From jeff.liu@oracle.com Fri Aug 1 01:09: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 24F407FB6 for ; Fri, 1 Aug 2014 01:09:28 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 021248F808F for ; Thu, 31 Jul 2014 23:09:27 -0700 (PDT) X-ASG-Debug-ID: 1406873365-04cbb02d849eba0001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id 41JoU8fWc5D6O6G0 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 31 Jul 2014 23:09:26 -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 s7169H0M019497 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Fri, 1 Aug 2014 06:09:18 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 s7169GVf026593 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Fri, 1 Aug 2014 06:09:17 GMT Received: from abhmp0014.oracle.com (abhmp0014.oracle.com [141.146.116.20]) by aserz7021.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id s7169GN8024542; Fri, 1 Aug 2014 06:09:16 GMT Received: from [192.168.1.106] (/221.223.108.37) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 31 Jul 2014 23:09:16 -0700 Message-ID: <53DB2F08.2090703@oracle.com> Date: Fri, 01 Aug 2014 14:09:12 +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 v3 00/10] xfs_ioc_bulkstat code refactoring and consolidation References: <538D92B6.5050402@oracle.com> <20140729232748.GI26465@dastard> <53D9F67F.9060609@oracle.com> X-ASG-Orig-Subj: Re: [PATCH v3 00/10] xfs_ioc_bulkstat code refactoring and consolidation In-Reply-To: <53D9F67F.9060609@oracle.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: 1406873366 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.8023 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 07/31/2014 15:55 PM, Jeff Liu wrote: > Hi Dave, > > On 07/30/2014 07:27 AM, Dave Chinner wrote: >> On Tue, Jun 03, 2014 at 05:17:42PM +0800, Jeff Liu wrote: >>> Hi folk, >>> >>> This is the revised patches for xfs_ioc_bulkstat consolidation and code >>> refactoring. As per Christoph's comments, I'm not include the per AG >>> inumber patch in this series given that I don't actually introduce the >>> relevant inumbers interface now. Similar to that reason, I also dropped >>> the per AG bulkstat patch, it would be included in parallel quota check >>> series. >>> >>> >>> v3->v2: >>> - one major bug fix is at xfs_bulkstat_ag_ichunk() regarding the user buffer >>> pointer operations, it should be defined as a pointer-to-pointer since it >>> would be updated inside xfs_bulkstat_ag_ichunk(). >>> >>> - separate xfs_inumber consolidate patch into two patches, the first one >>> fix the formater function return value and consolidate the codes, another >>> one does the actual logic changes for better error handling. >>> >>> - Add a separate patch to get rid of the redundant user buffer count >>> checks at xfs_bulkstat() >>> >>> - fixed agino calculation issue at xfs_bulkstat_grab_ichunk(). >>> >>> v2: http://oss.sgi.com/archives/xfs/2014-04/msg00554.html >>> v1: http://oss.sgi.com/archives/xfs/2013-12/msg00901.html >>> >>> >>> Any comments are welcome! >> >> Hi Jeff, I ported this to the current dev tree based on the >> xfs-libxfs-restructure branch, and I keep seeing fsstress failing >> with memory corruption after random bulkstat ioctls. I see regular >> failures with generic/013, generic/068, xfs/167 and the other >> fstress tests also randomly fail. The typical failure is glibc >> detected memory heap corruption on freeing the bulkstat structure >> after the ioctl: >> >> generic/068 42s ...*** Error in `./ltp/fsstress': double free or corruption (!prev): 0x00007f0224000b70 *** >> ======= Backtrace: ========= > > Sorry for my late response and thanks for help porting this patch series. > > Now I can reproduce this issue frequently with generic/013, will try to fix > it ASAP. Hi Dave, Could you please check the patch below for this issue? From: Jie Liu Subject: xfs: always updating acp elements at xfs_bulkstat_ag_ichunk After processing the inodes in chunk, we should always updating the last inode number and the left user buffer info no matter anything wrong while formatting an inode to the user buffer. Otherwise, the related info might be updated improperly at xfs_bulkstat() for the next round of inode processing. Signed-off-by: Jie Liu --- fs/xfs/xfs_itable.c | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/fs/xfs/xfs_itable.c b/fs/xfs/xfs_itable.c index 9959a05..f71be9c 100644 --- a/fs/xfs/xfs_itable.c +++ b/fs/xfs/xfs_itable.c @@ -328,11 +328,9 @@ xfs_bulkstat_ag_ichunk( lastino = ino; } - if (!error) { - acp->ac_lastino = lastino; - acp->ac_ubleft = ubleft; - acp->ac_ubelem = ubelem; - } + acp->ac_lastino = lastino; + acp->ac_ubleft = ubleft; + acp->ac_ubelem = ubelem; return error; } -- 1.8.3.2 Cheers, -Jeff From fmorision3@gmail.com Fri Aug 1 06: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=3.6 required=5.0 tests=FREEMAIL_ENVFROM_END_DIGIT, FREEMAIL_FROM,FREEMAIL_REPLY,HK_SCAM_S7,HTML_MESSAGE,T_DKIM_INVALID autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id ACC697FC2 for ; Fri, 1 Aug 2014 06:03:37 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 2CD78AC003 for ; Fri, 1 Aug 2014 04:03:34 -0700 (PDT) X-ASG-Debug-ID: 1406891009-04cbb02d84aaa90001-NocioJ Received: from mail-ig0-f194.google.com (mail-ig0-f194.google.com [209.85.213.194]) by cuda.sgi.com with ESMTP id 2iZGeXDVQuXupUBO (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Fri, 01 Aug 2014 04:03:29 -0700 (PDT) X-Barracuda-Envelope-From: fmorision3@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.213.194 X-Barracuda-IPDD: Level1 [gmail.com/209.85.213.194] Received: by mail-ig0-f194.google.com with SMTP id r2so295487igi.9 for ; Fri, 01 Aug 2014 04:03:29 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.213.194] X-Barracuda-IPDD: Level1 [gmail.com/209.85.213.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=5XRVcBxeVCG6+pmEfKeKt9DzUVnW7CsanpipSxZddLc=; b=dw7VRp6Mt9T10Lpl/PvODgfjsaDBoxpOh6EqwGS7AQKV0RItBIcP5qXtiCCSWv549i aqqXMWTJk1CsVILqFvtlDGjz/hWf1V9UdTKqtMQF93S4MjxG2XFz67FS42K48SFyZHah Sj+4EEvNx4RRCSWFQ4UCSasnhoMYg+LErDVn0cLxp+7G2AtltoIE41nUyoWGMGpfnu6e kRV/BCZYS55HYmblnswFD0uNvVlIydCx7R19E2cqGgjXER7UFRQY2BqSylBmNBU2kuFW gYUH842ljhPssbccu9kmNO9u426LHsFFTCmf+LzFrNovDeIQCU/9JyUkREqOplfqRegR YMhA== MIME-Version: 1.0 X-Received: by 10.50.33.100 with SMTP id q4mr6327284igi.8.1406889581259; Fri, 01 Aug 2014 03:39:41 -0700 (PDT) Received: by 10.64.243.135 with HTTP; Fri, 1 Aug 2014 03:39:41 -0700 (PDT) Date: Fri, 1 Aug 2014 12:39:41 +0200 Message-ID: Subject: Re: Very Urgent............ From: Fabian Morision X-ASG-Orig-Subj: Re: Very Urgent............ To: undisclosed-recipients:; Content-Type: multipart/alternative; boundary=089e0158b034bab6a604ff8f01ba X-Barracuda-Connect: mail-ig0-f194.google.com[209.85.213.194] X-Barracuda-Start-Time: 1406891009 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.8030 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 --089e0158b034bab6a604ff8f01ba Content-Type: text/plain; charset=UTF-8 -- Greetings from gulf region Thanks for the e-mail. I am very interested on funding lucrative business partnership with you acting as the manager and sole controller of the investment while i remain a silent investor for a period of ten yrs , though I am only looking at investment opportunities within the range you specified for a start. You can reply me here (fmorision@yahoo.com) Let me know your thought asap. Regards Financial Consultant Mr.Fabian Morision --089e0158b034bab6a604ff8f01ba Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: quoted-printable


--


Greetings from gulf r= egion

Thanks for the e-mail. I am very interested on funding lucrati= ve business partnership with you acting as the manager and sole controller = of the investment while i remain a silent investor for a period of ten yrs = , though I am only looking at investment opportunities within the range you= specified for a start. You can reply me here (fmorision@yahoo.com)

Let me know your thought asap.

Regards

Financial Consulta= nt

Mr.Fabian Morision
--089e0158b034bab6a604ff8f01ba-- From bfoster@redhat.com Fri Aug 1 07:44: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 1BEF07FC0 for ; Fri, 1 Aug 2014 07:44:15 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id BB949AC00A for ; Fri, 1 Aug 2014 05:44:11 -0700 (PDT) X-ASG-Debug-ID: 1406897047-04bdf03d43b58c0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 4jvasqUxhuL7rV6V (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 01 Aug 2014 05:44: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 s71Ci5WA023217 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Fri, 1 Aug 2014 08:44:05 -0400 Received: from laptop.bfoster (vpn-239-219.phx2.redhat.com [10.3.239.219]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s71Ci2tb010773 (version=TLSv1/SSLv3 cipher=AES128-GCM-SHA256 bits=128 verify=NO); Fri, 1 Aug 2014 08:44:04 -0400 Date: Fri, 1 Aug 2014 08:44:02 -0400 From: Brian Foster To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 2/2] xfs: flush both inodes in xfs_swap_extents Message-ID: <20140801124401.GA3582@laptop.bfoster> X-ASG-Orig-Subj: Re: [PATCH 2/2] xfs: flush both inodes in xfs_swap_extents References: <1406787128-11897-1-git-send-email-david@fromorbit.com> <1406787128-11897-3-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1406787128-11897-3-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.23 (2014-03-12) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.24 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1406897047 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Thu, Jul 31, 2014 at 04:12:08PM +1000, Dave Chinner wrote: > From: Dave Chinner > > We need to treat both inodes identically from a page cache point of > view when prepareing them for extent swapping. We don't do this > right now - we assume that one of the inodes empty, because that's > what xfs_fsr currently does. Remove this assumption from the code. > > While factoring out the flushing and related checks, move the > transactions reservation to immeidately after the flushes so that we > don't need to pick up and then drop the ilock to do the transaction > reservation. There are no issues with aborting the transaction it if > the checks fail before we join the inodes to the transaction and > dirty them, so this is a safe change to make. > > Signed-off-by: Dave Chinner > --- Both of these looked fine to me, but I couldn't apply this one to for-next or master... Brian > fs/xfs/xfs_bmap_util.c | 81 +++++++++++++++++++++++--------------------------- > 1 file changed, 37 insertions(+), 44 deletions(-) > > diff --git a/fs/xfs/xfs_bmap_util.c b/fs/xfs/xfs_bmap_util.c > index 3c60c43..2f1e30d 100644 > --- a/fs/xfs/xfs_bmap_util.c > +++ b/fs/xfs/xfs_bmap_util.c > @@ -1619,6 +1619,30 @@ xfs_swap_extents_check_format( > } > > int > +xfs_swap_extent_flush( > + struct xfs_inode *ip) > +{ > + int error; > + > + error = filemap_write_and_wait(VFS_I(ip)->i_mapping); > + if (error) > + return error; > + truncate_pagecache_range(VFS_I(ip), 0, -1); > + > + /* Verify O_DIRECT for ftmp */ > + if (VFS_I(ip)->i_mapping->nrpages) > + return -EINVAL; > + > + /* > + * Don't try to swap extents on mmap()d files because we can't lock > + * out races against page faults safely. > + */ > + if (mapping_mapped(VFS_I(ip)->i_mapping)) > + return -EBUSY; > + return 0; > +} > + > +int > xfs_swap_extents( > xfs_inode_t *ip, /* target inode */ > xfs_inode_t *tip, /* tmp inode */ > @@ -1662,26 +1686,28 @@ xfs_swap_extents( > goto out_unlock; > } > > - error = filemap_write_and_wait(VFS_I(tip)->i_mapping); > + error = xfs_swap_extent_flush(ip); > + if (error) > + goto out_unlock; > + error = xfs_swap_extent_flush(tip); > if (error) > goto out_unlock; > - truncate_pagecache_range(VFS_I(tip), 0, -1); > - > - xfs_lock_two_inodes(ip, tip, XFS_ILOCK_EXCL); > - lock_flags |= XFS_ILOCK_EXCL; > > - /* Verify O_DIRECT for ftmp */ > - if (VFS_I(tip)->i_mapping->nrpages) { > - error = -EINVAL; > + tp = xfs_trans_alloc(mp, XFS_TRANS_SWAPEXT); > + error = xfs_trans_reserve(tp, &M_RES(mp)->tr_ichange, 0, 0); > + if (error) { > + xfs_trans_cancel(tp, 0); > goto out_unlock; > } > + xfs_lock_two_inodes(ip, tip, XFS_ILOCK_EXCL); > + lock_flags |= XFS_ILOCK_EXCL; > > /* Verify all data are being swapped */ > if (sxp->sx_offset != 0 || > sxp->sx_length != ip->i_d.di_size || > sxp->sx_length != tip->i_d.di_size) { > error = -EFAULT; > - goto out_unlock; > + goto out_trans_cancel; > } > > trace_xfs_swap_extent_before(ip, 0); > @@ -1693,7 +1719,7 @@ xfs_swap_extents( > xfs_notice(mp, > "%s: inode 0x%llx format is incompatible for exchanging.", > __func__, ip->i_ino); > - goto out_unlock; > + goto out_trans_cancel; > } > > /* > @@ -1708,41 +1734,8 @@ xfs_swap_extents( > (sbp->bs_mtime.tv_sec != VFS_I(ip)->i_mtime.tv_sec) || > (sbp->bs_mtime.tv_nsec != VFS_I(ip)->i_mtime.tv_nsec)) { > error = -EBUSY; > - goto out_unlock; > - } > - > - /* We need to fail if the file is memory mapped. Once we have tossed > - * all existing pages, the page fault will have no option > - * but to go to the filesystem for pages. By making the page fault call > - * vop_read (or write in the case of autogrow) they block on the iolock > - * until we have switched the extents. > - */ > - if (mapping_mapped(VFS_I(ip)->i_mapping)) { > - error = -EBUSY; > - goto out_unlock; > - } > - > - xfs_iunlock(ip, XFS_ILOCK_EXCL); > - xfs_iunlock(tip, XFS_ILOCK_EXCL); > - lock_flags &= ~XFS_ILOCK_EXCL; > - > - /* > - * There is a race condition here since we gave up the > - * ilock. However, the data fork will not change since > - * we have the iolock (locked for truncation too) so we > - * are safe. We don't really care if non-io related > - * fields change. > - */ > - truncate_pagecache_range(VFS_I(ip), 0, -1); > - > - tp = xfs_trans_alloc(mp, XFS_TRANS_SWAPEXT); > - error = xfs_trans_reserve(tp, &M_RES(mp)->tr_ichange, 0, 0); > - if (error) > goto out_trans_cancel; > - > - xfs_lock_two_inodes(ip, tip, XFS_ILOCK_EXCL); > - lock_flags |= XFS_ILOCK_EXCL; > - > + } > /* > * Count the number of extended attribute blocks > */ > -- > 2.0.0 > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From BATV+4041ec451d47f32d1b83+3995+infradead.org+hch@bombadil.srs.infradead.org Fri Aug 1 08:53: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 1E5B17F57 for ; Fri, 1 Aug 2014 08:53:13 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 0C7B330406B for ; Fri, 1 Aug 2014 06:53:10 -0700 (PDT) X-ASG-Debug-ID: 1406901185-04cbb02d84b0780001-NocioJ Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.9]) by cuda.sgi.com with ESMTP id eaDBXtd1irko3Shb (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 01 Aug 2014 06:53:06 -0700 (PDT) X-Barracuda-Envelope-From: BATV+4041ec451d47f32d1b83+3995+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 1XDDGb-0008Nr-8G; Fri, 01 Aug 2014 13:53:05 +0000 Date: Fri, 1 Aug 2014 06:53:05 -0700 From: Christoph Hellwig To: Eric Sandeen Cc: xfs-oss Subject: Re: Is jdm_delete_filehandle part of a public API? Message-ID: <20140801135305.GA31894@infradead.org> X-ASG-Orig-Subj: Re: Is jdm_delete_filehandle part of a public API? References: <53D7DA7F.2040706@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <53D7DA7F.2040706@redhat.com> User-Agent: Mutt/1.5.23 (2014-03-12) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: bombadil.infradead.org[198.137.202.9] X-Barracuda-Start-Time: 1406901185 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.8034 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Tue, Jul 29, 2014 at 12:31:43PM -0500, Eric Sandeen wrote: > I was cleaning up xfsprogs to plug some leaks, and wanted to use > jdm_delete_filehandle(). I noticed that it has an "hlen" argument which > is unused. > > Can we remove that, or is this part of a public API? It's not in any > manpage (or even called anywhere in xfsprogs/xfstests/xfsdump/dmapi) > but it is in a public header... > > anyone know? > > If needed I guess I can just call it with hlen==0, but that seems odd. If it's in a public header we shouldn't touch it unless there's a pressing need. Talking about libhandle: this one has been a bit bitrotted. Maybe it's a good time to move everything over to the kernel by handle syscalls and deprecated it? From BATV+4041ec451d47f32d1b83+3995+infradead.org+hch@bombadil.srs.infradead.org Fri Aug 1 09:26: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 (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id DF1E87F37 for ; Fri, 1 Aug 2014 09:26:48 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id CDBE48F8071 for ; Fri, 1 Aug 2014 07:26:45 -0700 (PDT) X-ASG-Debug-ID: 1406903204-04cbb02d84b17f0001-NocioJ Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.9]) by cuda.sgi.com with ESMTP id VS8fyJaEbQJ9FKrM (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 01 Aug 2014 07:26:44 -0700 (PDT) X-Barracuda-Envelope-From: BATV+4041ec451d47f32d1b83+3995+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 1XDDn9-00072m-UR; Fri, 01 Aug 2014 14:26:43 +0000 Date: Fri, 1 Aug 2014 07:26:43 -0700 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 1/4] xfs: catch buffers written without verifiers attached Message-ID: <20140801142643.GA26455@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 1/4] xfs: catch buffers written without verifiers attached References: <1406768509-32556-1-git-send-email-david@fromorbit.com> <1406768509-32556-2-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1406768509-32556-2-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.23 (2014-03-12) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: bombadil.infradead.org[198.137.202.9] X-Barracuda-Start-Time: 1406903204 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-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.8035 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Looks good, Reviewed-by: Christoph Hellwig From BATV+4041ec451d47f32d1b83+3995+infradead.org+hch@bombadil.srs.infradead.org Fri Aug 1 09:27: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 3703D7F37 for ; Fri, 1 Aug 2014 09:27:42 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 16146304051 for ; Fri, 1 Aug 2014 07:27:39 -0700 (PDT) X-ASG-Debug-ID: 1406903257-04bdf03d43b9960001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id VY56FnbxgjQd7s1O (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 01 Aug 2014 07:27:37 -0700 (PDT) X-Barracuda-Envelope-From: BATV+4041ec451d47f32d1b83+3995+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 1XDDo1-00077Y-RB; Fri, 01 Aug 2014 14:27:37 +0000 Date: Fri, 1 Aug 2014 07:27:37 -0700 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 2/4] xfs: ensure verifiers are attached to recovered buffers Message-ID: <20140801142737.GB26455@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 2/4] xfs: ensure verifiers are attached to recovered buffers References: <1406768509-32556-1-git-send-email-david@fromorbit.com> <1406768509-32556-3-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1406768509-32556-3-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.23 (2014-03-12) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1406903257 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-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.8035 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS Looks good, Reviewed-by: Christoph Hellwig From BATV+4041ec451d47f32d1b83+3995+infradead.org+hch@bombadil.srs.infradead.org Fri Aug 1 09:28: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 498F87F37 for ; Fri, 1 Aug 2014 09:28:31 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id D93F2AC00C for ; Fri, 1 Aug 2014 07:28:27 -0700 (PDT) X-ASG-Debug-ID: 1406903306-04cb6c555daa7e0001-NocioJ Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.9]) by cuda.sgi.com with ESMTP id A51ghBfx8LcMr61c (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 01 Aug 2014 07:28:26 -0700 (PDT) X-Barracuda-Envelope-From: BATV+4041ec451d47f32d1b83+3995+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 1XDDoo-0007CW-9I; Fri, 01 Aug 2014 14:28:26 +0000 Date: Fri, 1 Aug 2014 07:28:26 -0700 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 3/4] xfs: quotacheck leaves dquot buffers without verifiers Message-ID: <20140801142826.GC26455@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 3/4] xfs: quotacheck leaves dquot buffers without verifiers References: <1406768509-32556-1-git-send-email-david@fromorbit.com> <1406768509-32556-4-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1406768509-32556-4-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.23 (2014-03-12) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: bombadil.infradead.org[198.137.202.9] X-Barracuda-Start-Time: 1406903306 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.8035 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Looks good, Reviewed-by: Christoph Hellwig From BATV+4041ec451d47f32d1b83+3995+infradead.org+hch@bombadil.srs.infradead.org Fri Aug 1 09:30: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 7AE287F37 for ; Fri, 1 Aug 2014 09:30:25 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 16550AC005 for ; Fri, 1 Aug 2014 07:30:24 -0700 (PDT) X-ASG-Debug-ID: 1406903423-04bdf03d43b9a90001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id HqoJdEl0AWBjEGHI (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 01 Aug 2014 07:30:23 -0700 (PDT) X-Barracuda-Envelope-From: BATV+4041ec451d47f32d1b83+3995+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 1XDDqh-0000DG-QH; Fri, 01 Aug 2014 14:30:23 +0000 Date: Fri, 1 Aug 2014 07:30:23 -0700 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 4/4] xfs: dquot recovery needs verifiers Message-ID: <20140801143023.GD26455@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 4/4] xfs: dquot recovery needs verifiers References: <1406768509-32556-1-git-send-email-david@fromorbit.com> <1406768509-32556-5-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1406768509-32556-5-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.23 (2014-03-12) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1406903423 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.8035 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Thu, Jul 31, 2014 at 11:01:49AM +1000, Dave Chinner wrote: > From: Dave Chinner > > dquot recovery should add verifiers to the dquot buffers that it > recovers changes into. Unfortunately, it doesn't attached the > verifiers to the buffers in a consistent manner. For example, > xlog_recover_dquot_pass2() reads dquot buffers without a verifier > and then writes it without ever having attached a verifier to the > buffer. > > Further, dquot buffer recovery may write a dquot buffer that has not > been modified, or indeed, shoul dbe written because quotas are not > enabled and hence changes to the buffer were not replayed. In this > case, we again write buffers without verifiers attached because that > doesn't happen until after the buffer changes have been replayed. > > Signed-off-by: Dave Chinner The xlog_recover_do_reg_buffer look fine to me, but what's the rationale for removing the xfs_dqcheck call? From bfoster@redhat.com Fri Aug 1 09:37: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 (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id E3D417F37 for ; Fri, 1 Aug 2014 09:37:59 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id D0BA9304067 for ; Fri, 1 Aug 2014 07:37:59 -0700 (PDT) X-ASG-Debug-ID: 1406903876-04cb6c555eaabb0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id mpOQQ8Huc9xPlfhy (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 01 Aug 2014 07:37:57 -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 s71Ebs7v000751 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Fri, 1 Aug 2014 10:37:54 -0400 Received: from laptop.bfoster (vpn-239-219.phx2.redhat.com [10.3.239.219]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s71EbqJw014040 (version=TLSv1/SSLv3 cipher=AES128-GCM-SHA256 bits=128 verify=NO); Fri, 1 Aug 2014 10:37:54 -0400 Date: Fri, 1 Aug 2014 10:37:51 -0400 From: Brian Foster To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 1/6] xfs: remove bitfield based superblock updates Message-ID: <20140801143751.GB3582@laptop.bfoster> X-ASG-Orig-Subj: Re: [PATCH 1/6] xfs: remove bitfield based superblock updates References: <1406791995-14723-1-git-send-email-david@fromorbit.com> <1406791995-14723-2-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1406791995-14723-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.24 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1406903877 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Thu, Jul 31, 2014 at 05:33:10PM +1000, Dave Chinner wrote: > From: Dave Chinner > > When we log changes to the superblock, we first have to write them > to the on-disk buffer, and then log that. Right now we have a > complex bitfield based arrangement to only write the modified field > to the buffer before we log it. > > This used to be necessary as a performance optimisation because we > logged the superblock buffer in every extent or inode allocation or > freeing, and so performance was extremely important. We haven't done > this for years, however, ever since the lazy superblock counters > pulled the superblock logging out of the transaction commit > fast path. > > Hence we have a bunch of complexity that is not necessary that makes > writing the in-core superblock to disk much more complex than it > needs to be. We only need to log the superblock now during > management operations (e.g. during mount, unmount or quota control > operations) so it is not a performance critical path anymore. > > As such, remove the complex field based logging mechanism and > replace it with a simple conversion function similar to what we use > for all other on-disk structures. > > This means we always log the entirity of the superblock, but again > because we rarely modify the superblock this is not an issue for log > bandwidth or CPU time. Indeed, if we do log the superblock > frequently, delayed logging will minimise the impact of this > overhead. > > Signed-off-by: Dave Chinner > Signed-off-by: Dave Chinner > --- > fs/xfs/libxfs/xfs_attr_leaf.c | 2 +- > fs/xfs/libxfs/xfs_bmap.c | 14 +-- > fs/xfs/libxfs/xfs_sb.c | 287 +++++++++++++++--------------------------- > fs/xfs/libxfs/xfs_sb.h | 10 +- > fs/xfs/xfs_fsops.c | 6 +- > fs/xfs/xfs_mount.c | 18 +-- > fs/xfs/xfs_mount.h | 2 +- > fs/xfs/xfs_qm.c | 26 +--- > fs/xfs/xfs_qm.h | 2 +- > fs/xfs/xfs_qm_syscalls.c | 13 +- > fs/xfs/xfs_super.c | 2 +- > 11 files changed, 130 insertions(+), 252 deletions(-) > > diff --git a/fs/xfs/libxfs/xfs_attr_leaf.c b/fs/xfs/libxfs/xfs_attr_leaf.c > index b1f73db..f4a47a7 100644 > --- a/fs/xfs/libxfs/xfs_attr_leaf.c > +++ b/fs/xfs/libxfs/xfs_attr_leaf.c > @@ -405,7 +405,7 @@ xfs_sbversion_add_attr2(xfs_mount_t *mp, xfs_trans_t *tp) > if (!xfs_sb_version_hasattr2(&mp->m_sb)) { > xfs_sb_version_addattr2(&mp->m_sb); > spin_unlock(&mp->m_sb_lock); > - xfs_mod_sb(tp, XFS_SB_VERSIONNUM | XFS_SB_FEATURES2); > + xfs_mod_sb(tp); > } else > spin_unlock(&mp->m_sb_lock); > } > diff --git a/fs/xfs/libxfs/xfs_bmap.c b/fs/xfs/libxfs/xfs_bmap.c > index de2d26d..15e8c09 100644 > --- a/fs/xfs/libxfs/xfs_bmap.c > +++ b/fs/xfs/libxfs/xfs_bmap.c > @@ -1224,22 +1224,20 @@ xfs_bmap_add_attrfork( > goto bmap_cancel; > if (!xfs_sb_version_hasattr(&mp->m_sb) || > (!xfs_sb_version_hasattr2(&mp->m_sb) && version == 2)) { > - __int64_t sbfields = 0; > + bool mod_sb = false; > > spin_lock(&mp->m_sb_lock); > if (!xfs_sb_version_hasattr(&mp->m_sb)) { > xfs_sb_version_addattr(&mp->m_sb); > - sbfields |= XFS_SB_VERSIONNUM; > + mod_sb = true; > } > if (!xfs_sb_version_hasattr2(&mp->m_sb) && version == 2) { > xfs_sb_version_addattr2(&mp->m_sb); > - sbfields |= (XFS_SB_VERSIONNUM | XFS_SB_FEATURES2); > + mod_sb = true; > } > - if (sbfields) { > - spin_unlock(&mp->m_sb_lock); > - xfs_mod_sb(tp, sbfields); > - } else > - spin_unlock(&mp->m_sb_lock); > + spin_unlock(&mp->m_sb_lock); > + if (mod_sb) > + xfs_mod_sb(tp); > } > > error = xfs_bmap_finish(&tp, &flist, &committed); > diff --git a/fs/xfs/libxfs/xfs_sb.c b/fs/xfs/libxfs/xfs_sb.c > index 6e93b5e..d16b549 100644 > --- a/fs/xfs/libxfs/xfs_sb.c > +++ b/fs/xfs/libxfs/xfs_sb.c > @@ -42,69 +42,6 @@ > * Physical superblock buffer manipulations. Shared with libxfs in userspace. > */ > > -static const struct { > - short offset; > - short type; /* 0 = integer > - * 1 = binary / string (no translation) > - */ > -} xfs_sb_info[] = { > - { offsetof(xfs_sb_t, sb_magicnum), 0 }, > - { offsetof(xfs_sb_t, sb_blocksize), 0 }, > - { offsetof(xfs_sb_t, sb_dblocks), 0 }, > - { offsetof(xfs_sb_t, sb_rblocks), 0 }, > - { offsetof(xfs_sb_t, sb_rextents), 0 }, > - { offsetof(xfs_sb_t, sb_uuid), 1 }, > - { offsetof(xfs_sb_t, sb_logstart), 0 }, > - { offsetof(xfs_sb_t, sb_rootino), 0 }, > - { offsetof(xfs_sb_t, sb_rbmino), 0 }, > - { offsetof(xfs_sb_t, sb_rsumino), 0 }, > - { offsetof(xfs_sb_t, sb_rextsize), 0 }, > - { offsetof(xfs_sb_t, sb_agblocks), 0 }, > - { offsetof(xfs_sb_t, sb_agcount), 0 }, > - { offsetof(xfs_sb_t, sb_rbmblocks), 0 }, > - { offsetof(xfs_sb_t, sb_logblocks), 0 }, > - { offsetof(xfs_sb_t, sb_versionnum), 0 }, > - { offsetof(xfs_sb_t, sb_sectsize), 0 }, > - { offsetof(xfs_sb_t, sb_inodesize), 0 }, > - { offsetof(xfs_sb_t, sb_inopblock), 0 }, > - { offsetof(xfs_sb_t, sb_fname[0]), 1 }, > - { offsetof(xfs_sb_t, sb_blocklog), 0 }, > - { offsetof(xfs_sb_t, sb_sectlog), 0 }, > - { offsetof(xfs_sb_t, sb_inodelog), 0 }, > - { offsetof(xfs_sb_t, sb_inopblog), 0 }, > - { offsetof(xfs_sb_t, sb_agblklog), 0 }, > - { offsetof(xfs_sb_t, sb_rextslog), 0 }, > - { offsetof(xfs_sb_t, sb_inprogress), 0 }, > - { offsetof(xfs_sb_t, sb_imax_pct), 0 }, > - { offsetof(xfs_sb_t, sb_icount), 0 }, > - { offsetof(xfs_sb_t, sb_ifree), 0 }, > - { offsetof(xfs_sb_t, sb_fdblocks), 0 }, > - { offsetof(xfs_sb_t, sb_frextents), 0 }, > - { offsetof(xfs_sb_t, sb_uquotino), 0 }, > - { offsetof(xfs_sb_t, sb_gquotino), 0 }, > - { offsetof(xfs_sb_t, sb_qflags), 0 }, > - { offsetof(xfs_sb_t, sb_flags), 0 }, > - { offsetof(xfs_sb_t, sb_shared_vn), 0 }, > - { offsetof(xfs_sb_t, sb_inoalignmt), 0 }, > - { offsetof(xfs_sb_t, sb_unit), 0 }, > - { offsetof(xfs_sb_t, sb_width), 0 }, > - { offsetof(xfs_sb_t, sb_dirblklog), 0 }, > - { offsetof(xfs_sb_t, sb_logsectlog), 0 }, > - { offsetof(xfs_sb_t, sb_logsectsize), 0 }, > - { offsetof(xfs_sb_t, sb_logsunit), 0 }, > - { offsetof(xfs_sb_t, sb_features2), 0 }, > - { offsetof(xfs_sb_t, sb_bad_features2), 0 }, > - { offsetof(xfs_sb_t, sb_features_compat), 0 }, > - { offsetof(xfs_sb_t, sb_features_ro_compat), 0 }, > - { offsetof(xfs_sb_t, sb_features_incompat), 0 }, > - { offsetof(xfs_sb_t, sb_features_log_incompat), 0 }, > - { offsetof(xfs_sb_t, sb_crc), 0 }, > - { offsetof(xfs_sb_t, sb_pad), 0 }, > - { offsetof(xfs_sb_t, sb_pquotino), 0 }, > - { offsetof(xfs_sb_t, sb_lsn), 0 }, > - { sizeof(xfs_sb_t), 0 } > -}; > - > /* > * Reference counting access wrappers to the perag structures. > * Because we never free per-ag structures, the only thing we > @@ -447,125 +384,119 @@ xfs_sb_from_disk( > to->sb_lsn = be64_to_cpu(from->sb_lsn); > } > > -static inline void > +static void > xfs_sb_quota_to_disk( > - xfs_dsb_t *to, > - xfs_sb_t *from, > - __int64_t *fields) > + struct xfs_dsb *to, > + struct xfs_sb *from) > { > __uint16_t qflags = from->sb_qflags; > > + to->sb_uquotino = cpu_to_be64(from->sb_uquotino); > + if (xfs_sb_version_has_pquotino(from)) { > + to->sb_qflags = be16_to_cpu(from->sb_qflags); > + to->sb_gquotino = cpu_to_be64(from->sb_gquotino); > + to->sb_pquotino = cpu_to_be64(from->sb_pquotino); > + return; > + } > + Ok, so we're inheriting the quota conversion from xfs_sb_to_disk() unconditionally (as opposed to previously being solely a has_pquotino() fixup function). > /* > - * We need to do these manipilations only if we are working > - * with an older version of on-disk superblock. > + * The in-core version of sb_qflags do not have XFS_OQUOTA_* > + * flags, whereas the on-disk version does. So, convert incore > + * XFS_{PG}QUOTA_* flags to on-disk XFS_OQUOTA_* flags. > */ > - if (xfs_sb_version_has_pquotino(from)) > - return; > + qflags &= ~(XFS_PQUOTA_ENFD | XFS_PQUOTA_CHKD | > + XFS_GQUOTA_ENFD | XFS_GQUOTA_CHKD); > > - if (*fields & XFS_SB_QFLAGS) { > - /* > - * The in-core version of sb_qflags do not have > - * XFS_OQUOTA_* flags, whereas the on-disk version > - * does. So, convert incore XFS_{PG}QUOTA_* flags > - * to on-disk XFS_OQUOTA_* flags. > - */ > - qflags &= ~(XFS_PQUOTA_ENFD | XFS_PQUOTA_CHKD | > - XFS_GQUOTA_ENFD | XFS_GQUOTA_CHKD); > - > - if (from->sb_qflags & > - (XFS_PQUOTA_ENFD | XFS_GQUOTA_ENFD)) > - qflags |= XFS_OQUOTA_ENFD; > - if (from->sb_qflags & > - (XFS_PQUOTA_CHKD | XFS_GQUOTA_CHKD)) > - qflags |= XFS_OQUOTA_CHKD; > - to->sb_qflags = cpu_to_be16(qflags); > - *fields &= ~XFS_SB_QFLAGS; > - } > + if (from->sb_qflags & > + (XFS_PQUOTA_ENFD | XFS_GQUOTA_ENFD)) > + qflags |= XFS_OQUOTA_ENFD; > + if (from->sb_qflags & > + (XFS_PQUOTA_CHKD | XFS_GQUOTA_CHKD)) > + qflags |= XFS_OQUOTA_CHKD; > + to->sb_qflags = cpu_to_be16(qflags); > > /* > - * GQUOTINO and PQUOTINO cannot be used together in versions of > - * superblock that do not have pquotino. from->sb_flags tells us which > - * quota is active and should be copied to disk. If neither are active, > - * make sure we write NULLFSINO to the sb_gquotino field as a quota > - * inode value of "0" is invalid when the XFS_SB_VERSION_QUOTA feature > - * bit is set. > + * GQUOTINO and PQUOTINO cannot be used together in versions > + * of superblock that do not have pquotino. from->sb_flags > + * tells us which quota is active and should be copied to > + * disk. If neither are active, we should NULL the inode. > * > - * Note that we don't need to handle the sb_uquotino or sb_pquotino here > - * as they do not require any translation. Hence the main sb field loop > - * will write them appropriately from the in-core superblock. > + * In all cases, the separate pquotino must remain 0 because it > + * it beyond the "end" of the valid non-pquotino superblock. > */ > - if ((*fields & XFS_SB_GQUOTINO) && > - (from->sb_qflags & XFS_GQUOTA_ACCT)) > + if (from->sb_qflags & XFS_GQUOTA_ACCT) > to->sb_gquotino = cpu_to_be64(from->sb_gquotino); > - else if ((*fields & XFS_SB_PQUOTINO) && > - (from->sb_qflags & XFS_PQUOTA_ACCT)) > + else if (from->sb_qflags & XFS_PQUOTA_ACCT) > to->sb_gquotino = cpu_to_be64(from->sb_pquotino); > - else { > - /* > - * We can't rely on just the fields being logged to tell us > - * that it is safe to write NULLFSINO - we should only do that > - * if quotas are not actually enabled. Hence only write > - * NULLFSINO if both in-core quota inodes are NULL. > - */ > - if (from->sb_gquotino == NULLFSINO && > - from->sb_pquotino == NULLFSINO) > - to->sb_gquotino = cpu_to_be64(NULLFSINO); > - } > + else > + to->sb_gquotino = cpu_to_be64(NULLFSINO); I'll ask since I'm not 100% on the backwards compatibility fixup here... but this else condition is effectively the same logic as the previous NULLFSINO checks due to the *QUOTA_ACCT flags checks, yes? If so, the rest looks fine: Reviewed-by: Brian Foster Brian > > - *fields &= ~(XFS_SB_PQUOTINO | XFS_SB_GQUOTINO); > + to->sb_pquotino = 0; > } > > -/* > - * Copy in core superblock to ondisk one. > - * > - * The fields argument is mask of superblock fields to copy. > - */ > void > xfs_sb_to_disk( > - xfs_dsb_t *to, > - xfs_sb_t *from, > - __int64_t fields) > + struct xfs_dsb *to, > + struct xfs_sb *from) > { > - xfs_caddr_t to_ptr = (xfs_caddr_t)to; > - xfs_caddr_t from_ptr = (xfs_caddr_t)from; > - xfs_sb_field_t f; > - int first; > - int size; > - > - ASSERT(fields); > - if (!fields) > - return; > + xfs_sb_quota_to_disk(to, from); > > - xfs_sb_quota_to_disk(to, from, &fields); > - while (fields) { > - f = (xfs_sb_field_t)xfs_lowbit64((__uint64_t)fields); > - first = xfs_sb_info[f].offset; > - size = xfs_sb_info[f + 1].offset - first; > - > - ASSERT(xfs_sb_info[f].type == 0 || xfs_sb_info[f].type == 1); > - > - if (size == 1 || xfs_sb_info[f].type == 1) { > - memcpy(to_ptr + first, from_ptr + first, size); > - } else { > - switch (size) { > - case 2: > - *(__be16 *)(to_ptr + first) = > - cpu_to_be16(*(__u16 *)(from_ptr + first)); > - break; > - case 4: > - *(__be32 *)(to_ptr + first) = > - cpu_to_be32(*(__u32 *)(from_ptr + first)); > - break; > - case 8: > - *(__be64 *)(to_ptr + first) = > - cpu_to_be64(*(__u64 *)(from_ptr + first)); > - break; > - default: > - ASSERT(0); > - } > - } > + to->sb_magicnum = cpu_to_be32(from->sb_magicnum); > + to->sb_blocksize = cpu_to_be32(from->sb_blocksize); > + to->sb_dblocks = cpu_to_be64(from->sb_dblocks); > + to->sb_rblocks = cpu_to_be64(from->sb_rblocks); > + to->sb_rextents = cpu_to_be64(from->sb_rextents); > + memcpy(&to->sb_uuid, &from->sb_uuid, sizeof(to->sb_uuid)); > + to->sb_logstart = cpu_to_be64(from->sb_logstart); > + to->sb_rootino = cpu_to_be64(from->sb_rootino); > + to->sb_rbmino = cpu_to_be64(from->sb_rbmino); > + to->sb_rsumino = cpu_to_be64(from->sb_rsumino); > + to->sb_rextsize = cpu_to_be32(from->sb_rextsize); > + to->sb_agblocks = cpu_to_be32(from->sb_agblocks); > + to->sb_agcount = cpu_to_be32(from->sb_agcount); > + to->sb_rbmblocks = cpu_to_be32(from->sb_rbmblocks); > + to->sb_logblocks = cpu_to_be32(from->sb_logblocks); > + to->sb_versionnum = cpu_to_be16(from->sb_versionnum); > + to->sb_sectsize = cpu_to_be16(from->sb_sectsize); > + to->sb_inodesize = cpu_to_be16(from->sb_inodesize); > + to->sb_inopblock = cpu_to_be16(from->sb_inopblock); > + memcpy(&to->sb_fname, &from->sb_fname, sizeof(to->sb_fname)); > + to->sb_blocklog = from->sb_blocklog; > + to->sb_sectlog = from->sb_sectlog; > + to->sb_inodelog = from->sb_inodelog; > + to->sb_inopblog = from->sb_inopblog; > + to->sb_agblklog = from->sb_agblklog; > + to->sb_rextslog = from->sb_rextslog; > + to->sb_inprogress = from->sb_inprogress; > + to->sb_imax_pct = from->sb_imax_pct; > + to->sb_icount = cpu_to_be64(from->sb_icount); > + to->sb_ifree = cpu_to_be64(from->sb_ifree); > + to->sb_fdblocks = cpu_to_be64(from->sb_fdblocks); > + to->sb_frextents = cpu_to_be64(from->sb_frextents); > > - fields &= ~(1LL << f); > + > + to->sb_flags = from->sb_flags; > + to->sb_shared_vn = from->sb_shared_vn; > + to->sb_inoalignmt = cpu_to_be32(from->sb_inoalignmt); > + to->sb_unit = cpu_to_be32(from->sb_unit); > + to->sb_width = cpu_to_be32(from->sb_width); > + to->sb_dirblklog = from->sb_dirblklog; > + to->sb_logsectlog = from->sb_logsectlog; > + to->sb_logsectsize = cpu_to_be16(from->sb_logsectsize); > + to->sb_logsunit = cpu_to_be32(from->sb_logsunit); > + to->sb_features2 = cpu_to_be32(from->sb_features2); > + to->sb_bad_features2 = cpu_to_be32(from->sb_bad_features2); > + > + if (xfs_sb_version_hascrc(from)) { > + to->sb_features_compat = cpu_to_be32(from->sb_features_compat); > + to->sb_features_ro_compat = > + cpu_to_be32(from->sb_features_ro_compat); > + to->sb_features_incompat = > + cpu_to_be32(from->sb_features_incompat); > + to->sb_features_log_incompat = > + cpu_to_be32(from->sb_features_log_incompat); > + to->sb_pad = 0; > + to->sb_lsn = cpu_to_be64(from->sb_lsn); > } > } > > @@ -802,35 +733,13 @@ xfs_initialize_perag_data( > * access. > */ > void > -xfs_mod_sb(xfs_trans_t *tp, __int64_t fields) > +xfs_mod_sb( > + struct xfs_trans *tp) > { > - xfs_buf_t *bp; > - int first; > - int last; > - xfs_mount_t *mp; > - xfs_sb_field_t f; > - > - ASSERT(fields); > - if (!fields) > - return; > - mp = tp->t_mountp; > - bp = xfs_trans_getsb(tp, mp, 0); > - first = sizeof(xfs_sb_t); > - last = 0; > - > - /* translate/copy */ > - > - xfs_sb_to_disk(XFS_BUF_TO_SBP(bp), &mp->m_sb, fields); > - > - /* find modified range */ > - f = (xfs_sb_field_t)xfs_highbit64((__uint64_t)fields); > - ASSERT((1LL << f) & XFS_SB_MOD_BITS); > - last = xfs_sb_info[f + 1].offset - 1; > - > - f = (xfs_sb_field_t)xfs_lowbit64((__uint64_t)fields); > - ASSERT((1LL << f) & XFS_SB_MOD_BITS); > - first = xfs_sb_info[f].offset; > + struct xfs_mount *mp = tp->t_mountp; > + struct xfs_buf *bp = xfs_trans_getsb(tp, mp, 0); > > + xfs_sb_to_disk(XFS_BUF_TO_SBP(bp), &mp->m_sb); > xfs_trans_buf_set_type(tp, bp, XFS_BLFT_SB_BUF); > - xfs_trans_log_buf(tp, bp, first, last); > + xfs_trans_log_buf(tp, bp, 0, sizeof(struct xfs_dsb)); > } > diff --git a/fs/xfs/libxfs/xfs_sb.h b/fs/xfs/libxfs/xfs_sb.h > index 2e73970..c28b3c1 100644 > --- a/fs/xfs/libxfs/xfs_sb.h > +++ b/fs/xfs/libxfs/xfs_sb.h > @@ -611,11 +611,11 @@ extern struct xfs_perag *xfs_perag_get_tag(struct xfs_mount *, xfs_agnumber_t, > extern void xfs_perag_put(struct xfs_perag *pag); > extern int xfs_initialize_perag_data(struct xfs_mount *, xfs_agnumber_t); > > -extern void xfs_sb_calc_crc(struct xfs_buf *); > -extern void xfs_mod_sb(struct xfs_trans *, __int64_t); > -extern void xfs_sb_mount_common(struct xfs_mount *, struct xfs_sb *); > -extern void xfs_sb_from_disk(struct xfs_sb *, struct xfs_dsb *); > -extern void xfs_sb_to_disk(struct xfs_dsb *, struct xfs_sb *, __int64_t); > +extern void xfs_sb_calc_crc(struct xfs_buf *bp); > +extern void xfs_mod_sb(struct xfs_trans *tp); > +extern void xfs_sb_mount_common(struct xfs_mount *mp, struct xfs_sb *sbp); > +extern void xfs_sb_from_disk(struct xfs_sb *to, struct xfs_dsb *from); > +extern void xfs_sb_to_disk(struct xfs_dsb *to, struct xfs_sb *from); > extern void xfs_sb_quota_from_disk(struct xfs_sb *sbp); > > #endif /* __XFS_SB_H__ */ > diff --git a/fs/xfs/xfs_fsops.c b/fs/xfs/xfs_fsops.c > index f91de1e..2c44e0b 100644 > --- a/fs/xfs/xfs_fsops.c > +++ b/fs/xfs/xfs_fsops.c > @@ -548,7 +548,7 @@ xfs_growfs_data_private( > saved_error = error; > continue; > } > - xfs_sb_to_disk(XFS_BUF_TO_SBP(bp), &mp->m_sb, XFS_SB_ALL_BITS); > + xfs_sb_to_disk(XFS_BUF_TO_SBP(bp), &mp->m_sb); > > error = xfs_bwrite(bp); > xfs_buf_relse(bp); > @@ -787,9 +787,7 @@ xfs_fs_log_dummy( > xfs_trans_cancel(tp, 0); > return error; > } > - > - /* log the UUID because it is an unchanging field */ > - xfs_mod_sb(tp, XFS_SB_UUID); > + xfs_mod_sb(tp); > xfs_trans_set_sync(tp); > return xfs_trans_commit(tp, 0); > } > diff --git a/fs/xfs/xfs_mount.c b/fs/xfs/xfs_mount.c > index 6dbad45..592e169 100644 > --- a/fs/xfs/xfs_mount.c > +++ b/fs/xfs/xfs_mount.c > @@ -621,7 +621,7 @@ xfs_mount_reset_sbqflags( > return error; > } > > - xfs_mod_sb(tp, XFS_SB_QFLAGS); > + xfs_mod_sb(tp); > return xfs_trans_commit(tp, 0); > } > > @@ -905,7 +905,7 @@ xfs_mountfs( > * perform the update e.g. for the root filesystem. > */ > if (mp->m_update_flags && !(mp->m_flags & XFS_MOUNT_RDONLY)) { > - error = xfs_mount_log_sb(mp, mp->m_update_flags); > + error = xfs_mount_log_sb(mp); > if (error) { > xfs_warn(mp, "failed to write sb changes"); > goto out_rtunmount; > @@ -1122,7 +1122,7 @@ xfs_log_sbcount(xfs_mount_t *mp) > return error; > } > > - xfs_mod_sb(tp, XFS_SB_IFREE | XFS_SB_ICOUNT | XFS_SB_FDBLOCKS); > + xfs_mod_sb(tp); > xfs_trans_set_sync(tp); > error = xfs_trans_commit(tp, 0); > return error; > @@ -1425,25 +1425,19 @@ xfs_freesb( > */ > int > xfs_mount_log_sb( > - xfs_mount_t *mp, > - __int64_t fields) > + xfs_mount_t *mp) > { > xfs_trans_t *tp; > int error; > > - ASSERT(fields & (XFS_SB_UNIT | XFS_SB_WIDTH | XFS_SB_UUID | > - XFS_SB_FEATURES2 | XFS_SB_BAD_FEATURES2 | > - XFS_SB_VERSIONNUM)); > - > tp = xfs_trans_alloc(mp, XFS_TRANS_SB_UNIT); > error = xfs_trans_reserve(tp, &M_RES(mp)->tr_sb, 0, 0); > if (error) { > xfs_trans_cancel(tp, 0); > return error; > } > - xfs_mod_sb(tp, fields); > - error = xfs_trans_commit(tp, 0); > - return error; > + xfs_mod_sb(tp); > + return xfs_trans_commit(tp, 0); > } > > /* > diff --git a/fs/xfs/xfs_mount.h b/fs/xfs/xfs_mount.h > index b0447c8..1ae9f56 100644 > --- a/fs/xfs/xfs_mount.h > +++ b/fs/xfs/xfs_mount.h > @@ -380,7 +380,7 @@ extern void xfs_unmountfs(xfs_mount_t *); > extern int xfs_mod_incore_sb(xfs_mount_t *, xfs_sb_field_t, int64_t, int); > extern int xfs_mod_incore_sb_batch(xfs_mount_t *, xfs_mod_sb_t *, > uint, int); > -extern int xfs_mount_log_sb(xfs_mount_t *, __int64_t); > +extern int xfs_mount_log_sb(xfs_mount_t *); > extern struct xfs_buf *xfs_getsb(xfs_mount_t *, int); > extern int xfs_readsb(xfs_mount_t *, int); > extern void xfs_freesb(xfs_mount_t *); > diff --git a/fs/xfs/xfs_qm.c b/fs/xfs/xfs_qm.c > index 1023210..170f951 100644 > --- a/fs/xfs/xfs_qm.c > +++ b/fs/xfs/xfs_qm.c > @@ -715,7 +715,6 @@ STATIC int > xfs_qm_qino_alloc( > xfs_mount_t *mp, > xfs_inode_t **ip, > - __int64_t sbfields, > uint flags) > { > xfs_trans_t *tp; > @@ -778,11 +777,6 @@ xfs_qm_qino_alloc( > spin_lock(&mp->m_sb_lock); > if (flags & XFS_QMOPT_SBVERSION) { > ASSERT(!xfs_sb_version_hasquota(&mp->m_sb)); > - ASSERT((sbfields & (XFS_SB_VERSIONNUM | XFS_SB_UQUOTINO | > - XFS_SB_GQUOTINO | XFS_SB_PQUOTINO | XFS_SB_QFLAGS)) == > - (XFS_SB_VERSIONNUM | XFS_SB_UQUOTINO | > - XFS_SB_GQUOTINO | XFS_SB_PQUOTINO | > - XFS_SB_QFLAGS)); > > xfs_sb_version_addquota(&mp->m_sb); > mp->m_sb.sb_uquotino = NULLFSINO; > @@ -799,7 +793,7 @@ xfs_qm_qino_alloc( > else > mp->m_sb.sb_pquotino = (*ip)->i_ino; > spin_unlock(&mp->m_sb_lock); > - xfs_mod_sb(tp, sbfields); > + xfs_mod_sb(tp); > > if ((error = xfs_trans_commit(tp, XFS_TRANS_RELEASE_LOG_RES))) { > xfs_alert(mp, "%s failed (error %d)!", __func__, error); > @@ -1452,7 +1446,7 @@ xfs_qm_mount_quotas( > spin_unlock(&mp->m_sb_lock); > > if (sbf != (mp->m_qflags & XFS_MOUNT_QUOTA_ALL)) { > - if (xfs_qm_write_sb_changes(mp, XFS_SB_QFLAGS)) { > + if (xfs_qm_write_sb_changes(mp)) { > /* > * We could only have been turning quotas off. > * We aren't in very good shape actually because > @@ -1483,7 +1477,6 @@ xfs_qm_init_quotainos( > struct xfs_inode *gip = NULL; > struct xfs_inode *pip = NULL; > int error; > - __int64_t sbflags = 0; > uint flags = 0; > > ASSERT(mp->m_quotainfo); > @@ -1518,9 +1511,6 @@ xfs_qm_init_quotainos( > } > } else { > flags |= XFS_QMOPT_SBVERSION; > - sbflags |= (XFS_SB_VERSIONNUM | XFS_SB_UQUOTINO | > - XFS_SB_GQUOTINO | XFS_SB_PQUOTINO | > - XFS_SB_QFLAGS); > } > > /* > @@ -1531,7 +1521,6 @@ xfs_qm_init_quotainos( > */ > if (XFS_IS_UQUOTA_ON(mp) && uip == NULL) { > error = xfs_qm_qino_alloc(mp, &uip, > - sbflags | XFS_SB_UQUOTINO, > flags | XFS_QMOPT_UQUOTA); > if (error) > goto error_rele; > @@ -1540,7 +1529,6 @@ xfs_qm_init_quotainos( > } > if (XFS_IS_GQUOTA_ON(mp) && gip == NULL) { > error = xfs_qm_qino_alloc(mp, &gip, > - sbflags | XFS_SB_GQUOTINO, > flags | XFS_QMOPT_GQUOTA); > if (error) > goto error_rele; > @@ -1549,7 +1537,6 @@ xfs_qm_init_quotainos( > } > if (XFS_IS_PQUOTA_ON(mp) && pip == NULL) { > error = xfs_qm_qino_alloc(mp, &pip, > - sbflags | XFS_SB_PQUOTINO, > flags | XFS_QMOPT_PQUOTA); > if (error) > goto error_rele; > @@ -1594,8 +1581,7 @@ xfs_qm_dqfree_one( > */ > int > xfs_qm_write_sb_changes( > - xfs_mount_t *mp, > - __int64_t flags) > + struct xfs_mount *mp) > { > xfs_trans_t *tp; > int error; > @@ -1607,10 +1593,8 @@ xfs_qm_write_sb_changes( > return error; > } > > - xfs_mod_sb(tp, flags); > - error = xfs_trans_commit(tp, 0); > - > - return error; > + xfs_mod_sb(tp); > + return xfs_trans_commit(tp, 0); > } > > > diff --git a/fs/xfs/xfs_qm.h b/fs/xfs/xfs_qm.h > index 3a07a93..bddd23f 100644 > --- a/fs/xfs/xfs_qm.h > +++ b/fs/xfs/xfs_qm.h > @@ -157,7 +157,7 @@ struct xfs_dquot_acct { > #define XFS_QM_RTBWARNLIMIT 5 > > extern void xfs_qm_destroy_quotainfo(struct xfs_mount *); > -extern int xfs_qm_write_sb_changes(struct xfs_mount *, __int64_t); > +extern int xfs_qm_write_sb_changes(struct xfs_mount *); > > /* dquot stuff */ > extern void xfs_qm_dqpurge_all(struct xfs_mount *, uint); > diff --git a/fs/xfs/xfs_qm_syscalls.c b/fs/xfs/xfs_qm_syscalls.c > index 80f2d77..45f28f1 100644 > --- a/fs/xfs/xfs_qm_syscalls.c > +++ b/fs/xfs/xfs_qm_syscalls.c > @@ -93,8 +93,7 @@ xfs_qm_scall_quotaoff( > mutex_unlock(&q->qi_quotaofflock); > > /* XXX what to do if error ? Revert back to old vals incore ? */ > - error = xfs_qm_write_sb_changes(mp, XFS_SB_QFLAGS); > - return error; > + return xfs_qm_write_sb_changes(mp); > } > > dqtype = 0; > @@ -315,7 +314,6 @@ xfs_qm_scall_quotaon( > { > int error; > uint qf; > - __int64_t sbflags; > > flags &= (XFS_ALL_QUOTA_ACCT | XFS_ALL_QUOTA_ENFD); > /* > @@ -323,8 +321,6 @@ xfs_qm_scall_quotaon( > */ > flags &= ~(XFS_ALL_QUOTA_ACCT); > > - sbflags = 0; > - > if (flags == 0) { > xfs_debug(mp, "%s: zero flags, m_qflags=%x", > __func__, mp->m_qflags); > @@ -371,11 +367,10 @@ xfs_qm_scall_quotaon( > /* > * There's nothing to change if it's the same. > */ > - if ((qf & flags) == flags && sbflags == 0) > + if ((qf & flags) == flags) > return -EEXIST; > - sbflags |= XFS_SB_QFLAGS; > > - if ((error = xfs_qm_write_sb_changes(mp, sbflags))) > + if ((error = xfs_qm_write_sb_changes(mp))) > return error; > /* > * If we aren't trying to switch on quota enforcement, we are done. > @@ -800,7 +795,7 @@ xfs_qm_log_quotaoff( > mp->m_sb.sb_qflags = (mp->m_qflags & ~(flags)) & XFS_MOUNT_QUOTA_ALL; > spin_unlock(&mp->m_sb_lock); > > - xfs_mod_sb(tp, XFS_SB_QFLAGS); > + xfs_mod_sb(tp); > > /* > * We have to make sure that the transaction is secure on disk before we > diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c > index b194652..8aa9eb4 100644 > --- a/fs/xfs/xfs_super.c > +++ b/fs/xfs/xfs_super.c > @@ -1250,7 +1250,7 @@ xfs_fs_remount( > * might have some superblock changes to update. > */ > if (mp->m_update_flags) { > - error = xfs_mount_log_sb(mp, mp->m_update_flags); > + error = xfs_mount_log_sb(mp); > if (error) { > xfs_warn(mp, "failed to write sb changes"); > return error; > -- > 2.0.0 > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From bfoster@redhat.com Fri Aug 1 09:39: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 93FAA7F37 for ; Fri, 1 Aug 2014 09:39:36 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 71A8C8F8071 for ; Fri, 1 Aug 2014 07:39:36 -0700 (PDT) X-ASG-Debug-ID: 1406903974-04cbb02d83b1d30001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id fgL7apAvCNmD5C7z (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 01 Aug 2014 07:39:35 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s71EdWkj030952 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Fri, 1 Aug 2014 10:39:32 -0400 Received: from laptop.bfoster (vpn-239-219.phx2.redhat.com [10.3.239.219]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s71EdUAU031232 (version=TLSv1/SSLv3 cipher=AES128-GCM-SHA256 bits=128 verify=NO); Fri, 1 Aug 2014 10:39:31 -0400 Date: Fri, 1 Aug 2014 10:39:29 -0400 From: Brian Foster To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 2/6] xfs: consolidate superblock logging functions Message-ID: <20140801143929.GC3582@laptop.bfoster> X-ASG-Orig-Subj: Re: [PATCH 2/6] xfs: consolidate superblock logging functions References: <1406791995-14723-1-git-send-email-david@fromorbit.com> <1406791995-14723-3-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1406791995-14723-3-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.23 (2014-03-12) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1406903974 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Thu, Jul 31, 2014 at 05:33:11PM +1000, Dave Chinner wrote: > From: Dave Chinner > > We now have several superblock loggin functions that are identical > except for the transaction reservation and whether it shoul dbe a > synchronous transaction or not. Consolidate these all into a single > function, a single reserveration and a sync flag and call it > xfs_sync_sb(). > > Also, xfs_mod_sb() is not really a modification function - it's the > operation of logging the superblock buffer. hence change the name of > it to reflect this. > > Note that we have to change the mp->m_update_flags that are passed > around at mount time to a boolean simply to indicate a superblock > update is needed. > > Signed-off-by: Dave Chinner > Signed-off-by: Dave Chinner > --- > fs/xfs/libxfs/xfs_attr_leaf.c | 2 +- > fs/xfs/libxfs/xfs_bmap.c | 10 +++--- > fs/xfs/libxfs/xfs_sb.c | 41 ++++++++++++++++++---- > fs/xfs/libxfs/xfs_sb.h | 42 ++--------------------- > fs/xfs/libxfs/xfs_shared.h | 26 ++++++-------- > fs/xfs/libxfs/xfs_trans_resv.c | 14 -------- > fs/xfs/libxfs/xfs_trans_resv.h | 1 - > fs/xfs/xfs_fsops.c | 29 ---------------- > fs/xfs/xfs_log.c | 17 +++++++-- > fs/xfs/xfs_mount.c | 78 +++++++----------------------------------- > fs/xfs/xfs_mount.h | 3 +- > fs/xfs/xfs_qm.c | 27 ++------------- > fs/xfs/xfs_qm_syscalls.c | 7 ++-- > fs/xfs/xfs_super.c | 13 +++---- > 14 files changed, 94 insertions(+), 216 deletions(-) > > diff --git a/fs/xfs/libxfs/xfs_attr_leaf.c b/fs/xfs/libxfs/xfs_attr_leaf.c > index f4a47a7..bcb0ab1 100644 > --- a/fs/xfs/libxfs/xfs_attr_leaf.c > +++ b/fs/xfs/libxfs/xfs_attr_leaf.c > @@ -405,7 +405,7 @@ xfs_sbversion_add_attr2(xfs_mount_t *mp, xfs_trans_t *tp) > if (!xfs_sb_version_hasattr2(&mp->m_sb)) { > xfs_sb_version_addattr2(&mp->m_sb); > spin_unlock(&mp->m_sb_lock); > - xfs_mod_sb(tp); > + xfs_log_sb(tp); > } else > spin_unlock(&mp->m_sb_lock); > } > diff --git a/fs/xfs/libxfs/xfs_bmap.c b/fs/xfs/libxfs/xfs_bmap.c > index 15e8c09..3a6a700 100644 > --- a/fs/xfs/libxfs/xfs_bmap.c > +++ b/fs/xfs/libxfs/xfs_bmap.c > @@ -1224,20 +1224,20 @@ xfs_bmap_add_attrfork( > goto bmap_cancel; > if (!xfs_sb_version_hasattr(&mp->m_sb) || > (!xfs_sb_version_hasattr2(&mp->m_sb) && version == 2)) { > - bool mod_sb = false; > + bool log_sb = false; > > spin_lock(&mp->m_sb_lock); > if (!xfs_sb_version_hasattr(&mp->m_sb)) { > xfs_sb_version_addattr(&mp->m_sb); > - mod_sb = true; > + log_sb = true; > } > if (!xfs_sb_version_hasattr2(&mp->m_sb) && version == 2) { > xfs_sb_version_addattr2(&mp->m_sb); > - mod_sb = true; > + log_sb = true; > } > spin_unlock(&mp->m_sb_lock); > - if (mod_sb) > - xfs_mod_sb(tp); > + if (log_sb) > + xfs_log_sb(tp); > } > > error = xfs_bmap_finish(&tp, &flist, &committed); > diff --git a/fs/xfs/libxfs/xfs_sb.c b/fs/xfs/libxfs/xfs_sb.c > index d16b549..d77d344 100644 > --- a/fs/xfs/libxfs/xfs_sb.c > +++ b/fs/xfs/libxfs/xfs_sb.c > @@ -726,14 +726,13 @@ xfs_initialize_perag_data( > } > > /* > - * xfs_mod_sb() can be used to copy arbitrary changes to the > - * in-core superblock into the superblock buffer to be logged. > - * It does not provide the higher level of locking that is > - * needed to protect the in-core superblock from concurrent > - * access. > + * xfs_log_sb() can be used to copy arbitrary changes to the in-core superblock > + * into the superblock buffer to be logged. It does not provide the higher > + * level of locking that is needed to protect the in-core superblock from > + * concurrent access. > */ > void > -xfs_mod_sb( > +xfs_log_sb( > struct xfs_trans *tp) > { > struct xfs_mount *mp = tp->t_mountp; > @@ -743,3 +742,33 @@ xfs_mod_sb( > xfs_trans_buf_set_type(tp, bp, XFS_BLFT_SB_BUF); > xfs_trans_log_buf(tp, bp, 0, sizeof(struct xfs_dsb)); > } > + > +/* > + * xfs_sync_sb > + * > + * Sync the superblock to disk. > + * > + * Note this code can be called during the process of freezing, so > + * we may need to use the transaction allocator which does not > + * block when the transaction subsystem is in its frozen state. > + */ > +int > +xfs_sync_sb( > + struct xfs_mount *mp, > + bool wait) > +{ > + struct xfs_trans *tp; > + int error; > + > + tp = _xfs_trans_alloc(mp, XFS_TRANS_SB_CHANGE, KM_SLEEP); We're converting some previous calls of xfs_trans_alloc() to the _xfs_trans_alloc() variant. The only difference is the dropped call to sb_start_intwrite() and I see that technically we handle that with the xfs_fs_writeable() check. Unless I misunderstand, the sb_start_inwrite() call is what will block us on internal transaction allocs once the fs is already frozen. It seems a little dicey to me to offer up this single helper without much indication that a frozen check might be a requirement, particularly since this is expected to be built into the transaction infrastructure. How would we expect a new caller to identify that? Even the current xfs_fs_writable() check seems like it might be unnecessary, given some brief testing. I don't hit the mount path at all on a frozen fs. I'm not sure of the mechanics behind that, but I'm guessing some kind of reference remains on the sb of a frozen fs and a subsequent umount/mount is purely namespace magic. Point being... this appears to be implicit and confusing. IMO, using an _xfs_sync_sb() variant that allocates a nonblocking tp if one isn't provided as a parameter (for example) and using that only in the contexts we know it's Ok to avoid freeze interaction issues might be more clear. Brian > + error = xfs_trans_reserve(tp, &M_RES(mp)->tr_sb, 0, 0); > + if (error) { > + xfs_trans_cancel(tp, 0); > + return error; > + } > + > + xfs_log_sb(tp); > + if (wait) > + xfs_trans_set_sync(tp); > + return xfs_trans_commit(tp, 0); > +} > diff --git a/fs/xfs/libxfs/xfs_sb.h b/fs/xfs/libxfs/xfs_sb.h > index c28b3c1..73dff28 100644 > --- a/fs/xfs/libxfs/xfs_sb.h > +++ b/fs/xfs/libxfs/xfs_sb.h > @@ -274,45 +274,6 @@ typedef enum { > XFS_SBS_FIELDCOUNT > } xfs_sb_field_t; > > -/* > - * Mask values, defined based on the xfs_sb_field_t values. > - * Only define the ones we're using. > - */ > -#define XFS_SB_MVAL(x) (1LL << XFS_SBS_ ## x) > -#define XFS_SB_UUID XFS_SB_MVAL(UUID) > -#define XFS_SB_FNAME XFS_SB_MVAL(FNAME) > -#define XFS_SB_ROOTINO XFS_SB_MVAL(ROOTINO) > -#define XFS_SB_RBMINO XFS_SB_MVAL(RBMINO) > -#define XFS_SB_RSUMINO XFS_SB_MVAL(RSUMINO) > -#define XFS_SB_VERSIONNUM XFS_SB_MVAL(VERSIONNUM) > -#define XFS_SB_UQUOTINO XFS_SB_MVAL(UQUOTINO) > -#define XFS_SB_GQUOTINO XFS_SB_MVAL(GQUOTINO) > -#define XFS_SB_QFLAGS XFS_SB_MVAL(QFLAGS) > -#define XFS_SB_SHARED_VN XFS_SB_MVAL(SHARED_VN) > -#define XFS_SB_UNIT XFS_SB_MVAL(UNIT) > -#define XFS_SB_WIDTH XFS_SB_MVAL(WIDTH) > -#define XFS_SB_ICOUNT XFS_SB_MVAL(ICOUNT) > -#define XFS_SB_IFREE XFS_SB_MVAL(IFREE) > -#define XFS_SB_FDBLOCKS XFS_SB_MVAL(FDBLOCKS) > -#define XFS_SB_FEATURES2 XFS_SB_MVAL(FEATURES2) > -#define XFS_SB_BAD_FEATURES2 XFS_SB_MVAL(BAD_FEATURES2) > -#define XFS_SB_FEATURES_COMPAT XFS_SB_MVAL(FEATURES_COMPAT) > -#define XFS_SB_FEATURES_RO_COMPAT XFS_SB_MVAL(FEATURES_RO_COMPAT) > -#define XFS_SB_FEATURES_INCOMPAT XFS_SB_MVAL(FEATURES_INCOMPAT) > -#define XFS_SB_FEATURES_LOG_INCOMPAT XFS_SB_MVAL(FEATURES_LOG_INCOMPAT) > -#define XFS_SB_CRC XFS_SB_MVAL(CRC) > -#define XFS_SB_PQUOTINO XFS_SB_MVAL(PQUOTINO) > -#define XFS_SB_NUM_BITS ((int)XFS_SBS_FIELDCOUNT) > -#define XFS_SB_ALL_BITS ((1LL << XFS_SB_NUM_BITS) - 1) > -#define XFS_SB_MOD_BITS \ > - (XFS_SB_UUID | XFS_SB_ROOTINO | XFS_SB_RBMINO | XFS_SB_RSUMINO | \ > - XFS_SB_VERSIONNUM | XFS_SB_UQUOTINO | XFS_SB_GQUOTINO | \ > - XFS_SB_QFLAGS | XFS_SB_SHARED_VN | XFS_SB_UNIT | XFS_SB_WIDTH | \ > - XFS_SB_ICOUNT | XFS_SB_IFREE | XFS_SB_FDBLOCKS | XFS_SB_FEATURES2 | \ > - XFS_SB_BAD_FEATURES2 | XFS_SB_FEATURES_COMPAT | \ > - XFS_SB_FEATURES_RO_COMPAT | XFS_SB_FEATURES_INCOMPAT | \ > - XFS_SB_FEATURES_LOG_INCOMPAT | XFS_SB_PQUOTINO) > - > > /* > * Misc. Flags - warning - these will be cleared by xfs_repair unless > @@ -612,7 +573,8 @@ extern void xfs_perag_put(struct xfs_perag *pag); > extern int xfs_initialize_perag_data(struct xfs_mount *, xfs_agnumber_t); > > extern void xfs_sb_calc_crc(struct xfs_buf *bp); > -extern void xfs_mod_sb(struct xfs_trans *tp); > +extern void xfs_log_sb(struct xfs_trans *tp); > +extern int xfs_sync_sb(struct xfs_mount *mp, bool wait); > extern void xfs_sb_mount_common(struct xfs_mount *mp, struct xfs_sb *sbp); > extern void xfs_sb_from_disk(struct xfs_sb *to, struct xfs_dsb *from); > extern void xfs_sb_to_disk(struct xfs_dsb *to, struct xfs_sb *from); > diff --git a/fs/xfs/libxfs/xfs_shared.h b/fs/xfs/libxfs/xfs_shared.h > index 82404da..4ae617a 100644 > --- a/fs/xfs/libxfs/xfs_shared.h > +++ b/fs/xfs/libxfs/xfs_shared.h > @@ -82,7 +82,7 @@ extern const struct xfs_buf_ops xfs_symlink_buf_ops; > #define XFS_TRANS_ATTR_RM 23 > #define XFS_TRANS_ATTR_FLAG 24 > #define XFS_TRANS_CLEAR_AGI_BUCKET 25 > -#define XFS_TRANS_QM_SBCHANGE 26 > +#define XFS_TRANS_SB_CHANGE 26 > /* > * Dummy entries since we use the transaction type to index into the > * trans_type[] in xlog_recover_print_trans_head() > @@ -95,17 +95,15 @@ extern const struct xfs_buf_ops xfs_symlink_buf_ops; > #define XFS_TRANS_QM_DQCLUSTER 32 > #define XFS_TRANS_QM_QINOCREATE 33 > #define XFS_TRANS_QM_QUOTAOFF_END 34 > -#define XFS_TRANS_SB_UNIT 35 > -#define XFS_TRANS_FSYNC_TS 36 > -#define XFS_TRANS_GROWFSRT_ALLOC 37 > -#define XFS_TRANS_GROWFSRT_ZERO 38 > -#define XFS_TRANS_GROWFSRT_FREE 39 > -#define XFS_TRANS_SWAPEXT 40 > -#define XFS_TRANS_SB_COUNT 41 > -#define XFS_TRANS_CHECKPOINT 42 > -#define XFS_TRANS_ICREATE 43 > -#define XFS_TRANS_CREATE_TMPFILE 44 > -#define XFS_TRANS_TYPE_MAX 44 > +#define XFS_TRANS_FSYNC_TS 35 > +#define XFS_TRANS_GROWFSRT_ALLOC 36 > +#define XFS_TRANS_GROWFSRT_ZERO 37 > +#define XFS_TRANS_GROWFSRT_FREE 37 > +#define XFS_TRANS_SWAPEXT 39 > +#define XFS_TRANS_CHECKPOINT 40 > +#define XFS_TRANS_ICREATE 41 > +#define XFS_TRANS_CREATE_TMPFILE 42 > +#define XFS_TRANS_TYPE_MAX 43 > /* new transaction types need to be reflected in xfs_logprint(8) */ > > #define XFS_TRANS_TYPES \ > @@ -134,20 +132,18 @@ extern const struct xfs_buf_ops xfs_symlink_buf_ops; > { XFS_TRANS_ATTR_RM, "ATTR_RM" }, \ > { XFS_TRANS_ATTR_FLAG, "ATTR_FLAG" }, \ > { XFS_TRANS_CLEAR_AGI_BUCKET, "CLEAR_AGI_BUCKET" }, \ > - { XFS_TRANS_QM_SBCHANGE, "QM_SBCHANGE" }, \ > + { XFS_TRANS_SB_CHANGE, "SBCHANGE" }, \ > { XFS_TRANS_QM_QUOTAOFF, "QM_QUOTAOFF" }, \ > { XFS_TRANS_QM_DQALLOC, "QM_DQALLOC" }, \ > { XFS_TRANS_QM_SETQLIM, "QM_SETQLIM" }, \ > { XFS_TRANS_QM_DQCLUSTER, "QM_DQCLUSTER" }, \ > { XFS_TRANS_QM_QINOCREATE, "QM_QINOCREATE" }, \ > { XFS_TRANS_QM_QUOTAOFF_END, "QM_QOFF_END" }, \ > - { XFS_TRANS_SB_UNIT, "SB_UNIT" }, \ > { XFS_TRANS_FSYNC_TS, "FSYNC_TS" }, \ > { XFS_TRANS_GROWFSRT_ALLOC, "GROWFSRT_ALLOC" }, \ > { XFS_TRANS_GROWFSRT_ZERO, "GROWFSRT_ZERO" }, \ > { XFS_TRANS_GROWFSRT_FREE, "GROWFSRT_FREE" }, \ > { XFS_TRANS_SWAPEXT, "SWAPEXT" }, \ > - { XFS_TRANS_SB_COUNT, "SB_COUNT" }, \ > { XFS_TRANS_CHECKPOINT, "CHECKPOINT" }, \ > { XFS_TRANS_DUMMY1, "DUMMY1" }, \ > { XFS_TRANS_DUMMY2, "DUMMY2" }, \ > diff --git a/fs/xfs/libxfs/xfs_trans_resv.c b/fs/xfs/libxfs/xfs_trans_resv.c > index f2bda7c..7c42e2c 100644 > --- a/fs/xfs/libxfs/xfs_trans_resv.c > +++ b/fs/xfs/libxfs/xfs_trans_resv.c > @@ -718,17 +718,6 @@ xfs_calc_clear_agi_bucket_reservation( > } > > /* > - * Clearing the quotaflags in the superblock. > - * the super block for changing quota flags: sector size > - */ > -STATIC uint > -xfs_calc_qm_sbchange_reservation( > - struct xfs_mount *mp) > -{ > - return xfs_calc_buf_res(1, mp->m_sb.sb_sectsize); > -} > - > -/* > * Adjusting quota limits. > * the xfs_disk_dquot_t: sizeof(struct xfs_disk_dquot) > */ > @@ -866,9 +855,6 @@ xfs_trans_resv_calc( > * The following transactions are logged in logical format with > * a default log count. > */ > - resp->tr_qm_sbchange.tr_logres = xfs_calc_qm_sbchange_reservation(mp); > - resp->tr_qm_sbchange.tr_logcount = XFS_DEFAULT_LOG_COUNT; > - > resp->tr_qm_setqlim.tr_logres = xfs_calc_qm_setqlim_reservation(mp); > resp->tr_qm_setqlim.tr_logcount = XFS_DEFAULT_LOG_COUNT; > > diff --git a/fs/xfs/libxfs/xfs_trans_resv.h b/fs/xfs/libxfs/xfs_trans_resv.h > index 1097d14..2d5bdfc 100644 > --- a/fs/xfs/libxfs/xfs_trans_resv.h > +++ b/fs/xfs/libxfs/xfs_trans_resv.h > @@ -56,7 +56,6 @@ struct xfs_trans_resv { > struct xfs_trans_res tr_growrtalloc; /* grow realtime allocations */ > struct xfs_trans_res tr_growrtzero; /* grow realtime zeroing */ > struct xfs_trans_res tr_growrtfree; /* grow realtime freeing */ > - struct xfs_trans_res tr_qm_sbchange; /* change quota flags */ > struct xfs_trans_res tr_qm_setqlim; /* adjust quota limits */ > struct xfs_trans_res tr_qm_dqalloc; /* allocate quota on disk */ > struct xfs_trans_res tr_qm_quotaoff; /* turn quota off */ > diff --git a/fs/xfs/xfs_fsops.c b/fs/xfs/xfs_fsops.c > index 2c44e0b..126b4b3 100644 > --- a/fs/xfs/xfs_fsops.c > +++ b/fs/xfs/xfs_fsops.c > @@ -763,35 +763,6 @@ out: > return 0; > } > > -/* > - * Dump a transaction into the log that contains no real change. This is needed > - * to be able to make the log dirty or stamp the current tail LSN into the log > - * during the covering operation. > - * > - * We cannot use an inode here for this - that will push dirty state back up > - * into the VFS and then periodic inode flushing will prevent log covering from > - * making progress. Hence we log a field in the superblock instead and use a > - * synchronous transaction to ensure the superblock is immediately unpinned > - * and can be written back. > - */ > -int > -xfs_fs_log_dummy( > - xfs_mount_t *mp) > -{ > - xfs_trans_t *tp; > - int error; > - > - tp = _xfs_trans_alloc(mp, XFS_TRANS_DUMMY1, KM_SLEEP); > - error = xfs_trans_reserve(tp, &M_RES(mp)->tr_sb, 0, 0); > - if (error) { > - xfs_trans_cancel(tp, 0); > - return error; > - } > - xfs_mod_sb(tp); > - xfs_trans_set_sync(tp); > - return xfs_trans_commit(tp, 0); > -} > - > int > xfs_fs_goingdown( > xfs_mount_t *mp, > diff --git a/fs/xfs/xfs_log.c b/fs/xfs/xfs_log.c > index ca4fd5b..8eaa8f5 100644 > --- a/fs/xfs/xfs_log.c > +++ b/fs/xfs/xfs_log.c > @@ -1292,9 +1292,20 @@ xfs_log_worker( > struct xfs_mount *mp = log->l_mp; > > /* dgc: errors ignored - not fatal and nowhere to report them */ > - if (xfs_log_need_covered(mp)) > - xfs_fs_log_dummy(mp); > - else > + if (xfs_log_need_covered(mp)) { > + /* > + * Dump a transaction into the log that contains no real change. > + * This is needed stamp the current tail LSN into the log during > + * the covering operation. > + * > + * We cannot use an inode here for this - that will push dirty > + * state back up into the VFS and then periodic inode flushing > + * will prevent log covering from making progress. Hence we > + * synchronously log the superblock instead to ensure the > + * superblock is immediately unpinned and can be written back. > + */ > + xfs_sync_sb(mp, true); > + } else > xfs_log_force(mp, 0); > > /* start pushing all the metadata that is currently dirty */ > diff --git a/fs/xfs/xfs_mount.c b/fs/xfs/xfs_mount.c > index 592e169..af4e01f 100644 > --- a/fs/xfs/xfs_mount.c > +++ b/fs/xfs/xfs_mount.c > @@ -419,11 +419,11 @@ xfs_update_alignment(xfs_mount_t *mp) > if (xfs_sb_version_hasdalign(sbp)) { > if (sbp->sb_unit != mp->m_dalign) { > sbp->sb_unit = mp->m_dalign; > - mp->m_update_flags |= XFS_SB_UNIT; > + mp->m_update_sb = true; > } > if (sbp->sb_width != mp->m_swidth) { > sbp->sb_width = mp->m_swidth; > - mp->m_update_flags |= XFS_SB_WIDTH; > + mp->m_update_sb = true; > } > } else { > xfs_warn(mp, > @@ -591,38 +591,19 @@ int > xfs_mount_reset_sbqflags( > struct xfs_mount *mp) > { > - int error; > - struct xfs_trans *tp; > - > mp->m_qflags = 0; > > - /* > - * It is OK to look at sb_qflags here in mount path, > - * without m_sb_lock. > - */ > + /* It is OK to look at sb_qflags in the mount path without m_sb_lock. */ > if (mp->m_sb.sb_qflags == 0) > return 0; > spin_lock(&mp->m_sb_lock); > mp->m_sb.sb_qflags = 0; > spin_unlock(&mp->m_sb_lock); > > - /* > - * If the fs is readonly, let the incore superblock run > - * with quotas off but don't flush the update out to disk > - */ > - if (mp->m_flags & XFS_MOUNT_RDONLY) > + if (!xfs_fs_writable(mp)) > return 0; > > - tp = xfs_trans_alloc(mp, XFS_TRANS_QM_SBCHANGE); > - error = xfs_trans_reserve(tp, &M_RES(mp)->tr_qm_sbchange, 0, 0); > - if (error) { > - xfs_trans_cancel(tp, 0); > - xfs_alert(mp, "%s: Superblock update failed!", __func__); > - return error; > - } > - > - xfs_mod_sb(tp); > - return xfs_trans_commit(tp, 0); > + return xfs_sync_sb(mp, false); > } > > __uint64_t > @@ -686,7 +667,7 @@ xfs_mountfs( > xfs_warn(mp, "correcting sb_features alignment problem"); > sbp->sb_features2 |= sbp->sb_bad_features2; > sbp->sb_bad_features2 = sbp->sb_features2; > - mp->m_update_flags |= XFS_SB_FEATURES2 | XFS_SB_BAD_FEATURES2; > + mp->m_update_sb = true; > > /* > * Re-check for ATTR2 in case it was found in bad_features2 > @@ -700,17 +681,17 @@ xfs_mountfs( > if (xfs_sb_version_hasattr2(&mp->m_sb) && > (mp->m_flags & XFS_MOUNT_NOATTR2)) { > xfs_sb_version_removeattr2(&mp->m_sb); > - mp->m_update_flags |= XFS_SB_FEATURES2; > + mp->m_update_sb = true; > > /* update sb_versionnum for the clearing of the morebits */ > if (!sbp->sb_features2) > - mp->m_update_flags |= XFS_SB_VERSIONNUM; > + mp->m_update_sb = true; > } > > /* 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; > + mp->m_update_sb = true; > } > > /* > @@ -904,8 +885,8 @@ xfs_mountfs( > * the next remount into writeable mode. Otherwise we would never > * perform the update e.g. for the root filesystem. > */ > - if (mp->m_update_flags && !(mp->m_flags & XFS_MOUNT_RDONLY)) { > - error = xfs_mount_log_sb(mp); > + if (mp->m_update_sb && !(mp->m_flags & XFS_MOUNT_RDONLY)) { > + error = xfs_sync_sb(mp, false); > if (error) { > xfs_warn(mp, "failed to write sb changes"); > goto out_rtunmount; > @@ -1100,9 +1081,6 @@ xfs_fs_writable(xfs_mount_t *mp) > int > xfs_log_sbcount(xfs_mount_t *mp) > { > - xfs_trans_t *tp; > - int error; > - > if (!xfs_fs_writable(mp)) > return 0; > > @@ -1115,17 +1093,7 @@ xfs_log_sbcount(xfs_mount_t *mp) > if (!xfs_sb_version_haslazysbcount(&mp->m_sb)) > return 0; > > - tp = _xfs_trans_alloc(mp, XFS_TRANS_SB_COUNT, KM_SLEEP); > - error = xfs_trans_reserve(tp, &M_RES(mp)->tr_sb, 0, 0); > - if (error) { > - xfs_trans_cancel(tp, 0); > - return error; > - } > - > - xfs_mod_sb(tp); > - xfs_trans_set_sync(tp); > - error = xfs_trans_commit(tp, 0); > - return error; > + return xfs_sync_sb(mp, true); > } > > /* > @@ -1419,28 +1387,6 @@ xfs_freesb( > } > > /* > - * Used to log changes to the superblock unit and width fields which could > - * be altered by the mount options, as well as any potential sb_features2 > - * fixup. Only the first superblock is updated. > - */ > -int > -xfs_mount_log_sb( > - xfs_mount_t *mp) > -{ > - xfs_trans_t *tp; > - int error; > - > - tp = xfs_trans_alloc(mp, XFS_TRANS_SB_UNIT); > - error = xfs_trans_reserve(tp, &M_RES(mp)->tr_sb, 0, 0); > - if (error) { > - xfs_trans_cancel(tp, 0); > - return error; > - } > - xfs_mod_sb(tp); > - return xfs_trans_commit(tp, 0); > -} > - > -/* > * If the underlying (data/log/rt) device is readonly, there are some > * operations that cannot proceed. > */ > diff --git a/fs/xfs/xfs_mount.h b/fs/xfs/xfs_mount.h > index 1ae9f56..40e72e3 100644 > --- a/fs/xfs/xfs_mount.h > +++ b/fs/xfs/xfs_mount.h > @@ -162,8 +162,7 @@ typedef struct xfs_mount { > struct delayed_work m_reclaim_work; /* background inode reclaim */ > struct delayed_work m_eofblocks_work; /* background eof blocks > trimming */ > - __int64_t m_update_flags; /* sb flags we need to update > - on the next remount,rw */ > + bool m_update_sb; /* sb needs update in mount */ > int64_t m_low_space[XFS_LOWSP_MAX]; > /* low free space thresholds */ > struct xfs_kobj m_kobj; > diff --git a/fs/xfs/xfs_qm.c b/fs/xfs/xfs_qm.c > index 170f951..37486c1 100644 > --- a/fs/xfs/xfs_qm.c > +++ b/fs/xfs/xfs_qm.c > @@ -793,7 +793,7 @@ xfs_qm_qino_alloc( > else > mp->m_sb.sb_pquotino = (*ip)->i_ino; > spin_unlock(&mp->m_sb_lock); > - xfs_mod_sb(tp); > + xfs_log_sb(tp); > > if ((error = xfs_trans_commit(tp, XFS_TRANS_RELEASE_LOG_RES))) { > xfs_alert(mp, "%s failed (error %d)!", __func__, error); > @@ -1446,7 +1446,7 @@ xfs_qm_mount_quotas( > spin_unlock(&mp->m_sb_lock); > > if (sbf != (mp->m_qflags & XFS_MOUNT_QUOTA_ALL)) { > - if (xfs_qm_write_sb_changes(mp)) { > + if (xfs_sync_sb(mp, false)) { > /* > * We could only have been turning quotas off. > * We aren't in very good shape actually because > @@ -1575,29 +1575,6 @@ xfs_qm_dqfree_one( > xfs_qm_dqdestroy(dqp); > } > > -/* > - * Start a transaction and write the incore superblock changes to > - * disk. flags parameter indicates which fields have changed. > - */ > -int > -xfs_qm_write_sb_changes( > - struct xfs_mount *mp) > -{ > - xfs_trans_t *tp; > - int error; > - > - tp = xfs_trans_alloc(mp, XFS_TRANS_QM_SBCHANGE); > - error = xfs_trans_reserve(tp, &M_RES(mp)->tr_qm_sbchange, 0, 0); > - if (error) { > - xfs_trans_cancel(tp, 0); > - return error; > - } > - > - xfs_mod_sb(tp); > - return xfs_trans_commit(tp, 0); > -} > - > - > /* --------------- utility functions for vnodeops ---------------- */ > > > diff --git a/fs/xfs/xfs_qm_syscalls.c b/fs/xfs/xfs_qm_syscalls.c > index 45f28f1..d558306 100644 > --- a/fs/xfs/xfs_qm_syscalls.c > +++ b/fs/xfs/xfs_qm_syscalls.c > @@ -93,7 +93,7 @@ xfs_qm_scall_quotaoff( > mutex_unlock(&q->qi_quotaofflock); > > /* XXX what to do if error ? Revert back to old vals incore ? */ > - return xfs_qm_write_sb_changes(mp); > + return xfs_sync_sb(mp, false); > } > > dqtype = 0; > @@ -370,7 +370,8 @@ xfs_qm_scall_quotaon( > if ((qf & flags) == flags) > return -EEXIST; > > - if ((error = xfs_qm_write_sb_changes(mp))) > + error = xfs_sync_sb(mp, false); > + if (error) > return error; > /* > * If we aren't trying to switch on quota enforcement, we are done. > @@ -795,7 +796,7 @@ xfs_qm_log_quotaoff( > mp->m_sb.sb_qflags = (mp->m_qflags & ~(flags)) & XFS_MOUNT_QUOTA_ALL; > spin_unlock(&mp->m_sb_lock); > > - xfs_mod_sb(tp); > + xfs_log_sb(tp); > > /* > * We have to make sure that the transaction is secure on disk before we > diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c > index 8aa9eb4..1c52726 100644 > --- a/fs/xfs/xfs_super.c > +++ b/fs/xfs/xfs_super.c > @@ -1249,13 +1249,13 @@ xfs_fs_remount( > * If this is the first remount to writeable state we > * might have some superblock changes to update. > */ > - if (mp->m_update_flags) { > - error = xfs_mount_log_sb(mp); > + if (mp->m_update_sb) { > + error = xfs_sync_sb(mp, false); > if (error) { > xfs_warn(mp, "failed to write sb changes"); > return error; > } > - mp->m_update_flags = 0; > + mp->m_update_sb = false; > } > > /* > @@ -1285,8 +1285,9 @@ xfs_fs_remount( > > /* > * Second stage of a freeze. The data is already frozen so we only > - * need to take care of the metadata. Once that's done write a dummy > - * record to dirty the log in case of a crash while frozen. > + * need to take care of the metadata. Once that's done sync the superblock > + * to the log to dirty it in case of a crash while frozen. This ensures that we > + * will recover the unlinked inode lists on the next mount. > */ > STATIC int > xfs_fs_freeze( > @@ -1296,7 +1297,7 @@ xfs_fs_freeze( > > xfs_save_resvblks(mp); > xfs_quiesce_attr(mp); > - return xfs_fs_log_dummy(mp); > + return xfs_sync_sb(mp, true); > } > > STATIC int > -- > 2.0.0 > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From sandeen@sandeen.net Fri Aug 1 09:59: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 D44A57F54 for ; Fri, 1 Aug 2014 09:59:23 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id C19C4304067 for ; Fri, 1 Aug 2014 07:59:23 -0700 (PDT) X-ASG-Debug-ID: 1406905162-04cb6c555dab770001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id vE2ysIRnQD699UT1 for ; Fri, 01 Aug 2014 07:59:22 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: by sandeen.net (Postfix, from userid 500) id 2599D6CC1C13; Fri, 1 Aug 2014 09:59:22 -0500 (CDT) From: Eric Sandeen To: xfs@oss.sgi.com Subject: [PATCH 0/6] xfsprogs: fix resource leaks Date: Fri, 1 Aug 2014 09:59:13 -0500 X-ASG-Orig-Subj: [PATCH 0/6] xfsprogs: fix resource leaks Message-Id: <1406905159-12415-1-git-send-email-sandeen@redhat.com> X-Mailer: git-send-email 1.7.1 X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1406905162 X-Barracuda-URL: http://192.48.176.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.8035 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- This is the result of getting bored while on "vacation: ;) It knocks out all coverity-reported resource leaks, eliminating 16 reported defects. Thanks, -Eric From sandeen@sandeen.net Fri Aug 1 09:59: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 E3F627F56 for ; Fri, 1 Aug 2014 09: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 C19EA8F8081 for ; Fri, 1 Aug 2014 07:59:23 -0700 (PDT) X-ASG-Debug-ID: 1406905162-04cbb02d86b28e0001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id BjV2QovJXtGYtDbT for ; Fri, 01 Aug 2014 07:59:23 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: by sandeen.net (Postfix, from userid 500) id 73F516CC1C18; Fri, 1 Aug 2014 09:59:22 -0500 (CDT) From: Eric Sandeen To: xfs@oss.sgi.com Subject: [PATCH 5/6] xfs_io: fix leaks in parent_list() Date: Fri, 1 Aug 2014 09:59:18 -0500 X-ASG-Orig-Subj: [PATCH 5/6] xfs_io: fix leaks in parent_list() Message-Id: <1406905159-12415-6-git-send-email-sandeen@redhat.com> X-Mailer: git-send-email 1.7.1 In-Reply-To: <1406905159-12415-1-git-send-email-sandeen@redhat.com> References: <1406905159-12415-1-git-send-email-sandeen@redhat.com> X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1406905162 X-Barracuda-URL: http://192.48.176.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.8035 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- parent_list() has instances where a handle is leaked, both by going out of scope, and on error paths. Signed-off-by: Eric Sandeen --- io/parent.c | 6 ++++-- 1 files changed, 4 insertions(+), 2 deletions(-) diff --git a/io/parent.c b/io/parent.c index 56e126d..0313119 100644 --- a/io/parent.c +++ b/io/parent.c @@ -293,7 +293,7 @@ print_parent_entry(parent_t *parent, int fullpath) static int parent_list(int fullpath) { - void *handlep; + void *handlep = NULL; size_t handlen; int error, i; int retval = 1; @@ -313,6 +313,7 @@ parent_list(int fullpath) progname, path, strerror(errno)); goto error; } + free_handle(fshandle, fshlen); } if (path_to_handle(path, &handlep, &handlen) != 0) { @@ -325,7 +326,7 @@ parent_list(int fullpath) if (!parentbuf) { fprintf(stderr, _("%s: unable to allocate parent buffer: %s\n"), progname, strerror(errno)); - return 1; + goto error; } if (fullpath) { @@ -365,6 +366,7 @@ parent_list(int fullpath) retval = 0; error: + free(handlep); free(parentbuf); return retval; } -- 1.7.1 From sandeen@sandeen.net Fri Aug 1 09:59: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 EA8BB7F57 for ; Fri, 1 Aug 2014 09:59:23 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id D94778F807A for ; Fri, 1 Aug 2014 07:59:23 -0700 (PDT) X-ASG-Debug-ID: 1406905162-04cb6c555dab780001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id T9B1mcDpzxqQwGl1 for ; Fri, 01 Aug 2014 07:59:23 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: by sandeen.net (Postfix, from userid 500) id 80E776CC1C19; Fri, 1 Aug 2014 09:59:22 -0500 (CDT) From: Eric Sandeen To: xfs@oss.sgi.com Subject: [PATCH 6/6] xfs_db: free flist on error in write_struct() Date: Fri, 1 Aug 2014 09:59:19 -0500 X-ASG-Orig-Subj: [PATCH 6/6] xfs_db: free flist on error in write_struct() Message-Id: <1406905159-12415-7-git-send-email-sandeen@redhat.com> X-Mailer: git-send-email 1.7.1 In-Reply-To: <1406905159-12415-1-git-send-email-sandeen@redhat.com> References: <1406905159-12415-1-git-send-email-sandeen@redhat.com> X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1406905162 X-Barracuda-URL: http://192.48.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.60 X-Barracuda-Spam-Status: No, SCORE=2.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MV0249, MARKETING_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.8035 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words 2.00 BSF_SC0_MV0249 Custom rule MV0249 One error path in write_struct() wasn't freeing the flist_t *fl which was allocated, so it leaks. Signed-off-by: Eric Sandeen --- db/write.c | 1 + 1 files changed, 1 insertions(+), 0 deletions(-) diff --git a/db/write.c b/db/write.c index 0157a44..a0f14f4 100644 --- a/db/write.c +++ b/db/write.c @@ -652,6 +652,7 @@ write_struct( buf = convert_arg(argv[1], bit_length); if (!buf) { dbprintf(_("unable to convert value '%s'.\n"), argv[1]); + flist_free(fl); return; } -- 1.7.1 From sandeen@sandeen.net Fri Aug 1 09:59: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 F11367F58 for ; Fri, 1 Aug 2014 09: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 DECD78F8089 for ; Fri, 1 Aug 2014 07:59:23 -0700 (PDT) X-ASG-Debug-ID: 1406905162-04cbb02d83b28d0001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id AB3g992LHLcpQrHx for ; Fri, 01 Aug 2014 07:59:22 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: by sandeen.net (Postfix, from userid 500) id 55A8E6CC1C16; Fri, 1 Aug 2014 09:59:22 -0500 (CDT) From: Eric Sandeen To: xfs@oss.sgi.com Subject: [PATCH 3/6] xfs_fsr: free handlep in fsrfs Date: Fri, 1 Aug 2014 09:59:16 -0500 X-ASG-Orig-Subj: [PATCH 3/6] xfs_fsr: free handlep in fsrfs Message-Id: <1406905159-12415-4-git-send-email-sandeen@redhat.com> X-Mailer: git-send-email 1.7.1 In-Reply-To: <1406905159-12415-1-git-send-email-sandeen@redhat.com> References: <1406905159-12415-1-git-send-email-sandeen@redhat.com> X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1406905162 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 2.60 X-Barracuda-Spam-Status: No, SCORE=2.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MV0249, MARKETING_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.8035 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words 2.00 BSF_SC0_MV0249 Custom rule MV0249 We leaked the fshandlep in both error returns and normal function exit. Signed-off-by: Eric Sandeen --- fsr/xfs_fsr.c | 3 +++ 1 files changed, 3 insertions(+), 0 deletions(-) diff --git a/fsr/xfs_fsr.c b/fsr/xfs_fsr.c index 752d2db..580604c 100644 --- a/fsr/xfs_fsr.c +++ b/fsr/xfs_fsr.c @@ -702,6 +702,7 @@ fsrfs(char *mntdir, xfs_ino_t startino, int targetrange) if ((fsfd = open(mntdir, O_RDONLY)) < 0) { fsrprintf(_("unable to open: %s: %s\n"), mntdir, strerror( errno )); + free(fshandlep); return -1; } @@ -709,6 +710,7 @@ fsrfs(char *mntdir, xfs_ino_t startino, int targetrange) fsrprintf(_("Skipping %s: could not get XFS geometry\n"), mntdir); close(fsfd); + free(fshandlep); return -1; } @@ -774,6 +776,7 @@ fsrfs(char *mntdir, xfs_ino_t startino, int targetrange) out0: tmp_close(mntdir); close(fsfd); + free(fshandlep); return 0; } -- 1.7.1 From sandeen@sandeen.net Fri Aug 1 09:59: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 (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 0ABEF7F59 for ; Fri, 1 Aug 2014 09:59:24 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id DECBD8F8087 for ; Fri, 1 Aug 2014 07:59:23 -0700 (PDT) X-ASG-Debug-ID: 1406905162-04cb6c555cab770001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id AaYn0icRcb7CeThx for ; Fri, 01 Aug 2014 07:59:22 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: by sandeen.net (Postfix, from userid 500) id 357946CC1C14; Fri, 1 Aug 2014 09:59:22 -0500 (CDT) From: Eric Sandeen To: xfs@oss.sgi.com Subject: [PATCH 1/6] xfs_io: free fshandlep in parent_check() Date: Fri, 1 Aug 2014 09:59:14 -0500 X-ASG-Orig-Subj: [PATCH 1/6] xfs_io: free fshandlep in parent_check() Message-Id: <1406905159-12415-2-git-send-email-sandeen@redhat.com> X-Mailer: git-send-email 1.7.1 In-Reply-To: <1406905159-12415-1-git-send-email-sandeen@redhat.com> References: <1406905159-12415-1-git-send-email-sandeen@redhat.com> X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1406905162 X-Barracuda-URL: http://192.48.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.60 X-Barracuda-Spam-Status: No, SCORE=2.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MV0249, MARKETING_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.8035 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words 2.00 BSF_SC0_MV0249 Custom rule MV0249 The allocated fshandle wasn't freed in either normal exit or error paths. Do this, and consolidate cleanup into an out: target. Signed-off-by: Eric Sandeen --- io/parent.c | 7 ++++--- 1 files changed, 4 insertions(+), 3 deletions(-) diff --git a/io/parent.c b/io/parent.c index ca989e9..56e126d 100644 --- a/io/parent.c +++ b/io/parent.c @@ -258,9 +258,8 @@ parent_check(void) if (!bstatbuf || !parentbuf) { fprintf(stderr, _("unable to allocate buffers: %s\n"), strerror(errno)); - free(bstatbuf); - free(parentbuf); - return 1; + err_status = 1; + goto out; } if (do_bulkstat(parentbuf, &parentbuf_size, bstatbuf, fsfd, fshandlep) != 0) @@ -272,8 +271,10 @@ parent_check(void) printf(_("succeeded checking %llu inodes\n"), (unsigned long long) inodes_checked); +out: free(bstatbuf); free(parentbuf); + free(fshandlep); return err_status; } -- 1.7.1 From sandeen@sandeen.net Fri Aug 1 09:59: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 E23BC7F55 for ; Fri, 1 Aug 2014 09:59:23 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id C1BA48F8084 for ; Fri, 1 Aug 2014 07:59:23 -0700 (PDT) X-ASG-Debug-ID: 1406905162-04cb6c555eab780001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id BIb2PNDe9MOCSeeu for ; Fri, 01 Aug 2014 07:59:22 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: by sandeen.net (Postfix, from userid 500) id 6590B6CC1C17; Fri, 1 Aug 2014 09:59:22 -0500 (CDT) From: Eric Sandeen To: xfs@oss.sgi.com Subject: [PATCH 4/6] libhandle: Fix handle leak in path_to_fshandle error paths Date: Fri, 1 Aug 2014 09:59:17 -0500 X-ASG-Orig-Subj: [PATCH 4/6] libhandle: Fix handle leak in path_to_fshandle error paths Message-Id: <1406905159-12415-5-git-send-email-sandeen@redhat.com> X-Mailer: git-send-email 1.7.1 In-Reply-To: <1406905159-12415-1-git-send-email-sandeen@redhat.com> References: <1406905159-12415-1-git-send-email-sandeen@redhat.com> X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1406905162 X-Barracuda-URL: http://192.48.176.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.8035 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- path_to_fshandle calls obj_to_handle, which potentially allocates a handle, but the handle isn't freed on a subsequent error path. Signed-off-by: Eric Sandeen --- libhandle/handle.c | 1 + 1 files changed, 1 insertions(+), 0 deletions(-) diff --git a/libhandle/handle.c b/libhandle/handle.c index 9f81483..3c1395a 100644 --- a/libhandle/handle.c +++ b/libhandle/handle.c @@ -97,6 +97,7 @@ path_to_fshandle( /* new filesystem. add it to the cache */ fdhp = malloc(sizeof(struct fdhash)); if (fdhp == NULL) { + free(*fshanp); close(fd); errno = ENOMEM; return -1; -- 1.7.1 From sandeen@sandeen.net Fri Aug 1 09:59: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 9558B7F54 for ; Fri, 1 Aug 2014 09:59:24 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 2B200AC006 for ; Fri, 1 Aug 2014 07:59:24 -0700 (PDT) X-ASG-Debug-ID: 1406905162-04cb6c555fab780001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id zDau82bNwKjszAz3 for ; Fri, 01 Aug 2014 07:59:22 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: by sandeen.net (Postfix, from userid 500) id 473376CC1C15; Fri, 1 Aug 2014 09:59:22 -0500 (CDT) From: Eric Sandeen To: xfs@oss.sgi.com Subject: [PATCH 2/6] xfs_fsr: fix leaks & catch error in fsrfile() Date: Fri, 1 Aug 2014 09:59:15 -0500 X-ASG-Orig-Subj: [PATCH 2/6] xfs_fsr: fix leaks & catch error in fsrfile() Message-Id: <1406905159-12415-3-git-send-email-sandeen@redhat.com> X-Mailer: git-send-email 1.7.1 In-Reply-To: <1406905159-12415-1-git-send-email-sandeen@redhat.com> References: <1406905159-12415-1-git-send-email-sandeen@redhat.com> X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1406905162 X-Barracuda-URL: http://192.48.176.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.8035 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- The allocated fshandlep leaks on most error paths; restructure with an out: target that does all necessary freeing, and initialize filehandles to -1 so that we know whether they need to be closed on the error path. While we're at it, if gettmpname() fails, we still return 0 for an error, because error is initialized to 0 and only set otherwise by fsrfile_common. So if gettmpname() fails, we return success from the function even though we did no work. Fix that as well by initializing error to -1. Signed-off-by: Eric Sandeen --- fsr/xfs_fsr.c | 28 ++++++++++++++-------------- 1 files changed, 14 insertions(+), 14 deletions(-) diff --git a/fsr/xfs_fsr.c b/fsr/xfs_fsr.c index 48629fd..752d2db 100644 --- a/fsr/xfs_fsr.c +++ b/fsr/xfs_fsr.c @@ -809,15 +809,15 @@ fsrfile(char *fname, xfs_ino_t ino) { xfs_bstat_t statbuf; jdm_fshandle_t *fshandlep; - int fd, fsfd; - int error = 0; + int fd = -1, fsfd = -1; + int error = -1; char *tname; fshandlep = jdm_getfshandle(getparent (fname) ); - if (! fshandlep) { + if (!fshandlep) { fsrprintf(_("unable to construct sys handle for %s: %s\n"), fname, strerror(errno)); - return -1; + goto out; } /* @@ -828,39 +828,39 @@ fsrfile(char *fname, xfs_ino_t ino) if (fsfd < 0) { fsrprintf(_("unable to open sys handle for %s: %s\n"), fname, strerror(errno)); - return -1; + goto out; } if ((xfs_bulkstat_single(fsfd, &ino, &statbuf)) < 0) { fsrprintf(_("unable to get bstat on %s: %s\n"), fname, strerror(errno)); - close(fsfd); - return -1; + goto out; } fd = jdm_open(fshandlep, &statbuf, O_RDWR|O_DIRECT); if (fd < 0) { fsrprintf(_("unable to open handle %s: %s\n"), fname, strerror(errno)); - close(fsfd); - return -1; + goto out; } /* Get the fs geometry */ if (xfs_getgeom(fsfd, &fsgeom) < 0 ) { fsrprintf(_("Unable to get geom on fs for: %s\n"), fname); - close(fsfd); - return -1; + goto out; } - close(fsfd); - tname = gettmpname(fname); if (tname) error = fsrfile_common(fname, tname, NULL, fd, &statbuf); - close(fd); +out: + if (fsfd >= 0) + close(fsfd); + if (fd >= 0) + close(fd); + free(fshandlep); return error; } -- 1.7.1 From sandeen@redhat.com Fri Aug 1 10:11: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 36AC87F50 for ; Fri, 1 Aug 2014 10:11:13 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 16A1F30405F for ; Fri, 1 Aug 2014 08:11:09 -0700 (PDT) X-ASG-Debug-ID: 1406905868-04cbb02d86b31a0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id EubJ1rkM3EG72z7G (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 01 Aug 2014 08:11:09 -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 s71FB8Md022779 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK) for ; Fri, 1 Aug 2014 11:11:08 -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 s71FB7GQ000950 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES128-SHA bits=128 verify=NO) for ; Fri, 1 Aug 2014 11:11:07 -0400 Message-ID: <53DBAE0B.6020000@redhat.com> Date: Fri, 01 Aug 2014 10:11:07 -0500 From: Eric Sandeen MIME-Version: 1.0 To: xfs-oss Subject: [PATCH] xfs: avoid double free on xlog_recover_commit_trans error X-Enigmail-Version: 1.6 X-ASG-Orig-Subj: [PATCH] xfs: avoid double free on xlog_recover_commit_trans error 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: 1406905868 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 xlog_recover_process_data() frees the transaction on any error out of the oh_flags switch statement, but in the XLOG_COMMIT_TRANS / xlog_recover_commit_trans() case, the transaction has already been freed in xlog_recover_commit_trans() before the error is returned. Avoid this by only freeing the transaction in xlog_recover_commit_trans() if no error will be returned. (Coverity spotted this) Signed-off-by: Eric Sandeen --- diff --git a/fs/xfs/xfs_log_recover.c b/fs/xfs/xfs_log_recover.c index 981af0f..e634ffd 100644 --- a/fs/xfs/xfs_log_recover.c +++ b/fs/xfs/xfs_log_recover.c @@ -3514,9 +3514,11 @@ out: if (!list_empty(&done_list)) list_splice_init(&done_list, &trans->r_itemq); - xlog_recover_free_trans(trans); - error2 = xfs_buf_delwri_submit(&buffer_list); + /* caller will free trans on error */ + if (!error && !error2) + xlog_recover_free_trans(trans); + return error ? error : error2; } From noreply@release.debian.org Fri Aug 1 11:39: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 1ABD07F51 for ; Fri, 1 Aug 2014 11:39:30 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 0943A30405F for ; Fri, 1 Aug 2014 09:39:29 -0700 (PDT) X-ASG-Debug-ID: 1406911165-04cbb02d86b71e0001-NocioJ Received: from picconi.debian.org (picconi.debian.org [5.153.231.3]) by cuda.sgi.com with ESMTP id AFpjtOZ9UvVHeEEV (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO) for ; Fri, 01 Aug 2014 09:39:26 -0700 (PDT) X-Barracuda-Envelope-From: noreply@release.debian.org X-Barracuda-Apparent-Source-IP: 5.153.231.3 Received: from mailly.debian.org ([2001:41b8:202:deb:6564:a62:52c3:4b72]) from C=NA,ST=NA,L=Ankh Morpork,O=Debian SMTP,OU=Debian SMTP CA,CN=mailly.debian.org,EMAIL=hostmaster@mailly.debian.org (verified) by picconi.debian.org with esmtps (TLS1.2:DHE_RSA_AES_128_CBC_SHA1:128) (Exim 4.80) (envelope-from ) id 1XDFrY-0001nI-Gd for xfsprogs@packages.debian.org; Fri, 01 Aug 2014 16:39:24 +0000 Received: from franck.debian.org ([138.16.160.12]) from C=NA,ST=NA,L=Ankh Morpork,O=Debian SMTP,OU=Debian SMTP CA,CN=franck.debian.org,EMAIL=hostmaster@franck.debian.org (verified) by mailly.debian.org with esmtps (TLS1.2:DHE_RSA_AES_128_CBC_SHA1:128) (Exim 4.80) (envelope-from ) id 1XDFrV-0007uK-7x; Fri, 01 Aug 2014 16:39:21 +0000 Received: from release by franck.debian.org with local (Exim 4.80) (envelope-from ) id 1XDFrT-00017p-Et; Fri, 01 Aug 2014 16:39:19 +0000 From: Debian testing watch Precedence: bulk X-Trille: 0.120315.1711 Subject: xfsprogs 3.2.1 MIGRATED to testing X-Testing-Watch-Package: xfsprogs X-ASG-Orig-Subj: xfsprogs 3.2.1 MIGRATED to testing X-Testing-Watch-Version: 3.2.1 To: xfsprogs@packages.debian.org Message-Id: Sender: Release Managers Date: Fri, 01 Aug 2014 16:39:19 +0000 Delivered-To: xfsprogs@packages.debian.org X-Barracuda-Connect: picconi.debian.org[5.153.231.3] X-Barracuda-Start-Time: 1406911165 X-Barracuda-Encrypted: AES128-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.8038 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header FYI: The status of the xfsprogs source package in Debian's testing distribution has changed. Previous version: 3.2.0 Current version: 3.2.1 -- This email is automatically generated once a day. As the installation of new packages into testing happens multiple times a day you will receive later changes on the next day. See https://release.debian.org/testing-watch/ for more information. From david@fromorbit.com Fri Aug 1 22:19: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 EE70B7F51 for ; Fri, 1 Aug 2014 22:19:54 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 8B26EAC005 for ; Fri, 1 Aug 2014 20:19:54 -0700 (PDT) X-ASG-Debug-ID: 1406949589-04bdf03d45d9050001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id y7M9aZ5ih2T9fPgB for ; Fri, 01 Aug 2014 20:19: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: AtIJADpY3FN5LKl0PGdsb2JhbABagw2BKYcvpyEBAQEBAQEGpQYBgQMXBQEBAQE4NoQDAQEFOhwjEAgDDgcDCSUPBSUDBxoTiEHIDhcYhWSJUAeESwWbeYt6jDwrLw Received: from ppp121-44-169-116.lns20.syd7.internode.on.net (HELO dastard) ([121.44.169.116]) by ipmail06.adl6.internode.on.net with ESMTP; 02 Aug 2014 12:49:48 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1XDPr1-0003HG-Ly; Sat, 02 Aug 2014 13:19:31 +1000 Date: Sat, 2 Aug 2014 13:19:31 +1000 From: Dave Chinner To: Brian Foster Cc: xfs@oss.sgi.com Subject: Re: [PATCH 2/2] xfs: flush both inodes in xfs_swap_extents Message-ID: <20140802031931.GS20518@dastard> X-ASG-Orig-Subj: Re: [PATCH 2/2] xfs: flush both inodes in xfs_swap_extents References: <1406787128-11897-1-git-send-email-david@fromorbit.com> <1406787128-11897-3-git-send-email-david@fromorbit.com> <20140801124401.GA3582@laptop.bfoster> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140801124401.GA3582@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: 1406949589 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.8056 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Fri, Aug 01, 2014 at 08:44:02AM -0400, Brian Foster wrote: > On Thu, Jul 31, 2014 at 04:12:08PM +1000, Dave Chinner wrote: > > From: Dave Chinner > > > > We need to treat both inodes identically from a page cache point of > > view when prepareing them for extent swapping. We don't do this > > right now - we assume that one of the inodes empty, because that's > > what xfs_fsr currently does. Remove this assumption from the code. > > > > While factoring out the flushing and related checks, move the > > transactions reservation to immeidately after the flushes so that we > > don't need to pick up and then drop the ilock to do the transaction > > reservation. There are no issues with aborting the transaction it if > > the checks fail before we join the inodes to the transaction and > > dirty them, so this is a safe change to make. > > > > Signed-off-by: Dave Chinner > > --- > > Both of these looked fine to me, but I couldn't apply this one to > for-next or master... It's actually in my working branch, which means it's based on 3.16-rc5 + random-outside-xfs-patches + for-next + verifier fixes + sb discombobulation and then this patch set. I didn't check that it applied directly against for-next - do you want me to rebase and resend it? Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Fri Aug 1 22:20: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 1D22F7F51 for ; Fri, 1 Aug 2014 22:20:11 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 9F506AC00A for ; Fri, 1 Aug 2014 20:20:10 -0700 (PDT) X-ASG-Debug-ID: 1406949607-04cbb02d85cffd0001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id OtHlioWmDBjdomSk for ; Fri, 01 Aug 2014 20:20: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: AtIJADpY3FN5LKl0PGdsb2JhbABagw2BKYcvpyEBAQEBAQEGpQYBgQMXBQEBAQE4NoQDAQEFOhwjEAgDDgcDCSUPBSUDBxoTiEHIDhcYhWSJUAeESwWbeZg2Ky8 Received: from ppp121-44-169-116.lns20.syd7.internode.on.net (HELO dastard) ([121.44.169.116]) by ipmail06.adl6.internode.on.net with ESMTP; 02 Aug 2014 12:50:07 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1XDPra-0003HP-FL; Sat, 02 Aug 2014 13:20:06 +1000 Date: Sat, 2 Aug 2014 13:20:06 +1000 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com Subject: Re: [PATCH 4/4] xfs: dquot recovery needs verifiers Message-ID: <20140802032006.GT20518@dastard> X-ASG-Orig-Subj: Re: [PATCH 4/4] xfs: dquot recovery needs verifiers References: <1406768509-32556-1-git-send-email-david@fromorbit.com> <1406768509-32556-5-git-send-email-david@fromorbit.com> <20140801143023.GD26455@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140801143023.GD26455@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: 1406949608 X-Barracuda-URL: http://192.48.176.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.8056 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Fri, Aug 01, 2014 at 07:30:23AM -0700, Christoph Hellwig wrote: > On Thu, Jul 31, 2014 at 11:01:49AM +1000, Dave Chinner wrote: > > From: Dave Chinner > > > > dquot recovery should add verifiers to the dquot buffers that it > > recovers changes into. Unfortunately, it doesn't attached the > > verifiers to the buffers in a consistent manner. For example, > > xlog_recover_dquot_pass2() reads dquot buffers without a verifier > > and then writes it without ever having attached a verifier to the > > buffer. > > > > Further, dquot buffer recovery may write a dquot buffer that has not > > been modified, or indeed, shoul dbe written because quotas are not > > enabled and hence changes to the buffer were not replayed. In this > > case, we again write buffers without verifiers attached because that > > doesn't happen until after the buffer changes have been replayed. > > > > Signed-off-by: Dave Chinner > > The xlog_recover_do_reg_buffer look fine to me, but what's the rationale > for removing the xfs_dqcheck call? It's done by the verifier. Cheers, Dave. -- Dave Chinner david@fromorbit.com From bounces@plexpr.tk Fri Aug 1 22:26: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=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 6AD337F5A for ; Fri, 1 Aug 2014 22:26:22 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 550AB8F8039 for ; Fri, 1 Aug 2014 20:26:19 -0700 (PDT) X-ASG-Debug-ID: 1406949976-04cbb02d85d0270001-NocioJ Received: from coro3.isol-servers.net (london189.startdedicated.net [62.75.252.189]) by cuda.sgi.com with ESMTP id I8KexNmt1c6TuoQ3 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 01 Aug 2014 20:26:17 -0700 (PDT) X-Barracuda-Envelope-From: bounces@plexpr.tk X-Barracuda-Apparent-Source-IP: 62.75.252.189 Received: by coro3.isol-servers.net (Postfix, from userid 0) id 4DEF1DD2ED0; Sat, 2 Aug 2014 06:23:41 +0300 (EEST) To: xfs@oss.sgi.com Subject: =?UTF-8?B?V29ybGQgQ2x1YiAtIM6jz4XOvc60z4HOv868zq4=?= X-PHP-Originating-Script: 10000:class.phpmailer.php X-ASG-Orig-Subj: =?UTF-8?B?V29ybGQgQ2x1YiAtIM6jz4XOvc60z4HOv868zq4=?= Date: Sat, 2 Aug 2014 06:23:41 +0300 From: "newsletter@plexpr.tk" Reply-To: "newsletter@plexpr.tk" Message-ID: X-Priority: 3 X-Mailer: PHPMailer 5.2.5 (https://github.com/Synchro/PHPMailer/) X-phpList-version: 3.0.6 X-MessageID: 5 X-ListMember: xfs@oss.sgi.com Precedence: bulk Bounces-To: bounces@plexpr.tk List-Help: List-Unsubscribe: List-Subscribe: List-Owner: MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="b1_dc0647c2b37d7e712db6759616329f10" X-Barracuda-Connect: london189.startdedicated.net[62.75.252.189] X-Barracuda-Start-Time: 1406949977 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.8056 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 HTML_MESSAGE BODY: HTML included in message --b1_dc0647c2b37d7e712db6759616329f10 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable WORLD CLUB =CE=91=CE=B3=CE=B1=CF=80=CE=B7=CF=84=CF=8C =CE=BC=CE=AD=CE=BB=CE=BF=CF=82,= =20 =CE=A4=CE=BF WORLD CLUB =CE=B5=CE=AF=CE=BD=CE=B1=CE=B9 =CE=BC=CE=B9=CE=B1 = =CE=94=CE=B9=CE=B5=CE=B8=CE=BD=CE=AE =CE=BA=CE=BB=CE=B5=CE=B9=CF=83=CF=84= =CE=AE =CE=BA=CE=BF=CE=B9=CE=BD=CF=8C=CF=84=CE=B7=CF=84=CE=B1 - =CE=BB=CE=AD=CF=83= =CF=87=CE=B7 =CF=80=CE=B1=CF=81=CE=BF=CF=87=CE=AE=CF=82 =CF=85=CF=80=CE=B7= =CF=81=CE=B5=CF=83=CE=B9=CF=8E=CE=BD, =CF=80=CF=81=CE=BF=CE=BD=CE=BF=CE=BC=CE=AF=CF=89=CE=BD =CE=BA=CE=B1=CE=B9 = =CE=B4=CF=8E=CF=81=CF=89=CE=BD =CF=80=CE=BF=CF=85 =CE=BA=CE=B1=CE=BB=CF=8D= =CF=80=CF=84=CE=B5=CE=B9 =CF=8C=CE=BB=CE=B5=CF=82 =CF=84=CE=B9=CF=82 =CE=B1=CE=BD=CE=AC=CE=B3=CE=BA=CE=B5=CF=82 =CF=84=CE=BF= =CF=85 =CF=83=CF=8D=CE=B3=CF=87=CF=81=CE=BF=CE=BD=CE=BF=CF=85 =CE=B1=CE=BD= =CE=B8=CF=81=CF=8E=CF=80=CE=BF=CF=85.=20 =CE=95=CF=80=CE=B9=CE=BA=CE=BF=CE=B9=CE=BD=CF=89=CE=BD=CE=AF=CE=B1 - =CE=A3= =CF=85=CE=BD=CE=B1=CE=BD=CF=84=CE=AE=CF=83=CE=B5=CE=B9=CF=82 - =CE=A3=CF=85=CE=BC=CE=B2=CE=BF=CF=85=CE=BB=CE=B5=CF=85=CF=84=CE=B9=CE=BA=CE= =AE - =CE=A3=CE=B5=CE=BC=CE=B9=CE=BD=CE=AC=CF=81=CE=B9=CE=B1 - =CE=91=CF=85=CF=84=CE=BF=CE=B2=CE=B5=CE=BB=CF=84=CE=AF=CF=89=CF=83=CE=B7 - = =CE=95=CF=85=CE=BA=CE=B1=CE=B9=CF=81=CE=AF=CE=B5=CF=82 =CE=91=CF=80=CE=B1= =CF=83=CF=87=CF=8C=CE=BB=CE=B7=CF=83=CE=B7=CF=82 - =CE=95=CE=BA=CF=80=CE=B1=CE=AF=CE=B4=CE=B5=CF=85=CF=83=CE=B7 - Startups - = =CE=A4=CE=BF=CF=85=CF=81=CE=B9=CF=83=CE=BC=CF=8C=CF=82 & =CE=A4=CE=B1=CE=BE= =CE=AF=CE=B4=CE=B9=CE=B1 - =CE=A5=CE=B3=CE=B5=CE=AF=CE=B1 - =CE=95=CF=85=CE=B5=CE=BE=CE=AF=CE=B1 =CE= =BA=CE=B1=CE=B9 =CF=80=CE=BF=CE=BB=CE=BB=CE=AC =CE=AC=CE=BB=CE=BB=CE=B1 =CE= =B5=CE=AF=CE=BD=CE=B1=CE=B9 =CE=BC=CE=B5=CF=81=CE=B9=CE=BA=CE=AC =CE=B1=CF=80=CF=8C =CF=84=CE=B1 =CE=B8= =CE=AD=CE=BC=CE=B1=CF=84=CE=B1 =CF=80=CE=BF=CF=85 =CE=B5=CE=BD=CE=B4=CE=B9= =CE=B1=CF=86=CE=AD=CF=81=CE=BF=CF=85=CE=BD =CF=84=CE=BF Club =CE=BA=CE=B1=CE=B9 =CF=84=CE=B1 =CE=BC=CE=AD=CE=BB=CE=B7 = =CE=BC=CE=B1=CF=82. =CE=98=CE=AD=CE=BB=CE=BF=CE=BD=CF=84=CE=B1=CF=82 =CE=BD=CE=B1 =CE=B5=CF=80= =CE=B9=CE=BA=CE=B1=CE=B9=CF=81=CE=BF=CF=80=CE=BF=CE=B9=CE=AE=CF=83=CE=BF=CF= =85=CE=BC=CE=B5 =CF=84=CE=BF =CE=B5=CE=BD=CE=B4=CE=B9=CE=B1=CF=86=CE=AD=CF=81=CE=BF=CF=85=CE=BD =CE=BC= =CE=B1=CF=82 =CE=B3=CE=B9=CE=B1 =CF=84=CE=B7=CE=BD =CF=83=CF=85=CE=BC=CE=BC= =CE=B5=CF=84=CE=BF=CF=87=CE=AE =CF=83=CE=B1=CF=82 =CF=83=CF=84=CE=BF World Club =CE=BC=CF=80=CE=BF=CF=81=CE=B5=CE=AF=CF=84=CE= =B5 =CE=BD=CE=B1 =CE=BC=CE=B1=CF=82 =CF=83=CF=84=CE=B5=CE=AF=CE=BB=CE=B5=CF= =84=CE=B5 =CE=BA=CE=B1=CE=B9 =CE=B4=CE=B9=CE=BA=CE=AD=CF=82 =CF=83=CE=B1=CF=82 =CF=80=CF=81=CE=BF=CF=84= =CE=AC=CF=83=CE=B5=CE=B9=CF=82 =CE=BA=CE=B1=CE=B9 =CE=B9=CE=B4=CE=AD=CE=B5= =CF=82 =CE=B3=CE=B9=CE=B1 =CF=84=CE=B7=CE=BD =CF=85=CE=BB=CE=BF=CF=80=CE=BF=CE=AF=CE=B7=CF=83=CE=AE =CF=84=CE=BF=CF=85= =CF=82 =CE=B1=CF=80=CF=8C =CF=84=CE=BF=CE=BD =CE=A3=CE=B5=CF=80=CF=84=CE=AD= =CE=BC=CE=B2=CF=81=CE=B9=CE=BF. =CE=96=CE=B7=CF=84=CE=BF=CF=8D=CE=BC=CE=B5 =CE=B5=CF=80=CE=AF=CF=83=CE=B7= =CF=82 =CE=BA=CE=B1=CF=84=CE=AC =CF=84=CF=8C=CF=80=CE=BF=CF=85=CF=82 =CF=83= =CF=85=CE=BD=CE=B5=CF=81=CE=B3=CE=AC=CF=84=CE=B5=CF=82 =CF=83=CE=B5 =CF=8C=CE=BB=CE=B7 =CF=84=CE=B7=CE=BD =CE=95=CE=BB=CE=BB=CE=AC= =CE=B4=CE=B1 =CE=B1=CE=BD=CE=B1=CE=B3=CF=81=CE=AC=CF=86=CE=BF=CE=BD=CF=84= =CE=B1=CF=82 =CF=83=CF=84=CE=BF =CE=B8=CE=AD=CE=BC=CE=B1 =CF=84=CE=BF=CF=85 email =C2=AB=CE=A3=CE=A5=CE=9D= =CE=95=CE=A1=CE=93=CE=91=CE=A4=CE=97=CE=A3=C2=BB [USERTRACK] ---------------------------------------------------------------------------= --------- =CE=91=CF=85=CF=84=CF=8C =CF=84=CE=BF =CE=BC=CE=AE=CE=BD=CF=85=CE=BC=CE=B1 = =CF=83=CF=84=CE=AC=CE=BB=CE=B8=CE=B7=CE=BA=CE=B5 =CF=83=CF=84=CE=BF xfs@oss= .sgi.com =CE=B1=CF=80=CF=8C newsletter@plexpr.tk =CE=91=CE=BD =CE=B4=CE=B5=CE=BD =CE=B8=CE=AD=CE=BB=CE=B5=CF=84=CE=B5 =CE=BD= =CE=B1 =CE=BB=CE=B1=CE=BC=CE=B2=CE=AC=CE=BD=CE=B5=CF=84=CE=B5 =CE=AC=CE=BB= =CE=BB=CE=B1 email =CE=B1=CF=80=CF=8C =CE=B5=CE=BC=CE=AC=CF=82 =CE=BA=CE=AC=CE=BD=CE=B5 =CE=BA=CE=BB=CE=B9=CE=BA = =CF=83=CF=84=CE=BF =CF=83=CF=8D=CE=BD=CE=B4=CE=B5=CF=83=CE=BC=CE=BF =CF=84= =CE=B7=CF=82 =CE=B4=CE=B9=CE=B1=CE=B3=CF=81=CE=B1=CF=86=CE=AE=CF=82 -- powered by phpList, www.phplist.com -- --b1_dc0647c2b37d7e712db6759616329f10 Content-Type: multipart/related; boundary="b2_dc0647c2b37d7e712db6759616329f10" --b2_dc0647c2b37d7e712db6759616329f10 Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: quoted-printable =0A =0A

3D""

 WORLD = CLUB

Αγα&p= i;ητ=CF=8C μ=CE=ADλος,

Το WORLD = CLUB ε=CE=AFναι &m= u;ια Διεθν=CE=AE κλ&eps= ilon;ιστ=CE=AE κοιν=CF=8Cτη&ta= u;α – λ=CE=ADσχη παρο= χ=CE=AEς υπηρεσι=CF=8Eν= , προνομ=CE=AFων και= δ=CF=8Eρων  που κα&= lambda;=CF=8Dπτει =CF=8Cλες τ= ις αν=CE=ACγκες τ&omicr= on;υ σ=CF=8Dγχρονου = ανθρ=CF=8Eπου.

Επι&kap= pa;οινων=CE=AFα – Συν= αντ=CE=AEσεις – Σ&upsilo= n;μβουλευτικ= =CE=AE – Σεμιν=CE=ACρια - &Al= pha;υτοβελτ=CE=AFωσ= η – Ευκαιρ=CE=AFε&si= gmaf; Απασχ=CF=8Cλησης= – Εκπα=CE=AFδευσ&= eta; – Startups – Τουρισμ=CF=8Cς &= ; Ταξ=CE=AFδια –  Υγ= ε=CE=AFα – Ευεξ=CE=AFα= και πολλ=CE=AC =CE=ACλ&la= mbda;α ε=CE=AFναι μερι&kapp= a;=CE=AC απ=CF=8C τα θ=CE=ADματ&alpha= ; που ενδιαφ=CE=ADρ&= omicron;υν το Club και τα μ=CE=ADλ= η μας.

Θ=CE=ADλ&o= micron;ντας να επικ&alph= a;ιροποι=CE=AEσου&mu= ;ε το ενδιαφ=CE=ADρ= ουν μας για τη&= nu; συμμετοχ=CE=AE σ&alph= a;ς στο World Club <= /span>μπορε=CE=AFτε  να= μας στε=CE=AFλετ&epsi= lon; και δικ=CE=ADς σα= ς προτ=CE=ACσεις &kappa= ;αι ιδ=CE=ADες για &t= au;ην υλοπο=CE=AFησ=CE= =AE τους απ=CF=8C τον &S= igma;επτ=CE=ADμβριο.

Ζητ&omicro= n;=CF=8Dμε επ=CE=AFσης κ&alpha= ;τ=CE=AC τ=CF=8Cπους συν= εργ=CE=ACτες σε =CF=8C&l= ambda;η την Ελλ=CE=ACδα &a= lpha;ναγρ=CE=ACφοντας &s= igma;το θ=CE=ADμα  του = email  «= ΣΥΝΕΡΓΑΤΗΣ»

 


--= ---------------------------------------------------------------------------= -------

=CE=91=CF=85=CF=84=CF=8C =CF=84=CE=BF =CE=BC=CE=AE=CE=BD=CF=85=CE=BC=CE= =B1 =CF=83=CF=84=CE=AC=CE=BB=CE=B8=CE=B7=CE=BA=CE=B5 =CF=83=CF=84=CE=BF xfs= @oss.sgi.com =CE=B1=CF=80=CF=8C newsletter@plexpr.tk

=CE=91=CE=BD =CE=B4=CE=B5=CE=BD =CE=B8=CE=AD=CE=BB=CE=B5=CF=84=CE=B5 =CE= =BD=CE=B1 =CE=BB=CE=B1=CE=BC=CE=B2=CE=AC=CE=BD=CE=B5=CF=84=CE=B5 =CE=AC=CE= =BB=CE=BB=CE=B1 email =CE=B1=CF=80=CF=8C =CE=B5=CE=BC=CE=AC=CF=82 =CE=BA=CE= =AC=CE=BD=CE=B5 =CE=BA=CE=BB=CE=B9=CE=BA =CF=83=CF=84=CE=BF =CF=83=CF=8D=CE= =BD=CE=B4=CE=B5=CF=83=CE=BC=CE=BF =CF=84=CE=B7=CF=82 =CE=B4=CE=B9=CE=B1=CE=B3=CF=81= =CE=B1=CF=86=CE=AE=CF=82

=0A

3D"powered

--b2_dc0647c2b37d7e712db6759616329f10 Content-Type: image/png; name="powerphplist.png" Content-Transfer-Encoding: base64 Content-ID: Content-Disposition: inline; filename="powerphplist.png" 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 RK5CYII= --b2_dc0647c2b37d7e712db6759616329f10-- --b1_dc0647c2b37d7e712db6759616329f10-- From bfoster@redhat.com Sat Aug 2 06:24: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 (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 848DE7F51 for ; Sat, 2 Aug 2014 06:24:23 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 20DB8AC002 for ; Sat, 2 Aug 2014 04:24:19 -0700 (PDT) X-ASG-Debug-ID: 1406978655-04cbb02d84e1aa0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id FeNN8W37nGdS5mF1 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Sat, 02 Aug 2014 04:24:15 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-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 s72BO7qJ029453 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Sat, 2 Aug 2014 07:24: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 s72BO7FU018060; Sat, 2 Aug 2014 07:24:07 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 51C6412577C; Sat, 2 Aug 2014 07:24:06 -0400 (EDT) Date: Sat, 2 Aug 2014 07:24:06 -0400 From: Brian Foster To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 2/2] xfs: flush both inodes in xfs_swap_extents Message-ID: <20140802112404.GA36014@bfoster.bfoster> X-ASG-Orig-Subj: Re: [PATCH 2/2] xfs: flush both inodes in xfs_swap_extents References: <1406787128-11897-1-git-send-email-david@fromorbit.com> <1406787128-11897-3-git-send-email-david@fromorbit.com> <20140801124401.GA3582@laptop.bfoster> <20140802031931.GS20518@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140802031931.GS20518@dastard> User-Agent: Mutt/1.5.23 (2014-03-12) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.24 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1406978655 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Sat, Aug 02, 2014 at 01:19:31PM +1000, Dave Chinner wrote: > On Fri, Aug 01, 2014 at 08:44:02AM -0400, Brian Foster wrote: > > On Thu, Jul 31, 2014 at 04:12:08PM +1000, Dave Chinner wrote: > > > From: Dave Chinner > > > > > > We need to treat both inodes identically from a page cache point of > > > view when prepareing them for extent swapping. We don't do this > > > right now - we assume that one of the inodes empty, because that's > > > what xfs_fsr currently does. Remove this assumption from the code. > > > > > > While factoring out the flushing and related checks, move the > > > transactions reservation to immeidately after the flushes so that we > > > don't need to pick up and then drop the ilock to do the transaction > > > reservation. There are no issues with aborting the transaction it if > > > the checks fail before we join the inodes to the transaction and > > > dirty them, so this is a safe change to make. > > > > > > Signed-off-by: Dave Chinner > > > --- > > > > Both of these looked fine to me, but I couldn't apply this one to > > for-next or master... > > It's actually in my working branch, which means it's based on > 3.16-rc5 + random-outside-xfs-patches + for-next + verifier fixes + > sb discombobulation and then this patch set. I didn't check that it > applied directly against for-next - do you want me to rebase and > resend it? > Ok, no worries. I was just trying to compile test and verify that nothing was unexpected with the patch as posted. I'm good as long we get some lead team for testing and whatnot when this gets merged to a dev. branch. :) Brian > Cheers, > > Dave. > -- > Dave Chinner > david@fromorbit.com From info@info.com Sat Aug 2 09:14:40 2014 Return-Path: X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 7C03A7F55 for ; Sat, 2 Aug 2014 09:14:40 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id B469D304048 for ; Sat, 2 Aug 2014 07:14:36 -0700 (PDT) X-ASG-Debug-ID: 1406988867-04bdf03d44f4920001-NocioJ Received: from mail.giniandjony.com (webmail.giniandjony.com [119.226.129.5]) by cuda.sgi.com with ESMTP id UlJQbe1OfAt8bkaj for ; Sat, 02 Aug 2014 07:14:28 -0700 (PDT) X-Barracuda-Envelope-From: info@info.com X-Barracuda-Apparent-Source-IP: 119.226.129.5 Received: from giniandjony.com (localhost [127.0.0.1]) by mail.giniandjony.com (Postfix-outgoing) with ESMTP id F193729FAE for ; Sat, 2 Aug 2014 19:50:02 +0530 (IST) Received: (qmail 27070 invoked by uid 65205); 2 Aug 2014 14:20:02 -0000 Received: from 115.242.27.252 by gnjXFmail (envelope-from , uid 0) with qmail-scanner-1.25 (clamscan: 0.60. Clear:RC:0(115.242.27.252):. Processed in 268.000225 secs); 02 Aug 2014 14:20:01 -0000 Received: from unknown (HELO [115.242.27.252]) (alagar.gj@giniandjony.com@[115.242.27.252]) (envelope-sender ) by 0 (qmail-ldap-1.03) with SMTP for ; 2 Aug 2014 14:15:33 -0000 Content-Type: multipart/mixed; boundary="===============2021110225==" MIME-Version: 1.0 Subject: R B I BANK INDIA To: Recipients X-ASG-Orig-Subj: R B I BANK INDIA From: info@info.com Date: Sat, 02 Aug 2014 19:34:01 +0530 Reply-To: rbionlineban@hotmail.com X-Qmail-Scanner-Message-ID: <140698893668624080@gnjXFmail> Message-Id: <20140802142002.F193729FAE@mail.giniandjony.com> X-Barracuda-Connect: webmail.giniandjony.com[119.226.129.5] X-Barracuda-Start-Time: 1406988867 X-Barracuda-URL: http://192.48.157.11: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 You will not see this in a MIME-aware mail reader. --===============2021110225== Content-Type: text/plain; charset="iso-8859-1" MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Description: Mail message body Dear Beneficiary, Kindly view the attached document, fill the required information's and revert immediately. Sign, Mgr. --===============2021110225== Content-Type: application/octet-stream MIME-Version: 1.0 Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="BANK_RBI.rtf" e1xydGYxXGFkZWZsYW5nMTAyNVxhbnNpXGFuc2ljcGcxMjUyXHVjMVxhZGVmZjBcZGVmZjBcc3Rz aGZkYmNoMzE1MDVcc3RzaGZsb2NoMzE1MDZcc3RzaGZoaWNoMzE1MDZcc3RzaGZiaTBcZGVmbGFu ZzEwMzNcZGVmbGFuZ2ZlMTAzM1x0aGVtZWxhbmcxNjM5M1x0aGVtZWxhbmdmZTBcdGhlbWVsYW5n Y3Mwe1xmb250dGJse1xmMFxmYmlkaSBcZnJvbWFuXGZjaGFyc2V0MFxmcHJxMntcKlxwYW5vc2Ug MDIwMjA2MDMwNTA0MDUwMjAzMDR9VGltZXMgTmV3IFJvbWFuO317XGYzNFxmYmlkaSBcZnJvbWFu XGZjaGFyc2V0MFxmcHJxMntcKlxwYW5vc2UgMDIwNDA1MDMwNTA0MDYwMzAyMDR9Q2FtYnJpYSBN YXRoO30NCntcZjM3XGZiaWRpIFxmc3dpc3NcZmNoYXJzZXQwXGZwcnEye1wqXHBhbm9zZSAwMjBm MDUwMjAyMDIwNDAzMDIwNH1DYWxpYnJpO317XGZsb21ham9yXGYzMTUwMFxmYmlkaSBcZnJvbWFu XGZjaGFyc2V0MFxmcHJxMntcKlxwYW5vc2UgMDIwMjA2MDMwNTA0MDUwMjAzMDR9VGltZXMgTmV3 IFJvbWFuO30NCntcZmRibWFqb3JcZjMxNTAxXGZiaWRpIFxmcm9tYW5cZmNoYXJzZXQwXGZwcnEy e1wqXHBhbm9zZSAwMjAyMDYwMzA1MDQwNTAyMDMwNH1UaW1lcyBOZXcgUm9tYW47fXtcZmhpbWFq b3JcZjMxNTAyXGZiaWRpIFxmcm9tYW5cZmNoYXJzZXQwXGZwcnEye1wqXHBhbm9zZSAwMjA0MDUw MzA1MDQwNjAzMDIwNH1DYW1icmlhO30NCntcZmJpbWFqb3JcZjMxNTAzXGZiaWRpIFxmcm9tYW5c ZmNoYXJzZXQwXGZwcnEye1wqXHBhbm9zZSAwMjAyMDYwMzA1MDQwNTAyMDMwNH1UaW1lcyBOZXcg Um9tYW47fXtcZmxvbWlub3JcZjMxNTA0XGZiaWRpIFxmcm9tYW5cZmNoYXJzZXQwXGZwcnEye1wq XHBhbm9zZSAwMjAyMDYwMzA1MDQwNTAyMDMwNH1UaW1lcyBOZXcgUm9tYW47fQ0Ke1xmZGJtaW5v clxmMzE1MDVcZmJpZGkgXGZyb21hblxmY2hhcnNldDBcZnBycTJ7XCpccGFub3NlIDAyMDIwNjAz MDUwNDA1MDIwMzA0fVRpbWVzIE5ldyBSb21hbjt9e1xmaGltaW5vclxmMzE1MDZcZmJpZGkgXGZz d2lzc1xmY2hhcnNldDBcZnBycTJ7XCpccGFub3NlIDAyMGYwNTAyMDIwMjA0MDMwMjA0fUNhbGli cmk7fQ0Ke1xmYmltaW5vclxmMzE1MDdcZmJpZGkgXGZyb21hblxmY2hhcnNldDBcZnBycTJ7XCpc cGFub3NlIDAyMDIwNjAzMDUwNDA1MDIwMzA0fVRpbWVzIE5ldyBSb21hbjt9e1xmNDFcZmJpZGkg XGZyb21hblxmY2hhcnNldDIzOFxmcHJxMiBUaW1lcyBOZXcgUm9tYW4gQ0U7fXtcZjQyXGZiaWRp IFxmcm9tYW5cZmNoYXJzZXQyMDRcZnBycTIgVGltZXMgTmV3IFJvbWFuIEN5cjt9DQp7XGY0NFxm YmlkaSBcZnJvbWFuXGZjaGFyc2V0MTYxXGZwcnEyIFRpbWVzIE5ldyBSb21hbiBHcmVlazt9e1xm NDVcZmJpZGkgXGZyb21hblxmY2hhcnNldDE2MlxmcHJxMiBUaW1lcyBOZXcgUm9tYW4gVHVyO317 XGY0NlxmYmlkaSBcZnJvbWFuXGZjaGFyc2V0MTc3XGZwcnEyIFRpbWVzIE5ldyBSb21hbiAoSGVi cmV3KTt9e1xmNDdcZmJpZGkgXGZyb21hblxmY2hhcnNldDE3OFxmcHJxMiBUaW1lcyBOZXcgUm9t YW4gKEFyYWJpYyk7fQ0Ke1xmNDhcZmJpZGkgXGZyb21hblxmY2hhcnNldDE4NlxmcHJxMiBUaW1l cyBOZXcgUm9tYW4gQmFsdGljO317XGY0OVxmYmlkaSBcZnJvbWFuXGZjaGFyc2V0MTYzXGZwcnEy IFRpbWVzIE5ldyBSb21hbiAoVmlldG5hbWVzZSk7fXtcZjM4MVxmYmlkaSBcZnJvbWFuXGZjaGFy c2V0MjM4XGZwcnEyIENhbWJyaWEgTWF0aCBDRTt9e1xmMzgyXGZiaWRpIFxmcm9tYW5cZmNoYXJz ZXQyMDRcZnBycTIgQ2FtYnJpYSBNYXRoIEN5cjt9DQp7XGYzODRcZmJpZGkgXGZyb21hblxmY2hh cnNldDE2MVxmcHJxMiBDYW1icmlhIE1hdGggR3JlZWs7fXtcZjM4NVxmYmlkaSBcZnJvbWFuXGZj aGFyc2V0MTYyXGZwcnEyIENhbWJyaWEgTWF0aCBUdXI7fXtcZjM4OFxmYmlkaSBcZnJvbWFuXGZj aGFyc2V0MTg2XGZwcnEyIENhbWJyaWEgTWF0aCBCYWx0aWM7fXtcZjQxMVxmYmlkaSBcZnN3aXNz XGZjaGFyc2V0MjM4XGZwcnEyIENhbGlicmkgQ0U7fQ0Ke1xmNDEyXGZiaWRpIFxmc3dpc3NcZmNo YXJzZXQyMDRcZnBycTIgQ2FsaWJyaSBDeXI7fXtcZjQxNFxmYmlkaSBcZnN3aXNzXGZjaGFyc2V0 MTYxXGZwcnEyIENhbGlicmkgR3JlZWs7fXtcZjQxNVxmYmlkaSBcZnN3aXNzXGZjaGFyc2V0MTYy XGZwcnEyIENhbGlicmkgVHVyO317XGY0MThcZmJpZGkgXGZzd2lzc1xmY2hhcnNldDE4NlxmcHJx MiBDYWxpYnJpIEJhbHRpYzt9DQp7XGZsb21ham9yXGYzMTUwOFxmYmlkaSBcZnJvbWFuXGZjaGFy c2V0MjM4XGZwcnEyIFRpbWVzIE5ldyBSb21hbiBDRTt9e1xmbG9tYWpvclxmMzE1MDlcZmJpZGkg XGZyb21hblxmY2hhcnNldDIwNFxmcHJxMiBUaW1lcyBOZXcgUm9tYW4gQ3lyO317XGZsb21ham9y XGYzMTUxMVxmYmlkaSBcZnJvbWFuXGZjaGFyc2V0MTYxXGZwcnEyIFRpbWVzIE5ldyBSb21hbiBH cmVlazt9DQp7XGZsb21ham9yXGYzMTUxMlxmYmlkaSBcZnJvbWFuXGZjaGFyc2V0MTYyXGZwcnEy IFRpbWVzIE5ldyBSb21hbiBUdXI7fXtcZmxvbWFqb3JcZjMxNTEzXGZiaWRpIFxmcm9tYW5cZmNo YXJzZXQxNzdcZnBycTIgVGltZXMgTmV3IFJvbWFuIChIZWJyZXcpO317XGZsb21ham9yXGYzMTUx NFxmYmlkaSBcZnJvbWFuXGZjaGFyc2V0MTc4XGZwcnEyIFRpbWVzIE5ldyBSb21hbiAoQXJhYmlj KTt9DQp7XGZsb21ham9yXGYzMTUxNVxmYmlkaSBcZnJvbWFuXGZjaGFyc2V0MTg2XGZwcnEyIFRp bWVzIE5ldyBSb21hbiBCYWx0aWM7fXtcZmxvbWFqb3JcZjMxNTE2XGZiaWRpIFxmcm9tYW5cZmNo YXJzZXQxNjNcZnBycTIgVGltZXMgTmV3IFJvbWFuIChWaWV0bmFtZXNlKTt9e1xmZGJtYWpvclxm MzE1MThcZmJpZGkgXGZyb21hblxmY2hhcnNldDIzOFxmcHJxMiBUaW1lcyBOZXcgUm9tYW4gQ0U7 fQ0Ke1xmZGJtYWpvclxmMzE1MTlcZmJpZGkgXGZyb21hblxmY2hhcnNldDIwNFxmcHJxMiBUaW1l cyBOZXcgUm9tYW4gQ3lyO317XGZkYm1ham9yXGYzMTUyMVxmYmlkaSBcZnJvbWFuXGZjaGFyc2V0 MTYxXGZwcnEyIFRpbWVzIE5ldyBSb21hbiBHcmVlazt9e1xmZGJtYWpvclxmMzE1MjJcZmJpZGkg XGZyb21hblxmY2hhcnNldDE2MlxmcHJxMiBUaW1lcyBOZXcgUm9tYW4gVHVyO30NCntcZmRibWFq b3JcZjMxNTIzXGZiaWRpIFxmcm9tYW5cZmNoYXJzZXQxNzdcZnBycTIgVGltZXMgTmV3IFJvbWFu IChIZWJyZXcpO317XGZkYm1ham9yXGYzMTUyNFxmYmlkaSBcZnJvbWFuXGZjaGFyc2V0MTc4XGZw cnEyIFRpbWVzIE5ldyBSb21hbiAoQXJhYmljKTt9e1xmZGJtYWpvclxmMzE1MjVcZmJpZGkgXGZy b21hblxmY2hhcnNldDE4NlxmcHJxMiBUaW1lcyBOZXcgUm9tYW4gQmFsdGljO30NCntcZmRibWFq b3JcZjMxNTI2XGZiaWRpIFxmcm9tYW5cZmNoYXJzZXQxNjNcZnBycTIgVGltZXMgTmV3IFJvbWFu IChWaWV0bmFtZXNlKTt9e1xmaGltYWpvclxmMzE1MjhcZmJpZGkgXGZyb21hblxmY2hhcnNldDIz OFxmcHJxMiBDYW1icmlhIENFO317XGZoaW1ham9yXGYzMTUyOVxmYmlkaSBcZnJvbWFuXGZjaGFy c2V0MjA0XGZwcnEyIENhbWJyaWEgQ3lyO30NCntcZmhpbWFqb3JcZjMxNTMxXGZiaWRpIFxmcm9t YW5cZmNoYXJzZXQxNjFcZnBycTIgQ2FtYnJpYSBHcmVlazt9e1xmaGltYWpvclxmMzE1MzJcZmJp ZGkgXGZyb21hblxmY2hhcnNldDE2MlxmcHJxMiBDYW1icmlhIFR1cjt9e1xmaGltYWpvclxmMzE1 MzVcZmJpZGkgXGZyb21hblxmY2hhcnNldDE4NlxmcHJxMiBDYW1icmlhIEJhbHRpYzt9DQp7XGZi aW1ham9yXGYzMTUzOFxmYmlkaSBcZnJvbWFuXGZjaGFyc2V0MjM4XGZwcnEyIFRpbWVzIE5ldyBS b21hbiBDRTt9e1xmYmltYWpvclxmMzE1MzlcZmJpZGkgXGZyb21hblxmY2hhcnNldDIwNFxmcHJx MiBUaW1lcyBOZXcgUm9tYW4gQ3lyO317XGZiaW1ham9yXGYzMTU0MVxmYmlkaSBcZnJvbWFuXGZj aGFyc2V0MTYxXGZwcnEyIFRpbWVzIE5ldyBSb21hbiBHcmVlazt9DQp7XGZiaW1ham9yXGYzMTU0 MlxmYmlkaSBcZnJvbWFuXGZjaGFyc2V0MTYyXGZwcnEyIFRpbWVzIE5ldyBSb21hbiBUdXI7fXtc ZmJpbWFqb3JcZjMxNTQzXGZiaWRpIFxmcm9tYW5cZmNoYXJzZXQxNzdcZnBycTIgVGltZXMgTmV3 IFJvbWFuIChIZWJyZXcpO317XGZiaW1ham9yXGYzMTU0NFxmYmlkaSBcZnJvbWFuXGZjaGFyc2V0 MTc4XGZwcnEyIFRpbWVzIE5ldyBSb21hbiAoQXJhYmljKTt9DQp7XGZiaW1ham9yXGYzMTU0NVxm YmlkaSBcZnJvbWFuXGZjaGFyc2V0MTg2XGZwcnEyIFRpbWVzIE5ldyBSb21hbiBCYWx0aWM7fXtc ZmJpbWFqb3JcZjMxNTQ2XGZiaWRpIFxmcm9tYW5cZmNoYXJzZXQxNjNcZnBycTIgVGltZXMgTmV3 IFJvbWFuIChWaWV0bmFtZXNlKTt9e1xmbG9taW5vclxmMzE1NDhcZmJpZGkgXGZyb21hblxmY2hh cnNldDIzOFxmcHJxMiBUaW1lcyBOZXcgUm9tYW4gQ0U7fQ0Ke1xmbG9taW5vclxmMzE1NDlcZmJp ZGkgXGZyb21hblxmY2hhcnNldDIwNFxmcHJxMiBUaW1lcyBOZXcgUm9tYW4gQ3lyO317XGZsb21p bm9yXGYzMTU1MVxmYmlkaSBcZnJvbWFuXGZjaGFyc2V0MTYxXGZwcnEyIFRpbWVzIE5ldyBSb21h biBHcmVlazt9e1xmbG9taW5vclxmMzE1NTJcZmJpZGkgXGZyb21hblxmY2hhcnNldDE2MlxmcHJx MiBUaW1lcyBOZXcgUm9tYW4gVHVyO30NCntcZmxvbWlub3JcZjMxNTUzXGZiaWRpIFxmcm9tYW5c ZmNoYXJzZXQxNzdcZnBycTIgVGltZXMgTmV3IFJvbWFuIChIZWJyZXcpO317XGZsb21pbm9yXGYz MTU1NFxmYmlkaSBcZnJvbWFuXGZjaGFyc2V0MTc4XGZwcnEyIFRpbWVzIE5ldyBSb21hbiAoQXJh YmljKTt9e1xmbG9taW5vclxmMzE1NTVcZmJpZGkgXGZyb21hblxmY2hhcnNldDE4NlxmcHJxMiBU aW1lcyBOZXcgUm9tYW4gQmFsdGljO30NCntcZmxvbWlub3JcZjMxNTU2XGZiaWRpIFxmcm9tYW5c ZmNoYXJzZXQxNjNcZnBycTIgVGltZXMgTmV3IFJvbWFuIChWaWV0bmFtZXNlKTt9e1xmZGJtaW5v clxmMzE1NThcZmJpZGkgXGZyb21hblxmY2hhcnNldDIzOFxmcHJxMiBUaW1lcyBOZXcgUm9tYW4g Q0U7fXtcZmRibWlub3JcZjMxNTU5XGZiaWRpIFxmcm9tYW5cZmNoYXJzZXQyMDRcZnBycTIgVGlt ZXMgTmV3IFJvbWFuIEN5cjt9DQp7XGZkYm1pbm9yXGYzMTU2MVxmYmlkaSBcZnJvbWFuXGZjaGFy c2V0MTYxXGZwcnEyIFRpbWVzIE5ldyBSb21hbiBHcmVlazt9e1xmZGJtaW5vclxmMzE1NjJcZmJp ZGkgXGZyb21hblxmY2hhcnNldDE2MlxmcHJxMiBUaW1lcyBOZXcgUm9tYW4gVHVyO317XGZkYm1p bm9yXGYzMTU2M1xmYmlkaSBcZnJvbWFuXGZjaGFyc2V0MTc3XGZwcnEyIFRpbWVzIE5ldyBSb21h biAoSGVicmV3KTt9DQp7XGZkYm1pbm9yXGYzMTU2NFxmYmlkaSBcZnJvbWFuXGZjaGFyc2V0MTc4 XGZwcnEyIFRpbWVzIE5ldyBSb21hbiAoQXJhYmljKTt9e1xmZGJtaW5vclxmMzE1NjVcZmJpZGkg XGZyb21hblxmY2hhcnNldDE4NlxmcHJxMiBUaW1lcyBOZXcgUm9tYW4gQmFsdGljO317XGZkYm1p bm9yXGYzMTU2NlxmYmlkaSBcZnJvbWFuXGZjaGFyc2V0MTYzXGZwcnEyIFRpbWVzIE5ldyBSb21h biAoVmlldG5hbWVzZSk7fQ0Ke1xmaGltaW5vclxmMzE1NjhcZmJpZGkgXGZzd2lzc1xmY2hhcnNl dDIzOFxmcHJxMiBDYWxpYnJpIENFO317XGZoaW1pbm9yXGYzMTU2OVxmYmlkaSBcZnN3aXNzXGZj aGFyc2V0MjA0XGZwcnEyIENhbGlicmkgQ3lyO317XGZoaW1pbm9yXGYzMTU3MVxmYmlkaSBcZnN3 aXNzXGZjaGFyc2V0MTYxXGZwcnEyIENhbGlicmkgR3JlZWs7fXtcZmhpbWlub3JcZjMxNTcyXGZi aWRpIFxmc3dpc3NcZmNoYXJzZXQxNjJcZnBycTIgQ2FsaWJyaSBUdXI7fQ0Ke1xmaGltaW5vclxm MzE1NzVcZmJpZGkgXGZzd2lzc1xmY2hhcnNldDE4NlxmcHJxMiBDYWxpYnJpIEJhbHRpYzt9e1xm YmltaW5vclxmMzE1NzhcZmJpZGkgXGZyb21hblxmY2hhcnNldDIzOFxmcHJxMiBUaW1lcyBOZXcg Um9tYW4gQ0U7fXtcZmJpbWlub3JcZjMxNTc5XGZiaWRpIFxmcm9tYW5cZmNoYXJzZXQyMDRcZnBy cTIgVGltZXMgTmV3IFJvbWFuIEN5cjt9DQp7XGZiaW1pbm9yXGYzMTU4MVxmYmlkaSBcZnJvbWFu XGZjaGFyc2V0MTYxXGZwcnEyIFRpbWVzIE5ldyBSb21hbiBHcmVlazt9e1xmYmltaW5vclxmMzE1 ODJcZmJpZGkgXGZyb21hblxmY2hhcnNldDE2MlxmcHJxMiBUaW1lcyBOZXcgUm9tYW4gVHVyO317 XGZiaW1pbm9yXGYzMTU4M1xmYmlkaSBcZnJvbWFuXGZjaGFyc2V0MTc3XGZwcnEyIFRpbWVzIE5l dyBSb21hbiAoSGVicmV3KTt9DQp7XGZiaW1pbm9yXGYzMTU4NFxmYmlkaSBcZnJvbWFuXGZjaGFy c2V0MTc4XGZwcnEyIFRpbWVzIE5ldyBSb21hbiAoQXJhYmljKTt9e1xmYmltaW5vclxmMzE1ODVc ZmJpZGkgXGZyb21hblxmY2hhcnNldDE4NlxmcHJxMiBUaW1lcyBOZXcgUm9tYW4gQmFsdGljO317 XGZiaW1pbm9yXGYzMTU4NlxmYmlkaSBcZnJvbWFuXGZjaGFyc2V0MTYzXGZwcnEyIFRpbWVzIE5l dyBSb21hbiAoVmlldG5hbWVzZSk7fX0NCntcY29sb3J0Ymw7XHJlZDBcZ3JlZW4wXGJsdWUwO1xy ZWQwXGdyZWVuMFxibHVlMjU1O1xyZWQwXGdyZWVuMjU1XGJsdWUyNTU7XHJlZDBcZ3JlZW4yNTVc Ymx1ZTA7XHJlZDI1NVxncmVlbjBcYmx1ZTI1NTtccmVkMjU1XGdyZWVuMFxibHVlMDtccmVkMjU1 XGdyZWVuMjU1XGJsdWUwO1xyZWQyNTVcZ3JlZW4yNTVcYmx1ZTI1NTtccmVkMFxncmVlbjBcYmx1 ZTEyODtccmVkMFxncmVlbjEyOFxibHVlMTI4O1xyZWQwXGdyZWVuMTI4XGJsdWUwOw0KXHJlZDEy OFxncmVlbjBcYmx1ZTEyODtccmVkMTI4XGdyZWVuMFxibHVlMDtccmVkMTI4XGdyZWVuMTI4XGJs dWUwO1xyZWQxMjhcZ3JlZW4xMjhcYmx1ZTEyODtccmVkMTkyXGdyZWVuMTkyXGJsdWUxOTI7XGNo eXBlcmxpbmtcY3RpbnQyNTVcY3NoYWRlMjU1XHJlZDBcZ3JlZW4wXGJsdWUyNTU7XHJlZDBcZ3Jl ZW4zMlxibHVlOTY7XHJlZDQyXGdyZWVuNDJcYmx1ZTQyO1xyZWQyNTVcZ3JlZW4xMDJcYmx1ZTA7 XHJlZDE5MlxncmVlbjBcYmx1ZTA7DQpccmVkMTAyXGdyZWVuMTAyXGJsdWUxMDI7XHJlZDBcZ3Jl ZW4xMTJcYmx1ZTE5MjtcY2FjY2VudG9uZVxjdGludDI1NVxjc2hhZGUyNTVccmVkNzlcZ3JlZW4x MjlcYmx1ZTE4OTt9e1wqXGRlZmNocCBcZnMyMlxsb2NoXGFmMzE1MDZcaGljaFxhZjMxNTA2XGRi Y2hcYWYzMTUwNSB9e1wqXGRlZnBhcCBccWwgXGxpMFxyaTBcc2EyMDBcc2wyNzZcc2xtdWx0MQ0K XHdpZGN0bHBhclx3cmFwZGVmYXVsdFxhc3BhbHBoYVxhc3BudW1cZmFhdXRvXGFkanVzdHJpZ2h0 XHJpbjBcbGluMFxpdGFwMCB9XG5vcWZwcm9tb3RlIHtcc3R5bGVzaGVldHtccWwgXGxpMFxyaTBc c2EyMDBcc2wyNzZcc2xtdWx0MVx3aWRjdGxwYXJcd3JhcGRlZmF1bHRcYXNwYWxwaGFcYXNwbnVt XGZhYXV0b1xhZGp1c3RyaWdodFxyaW4wXGxpbjBcaXRhcDAgXHJ0bGNoXGZjczEgXGFmMFxhZnMy MlxhbGFuZzEwMjUgXGx0cmNoXGZjczAgDQpcZnMyMlxsYW5nMTYzOTNcbGFuZ2ZlMTYzOTNcbG9j aFxmMzE1MDZcaGljaFxhZjMxNTA2XGRiY2hcYWYzMTUwNVxjZ3JpZFxsYW5nbnAxNjM5M1xsYW5n ZmVucDE2MzkzIFxzbmV4dDAgXHNxZm9ybWF0IFxzcHJpb3JpdHkwIE5vcm1hbDt9e1wqXGNzMTAg XGFkZGl0aXZlIFxzdW5oaWRldXNlZCBcc3ByaW9yaXR5MSBEZWZhdWx0IFBhcmFncmFwaCBGb250 O317XCoNClx0czExXHRzcm93ZFx0cmZ0c1dpZHRoQjNcdHJwYWRkbDEwOFx0cnBhZGRyMTA4XHRy cGFkZGZsM1x0cnBhZGRmdDNcdHJwYWRkZmIzXHRycGFkZGZyM1x0YmxpbmQwXHRibGluZHR5cGUz XHRzY2VsbHdpZHRoZnRzMFx0c3ZlcnRhbHRcdHNicmRydFx0c2JyZHJsXHRzYnJkcmJcdHNicmRy clx0c2JyZHJkZ2xcdHNicmRyZGdyXHRzYnJkcmhcdHNicmRydiBccWwgXGxpMFxyaTBcc2EyMDBc c2wyNzZcc2xtdWx0MQ0KXHdpZGN0bHBhclx3cmFwZGVmYXVsdFxhc3BhbHBoYVxhc3BudW1cZmFh dXRvXGFkanVzdHJpZ2h0XHJpbjBcbGluMFxpdGFwMCBccnRsY2hcZmNzMSBcYWYwXGFmczIyXGFs YW5nMTAyNSBcbHRyY2hcZmNzMCBcZnMyMlxsYW5nMTAzM1xsYW5nZmUxMDMzXGxvY2hcZjMxNTA2 XGhpY2hcYWYzMTUwNlxkYmNoXGFmMzE1MDVcY2dyaWRcbGFuZ25wMTAzM1xsYW5nZmVucDEwMzMg DQpcc25leHQxMSBcc3NlbWloaWRkZW4gXHN1bmhpZGV1c2VkIFxzcWZvcm1hdCBOb3JtYWwgVGFi bGU7fXtcKlxjczE1IFxhZGRpdGl2ZSBccnRsY2hcZmNzMSBcYWYwIFxsdHJjaFxmY3MwIFx1bFxj ZjE3IFxzYmFzZWRvbjEwIFxzdW5oaWRldXNlZCBcc3R5cnNpZDM2Nzg3MDkgSHlwZXJsaW5rO317 XCpcY3MxNiBcYWRkaXRpdmUgXHJ0bGNoXGZjczEgXGFmMCBcbHRyY2hcZmNzMCBcYiANClxzYmFz ZWRvbjEwIFxzcWZvcm1hdCBcc3ByaW9yaXR5MjIgXHN0eXJzaWQxMjQ3Njk5MSBTdHJvbmc7fXtc czE3XHFsIFxsaTBccmkwXHNhMjAwXHNsMjc2XHNsbXVsdDFcd2lkY3RscGFyXHRxY1x0eDQ1MTNc dHFyXHR4OTAyNlx3cmFwZGVmYXVsdFxhc3BhbHBoYVxhc3BudW1cZmFhdXRvXGFkanVzdHJpZ2h0 XHJpbjBcbGluMFxpdGFwMCBccnRsY2hcZmNzMSBcYWYwXGFmczIyXGFsYW5nMTAyNSBcbHRyY2hc ZmNzMCANClxmczIyXGxhbmcxNjM5M1xsYW5nZmUxNjM5M1xsb2NoXGYzMTUwNlxoaWNoXGFmMzE1 MDZcZGJjaFxhZjMxNTA1XGNncmlkXGxhbmducDE2MzkzXGxhbmdmZW5wMTYzOTMgXHNiYXNlZG9u MCBcc25leHQxNyBcc2xpbmsxOCBcc3NlbWloaWRkZW4gXHN1bmhpZGV1c2VkIFxzdHlyc2lkMTE3 NjI2NTQgaGVhZGVyO317XCpcY3MxOCBcYWRkaXRpdmUgXHJ0bGNoXGZjczEgXGFmMCBcbHRyY2hc ZmNzMCANClxzYmFzZWRvbjEwIFxzbGluazE3IFxzbG9ja2VkIFxzc2VtaWhpZGRlbiBcc3R5cnNp ZDExNzYyNjU0IEhlYWRlciBDaGFyO317XHMxOVxxbCBcbGkwXHJpMFxzYTIwMFxzbDI3NlxzbG11 bHQxXHdpZGN0bHBhclx0cWNcdHg0NTEzXHRxclx0eDkwMjZcd3JhcGRlZmF1bHRcYXNwYWxwaGFc YXNwbnVtXGZhYXV0b1xhZGp1c3RyaWdodFxyaW4wXGxpbjBcaXRhcDAgXHJ0bGNoXGZjczEgXGFm MFxhZnMyMlxhbGFuZzEwMjUgXGx0cmNoXGZjczAgDQpcZnMyMlxsYW5nMTYzOTNcbGFuZ2ZlMTYz OTNcbG9jaFxmMzE1MDZcaGljaFxhZjMxNTA2XGRiY2hcYWYzMTUwNVxjZ3JpZFxsYW5nbnAxNjM5 M1xsYW5nZmVucDE2MzkzIFxzYmFzZWRvbjAgXHNuZXh0MTkgXHNsaW5rMjAgXHNzZW1paGlkZGVu IFxzdW5oaWRldXNlZCBcc3R5cnNpZDExNzYyNjU0IGZvb3Rlcjt9e1wqXGNzMjAgXGFkZGl0aXZl IFxydGxjaFxmY3MxIFxhZjAgXGx0cmNoXGZjczAgDQpcc2Jhc2Vkb24xMCBcc2xpbmsxOSBcc2xv Y2tlZCBcc3NlbWloaWRkZW4gXHN0eXJzaWQxMTc2MjY1NCBGb290ZXIgQ2hhcjt9fXtcKlxwZ3B0 Ymwge1xwZ3BcaXBncDBcaXRhcDBcbGkwXHJpMFxzYjBcc2EwfXtccGdwXGlwZ3A1XGl0YXAwXGxp MFxyaTBcc2IwXHNhMH17XHBncFxpcGdwNFxpdGFwMFxsaTBccmkwXHNiMFxzYTB9e1xwZ3BcaXBn cDJcaXRhcDBcbGkwXHJpMFxzYjBcc2EwfXtccGdwXGlwZ3AxXGl0YXAwXGxpMFxyaTBcc2IwXHNh MH0NCn17XCpccnNpZHRibCBccnNpZDEyNzc1XHJzaWQxOTczMzhccnNpZDc0ODg0M1xyc2lkOTQy NTAyXHJzaWQxMTI2NTA0XHJzaWQxNjAzNjI1XHJzaWQyMTE5MTcwXHJzaWQyMTI3MzE4XHJzaWQy MTY4NjM0XHJzaWQyMjQyOTEyXHJzaWQyMzIxNTkwXHJzaWQyOTA5MTY1XHJzaWQyOTE0MjUwXHJz aWQzMTY0MDg1XHJzaWQzMjE4NTQ0XHJzaWQzNjc4NzA5XHJzaWQ0MDIxMDMyXHJzaWQ0NjE0MDE0 XHJzaWQ1MDU1Mjc2XHJzaWQ1MDY1Mjk0DQpccnNpZDUzNzYzNzNccnNpZDU3OTY4ODlccnNpZDU5 ODEwOThccnNpZDYyMzAxMDVccnNpZDc0MzczNjJccnNpZDc1NTA2NzZccnNpZDc2MjI1NzFccnNp ZDgxMzg0MTNccnNpZDg1OTQ3NTZccnNpZDg2ODA4NjhccnNpZDkwNTkyNDZccnNpZDk3MjI2OTNc cnNpZDk3NjQ5MzVccnNpZDk5NjY0NDVccnNpZDEwMDQ4NjgzXHJzaWQxMDA1NTE5NFxyc2lkMTA3 NTExMjlccnNpZDEwNzYxNDcyXHJzaWQxMTc2MjY1NFxyc2lkMTE5NTM4NDQNClxyc2lkMTIzODky MzNccnNpZDEyNDc2OTkxXHJzaWQxMzEzMzQ2Mlxyc2lkMTMxOTA0NjhccnNpZDEzMzEyNDQ2XHJz aWQxMzQ1NjIwN1xyc2lkMTM3ODkwMDNccnNpZDEzNzkyNTMzXHJzaWQxNDAyNTUxMlxyc2lkMTQ2 OTU1NjRccnNpZDE0OTUxMjM2XHJzaWQxNDk3MjkzOFxyc2lkMTU2ODk4MDJccnNpZDE1ODA3NjQ3 XHJzaWQxNjIwNjUxOX17XG1tYXRoUHJcbW1hdGhGb250MzRcbWJya0JpbjBcbWJya0JpblN1YjBc bXNtYWxsRnJhYzANClxtZGlzcERlZjFcbWxNYXJnaW4wXG1yTWFyZ2luMFxtZGVmSmMxXG13cmFw SW5kZW50MTQ0MFxtaW50TGltMFxtbmFyeUxpbTF9e1xpbmZve1xhdXRob3IgQW50aG9ueX17XG9w ZXJhdG9yIGNvbXBhcX17XGNyZWF0aW1ceXIyMDE0XG1vN1xkeTIxXGhyMjFcbWluNTF9e1xyZXZ0 aW1ceXIyMDE0XG1vN1xkeTIxXGhyMjFcbWluNTF9e1x2ZXJzaW9uMn17XGVkbWluczF9e1xub2Zw YWdlczJ9e1xub2Z3b3JkczUwNH17XG5vZmNoYXJzMzUyOX0NCntcKlxjb21wYW55IEhld2xldHQt UGFja2FyZH17XG5vZmNoYXJzd3M0MDI1fXtcdmVybjMyODU5fX17XCpceG1sbnN0Ymwge1x4bWxu czEgaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9vZmZpY2Uvd29yZC8yMDAzL3dvcmRtbH19 XHBhcGVydzEyMjQwXHBhcGVyaDE1ODQwXG1hcmdsMTQ0MFxtYXJncjE0NDBcbWFyZ3QxNDQwXG1h cmdiMTQ0MFxndXR0ZXIwXGx0cnNlY3QgDQpcd2lkb3djdHJsXGZ0bmJqXGFlbmRkb2NcdHJhY2tt b3ZlczBcdHJhY2tmb3JtYXR0aW5nMVxkb25vdGVtYmVkc3lzZm9udDBccmVseW9udm1sMFxkb25v dGVtYmVkbGluZ2RhdGExXGdyZmRvY2V2ZW50czBcdmFsaWRhdGV4bWwwXHNob3dwbGFjZWhvbGR0 ZXh0MFxpZ25vcmVtaXhlZGNvbnRlbnQwXHNhdmVpbnZhbGlkeG1sMFxzaG93eG1sZXJyb3JzMFxo b3J6ZG9jXGRnaHNwYWNlMTIwXGRndnNwYWNlMTIwXGRnaG9yaWdpbjE3MDENClxkZ3ZvcmlnaW4x OTg0XGRnaHNob3cwXGRndnNob3czXGpjb21wcmVzc1x2aWV3a2luZDFcdmlld3NjYWxlMTAwXHJz aWRyb290NTA1NTI3NiBcZmV0MHtcKlx3Z3JmZm10ZmlsdGVyIDI0NTB9XGlsZm9tYWNhdGNsbnVw MHtcKlxmdG5zZXAgXGx0cnBhciBccGFyZFxwbGFpbiBcbHRycGFyDQpccWwgXGxpMFxyaTBcd2lk Y3RscGFyXHdyYXBkZWZhdWx0XGFzcGFscGhhXGFzcG51bVxmYWF1dG9cYWRqdXN0cmlnaHRccmlu MFxsaW4wXGl0YXAwXHBhcmFyc2lkMTE3NjI2NTQgXHJ0bGNoXGZjczEgXGFmMFxhZnMyMlxhbGFu ZzEwMjUgXGx0cmNoXGZjczAgXGZzMjJcbGFuZzE2MzkzXGxhbmdmZTE2MzkzXGxvY2hcYWYzMTUw NlxoaWNoXGFmMzE1MDZcZGJjaFxhZjMxNTA1XGNncmlkXGxhbmducDE2MzkzXGxhbmdmZW5wMTYz OTMgew0KXHJ0bGNoXGZjczEgXGFmMCBcbHRyY2hcZmNzMCBcaW5zcnNpZDExNzYyNjU0IFxjaGZ0 bnNlcCANClxwYXIgfX17XCpcZnRuc2VwYyBcbHRycGFyIFxwYXJkXHBsYWluIFxsdHJwYXJccWwg XGxpMFxyaTBcd2lkY3RscGFyXHdyYXBkZWZhdWx0XGFzcGFscGhhXGFzcG51bVxmYWF1dG9cYWRq dXN0cmlnaHRccmluMFxsaW4wXGl0YXAwXHBhcmFyc2lkMTE3NjI2NTQgXHJ0bGNoXGZjczEgXGFm MFxhZnMyMlxhbGFuZzEwMjUgXGx0cmNoXGZjczAgDQpcZnMyMlxsYW5nMTYzOTNcbGFuZ2ZlMTYz OTNcbG9jaFxhZjMxNTA2XGhpY2hcYWYzMTUwNlxkYmNoXGFmMzE1MDVcY2dyaWRcbGFuZ25wMTYz OTNcbGFuZ2ZlbnAxNjM5MyB7XHJ0bGNoXGZjczEgXGFmMCBcbHRyY2hcZmNzMCBcaW5zcnNpZDEx NzYyNjU0IFxjaGZ0bnNlcGMgDQpccGFyIH19e1wqXGFmdG5zZXAgXGx0cnBhciBccGFyZFxwbGFp biBcbHRycGFyXHFsIFxsaTBccmkwXHdpZGN0bHBhclx3cmFwZGVmYXVsdFxhc3BhbHBoYVxhc3Bu dW1cZmFhdXRvXGFkanVzdHJpZ2h0XHJpbjBcbGluMFxpdGFwMFxwYXJhcnNpZDExNzYyNjU0IFxy dGxjaFxmY3MxIFxhZjBcYWZzMjJcYWxhbmcxMDI1IFxsdHJjaFxmY3MwIA0KXGZzMjJcbGFuZzE2 MzkzXGxhbmdmZTE2MzkzXGxvY2hcYWYzMTUwNlxoaWNoXGFmMzE1MDZcZGJjaFxhZjMxNTA1XGNn cmlkXGxhbmducDE2MzkzXGxhbmdmZW5wMTYzOTMge1xydGxjaFxmY3MxIFxhZjAgXGx0cmNoXGZj czAgXGluc3JzaWQxMTc2MjY1NCBcY2hmdG5zZXAgDQpccGFyIH19e1wqXGFmdG5zZXBjIFxsdHJw YXIgXHBhcmRccGxhaW4gXGx0cnBhclxxbCBcbGkwXHJpMFx3aWRjdGxwYXJcd3JhcGRlZmF1bHRc YXNwYWxwaGFcYXNwbnVtXGZhYXV0b1xhZGp1c3RyaWdodFxyaW4wXGxpbjBcaXRhcDBccGFyYXJz aWQxMTc2MjY1NCBccnRsY2hcZmNzMSBcYWYwXGFmczIyXGFsYW5nMTAyNSBcbHRyY2hcZmNzMCAN ClxmczIyXGxhbmcxNjM5M1xsYW5nZmUxNjM5M1xsb2NoXGFmMzE1MDZcaGljaFxhZjMxNTA2XGRi Y2hcYWYzMTUwNVxjZ3JpZFxsYW5nbnAxNjM5M1xsYW5nZmVucDE2MzkzIHtccnRsY2hcZmNzMSBc YWYwIFxsdHJjaFxmY3MwIFxpbnNyc2lkMTE3NjI2NTQgXGNoZnRuc2VwYyANClxwYXIgfX1cbHRy cGFyIFxzZWN0ZCBcbHRyc2VjdFxsaW5leDBcc2VjdGRlZmF1bHRjbFxzZnRuYmoge1wqXHBuc2Vj bHZsMVxwbnVjcm1ccG5zdGFydDFccG5pbmRlbnQ3MjBccG5oYW5nIHtccG50eHRhIC59fXtcKlxw bnNlY2x2bDJccG51Y2x0clxwbnN0YXJ0MVxwbmluZGVudDcyMFxwbmhhbmcge1xwbnR4dGEgLn19 e1wqXHBuc2VjbHZsM1xwbmRlY1xwbnN0YXJ0MVxwbmluZGVudDcyMFxwbmhhbmcge1xwbnR4dGEg Ln19e1wqXHBuc2VjbHZsNA0KXHBubGNsdHJccG5zdGFydDFccG5pbmRlbnQ3MjBccG5oYW5nIHtc cG50eHRhICl9fXtcKlxwbnNlY2x2bDVccG5kZWNccG5zdGFydDFccG5pbmRlbnQ3MjBccG5oYW5n IHtccG50eHRiICh9e1xwbnR4dGEgKX19e1wqXHBuc2VjbHZsNlxwbmxjbHRyXHBuc3RhcnQxXHBu aW5kZW50NzIwXHBuaGFuZyB7XHBudHh0YiAofXtccG50eHRhICl9fXtcKlxwbnNlY2x2bDdccG5s Y3JtXHBuc3RhcnQxXHBuaW5kZW50NzIwXHBuaGFuZyB7XHBudHh0YiAofQ0Ke1xwbnR4dGEgKX19 e1wqXHBuc2VjbHZsOFxwbmxjbHRyXHBuc3RhcnQxXHBuaW5kZW50NzIwXHBuaGFuZyB7XHBudHh0 YiAofXtccG50eHRhICl9fXtcKlxwbnNlY2x2bDlccG5sY3JtXHBuc3RhcnQxXHBuaW5kZW50NzIw XHBuaGFuZyB7XHBudHh0YiAofXtccG50eHRhICl9fVxwYXJkXHBsYWluIFxsdHJwYXJccWwgXGxp MFxyaTBcc2wyODhcc2xtdWx0MA0KXG5vd2lkY3RscGFyXHdyYXBkZWZhdWx0XGZhYXV0b1xyaW4w XGxpbjBcaXRhcDBccGFyYXJzaWQzNjc4NzA5IFxydGxjaFxmY3MxIFxhZjBcYWZzMjJcYWxhbmcx MDI1IFxsdHJjaFxmY3MwIFxmczIyXGxhbmcxNjM5M1xsYW5nZmUxNjM5M1xsb2NoXGFmMzE1MDZc aGljaFxhZjMxNTA2XGRiY2hcYWYzMTUwNVxjZ3JpZFxsYW5nbnAxNjM5M1xsYW5nZmVucDE2Mzkz IHtccnRsY2hcZmNzMSBcYWYzMTUwNlxhZnMxOCBcbHRyY2hcZmNzMCANClxmczE4XGluc3JzaWQx NDY5NTU2NFxjaGFycnNpZDEwNzYxNDcyIA0KXHBhciB9XHBhcmQgXGx0cnBhclxxYyBcbGkwXHJp MFxzYjEyMFxzYTEyMFxzbDM2MFxzbG11bHQwXHdpZGN0bHBhclx3cmFwZGVmYXVsdFxhc3BhbHBo YVxhc3BudW1cZmFhdXRvXGFkanVzdHJpZ2h0XHJpbjBcbGluMFxpdGFwMFxwYXJhcnNpZDE2MjA2 NTE5IHtcZmllbGRcZmxkZWRpdHtcKlxmbGRpbnN0IHtccnRsY2hcZmNzMSBcYWYzMTUwNlxhZnMx OCBcbHRyY2hcZmNzMCBcZnMxOFxjZjFcaW5zcnNpZDE2MjA2NTE5XGNoYXJyc2lkMTA3NjE0NzIg DQpcaGljaFxhZjMxNTA2XGRiY2hcYWYzMTUwNVxsb2NoXGYzMTUwNiAgSFlQRVJMSU5LICJodHRw Oi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0ZpbGU6U2VhbF9vZl90aGVfUmVzZXJcaGljaFxhZjMx NTA2XGRiY2hcYWYzMTUwNVxsb2NoXGYzMTUwNiB2ZV9CYW5rX29mX0luZGlhLnN2ZyIgfXtccnRs Y2hcZmNzMSBcYWYzMTUwNlxhZnMxOCBcbHRyY2hcZmNzMCBcZnMxOFxjZjFcaW5zcnNpZDk5NjY0 NDVcY2hhcnJzaWQxMDc2MTQ3MiANCntcKlxkYXRhZmllbGQgDQowMGQwYzllYTc5ZjliYWNlMTE4 YzgyMDBhYTAwNGJhOTBiMDIwMDAwMDAwMzAwMDAwMGUwYzllYTc5ZjliYWNlMTE4YzgyMDBhYTAw NGJhOTBiYTgwMDAwMDA2ODAwNzQwMDc0MDA3MDAwM2EwMDJmMDAyZjAwNjUwMDZlMDAyZTAwNzcw MDY5MDA2YjAwNjkwMDcwMDA2NTAwNjQwMDY5MDA2MTAwMmUwMDZmMDA3MjAwNjcwMDJmMDA3NzAw NjkwMDZiMDA2OTAwMmYwMDQ2MDA2OTAwNmMwMDY1MDAzYTAwNTMwMDY1MDA2MTAwNmMwMDVmMDA2 ZjAwNjYwMA0KNWYwMDc0MDA2ODAwNjUwMDVmMDA1MjAwNjUwMDczMDA2NTAwNzIwMDc2MDA2NTAw NWYwMDQyMDA2MTAwNmUwMDZiMDA1ZjAwNmYwMDY2MDA1ZjAwNDkwMDZlMDA2NDAwNjkwMDYxMDAy ZTAwNzMwMDc2MDA2NzAwMDAwMDc5NTg4MWY0M2IxZDdmNDhhZjJjODI1ZGM0ODUyNzYzMDAwMDAw MDBhNWFiMDAwMDAwMDAwMDAwMDAwMDA0MDAwMDAwMDB9fX17XGZsZHJzbHQge1xmaWVsZFxmbGRl ZGl0e1wqXGZsZGluc3Qge1xydGxjaFxmY3MxIA0KXGFmMzE1MDZcYWZzMTggXGx0cmNoXGZjczAg XGZzMThcY2YyXGluc3JzaWQxNjIwNjUxOVxjaGFycnNpZDEwNzYxNDcyIFxoaWNoXGFmMzE1MDZc ZGJjaFxhZjMxNTA1XGxvY2hcZjMxNTA2ICBJTkNMVURFUElDVFVSRSAiaHR0cDovL3VwbG9hZC53 aWtpbWVkaWEub3JnL3dpa2lwZWRpYS9jb21tb25zL3RodW1iLzEvMWIvU2VhbF9vZl90aGVfUlxo aWNoXGFmMzE1MDZcZGJjaFxhZjMxNTA1XGxvY2hcZjMxNTA2IA0KZXNlcnZlX0Jhbmtfb2ZfSW5k aWEuc3ZnLzEyMHB4LVNlYWxfb2ZfdGhlX1Jlc2VydmVfQmFua19vZl9JbmRpYS5zdmcucG5nIiBc XCogTUVSR0VGT1JNQVRJTkVUIH19e1xmbGRyc2x0IHtccnRsY2hcZmNzMSBcYWYzMTUwNlxhZnMx OCBcbHRyY2hcZmNzMCBcZnMxOFxjZjJcaW5zcnNpZDk5NjY0NDVcY2hhcnJzaWQxMDc2MTQ3MiB7 XCpcc2hwcGljdA0Ke1xwaWN0e1wqXHBpY3Byb3Bcc2hwbGlkMTAyNXtcc3B7XHNuIHNoYXBlVHlw ZX17XHN2IDc1fX17XHNwe1xzbiBmRmxpcEh9e1xzdiAwfX17XHNwe1xzbiBmRmxpcFZ9e1xzdiAw fX17XHNwe1xzbiBwaWJGbGFnc317XHN2IDJ9fXtcc3B7XHNuIGZMaW5lfXtcc3YgMH19e1xzcHtc c24gd3pEZXNjcmlwdGlvbn17XHN2IFNlYWwgb2YgdGhlIFJlc2VydmUgQmFuayBvZiBJbmRpYS5z dmd9fXtcc3B7XHNuIHBpaGxTaGFwZX17XHN2IA0Ke1wqXGhse1xobGZyIGh0dHA6Ly9lbi53aWtp cGVkaWEub3JnL3dpa2kvRmlsZTpTZWFsX29mX3RoZV9SZXNlcnZlX0JhbmtffXtcaGxzcmMgaHR0 cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9GaWxlOlNlYWxfb2ZfdGhlX1Jlc2VydmVfQmFua199 fX19e1xzcHtcc24gZkxheW91dEluQ2VsbH17XHN2IDF9fXtcc3B7XHNuIGZJc0J1dHRvbn17XHN2 IDF9fXtcc3B7XHNuIGZMYXlvdXRJbkNlbGx9e1xzdiAxfX19DQpccGljc2NhbGV4NDFccGljc2Nh bGV5NDFccGljY3JvcGwwXHBpY2Nyb3ByMFxwaWNjcm9wdDBccGljY3JvcGIwXHBpY3c3NjIwXHBp Y2g3NjIwXHBpY3dnb2FsNDMyMFxwaWNoZ29hbDQzMjBccG5nYmxpcFxibGlwdGFnLTE0NjAwMTM2 ODV7XCpcYmxpcHVpZCBhOGY5ZjU4YmEzMmM5MmY2YmRjYzM2NmY1MWU5ODk0Mn0NCjg5NTA0ZTQ3 MGQwYTFhMGEwMDAwMDAwZDQ5NDg0NDUyMDAwMDAwNzgwMDAwMDA3ODA4MDYwMDAwMDAzOTY0MzZk MjAwMDAwMDA2NjI0YjQ3NDQwMGZmMDBmZjAwZmZhMGJkYTc5MzAwMDAyMDAwNDk0NDQxNTQ3ODlj ZWQ3ZDc5DQo5ODFjNTViOWZlZGJkNWRkZDU2YmVkNGI1N2VmZDMzM2QzMzMzZGZiOWU0OTQyMjYx YjU5NDkwODI0MTA5NmIwNjMwODliMjA4MjZjODJiMjI5MDg4YWUwYzYwZmY1MmFlMDgyODBjYTE1 NTBkNDBiMjJhMDIyMDg4ODBiYmIyMg0KYWIyMTAxMDIyNDIxYzllY2RmZWY4ZjczNmFhNmE3ZDMz Mzk5NmMxOGJkZjc3ZDllM2M5OWFhM2FkNTc1YWFjZTM5ZGZmZTdkMDdmODNmZmM0N2MzZjNhZmVl YzAxZTgyMGFhMDE1NDAyZDAwYjViNWI1ZTU4Y2I3ZDdhZjRmMGUNCjEzYzEwM2MwZWJmMzYxYTBi ZmJmYTgzOWMxMjM3ODExMTA0NWE4YmFmZWNmYWFjYTJhZmFmMTlkNzdkZTA4NjAwMzgwNjcwMDNj MGRlMGJkMGZmZDJkZjYwMmZlNWQwNzM4MGY2MGQ5ZTJjNThiYmUyMDA4MDIxZWY5Y2RjMzEwDQpm ZDdlODhhMjFmODI4N2JkZDJmMGYwMzA4ODAwMDI2MTc4OTg0MDQ0MDAwMDhmMDdmMDc4M2NmMGYw NzY4MmM3MDM0MTEwZjgzZDg0YzFhMTQxMGMwZTBlNjE2ODc4MThlZDlkNWQ3OGY4MzcwZjVmZDJk ZjNmZjgwNDgwZGYwMA0KZDhmYzJmNzhkN2RkYzJiZmNiMDAwNzAxMmM0OGE3ZDMwYjkyODlmOGU5 N2Y3YmUxNzk4NDAyMDE3OGJkMDI4Njg2ODdkMWQ3M2Y4MDYxMDIwMmEyZjhjZmI5ZjMxNzdjZjBi ZGVmN2RlZjZlMDA5YmMwNTZlNDNiMDAzNjAyMTgNCmUwZTcwMGMwMGY0MDAyNWJmOTMxMDAzNjAw NWFiNTZhZDUxMTRmM2VmZTU4Y2QzYjZmYmYwZGQxZWY4M2RmZTc4M2M3ZTM0MWZmYzAyMDdhZmJm YTYxZGEzNjA0YWZlZjdiMmZiY2YwYzJjZDAwMWUwNDMwZjRhMTdlODU1ZGMwDQpiZTNjYzA2MTAw OGIzM2U5ZDQ1NTFiZGY3ZjJmMWYwYTA0MTAxMGZkZmM2M2Y3YTFiMjJhYmZlMWM5YTc5ZWZhMzQ4 MDc3MDFmYzE5YzA4YmQ4NzMxZmRjMDRkMDA1YTAyNTliNGVjZmY0NzhiMDc4Y2IwNzliMTFlMDE0 YTJiNw0KYWYxZmJkZmRmZDk4MzI3NWZhZTNmN2RmN2ZmZjY5MDA5ZWQ4NDNjZmRkZTNkODE3MDdk ODA2NzA5Y2E5YTlkN2Y4N2QwMjQ0YmYxZmJkN2RmZDE4ODYwN2JkZmQwMzM3NmRkZWJjZjlkNzAw ZWUwNTViOWRlMzIxMGEyMDA3MzYNCjUwMTEwMDIxMDAzMjAwNmY0OWJiNWUzMDVlYmI5NmZmNWIw NzgwY2FmYzllMDc0MDIzODA1OWE2NjlkNjBmZjVmNzllMWEwYzA0ZTBmNzc5YjFhZGI3MGYxZWFm ZWY4M2I3ZGVkOWYwMDkwMGI3ODE1MThiZmY0MzE5NTQyZTVhDQpiOGYwMDU1ZDkxMjgxZGI3Mjkx OTMzNDk5NTI1MGEwNjgzZGYwNmIwMTI2YzkwNGExMTA0ZDAxMzBhODVjZTNmNjlmNTZhNTJhNDA4 MDUwMzIyMDEyMDQxMTAyODE4MTA0OTk1MjVkMjU0ODU0YzVkMjU1MzU3NDllNzdmNmI4YQ0KNGM4 YTE0YTU3MDI4NDhlMTYwODA0MmMxMDA4NTgzMDE0YTI3OTNlNDEzODQyZjAxMzgwZDQwMGJiNjlm MTRlMDdkNTkwMWUwNzM5YTJjNTEzMjY2ZjJmZTQ2MjkxMjg5NWMwNTI2MjNmYzFmMzhlYWVhZWJl YjllMzQ1NDk5MzINCjcxOWI2Mjg2NDZhNmExYmYwZWUwMmMzMDFlNTk4YTQyMjAxMDM4N2JmNmFj NTk2YzUwNDI0MTZhNmI2OWE2ODUwYjE3ZGUwM2UwMWMwMDg3MDFlODA0OTAwMWEwOGRmMzRjOTE1 ZmQzYzA1NjdhMTU4MDE5MDA4ZTAxNzBjMTljDQozOTczOWVjZWE0NTMxNDBjODgxNDBhMDQ0ODk2 YTQ5ZjAyNTgwZDIwNTVlNmI3NjQwMGE3Nzc3NDc0M2NlYjk4M2E2NWUyMzYxOWFhNGM4OTQ0ZTIz NzAwMWE3NmY5YWJmYzA3MjA5M2NmZTdiZjZmYTgzMjY1MTMzMWIyNzU5NQ0KYjJkOWNjNmYwMTFj OGFlZDU3NGQ0NzJhOTVmYTY2MzgxNDIyNDFmMDkwZThmNzNmMGFlMDcyMDA4YmMwODRhNWJkODUx YTAwYzczOThlNzM5MzY1OWFlNGYxNzhjODM0ZjQwMTAwNTcwMDk4ODZiMTJjNGUwMDcwNzA2NTJl ZjcNCmJjM2JkMGJhMjJkMTk0Mjk1MzdlMDkyMGJlMTdmYmI4Y2Y0MTA0NzA4MTJhNDU0NzU2YWNh MjI4ZGYwNDEzNmE4YTIxMDMzODRkNTM5NWMxODBlOGE3YjhlM2ZjMDJjMGYxMDBmNDVkN2M2ZTE3 ODA1MzAxOWMwY2UwNjM2MDgzDQpiN2IzYTgwZTA0MDJlNzRlOWYzNjhkOTE3ZjQ1MjYwMDI3ODEw OTg0YzUzOGY4YzBhNTRiMjkxOTMzMjkxZGI3Mjk2NjE5YTQ2OWRhYTk2MDkzZTAzZjFhZDM5Yjli OWJkZjQ5ZDgwNjI1NjMyNmQ1MTU2YTM3MDM1ODVlZDIyNg0KYWQyOGNhZDcwNThmODdlMmYxNzgy ZjgwMzMwMTE4YmJmOTVjYzEzNjRkMzI1NTg1ZGE1YTViMzdhNjUyYzkyZGExNjA4MDIyOTFjODM1 MjhjZjYzMjc4MzJhMDBhN2NiZDE0ODZmMjQxNDI0Yzc3MWFlMDY5MDJlYmEyZTAyMzgNCmMzZDQ1 NDRhM2I0Y2E2NTg3MmMwMDExZmUwM2Y5NDZjMDcwMTVjYTYyYjhjY2Y2YWIyNDQwMDJlYzQ1OGMx MjlkN2Q4ZDhmODMzZDFlZjIzNTU1NTdmMDVjNjEzZjcxNGRhYTQ0ODg4YzA3ODJjYzA1NmQyZWE2 ODM4NDRkOTZjDQplNjdlMDBjOWRkZjg2ZDFmODA0M2IzZTlkNGI2NzAyODQ4ZjVmNTc1M2YwMTkw MjhiYTZlMDNmOGJjMjY0NzQ3Yzg3NjU1NTVkNTE1ZjgwZjVhY2RkNTA5MjdkNjlmOGM5OTk0YjQ0 ZGFhYzg2NjlmMDFkMDU2NzQzZGRlZDhkOA0KNzg0YjI4MjA1MjJlOTc3YjE5NGM0MGRhMWQzODYw MTMwYTAwYjA2OGQxYzIzZmU5YmFiZTUxNTc2NDRhYzQxZDRhMjQxMmZmOWMzZTdkZmFjYjhiMTcy ZDdhYmVhM2FkZWRmNTU0Y2NhMjc4Y2MyMjAwMWZjNWVlMGRiNDA3YzANCjhhZmFiYTNhMGE4Nzgy YjQ2MmM1OGEzZjAxYjA4YWFlY2ZlZTY4NmZhNzg0NmQ1MGRjMzIyODVmNTVmNTMyODBlYzZlM2M2 ZjlmYzAxMjRkOTY0NjI0NGI5ZmNmNzczMTE4ZTkwMmQ4Y2MzZjJiMWMwY2QwOGMxOTMzMDhjMDky DQo1ZGY4ZmQwOGJmZWZkMmM2ODZmYWNkYzE4MDQ4M2VhZjk3NGM0MzJmZDY2NTViMDA1Y2E4NGE1 MWQyMTRjOWU1OTk2NzAyYjg1ODk2ZTVhZjA5ODJmMDQ1NTM1MzI4NmVlOTE0MGEwNDI4MWEwZWQx ZGNiOTczM2UwMDcwMzYxOA0KZGZkZWQ5OTVlNjAzYjA1YThlNDYyODEyMGExMjgwMGIzMDRhYTkw MjAwY2UzNTM1ODUzMjcxOWJlNDY4ODQwMDJjZGU4NWY3ZmVkNzQzMTA4NGIzNGQ0ZGExNTRjY2Ey NjRkYzIxOGM1ZDk5OWRkOTc0OWEwYzRkMjUwMDZiYzANCjNlY2E2NDkxMDY3MGRhZmNmOWYzYzhl M2YxOTBjNDNlZDI0ZjFjNTMyNzAwNWZjNjM4ZmNiYWExYmVmZWRlNjlkM2E2OTYzMzYyMDBjMDI3 YWEyYTczMDQ2MDI5OThmZWZiMTlkYjM0N2E4M2EyNDgwMWQxNGY5ZDlkOWQ3ZjAzDQo3MDE0YzZh ZWM4MWQyMTBhZTAzMjRkNTFjODMyMGQwMjMwYWJlOGRhZDRhYTVjYzU1MDI2NmU5M2E5MjllZWE0 ZmJiNzgxZDhkMmQyZjQ0YmRiNTAyOTZlMTk5NDRlYTdlZjAyYTBmMDZiOWVkOWIzNjc3ZjI1MWMw YTUyNTM1Mw0KZDNlZmMwYzg2OTMxMTRiMDU5NWU4YTEwODBhM2IyZDljYzliYzE4MDQ4YjZhZTUy NzU1NWQ1NGIwMDBhZWVlZjE2NmE2YWE4YjNiZGZkZjFmMTNhMzU3YmY2YWM5ZjRmOWQzYTNhYzBl MTYwODBiMmQ5ZWM3NzAwZWMzZmE1YWINCjkzNzQ1NTJlMzdmODE2OTg5MWU1MDZkYmI2YjY3YTA1 ODE2NmVjMzc3ZDMzOTgyYTU3YWU5ZmU1OTBhYWNhZTU3ZTFlMGQ4NzY4Y2U5YzM5M2YwMWIzODMw MzQwYWE1MDI4YmM5MGI0NGRiMjc1OTUzYTNhM2ExZWMwYmYwMTVmDQowZTc3NzY3NjZjNzI0Yzlk NmM0M2EzYmFiYWJhYWY2MmI0ZDM2YTJlOTdiYjNkMWEwZTExOThhYTUyYWM0M2NlYjEwYzlkYTQ0 ODk4MTQyOTQyOTUxNTE5MDI3MDMxODA4MzAwNWMyNzA4MWViMjJkOGIwMDdjMGFjMDE0NTExNA0K NmZkNjRhMDYyNDVmNTU0NTNkMzNmNjFiNmY4NWEyYTdhN2U3OTdiMzY2Y2QxY2I5NWU1NTU5Zjk3 Y2NhYjE0ODhlODQyOTVmNTU0NTAwYTZmMzRiNmQwMDY2ZjJiZjA1MzA2Nzg0OGJmZDJjNGQyMWM3 ZDQ0OTk2YTIwNGUwMjINCjMwNzNlODhlZTAwMTcwNDYzNDFjYTI3Yzc1ZDU2NjhjMWE0YzgyZTE3 MGY4YzY5OGExOTE2MzZhMDRlMGJmYzBkOGNlM2U4OTcwNGY0ZmNmNjBjMjM2Yzg2MDFmZmZhMzQ1 ZDczYWU1Njg4NGIyOTkzNDYxYWM4MDA1MDBkMDY0DQphOTc3ZjZhYzU5MmVhOTNhYzFlN2YzZGQ5 Mzc2MmM0YWM2NGNlMjEzNjIyMTQ2Mjc0NDJlMTgwY2RlOWE0YWM0OGIwN2YzN2NjN2Q0NDk2Nzdh NjlhNjVjZTdiYWJhM2ExZjRjMjYxMjU0ZjQzYjRiNjI4NjQ2MDBiZTUyNzQwZQ0KYWI1NjFkMzlk MDU4NWZlNzNhMmRlYTE1MjllMjVhYTZiZTBjZTA2YTUzNTNjOGViZjVkZTBjZTBkODcwMzA0OGEx NDA4MDE2MmQ1YWY0MDBjNjFhMzM1MjUzYTc3NmJmYTFiMWZlYWMyOGZlMGUzNWQ1ZDUyNDQ1YzIw NGEwYjkNCmU4ZmM0OTg2MmE1MzMyNjY1MjYzNDNmZDEwYzY0ZWFhN2QwMjgxZTlkM2E3NTNjMjM2 NDg5NWEzYTUzY2U1YTg0ODI4NDgwYjE3MmU3YzE5ZTNjY2Y2MzliMzY3Zjc4Mjk5MTk3M2YxNzhm YzRiNWVhZjQwZjVmNWY1Y2Y1NTU1DQplNmI2Y2U5ODNlZmRjOWEyYTZjMTYwNDBhNDg0NmQ5MmEy MjhmNzAyZjhiNDY1NTkzZjU2YTUyODM1MzYzNGFjNGJkODA2MDFmODc0OTk0N2Y4NzQ5NWFkM2Mz MDVlMGEwMDllNTRjMmU5Yjc3NGQ1M2QxNzA2ODBmNmI2YjZiYg0KNGM0ZDdkMDk2Y2QwMTdjNzJk OWQ3MjE1ZDliNWJhMjI4ZmQ4OWIzMWFhMDY3OTAwYWNhY2FhYWNkY2NjMDc2ZDBkMDBiMWE5YTE4 MTRjMjY1ZjdjMjkxNDBjMTA4MDhhYTJiZTM4ODU0MmUxMmY1YzAwZGJiZmU4ZmM5MmE0MTMNCmEz NGNkYzc2MjdiNTgyN2QwNGRlNmMyNmYzNjRjMjM2Yzg2MjJiZTJhOGEyNmJhYjdjNWUyZjAxZjgy MjI2MTZhNGQ2NjhiMjQ0OWExY2E1NjgzNGIyMDVjMDAyN2VmZTA0YWUzMzE3MGIyODE2ODA4YjZh ZjI3OTUyYTIxMTUyDQo5ODkwNzU3YzJlOTdmYjQ2MzI2NjUyMjgxMDIwMzAyMzQ0MzFhNGI2YjZi NmM3ZGJkYmRiZmY4MDUxNTIwYzAwMWQ1MjI0NGM1MjI0NGMzMWRiMjIwMDQ4MjQxMmU3ZjM0MWJm YjZiYWJhZmExMTlkNDlkZTU5MDBjZGE2YTY1MA0KNWI1YmRiZmRmYzVlYTVhZGFkZTU1N2M5NDRl MjAxYjA4MTNkY2ZkMDU0OTJhMzYxMzIzNTg1ZDZhYzM5ODkwMDA4ZTk2NDgyMDA0YzI5ZTk0ZjE4 YzA3ZmYxODEyY2Q2MWUxNjE5YWE0YzI5YzdhMmY2ZjZmNjQ3YjFlYjQ2OTgNCjNkMDY0ZjQ3NDdj NzRmMTNiNjQxOGExNDIxMDAwNzE0NWQzYjBjY2NmNTU2NmU0NTE1YTM5MGNkNjRkZTUzYTUyODI1 NmM4MzJjY2JmYTQxZDFiNTgwMjY0YmQ0ZGRkZGZkMTJiNjdmNTkwMTRjNmYxNTAwNjBjOTkyMjU5 NzgzDQowOTNmYmI2MmY3OGQ2M2Q0YjExMTcxMWNmYjhmMmU2OTllM2Q3YmQ2YmJmY2ZjMTdmOGMw MmZlM2M3NjcxOGFhNGM1M2JiYmJjOWI2NGNkNzZjMzkzZjliY2QzZTUwYzRhNjRhY2RhZmM1ZjAw MmI4OTJhZmU0NjI2YmRlMzI0Mw0KOTUyOTY5OWJiNDY4ZDFhMjNmZWNjMmJiZWM1MTVjOTRiMDQ2 Yzg3Mjc3ZDFmOTgzMDU0MTIwMzA5NTYzMjIxY2VhMTUwNGYyZmJmZDc3ODBmOTViYWZlMzZhNDM0 ZjUxOWJjM2Y5Yjk1M2Y3NjhjZjc3OGMyZWIwNzdmMjAwNTgNCmFhNDQyM2M0MDdkOGE1MGU4Nzcy YjIyYzgyYjE5ZTJmOGI3ZTFmMDEzOGM3NTQxNWIyMGRjZDc1NWRlZTQ4NjhmYTc0OTgwZGYyYTE0 NWU3ZDZkOGJhNGE1YzQ2Mzg3YjRmYmVkNGNlZTA0ODViNTdkZDk3M2VhNmU4ZmMyMmQxDQplZjI3 MzBmN2RhNzgxMGE2NGQ5YmY2YzM4MGU4MjcwMDY3ZjA3Mzg1ZGE3YzM1ZjMyYzk5MjY2MTk0YTQ3 YjFjZGIyMjUzNTM2ODZhZjc5NDcxYTVlNGJkMDA4NWYzNGYwNTZjOTAwZjczNmM3YjA4YzA3Yzdl ZGQ5MGEzMTFiMg0KNmRmYjY2OGNkYWEwYWY0ZTU4MDY1OTZjNDIxZTAxZjYwZDRhMWQxMWU1NzAw MTVmYzlmMzhhY2U3ZGNhMzE3NTU3NGYzZTcwMGZiY2NmNGVhMTRkNTc2NDU3NjhmOTU0ZDFmOWZk YzNlY2EzOWMzYmMxYmQ0NjQ1NDVjNWYzN2UNCjlmOGYwMGNjZTFlNzk2Mjk1MmM0MzU4ODdjOWQ5 M2I3NGZiYTM3ODQwMjIyMzUzNzM3ZmYxOGJiZWY3NGQ4NTkxYzgxODlmOWUwNDIyOTEyMjIyOTEy MjJjN2I2YTg1MGE4N2QyMDE1YjMyODlkNGVmZjYwODI3YjAwYTAyMTk3DQpjYjNkNWNmMmRiNjdm MjA5ZTU1MjQyMGY4MGViOTJiNmU5ZGFlZTczYmJmYzE2M2IwOWFkYTZiYWJhMzcxOTMzYzliNmVk NWIzMGFhNjJjY2UwODM3YmQ5MDRmNzJhOTE3MGU4MGRhZWQzYmE1MTBmMjc0NGMzMjE3MjFjZTcy Ng0KMzAzZWU4OTkzMzY3Y2ViMGE1YWJjNDA1OTQ3ZDFkMDEwMDJiMjU0OWZhNjEzYTZlOTNjOTI4 ZGE3ODcyYzAyMWJjN2Q4ZDFjMGQxMzgwYzM4YjJmMGE4MmYwNjk0ZWQ2OWJmODI5YjFiMWIxZjFi OWI0NjM1MzZiNGJmMzIwMjYNCjZmNWNkOTY1NzhkYmRiZGIxZjRkM2IxNmVkM2Y3NzZlM2Y0NmVk Y2ExOWJlMjIzZjhiZjFlM2JjZWM4ZThlMGU4YTNiYjE0MThjYWEwZDQxMmUwNTdmYjFiODYxZGM3 MWE4YTYyNmZmMWFiNjk3ODZmNzU1MDQ0M2MxMDBhNWUzDQo3NjI5NDUxYjAzNTExNGJmOTU2MDU0 YWEzYWUxZDgwNGUwMjI0MTEwM2U4YmIxNmFkNzk3Zjk0MjcxZGYzZGExNzExNTJkMTgwYzVlYmEx N2RmMDEwODg3YzM5N2M1YWQxMTgzYzIzNDdlM2ExODhiZDk5YmE2NGY5ZGZhMWFjNg0KMWY1YzQ3 NTMxNDRhZDgwNjc1NzU3NjhjZDFmMWVhMGFiNTFmNzAxMjc0NzA1MTdiNzFiYjVmZDhmN2IxODQw YjVkMGJjYjVjOWIwMWU2NTQ3MDkyYzllNGJkOTE1MGQwZTVhZDE3NzQ3Njc0NTAyYTk1ZmE1MTUx NWJiMWJhYmENCmZhMDljZTkzNWQ5Njc0ODBhOTJhZWUzZGQzYjA5N2QwYWUyYjMyNzM3N2M1ZTNk N2JhMjcwYjg1YzIwZmI5ZDlhZTVjZmMxNDAwNTgxNTE1MTUyZmU1NzJiOTI3MDA3YzU2NTc2NDhh NDQyMmQ3MTY1ZDM3YWFhYTcyYmZlNmIzDQo3NmFmNzVmZTVmODgxOWQxNzA4ODBjNTU3NjJkNTg0 YmQyYTlkNGJkNzFjYjIwMDA5N2NjOTkzZDdiNWQyMjkxYjhhYmU0MWUzM2UxMzg0M2Y1ZjU3NTZm ODJmM2U5Y2VjZWNlNWZhNzFjOGIxMjRlOGM1MDNlMDA3MWI3ZTBlZA0KZWNlOGU4Y2JjNDZkYWFh ZWFlN2UwZWEzMmJlYzIwMmUzMThmYTdlZjg1NmRjYmVjYWQ2NmI2NWUwYjAwMzJlOWU0NGIyYTli MTBjNWYwODBjZGYwM2QxZDVmZTUwMWYwNzEwMDI3ZWVlMWRmOWQzNDgyYTJmODNkNGVhMWJhMmQN CjRkNzE1NWNhNGM2YjZiY2IwN2I5NmM2NjgwZjNlMjc5ZWRlZGVkZWY2MDJjZWY5ZWNkYWZiOTAy YWI2MjliMjZhNTFkOGI0Y2QzZmNmYzllZWVlNzI5NDViNmRlNTY3ZTJlYzVhZDU0Njc4ZDczOGYx ODhiYzUxZWQwOTljOWFlDQozYTkxNDg5YzE4MDgwNDdlYTQyYjEyMTk4NjcxMDE2ZjUzODViZDRi OGUyMzAwYmVjZGM5ZGRkMjg2ODY4NjcyZTQ3MzZmZTMxMGVlZjdiZDU2OTEyMjY0ZWEyYWI1YjRi NGRjMGQ2MDg2YWU0OGM0MmQ2NTJkZTc5ZWZiODk0ZA0KZDhkZWJiNzYyMWVmN2I5NjFmMWY1OGE0 OWFlZWIxODg5Nzg4YTEyOTk0NzIyYzAyNzA4OTdiMzI5YmNkZGVkYmRhZGFmYTAyYzY3MTcxMDk4 MjcwMTVkNzczZTcwMjgwYWUyYTk0OGM5OTE0Yjc3NGNhZTdmM2Y3MDBmODFjOTcNCjE4YWJmNzU0 NDcyN2MwMTc3NDQ1MjJkZTlmMGYxYmJlNmMyNmZkYmU2M2VhNzRkNDUxNDc2ZDA2ZjAzMTQzOTU2 OWVlZGNiOWRiMWM1MzI3NDM5NTI5MWMwZTdmN2I5YzdiODMzNWQ1ZDVlZjA2MDI4MWZmNzI0ZjY4 OWE3NjYzDQoyNjZlOTNjMmE4ZTBlZTdiOWVhNjRkOWI3NjVkZGExOTg5M2U5MGY5ZTk0M2Y4Y2Nh YTFjZTdiNjE5NWU2NmM5MmE1ZWRkMDkwMGU3NzZiNmI3OTNhMWNhYWUyOTZmZTU2ZTc2ZWY5NGY2 YjY1NjAyZDAwMWEwYmJhNWE1ZTU1YQ0KMDAzOGU4YTA4M2M2ZThhMTBiMTcyZWEwOThhOTUxMjY5 NTc0MDc3ODQ3M2NjY2RiZGNkNGY4M2U0NjU3Y2UyMTk4OWM1YjcwM2M2NGViMGFiNTY0YTgzMmM5 ZDFmMGVmNTM4ZWU1YmVmZmM3MDA1Y2MwZTNjNTY2OGY3M2VmMmMNCjZlYjM3NmJmNTVjYWQ0NTQ0 YWM2NGMwMjczYTllZTE2MTQ0ZDk2Mjg2MTFiMjQwODgyNmIyYTBjZGE5NjQ5M2U5ZmVmYmM3MWVl ODkyNGUyZjEyZDA5Y2I3MDY3NTliOTUwOWMyNGY2OGM0YmFjYjUyMjliNzE4NTk3OWY3MTg3DQo4 MThmYWZkNDYyYjc2MWMwZWZmNzdmOTNmM2I0MmY4MjA1ZmM5NWMzMTkwMGE2Nzc3NTc1ZmRjMDg5 YzUwODgwNTdkM2I0NmI1NDU1N2QxNzRjM2U5MGIxZWI1ZTllMGUwMDRmNjcxMzMxOTcwZmJiMTYz MTg0YzNlMTFiMTVjNg0KYTdjYmVhYjlhYWFhN2U4NTJmMjg1NzQ2YjkzMGVkNThhZWEzNjVkNzI3 OWVhYWFhOTdhNjFkOGJhNjc0NzU2ZDczMWYyZTQ5ZDJkOWQyZDhkNTVjOGEyZmE2ZDNlOTNlMDBl N2FhNzI5NDBjNTUyNjQxMTAyZTQ3NTEyMGRjMWUNCjg2MGZjMGU5OWEyYzUzOGMzOWNkM2ZjZTY3 ZmMyMTQ1NmQ4MmUxNzBmODk2Y2FjYWNhNzU1YzVhMmYxZTdjNTdiNWNiNzI1YjcyODFjYjBkMzdj OWIyN2MyYjVmNjkzNzAwYjg4ZTdiYWE4ZTAxMGJjNzM5MWEzYmE3YTc5ZjE1DQpiNzc0NzdlNWNl MDRkMGUxZjNmOWFlYjM2ZGZiM2MwMDk2NjUxOGMzMThkZmVlOWM4ZTg0ODI2NDlhZTYzNWZjZDgz NDM4Y2JjM2M0ODZhNTA5MjFhYTUyOTRiODM4ZWZhZWRlNzA3NGQ0ZWY1OTBlYjMzOTVmNmRlN2M3 ZjUwZA0KZjVmNWVmZGE4NjQ2MDcyZDViYjZiNWEyMjJmMzIyNzZkZDFhMTNlZGVjNjhhNzcwMjg0 ODcyMzQ0Yzc1ODUwMjM1MzczN2RmMDczNjkwMWE4MDc4NGI3M2YzZDNhYTE0YTVhNDZkYmE0Njk3 NjI1YzY1YTgzMmE1OTg3NWVjYjgNCmY2YjZiNjdmZjJmM2E3ODA3OTczMmVlNDJiZmM2YWM3ZDRj OTMxMzU4YTE5MWE2NTEzMzE5MmEzNjE4YTE5MWEyNTYzMjZmOWJjNWU2YTZkNjk3NjdkYjZkZDk4 M2NhNGRhZGFkYTNmODM5MTY1NjRkM2U5NmQ4NjJhOTMxMjhkDQo1MDQ3NDdjNzEzMDAxNmYwNmYz N2RlYTRmOTE0MjdlNTM2MDAwODgyNzA0MWRhYjE1ZDJmZGUyZWFkZTJhMzkzYjY0OTk5NTRhYTk4 NzQ5YzE3MGMwNjNmNDA3OWRmYWU0ZjU3MTU2YTZmNmI3YjAyNjMwNTJmM2Y4MDJmM2JhNg0KNGU1 ZDVkNWRjZmVmNGE0NzhhZDBkMmQ1ZDk0OTAwY2UwN2YwMTU1NThlOTIxYzhkNTA0MDE0YTliM2Ez ZTNhNzYwYWFkODE1MzY5MzMyN2Y5NDg4YzdiNzYyMzQwNmNhOWI0YWE1YmU5Nzc2MmNkMjU0NzUw YjM4N2ZlZGU4NjgNCmJmMDdjMDQ1NGQwZGY1OTRiNDRkOGE5OTFhMjU2YzgzYTY3NDc1MTE4MGYz NmI2YWYyOTRhZmFlN2UxYWMwOTlkY2ViNzM0YTQzN2QzZGE5OGE0MjgyMjA3YzYyNTc1ZmM0ZDZi NTNlMDBkNzAyNjg4YTg0NDIwNGUwODRjNjg2DQo4NjQ3NjJiMWQ4ZDNlM2RjMjIxYjlhNGE4ZDBk MGRiN2YxNjM0YjkzMjU1N2Y4YmQ2OGE3M2I5MDcwNjJjMzljMDRiODgyNTJjOGU3ZjM2ZTY3M2Yy ZGMyODkyNjhmNTc4YWM1NjJkZjA3OWY2OTFjMzEzZTNiZjc5OGMxNWNkMw0KYjQxZTMwYzFhMzA3 YzBkZDcxNGI3Nzc5ZmUyMTNlOWZlZjMyNWQ5MTVjZGU1YzA5MDBhNzlmN2VmYTRkYzk2NDcyODAw ZmZlM2MwMGFhMmNjYjc3MDNmODYyNDU0NTc2ODhlNTEzYzU2OGRhYjRhOTViMDE5YzkxNGMyNGRl MTUNCjQ1ZjEwZTAwYjE5OTMzN2IwODgwODc2NzNhMmUwMDliMWNiYjk1YTExMDBhODUzZTVmNTU1 NWY1MmVmYjMzNzQzZDhmMzBiZDk4NTM4NjgzYzdiOWVkOTM5YzE3YWIwMGUwZjNmOWFlNDhjNzZk NGFiMzQ1YjgzMzkxYTllOGI0DQowZDk1MmM1ZDJiMzY5N2FkMGViMzk5NTY1NjJkZTIwMzc4NGIz MjFlZGY2MGViYWExYmIyNzIyYzI2ZTcyZWRiNTUwNDAzMDE5MWE0NDg5OGNlMzllNzljMzdmMmQ1 NTVkYjM4OGYzYjFhYzAzNWRjOWZmYTY1YjBlMDgzNzAzYQ0KOTllODRiYzU0YzM3NWU1OWY1Nzli ZGQ0ZGQzZDg1OTIzMTkzZGFkYmRiMWYwNDcwODdhZGFiMzQ3N2VlOWNlN2MxMmM0OGE1OTExODFl OGM0YWUwNWVlYzVlOWE2OGQ4NzE2MmQ0ZGFkYWZhNjIyMjkxZjg0MWRhYjEyOTZlMTkNCmU0NTgy NmU5ZWNiYjk3NjM2NWE2MmM0NTI5OTNjOTVjY2Y4ZjMzOWEyY2I5N2VlMzY1NjVkYTk3YzdlY2Q5 YjNmZjkyNjE4NjczOTdhOTQzZDdkNDQxOGNlZjA2YjQ5YjliOWI1ZWM3YThjMDcyYTExYmMxZGZk NWQ5NDE4N2FjDQo1OGIxYmJmYWU3YzhjYmI2YjdiNjdlMTU2MzVmN2VjNGZhMzU2ZmZmZmQ5ZjUy ZTVhOGJiNzI2NzI0ZTJjZTQ2NDU1MTllYzNhOGMwNzUwNTk3MjkzZTBkNDA4OTNiMzY2NWUyMzE4 YTk5MWFlOThhNDRhNmFhNTAzNjExYTMzOA0KMzMwNzE2MWI0NWE2NGQ5ZDNhZjVmNmEyZTM4MzAy YTI0OGEyMjgxNjBiNzI3ZWVjMWM3NDAwYTczNWQ0ZDU1MTM2MTFhMzZjMjI0Njc1ODVjMjE2MDBm MzBjNWQ3ZmNmZWZmNzhmMjdlNzVjYzI3OWIxMDgwMGY5N2NmZWE5NGMNCmRjYTZmZGY2OWJiZTY5 OWNmNmRiNDE1MmE1YTg2YmQ4NzYyMzIwNjc3M2FiNTUzOTY2MWUwNmNiZmE5YjAzMzZjMDBiYjgy OWYyZjQ3MDM4ZmMzNTJlMDQ3NDRjZjZlMWU1MTAwYzA2MmY3NzFjZTc4ZjAwYTYwMjM4YTk1MDI4 DQpmYzEzNDA0NjkxYTU5N2MxZDQxNjExYTM1NmEwZjliNjZkM2ZkM2QwZDBmMDFiMDA2YjM0Nzk0 NDU1YWI0ZjI3MTM1YmY5MGEzZjM4MTQwY2JjNWUxNGFhN2E3MDNhOTkxY2Y5ZDA2MDgyOTA2YjYx NWJjZWZkYjQ0YjAxZjgzNQ0KNGRiYjIxMjA4YWFlZTAxOTAyNzA5NjE0OGQ5MjZkZGJhN2VjZTQ2 YmQ1MmE1Mjg0MTI5NjQxNTNiYTNhNDk5MmEyZmY2ZGViMmFkNWQ1ZDYzZTA2NjAxNmI3MjM5NDMz NjRlNDRiZjRlMmU5ODYyYWJiYWFkN2E0ODRhZGEzMTMNCmI2NDE4NzFkNzZkOGM4YWE5YjMyNjVj YTZiYTIyOGRlNWNhNjZkYjBhOWIxNjEyODY2NjhhNDJiMzI1NTU3ZTUwNmQyODkzODc1YjNjODBi MGYwMGM3ZWJmNThlYzc0Zjc2MDQyZjk4ZTVlYzYzMDA3ZTZkNmEwYTE5YWE0YzlhDQoyMjhkNDQ2 ZmRhODZlNjU2MDBlOGUwMzY3MTI3MTIwYTkyMTQwOWJiMTNmNDBjM2UzMTNmMGYyMGE5YzkyM2E2 YzE2YmQzMGU4YjEyZjEzM2Q1NDg1OWJjNzhmMTIzMmMzOTRjMjY1MTE0Mzc4MmU5YzQ4ZTIyNDUy OGVlYzRkZQ0KMDQ1MDBmZTAzYjNjNWFlMzRhMDA4YmE1NDg5ODM0NTU3MTI3YjAwMGM2MGEzZThi NDlmMmMzNDQyMmYxYjVhNmM2MDY5N2VkNzkxMjg5YzQ2ZDdjYTBlYzE5MzM2NjBjMDEzOGIyZGM3 ZDJiNTdhZTVjZDdkNGQ0Yjg4ZDFmN2ENCmJhYmJiYmRmZTNmMmQyOGU0MmE0ODBiOGUzM2M5YzYy OGRkZDE5OTlmMTdhODVmMTU2NjE3NzkwZTk4NjI3MDIzOGM3ZDI5OTVhOTFjYjY1ZWZjMWVlNDVl OWZiMDE3NGU1YWJhYjI4MTkzM2RkNDFmOTQxMzI5MTc4OGRkYjYxDQphZjMxNGRmMzM3ZDk0NDhj MWM1MzI3MjUxYWExYjgzNTEyNWQ3MjEwODA2MDU1NjU4ZTVhOWE5YjA4YzA3NTdjZDU4YTMxZGI3 ZTMzMTIwZTUxYmVhYWQyOTUzZTZmMDUyN2Y3YzE2MGYwZGU0ODI0ZjIzMzAwYjc1OGJhNGFmMw0K ZTdjZDIzMzc4NzM5NmViMWEwYzI5NDYzNTFjMjM2ZThhODU1YWJjOGQ0MTQ0YTI3ZTMwNDQ2Mzk5 MjFkZWQ2ZDZlNjRlNjIxZGJiZmNlYjgxMGMwNTRiYzkzMTM4OWM0ZmYwMGY4MDYxZmUwNjk2MDgy ZDRiODgxMDM1YzhlNzANCjAzZTgyZjRjMzkxNmNkOTgzMWUzY2YzYjdhYTBhMjRhNTFmNzgzYmEy NGVmZmNjNjg2ZmFmMTc4YThkM2QxZDFmMTY1Zjc0MDE0ZmQzN2E3ZTNiNmFiODc4ZWM3NDM3Njg0 NDAzODFjZGU2MDZhMGE1NTU3NTdmZjY1ZTFjMjg1DQplYmMxNjI5YjY2NzE1Mjc5MjAwMGQzZWZm MzUxNWI1YmRiZWYwMTljNTRhOGFkMjVjN2Q0YzlkNjU1MGEzMTYxYWZhMWE1YjllOTc1NmVkNGI4 Y2ViMTJkMGEwNTAzYzQ4MzEyZmUzYmU1NTg5NDRjMjY5ZjZiNmI2ZDdkMGNjYw0KNjBiMzlmMjY0 Yjk0NGNjNjFmZDMxNTk5NTIzMWE2MmUzOThlZjM2Y2MyMzYyODkzNGUzZjViNTU1NTc1NWZjYWIx YTgyYTk3ZmJiZDliMDZjYjI3ZGIyN2FhYWI3MmQ0ZGNkNDQ4MTg5YjFmYmMzMzY4OGM4NDgyYTRj YTUxOTcNCmZmNDc3N2Y0OGRiODljZTE3YWM5MWE0YzRkMjFjZThlMjZiYzc3Yjk2M2VhOTQ0YzI0 N2VlYjllNjg2OTZlMjYwMGUzOTkyNTRiMTFjZTY2YjNkNzM4NGVlYzFlOGM2ZmE3ZGUyMTYyMzE5 YmY4ZTAxNDhhNGUzYjE4MTVhOGYyDQo5NTk1OTU2ZTE0YzgwMWM5NzhmY2M3MDBjZTk2MjIyMTRh M2IxNjRkOTkzMjY1NmQ1NzY3ZTc3ZDQxZjYxYmI3NWE5NmI1Mzk5ZmNmZmYzZTY2NTliNGYyOTA0 MzVlNzY2MmY2M2FiMDE1YjIwMmMwZTczMzk5ZjQzYmQ5NDRjYw0KOTU0NmFmMDM3MDI5N2ZmZTcx YjE1OGVjYzE1YzM2NDMwMDE0YzdiNjA3YzAzMjEzOWI3NTQ1YTIyMzBlM2I4YzZjNWQ2NTgzNmQx ODc3MDJiODI0OTM0YTkyZGZlNzczMjMyYTc3ZWFiNTAxZWM4NzQ5N2FkNzQyYTFkMGI1MzUNCmQ1 ZDU3ZmU3ODc5ZWI4MTM3MzhkNTJlM2IzYzQ1MDI4ZjQwNTRlYmE1Yzc3OWVjMjc5NTg2MWRjOWJm ZTc1MjgyZWU1MTAwM2UzZjlkMzAxN2NkZTk1MDlmMmY5ZmM1YjFlOGZlN2FkNmMzNmYzNmU2ZDRk MGQwMWY4YjFhNWFiDQo1NDU5OTk3YjEzNDA0NTY1NDU5NjUyMzE5M2I4NTBmOGYxZTZhNmE2NjE0 MTEwNWNiZDNmMGI5NjdhNmFmMTk1OWYwNDcwYzZiNDY5ZDMzNjAwNDA0NzQ3YzdmNzA0NDFiODNl OTM0ZWRmOTY3NjJjYjJmODQwNzc3NDc0YmM4MQ0KMzJlOTM5N2IwMThiYjliMDE1MDU4MDY4MzRm YWU1NmMyMjQ2YmFhYWRlMzllZTFkOGExNDcxNDMzZTVkMTNkYzgxMzIzMzgyZWY0YmE4MDY1MDIx OGFlMjBiMzVmOTZhNGEyNjkzNzdjYmQxMzBjNWUzZjE3YjFkYzdmZWQxOGMNCmU5ZDNiZjdkZTI4 OTI3YmU2OGViYWFjYjk3YTliOWE5ZTk0ZGQ3ZWM5YTRlMjUyOTFlOGYzZjVjOTljYjUxNjM0MzAz YWQ1ZWJkZmFhZmQ4NzE0MDQwMjM5ODg0MWE5ZDM3NmZkZTViZmM5YzFiZWNlMGM2NDc5Zjk4NGRh N2M4DQpkMjU1NGFhN2QzZmY1ZDUzNTM3MzMzNDY3ZGU3N2IwMzAxNmU1OTczNTdlY2M5YTk5OGU5 OWEyZWNiMjJhNTJiOTI2YmFiZjUwMjgwMmNjYjM3YzhiMjdjYzMwZTFlZjQ2MTE1NTMzM2MxNzI4 Y2VmNzcyNWU4ZTZhNjQ2OWFiMQ0KZGY3NDcyNGM5ZDZhNmJmMmU0NGFkYTRkNGQ0ZDhmMjc5M2M5 MWZhNTE5MzUyMjAwOWYzMTU0OTliYWE3NGMyMTAwMjc3M2I3MWRmOTdjYmU1ZjAwMzhiN2FhYWFl YWYxY2FjYWNhMjc2YjZhNmE3ZTBmNjZmNmViOThjNDdiMzUNCjU0YjE0ODk1NGUyZTFiYTQwMDVj OTE4OWRiOTQ0ZGM0NjhmZmZkZTcxMmI4MmY3YzE3ZDE4ZTFkYTgzZDRkMGQwZGRmOWYzZTZkZGE0 YmZjYjBkNjdkN2Y4Y2NkODUxYWMxYTE3MTRiYTdjZWNlY2U2N2RkMTM5NjY1MTJjNjQ2DQpkYzZm MDdjN2I2ZGM0NGVlZjFiYzRiN2IwMmZiMDU0NDNmNjliMjQ0YjZjMThjMTJiMTk4YmQxZTQwM2Rk NzQ5NGYwM2IwNWE5NjY1MDJmMGE1NDgyODQ4ODU0MmUxNmYzYzZlOWIwMDdjODZjZmY2MTNlNDY4 OTg5NjJmM2ZiOA0KNWY5MzI1YjIzNDg1MGUzYTY4MTllOTBhNGIxNTk5M2Y2ZjFlMjU2MzJjNWZk NzY2NDlkYjJiMzFmZTQwY2I5MjI0MWQwNDIwYzY1NTJkMDFjMDU1OTZhZTUyMjY5NTc0YzM2NzI3 NGE1ZDk5MDhkZGJhMjI4ZGU0NGI0ZDgwZDMNCjM5ZjUwMDAwYzQyY2QzZjUzMDFkZWI5ZTJiNTY2 NTVhN2MzZTFmOWU3OGUyMDk5Nzg2OGIxYmRlZDkwMDAwYmZjNTA0MTgyMmZhNWQzZjJiZDViYmIz OTY5YzQ5YzMzMDBjZDNlYmY1MDIyMDkwZTBiYjQxNTYzNGFjNWZmZjU2DQoxYjgwMmQ3ZGZkZmRl NzAwYjhlMTk4NjM4ZWI5NjFkM2E2NGQzNjgwNGYwYTNlZmZhMzliMzZiYzVkM2QzMDM4MDhkMWVm ODM2MTE4ZGQ1YmI3ZjVkZTljNGEyNmJlYWQ0YTUxM2NmMjliODdmY2IzZTZlZWZmMmMzYzFlNzhl MA0KMTk3ODc3ZTNhNjE1ZGJmYWZhZjBkODFmMWVmZDYxNDdmN2I0MDE4ZmM3ODM0MDMwMzg2NDFi ZGExZDE1MTVkOTVlOTRhZmRkYjE2OWYzZTZjZDc3MDFkODI4NDkxMjAwMGMwYjgyYTBlOTU2ZWNi NWQ3ZGVmOGU3YTE1ZThmMDcNCmE2YWFmY2ExYWRhZDZkNDc0MWYwZTUzMDM4MzgzNDhjZjU2ZmJk N2RjNjBlZGEzZDNlM2MzYzBjNzBjNzQ5MzAxNGZlOTljZmViNDUzMjk5ZGM5ZTM1ZDQxNTZhZGZl MTMzZGVkNWUzZGFmOGVhZDgxMWZjZDhiZDY4ODczMWRkDQphOGFmYWI3YjE4ZTVlZGQ3ZTI5NGNl Y2VmZmMyZTRmNDZiNmYzMDIwZmUzY2M2ZDRiNWZkM2MxZTBmZTVmM2Y5MmI5MmYxMzhjNTRjY2Q1 NTZmMGUwMWIwOWNhYjU1NjcwMjM4YjViNWE1ODUwMDU0NzJhMTZhNjkzMDIwOTJkZg0KZWY3Yjgw MWIzM2RhYzc3ZjFjOTNlZTE3MmM1OGUwYWE3MTc1M2EzN2M4MDA1ODM1ZDk5N2RmMDU4NGI4YjRi Zjg4MWY3ZjNjMTViM2RjZTg5YmIxMzA3NWNkYTVkZmFlOTdlNGM0ODY4Njg2MGZmNjYyZTc0YWYx MTFkYmIyZGUNCjAzNzM2MDdmNzczNzdmNmJhNjI2NDcyOTliY2RmYzEwYzAyNzUyYTlkNDQ2YjA0 MWY4YWVhNmFhMTQwZTg3NmY5YTNmNmY3ZmY3MjNjYzZiNmU2YzdjOTFmZjZkMDE4MDYxNjg1Nzgz NGRiMjJiMDE1NGM3MWRlN2I1NDgzOGVjDQo1YWU3MjY4MmViN2M1ODE1MGUwNjVjYmRmNGViOTNi ODZmYjJkOGFlMzQ2Mzc1NTVkNWQzYjk1Y2NlZjUxMTRjMzczNWM1MTViNGM2MDQ1ODY4Y2NmZWFj OGUxOGIxMDE3YzA5Y2MxM2IzYjc2MTAyZjg0NjJhOTVkYTA2OTZmNQ0KMWUwYjg1NDI4ZjgwODVk NmVjNTJmYzZmMzQxYWJkOGZhYjEwMDU4OTM5ZjFjZmE5YWVjYzUxNTU2NTI1NjFkNzRhMTdlNTYz YjFkODc4NmVkMmVkMzA2N2NlOWMwNzAxY2NmMWY5N2NkNzNhYTY0ZTMzNjdjZWJjN2Q0N2Y3NGMN CjAyODc0NzIzZTFkNzRhNGZkNmQ1ZDYzZWU1ZjNmOWFlZTA4NzkxMjIzM2VkMThkNTc2M2Y1MzUz NDg4ZTQ2NDY0YWUxNzY3Njc2NmUwNTIzNWRjNTkwYjhmMWEwMWQ2MzE1NzIxZmM2OTYyNDk4MDgx OWJmZGY3ZjYzMjI5MWEwDQo3MDM4NGM1ZTQxNzBiZDNmODdhNzUzNDllYWVlZWViZTExYzA2MTg2 MmE1MzJjMTZhM2Y5ZjNlNzkzNmRkYjk3ODBmOTcwMjc1M2M2YjA5MTkzYThhZjAwNThjZTA3YmEz OWNhY2U3ZDZlOTI3ZGRjNTNiODI0MTViMzI4YzgzYw0KNGZiYjFhNjA1ODI3NDlkMjE3MmM1ZDc1 ZjVmNTUyNmE3MGJlYzdlMzc5ZDAzZDY4NmE2YWZhMmIzN2Q4Y2MwMzQ2Zjk1OWNjZWZmMzYyZWVm ZWEzZDk4YmNmM2RmMzRjMDhjMDNmMzExNjE1NzIyNDBjNTM1MzllNTRlNTY4OWYNCjJhNDVhOTdi NGExNzE1MGFiNWVmMjg1Mjc0ODc3NjUwMDBiMzQ0YmZmZmQ1ODE4MTgxYmViNTZiZDc3NjZjZGRi YTM1M2MzNDNjZWNkOWJjNjVhYjA3YzAxZmEzOTJiNDM5MTQwYWZkMDljMDk2NjEwOGQ4ZmFjMTI2 ZGM3N2RmDQo3ZDJmMDk4MmU3NTIwMGY3NzliZGRlMGQwMWQxNGY4NTQyZTExZTAwYTdhMzdjYjlk Zjc2NWVhZWZmNjEwMGQzZTYyZjVjMDQwMGYxZmViZTdlODBkOTllM2YyY2Y4YzNjMWMwYTVmZDgz ODNlOGVkZWYzZmE4YmZiZmZmNjczYg0KNzk3ZjVkMmU5N2JiYzc1MGU1NjdkNTY4ZTgxY2MzNzZm ZTFhMDg4NTgwZWQyZDVkYWY3OTA1NjE5NjdiNTA1ZjVmM2ZlOGYzN2E4MTEyYjNlOTZhMmU1ZWJi YTExZjIyOGY0Y2RjYWZlNGM3YmE0Y2QzNTgwZmUwYjI5ZTllOWUNCjE3OTM0ZThjNGUzY2UxMzg1 YWIxN2MzOTY5YjIzNGI4ODMwZWNmZTQ1NmIxZjMwZjVjYmFmNDBmNjBhOTk5MTUwMGQwZDVkNTU5 MmMxNDM4MzM2N2NlZmM1YjNlOWY3ZjBiYzA2OTNjOTFiYzIzYzI1NmY5NTIwMGQ3NWJiYTRhDQo5 YWFhYmVlMWY1MGFlNDE1MDQzMjBjZTMzNTMwZGU3ZDIyODAxYjZkYTZkZTJkYjM3NTk1ODJjMWUw ODUwMDE2OGJhM2FhY2M4Nzg1MDA4MGMzMzllNWQ4YTk0ODk2NGMyNjczOWZhZTQ4MTQzMzM1YWFj YWU1YmVhMTZiY2EwNg0KMzA0ZjU1MzkyYzAxNTMwNTVkMWZmOTI3YjgyZmZmOTJlMjQ2ZTdmMzkz MmViM2NlZjMwMTJlMTdiMWUwOTI4ODJiMmE3MzM5OTcyNzljZDJkMzMzNjM2MDgyM2UzNzcxM2Q3 NGJlNmRkYjFiYTJkMWU4OGQzZTQxMzhiN2U4ZjcNCjdiYzAwYmE1MzliNmU1MDZhOGJiODE3ZTM3 YjdiNWI1NmUwNjcwNzQyMjExMWZkNDM0ZWQ2MTAwMzcxN2Y1YTU1NTEwODQ1YmRkZGM5Zjg0YzUw YTlkOWFiYTRhZDk0NDhjYWFhYmFhYzgzNGNkYmI2YzQ2YjY4ZTA1OGI1MGQ5DQo5YjUxMjY2MzYw OWFlNmU0MjMyZDM4MmEzMjI5NjZiNGQxYjQ0MTAwMzc0N2MzYTFkNzAwZGMwNDE2M2U1NTJhNDMy Y2YwNzgzYzg0ZDE3MGRlZjNiOTRmN2I3NDgwOTcyZjVmZmUxODNmZTkwNjkxMzU3MTMzNWM2OWFl NTA1ZA0KMzgxOGJjZDIyYjA4MzdjNjBjOGQ1NmFkNWFmNTMyMDAzODhlNzNjZGM5Mjc5ZjNjZGUw YTk2Yjg0YjcxN2YzMGUzM2U2MTZjMzY0MzI4MWMwYWFkYzc2ODJhNDYwNjYzMGQwNDUxNmVjMDU4 MTA4ZjNiMDM0NTZhODEwMDAwOTYNCjY1NWQwMTE2ZmY3NTNjOThiMWU1YmM5YTlhOWE4ZDAwYmVh ZmM5MTJmOWJkZGVkYmE0NDg3ODQzMzI2NjUyNDBmNGJiMWUyNWYyNzgzYzE0MTBmZGFjMzJiYzI4 NTIyODE4YTBhNmE2MjZmMjBhYzI0ZDNlOWZlZmRlZGFkYWRhDQpiNTFkMWRlZGE0NDgxMTUyZTUy OGY5ZmQzZTkyMjIyMWVhZWNlYzI0NTExNDZmMGEwNjgzYzc4M2IxODhiZGE1ZmYzYjAwOGVlZmU5 ZTk3OTM2NjY5OTI0NDdjMmFlOTY1MzlhYjIzMjgzMmYwODc3ODAyZmM5MjY2MmI0N2NmOQ0KZjJi NzQ2NWEyYzViYjZlYzQxM2VjMGFlNTBkNTI0YjA1OTMxMDZlMTUwOTAwYWI1YjU2ZmU1YWJhYmZm OWFjZDY2ZmY2YTZhMGEyZDVkNzI4MGViNWUyY2ViMWVhY2FlYWUzZTFkYzBkNTAwZDBkNmQ2ZjY2 MzFlYTk1MDVjMzkNCmRkMTM4ZDQ2ODdjMTA2Y2Q5N2NkNjY1ZmE4YWRhOTcxZjlmOTMyYjBhNGI0 YTMzNDU1ZmQwMGMwNzk1Y2QwMTBhZmJlZmFlYTg3Nzk5YmYzMmNjYmZhMDcwMGRmNDkxZmY5Yzg5 NTE4MmRiOWUwMDdmMDc1OWU3ZmFiNzNlZmNlDQpkYzQyYTFmMDBjMTgwNTU4M2E2ZmRlYmNjN2Mx Y2M5MmM3ODA5MWJhMGIyM2UxMjA4MTA1MTY5ZTE2ODk0NGJlMDBlMDA0NWU1MmUyNDAwMDE3ZTVh YmFiMzcwMDM4NWM1NTY0MGEwNjQ0MGEwNjgzOWI5Mjg5YzQ2NjMwOGFiMw0KYjdhYzc5MDI4MDJl NDU1MTFlYzJmNjc1YzBkYThiNGE0ZDAwN2M4MDU3YWM1ODMxM2FjMGRkNTNhNjNjYzQ0OWI0NmI3 NDc3NTM0ZmM2NjBlYWQ0YTkzNzM3MzUzNTNkYzQwZmZkYmFhZTVmYWUyYjEyMmQ1Y2IzYzY0MGZi MDANCjAwMjAwMDQ5NDQ0MTU0MzA3ZjIyNTNlNWUxNWVhZmQ3Y2RiZDU5ZTBmMzc5YzkzMDBjM2Fm ZWY4ZTM3ZmVkMzY4ODNiMGU4MTA5NDUyYTE4NWY3NmMzN2ZlMjljNmYwNzY1NDkyMjAwNWZhYTY0 YTUwZjAwNTY1YWU5MTMwMDQyDQoyNjFiODBjZjAxZjg0ZTRmNGZjZjZiMDBjMGY1NTZiYmM4NmRl N2ZhYjcwMzE4MzVjY2Y4YzE0OWRlZjllNzlmZmYyODQ2ZDljZjhlNDI4Y2MyMDA5YTM4MzUzODEz YzA0NzU4Mjk4NzkxY2M4OTBmYjMyNjc0MTMxZjYwMzc1Mw0KZTRhYTZjMjI0NjRiOTYyYzc5Njdh NDg1MmE0N2VlNGJiMzhjNzNkN2VhMzI0MzkyZjY5ODE3MjljMjRiMzY3Yzg1YWIyYzc3ODIwZGU2 Mjc4YmRhMmNkNTY0ODkzNDU1MWQwMmIwM2ExZThmYWYwMTE3MWE3YzNlZGZmZjAwNTgNCmRkZGNk Y2ZjMDMwMDZmN2EzZDllZmI3OTNmM2RiMjJjYmYwM2UwOTBiNmQ2NTYzMjU0OTlkYTVhNWI4OWIz ODM2M2JiYmJiYjFmMDAyYmM4YjY5ZDAzZGNiMmFjM2JjMDI2NTE5ZTQ3NDYyMDFhOGRiZTA2MTY2 ODI3ZjI0OWE1DQo4MmM1NWZiYjA1NTA3Y2UwODYwNmNlMjY5YTAwZDRmMmI2Y2IwMGU0OTcyZDVi MzYxYzhmYzc3ZmU3ZjE3ODY4ZjFlMmM1YmQyOGJmYzdjMzY0ZDA4MGM5Njc1ZDY2Yjk3Y2UzNGFj ZDU3NjUxMzMxM2FmNGQwNDNkNzhmYjQ1MA0KYTI5MWZiZjkwMDFmY2Y0Zjc1MTg4NmIxMzMwMzVj YzBjNDkxMDQyOWMzNjBlOWE3MGIxNjJjNzgxN2FjNThkYTg4M2U3N2U4YTE4NzllMDYxNjZlZjMy MGI3YzIzNDE1ZGQ3Yjc4MzgxYzFlMDY1MGExMjkxMjQ1YzJlMTdiOGINCjllNzU3MDM0MWM3MmEz Mzg1YWMxNDg1OTNlMTQwYzEyODA0NjI3MTZmYjAzYzA1ODBiNmZkZjA2MDBmMTc4ZWNjNjQyYTFm Njc3MDAwNDY1ZDQxZDdhNjQ0NTQ1YzVhZDAwNjBkYmY2Y2I2MGQ5MGUyYTQ2MDMxNzgyOWNkNzRk DQowN2QwNjllODNhODE2NTIxYjQ3OGQ5MjAxZjUxZDRlNzc4MzY5Mzc5OWZiZmNiOTlkOGM5OThl NTk2OTY5NmI1ZDE2OGY0MzZiMDA5YmE4NmZmN2Y1NDdkNWQ1ZDM5Y2RhNmE5ODQ0NDdmOTVhZGUw MDNkZTFlNjlhMWNhOTFmZg0KZTEzY2Q4OTU1YzliZjhjYzFjMDNiZmRmZmI2NWIwNTliZDkyZmY1 YjBkZTBlMzA2OGJlMzFkNGY4Yzc3YjEzMjIwZmE1ZWM3ZThjY2NjMTU2YTZiMDhjMDU1NzU4NWMy NjAzNjkzMjY1NThlNTI2NTQ1ODViYjBhNTNhNzllN2MNCmYyZmYwMzEwZTQzMTYxMDdhNDUzYTlj Nzk2MWM3MDAwMDEwMGFmN2I3OTllYWVjYTE0NjE5NDAxMDAxYTMzZWNmYzcxNTU5NTk1NGY2M2I0 ZjY0NTJkZmZkZjk1OWUwMzE4MmQzODVhMGU4NzY1YjNkOTFiNzhiYmUyODlkYmM1DQo0OWJmMDU2 MDE2MTdmZTRjMDA2YjgyMDE5MWRhZGFkYTFlMDEzMDZiZDliMjY1Y2Y4M2E5NDYxNzA0MDI4MTJk MTVkOTJjNjFjNzYxMzgyMzk4MzE2M2M2MmIwOWRiYTA5OGExOGRmOWM3ZmRkYmE1Yzk3YzRkOWMw ZGI5MDM3Yw0KNDMzNjExYTM4NTBiMTc4ZTkyNjg0ZDk2N2U1ZTIyNjQ1NTcwMTdkODE4MDQ0NWYx NTM2OWM3YTJiOGE1NTNjYWIxMjg2OTliNjQ2OThhMWIyYWIyYTM1NGM2NzAyODE4YTA4MGRmNzcx ZjgwOGJmZDNlMWY2NTMyOTliYjM4ZDkNCmZlYjNhNjY5OGYyNDE5MTViOTUyOTVhM2Q0ZDRkNGY4 MjZlNzcxZjJlMmM1OGIxZjZmNjMyOTMxNTU3Y2UyNTliMjJjNWZjZjJkNTY1NzgwOTkzNDBkMzBl OTdjMGQ4MGU1Yjk1Y2VlMTE0YzNjODhlMzIxMDljMDc3ZTQ5MTQ3DQpiYzAxNDY0OTRhNDM2MGE2 ZjBmY2FjMDZiMGQ1NWQwYmUwMGM5ZDM5MjQ3ZWU0Zjc3OWM5NTA2NWVhZTllOTU5MGYyNjIwNGUy ZDE0MGFhZmQ2MTU2YWRkODliMTQzOWM3YWVhYzk0ZjgzMDVlZjU3ODI0ZGEwMDQ4MDVhY2JiMg0K OWVjMGQ4MjI3MWMwYThjNjMzNjY4MDhmMzllNjk4YjIyYmQ4MGQ1NzQ5ZjMzNDk1MzE2NjMxYmZk ZmY3MDU0ZDU1ZmYwOGUwNjM1M2E2NGM3OWEwYWRhZDZkM2QxODlmYjkxOGMwNjcyNmQxZjczYzU4 MzBmZGIxMTgxNTc0OGUNCmY1NzliZDE0MGQ4NzQ4OTVhMmQ0ZGVkZWZlYWQzM2NlMzg2MzU4NTcy NDc3ZTI5YzhiZDFiMGQ4NDYzMDFiZjljNTAwMTZmMDA5ZTBkYWFiOTNhMmRmNDdiMjJjNWYwZjQ2 MTI2YjUyYTllNDcwNjkwNzNhM2IzYWRjNTVlNzRmDQphNTUyZGI5OTJlYzNhMTYwM2Y0NjU1OWY0 NjhjYjIyZDgwZjljNjFiMDBiNDhhOGM1Y2FmMDRlMGE5YWRhZDdkOGNhZmFlZWI5M2M5ZTRhZjVh OWE5YjY5ZTk5MjI1MWJhNDQ4ODg2Y2QzMTgwNjUwYTVhYjhhZWIzN2RmNTM5ZQ0KMzcxN2RkZGM4 OGUzMGVmMDM3Zjk1ODVlMzVkMmEyYmViZWVlMjE3ZWYyMWM3ZTRhZTExZjZmNGMwZTZmNjU2NWU1 NzU2ZDZkNmRiZjAyODAwMzBlMzg2MDI4MWEwZTUxNWQ1ZGRkYTkwMDRlNWViNDY4ZTE0NDg2OGUx ZGMxODMNCmVkM2QyNTM5YzdiNmRjMjI2MDUzMDE3Yzc0ZjZlYzU5Nzc4MmRiYzNiYjNhM2IyOTli Y2QzZWMyZGIxZTJjY2JmMjc3MDExY2NhMjdjMmZlMDAyYWI4YTBkOGUyYmUxM2ZmZmYwNGYwZWE3 YWI2NjUwZDgwOTNjZTE1MmI1NjdjDQoxZjAwNjQ1OWJlMWNhY2FlMDdjMGMyNTZiZmMwZmY0ZTAy NTAyYzI2MzBjZTA1OTBiMDZkOWI0MmExZDBhZDAwYjRkOTMzNjczZWVhOTgzYWM1MmQ4MzVhNWI5 YTVkZWFiNzNjNjY5YjI0OGFlMmY3MDFiNDA2MDI4MWJiNTViNg0KZDIyNzIzNDAzNWQ1ZDRkNDdj MjMxYTBkZGY4OGQxODI3MWU1MzA4ZjhmOTVjYmU3YmZiYTlkMjVlYmUwODMwZjdlMzQ5Yjg4ZDFj N2NlMzhlMzdkN2VjYWNiMDU4YWQyMGQzMmNlMGUwNWM0M2Y4MmYxYTY3NjMwMTJlNjA3NzANCmEz YzEzYWJlYTdmMTUxMDAzNzQ1MjMxMWFhYWNhYzdjMGEyYzY5ZGEwYjYwNGE0ZDRkY2Q0M2JjN2Y3 MzAxODhlOTU0OTI0YzI2MGI3NDAxNDAzYTlkZmU4ZDI2NGIyNDhhZTI2NTAwZDBkY2RjZmM1YmIw NGM4MTg0MjI0YjdkDQpmY2Y3NGYwNzFmNmM1NTUxNWUwMGRmZDA4M2FiNWQxMTAwNjIyNDEyMTkw MjEwNjg2YTZhZmEzNjk4ZmE2NGM3NmM5YmMwNDg2OGEwYjNiM2YzMzE2ZThlZmNmNjQ5YWI1NzBm MDNiODI2MzIyYWQ0MDE0MDU1MjAyMDBlNzhiZA0KZGU1NzAxMmM5NTI0ZTlmOTdjM2U3ZmUzMGVk ZTdiYjkxNDA5OTMyNjRiNjRhODMyZTk4YTQ0OGQwZGY1YzMyODRmZTIwZmUzMDMwYzAwZThlYWVj N2M5YTA3NGU4ZTcxMTQ1ZDllODlkYjM0N2RkYWI0MTE2ZjUyYTQ3Yzk2NWINCjBmZGJlNzJmNDgx OGI1N2Q4NjkzYzllNGVkZDhmNWYwOTQ4OWIwMGE0YzkwMTMwMDRjYWZhOGM4ZmNjNDE1YjIzODFh MDNhMjlmZWFlYmViNWYwNWQwOWM0YWM0NjljZDlhMzVlZTc1YTViZGFkZWQwZGQ3ZjkxZDBhODVj ZWUyDQpiZjg3NzQzYTRkNjBkNjJmMzUxYTA5MGY4MzUxOTA1MzUzODk4NDliOGJmNTQ5NzA5YjQw M2MxZWZmMzU5ODYwMDliMDA5YmQwYzgwOWM0ZWE3ZGZmN2Y5N2M1N2YxN2I4ZjU1NjVjOTJkNzE3 NDBkOTc2YThiNTc2OTlkYTFhOQ0KYjQ3OGYxZTJjZDAwYmFhNTY4OTQzMDgxN2Q5YTRiZjY1ZjAz NWIzYzNhODBhMzMyZTkzNDM1MzUzNWJkNWNhNmY5MTliOTVjNmVlNDliZDQ1NDU3Yjk4MTA2YzVm NTQzZjFiMTg0NmRiODcxNDgwMDAwY2IzMjdiYzE5Mzk1NGINCjkwOTlhODczN2IxOGFiYzA2NjYy M2RiNmE3MjZmM2MxM2U2ZTcwNmE3Nzc3NzE1NjgxM2JjYmE3MjQ5MzQ5ZDdmOWVkMDBlODkwMjRl OWY3MDA5MGNmZTc3ZjA0NWUyY2Q1ZWJmNWZlMGNjYzY4NTIyMzhlMGE5NmQzNDQ5ZmVmDQowZGIw MGY1Y2M1NmRiZDA3MDBmMGQ4YjZmZDU3NDExMDZlMDc1MzU3Y2VmNjc4M2M3NzgzZTlhMDA2ODA4 ZmRiOTYzNTVjYTI5N2JhNTgyNjQ5ZDIxMGQ4ZjczYjg5ZWZmNjU2MGUwNWVlNjAyOTM1ODE5ZTIy OTU4YmQ0MDAyZQ0KMGQwNjgzYWVhNzRhNTBhNDg4MWJkZmJkYTBiOGQxNTI1YjU3ZGQ2ZDY3MGMw MDM4ZThhMDgzMzY0NmEzZDFlYmIxNjNlOGVkZWRlZDU3ODMwOTIwM2JhNWVmNGQwMmFiYzBhYzU1 MzI3OGU2ZmJmZTczZTcxMjgwYzZiOGUzM2MNCjA0YTZkNjU5MDBhZTQ4MzgwZTg1ODI0MWVhZTg2 OGZiMDlkOGMwN2IwMDVjYzk0ZDliZjMwMDc4ZmQ4YzNmMWIwMDBlODljN2UzMmZmMDY3N2M3MmQ2 YWM1OTJmMDEwMDI3NzUwNTAwOWU0MmExZjA3ODMyOTlmYzM1ODBlM2UyDQo4ZTQzNGEzNDQyODIy MDdjMGU0MDdiNmQ0ZGZlM2Q1NThhYmE3NTRhYWE2YjZiNmJkZmE4YzllNzA5NGM4MjRmYWFhYWZh NGYzMGNmZDcxODg0NDJhMTViMzllYjZiZTBhYTVmMzllZmQ2Yzc3OGZhY2E1NWJjZGY2ZTY0NDY1 Mw0KMzRiMmZkMDBkN2Q1ZDViZDg4ZDE2YTA2ZTlhMjAyMzc2MzE2NjE1YzkzYTNlZWM4YmJkNWU2 MmU5YzMyNjU0YWI5OTAxZDBmODA1NWNkZGM2NDU5NWQ1NWI1NGU1NzY0MGE4NzgyZDRkZWRlZjY3 ZTk5ZjZiYjgzMzViMzY2Y2UNCjc0MDdjODlkZDFkNTEyMWJiNDM1YTJlOGE3NDgzODM0MDhlMDQy NmUzYjRmODU5ODE0ZGM3MmQyNDkyN2RkMDViZTExMDY5ODYwODU0MmExYjAwMWNjMjVlYWYwNTVk OTBhNjA4ZWEyMjg1YmMxMjZkMTkxYWFhMjEwNTg5MTk2DQpjZjViOWFlMjdlOTMxZmI2YjRiNGZj YzM1MDY1MGE4ODIyMTk4NmYxMWE4ZjFmM2ZhZWE4YWY1OWNiYjJiZTI1MDgwMmFiM2VjYjhhYWI5 NjIyZWU2NjJhNTY1NDU0ZjRhMTRjOWM1NzYzNDNjM2FiNzE0YjFmNDljNTUxYTUyOA0KNjUzMzk5 NjdlYWVhZWE5ZWVlZWFlYTdhYTNiNGJkYzVlNDA1OTcxY2NmNzI0Y2RkYTU1YTYzZmRlNDhlNmQx MThmMjM3NmM5ZjIzMmFlNDA5NzNhZDQ4ZmQxMTQ4OTQyYTFkMGVkZTAxOTdiOGIxNzJmMjIwMDcz Zjg0N2RlOTMNCmFiZjhlM2I2YTE1MTJjMTYxYmY2NzliZGE0YWFlYWQ2NDM1N2FjNTgwNzYwM2E5 Nzk2N2ZjOTU1YTlkMzM0NGRmYjFkYzY0NjZjYTg5NjY1ZGRhNGM5NTFlYWU5ZTk3OTFlYzA4Yzhl OGU4ZTc1YWQyZDJkZWIwMWY0OThhNjQxDQpjMTYwZjAxNzAwNjY0NjIyOTE1NzljNTg2YzBiODBk YmE1MDhhYmM3YzFjZDkxMGYwNTgzYzFlZjA3MDNhMmJiMmE0ZTA1OTA3NzczOTAwNTQxYjgwZDgw YzBmNzVjYmEwYzRjNWY5NTAxOWNjM2VkMDgyZDI4NDExZGIzNDY1ZA0KYjA3MmU1Y2FjZDE4NGRm MDFiYzFlYWQ1YWI1ZDc2MzAxZGMwZDkzZDNkMzM0ODkzYTM2ZTM4ZWNlOTI1Y2Q0MzljZWFiODUx OTQyN2E1MWQ4YmNhNTQxMjA0NzJkOWNjNTAzNjExYTM0MDIwZjAyNTdlMmFjZDY3NWJhOWYwZDQN CmM2Nzk0YzA0YzAxYzFlYTE3ODExODA3OTdjNTVlY2NhYWU5ZTY1MzE3ZmRlYmM1ZmFiYWE3YTMz MTgyOTEzMDBkNDFiODZiMTA1YzBjOWNkY2RjZDc3ZGIwNjRiMTdmMWY5N2M3NzAzYThlNGJjNmIw Njk4NmU2ZTAwODg4YjdlDQoxZmM1NGM4MzAyYTI0ODdlOWY4ZjU0Mjk0YTdlOWY4ZmJjNWUyZjI5 NTI4NDdjM2VkZjEwODA1ZjAxZjgwNmQ4MDRiOTgxYWZmYTNiZjgyNDVhYjk2Y2Q5YjI1YjM0NDUy MmJmY2Y0NzcyMjQ0Yzg1ZGFkYTI3MDE5Y2NlMTdjMA0KNDFiY2JiY2I5Mzg5YzQ2MDc3NzdmNzdh MzBkZGY5OGUwMzBmM2NiMGI3Y2M2YjdkYjViYWJhOWFjMGQyODMyZTI4NzNiZDFjYWFmOTRhY2Q5 NjljOWZjZDQ5YmUwODAwYTIyODVlOTQ0ZGM0YzhlZmY3NWZiYmRkMmYwMDM4M2INCjEzYjcyOTk1 NGM4Y2I4OTliODc3ZTQ5YzkyNzYzNjBmYTcxNTAxOWNjZTAzYmNmNjNmZWFhOGEzNWNkMmIwZDMw ZWVlZjFjMGI3YzFmOTI4MTg4OWNlODEwZDcyMzM5ZjQ4ZGY0ZGYzZWQ2OTgzYzFlMGI2ODY4Njg2 MmY4MjE5DQo0MTVjZGU1N2VmZjNmOTQ4ZDdmNWQyZDllY2VhZGMzNmM2MmZlZDc0YjE2NTU5NGYw Mjk4YzYyN2Y5ZjU2MGI2ZTk3YjIzZTFmMDAwODA4YzIyY2JkYjcyZDllY2ViMWU4Zjg3NGNkMzc0 MzcyMmYxMDEzODNhOTU0YzkwYTkyOQ0KNmUxZGFiNTI1Y2NhNTdmY2Q3NTBiMjIyNjU1OTVlMDJi NmE3ZDQ2NGYxYTkxZWI2MmQyMDAwNjBjZWVjNTljNDc1ZTBiMjEzNjc0NjhjNjcwZDgwYmJkNjE2 MmQ1YTQ0MjhhOWU1MGNjMGMzZWRiMTNmYWNjZDU3YmI4MzFhMDANCjkzNmFlNzYyMGY4NmM1NzBi M2U0ODhlZDk1Njc1YTU0ZmI3Y2JlMDcyM2ExMjA1OWJhZWFhYTA0ZGYxNDQ1NzEwYjgwM2FiMDAx NzQwMzBhNTY3MTdiZjFjZTIyMmFiMjQ5ZGMwZGU2MzhiODJmOWQ0YTEyMmZiMzM0YWRhOWIxDQpm MTU5YjBjMTExMDAzODg5NDQ2MjAzNDY5M2I1NWRjYmRhMzEyNTkxMTYwMDgwNDQzY2ZlMTMwMDE3 ODY0M2ExN2U5NDI0YTlhOTUyOTRhMmUxMTA4NTQyYTFlZjgzMTk3NzI2NDQ3ZGExZjAzYTQ2Yjc0 NGM4YjEyMjM4OWE2Yg0KZThkOTBlMDE3N2U3MTM4YzNhMGU0ZWU2NjU5NDRhMjNmOTlhOGYzOGUy ZjAyMTZlNjVkYTViMDUzZTY1ZmU4MTVjM2ZhZTI0OGFlMmU1ZTk3NGVhMDNjZTc3M2U1NTk5Y2Iw ZGQ4YjY3ZDhiY2ZlYmE1NzQzYWZkOTc1ODJjZjYNCjUzZGUzNjA2ZTY1NzNlNzQyN2JkNjIyM2U4 ZThlODc4OTFlYmQwYWU5M2UwZTRjNjg2MDYwMjBiNGNiOGI0YTRiOTIyNDlkMjU2MDA1ZDk1OTUx NTE3MWE4NmQ2MGJlMGM3ZGNjYjU0M2NjMDI3YThhYzg4Y2FiMzY1MjgwYjZjDQpkYmJlMGNjMGQx ZjVmNTc1ZWY0NGMzMjE4YWM3ZWM0ZDAwM2U4MmYyYTUxYzE0ZWViM2FmZTNjN2E3YTVmOWY2YjUx ODJmZGNiOGIzYTM4M2IyODkxOGI1YjZiNmJhN2E1NTIyYzg2NjcyZTNjNDlmNjMwYzU2ZjhmZGZl OWRhZA0KNTc1MTBlZDNjMmEzNWUyMjg0OTk3MWU1NzQ0ZTMyY2YxMTA0ZTEzYzVlMTJlOWQzMDBk YWE3NGU5ZGJhODVmMzRlMzcyYmRlMDk4ODdlY2E1NTU0ZWNhYTg1ZWQwZTcwZWFiNWU0ODAwM2I2 MmU1ZGJhOTQ1NmFkNWFlNWM2NTYNCjk3OTMzMzBlNWZiODYwODE2YmZiZWU4OTNiYjEyMTRlZGQx MjYwMTRlZTIzYmM3Zjc3ODc0MmExMTczMGQ2YzYwZDMwZjJkZTBlMTZkNjc0NmEzZTVmY2QxYzNh MzE5Mzk0ZjIxOTllYzc3MzRhMGFkZTQ3Y2EyNjYyMzQ2N2U2DQpjYzJkZTNiZTkxYWVlYjk3YTRl M2I2YmIzOTg2MWYwMGYyZjk2YWMyYzQ5YjZjYjhmMDAwOTg2MzE4YzYyZjc4MTU5OGRkYWQ4NGZh NTkwMGFlMzEyMDBkZTBjYzUwMzA0OGMxNjBmMGY3MDBiY2UxNzBmOGRlYTIyY2ZlZTUwMA0KODI4 YTE0YTE1MDI4NTQ2Y2EyM2I5NTA3MWJlYzJjN2M0ZTJjNDY1NTk1OTU2ZWY0ODhkNmRhZDJmMmZl MzE0NzFmNGQ3YzU1OTZkYmE4YTM2ZTY2NGY4ZjNiYzBjYjAwMmM1MWE1Mjg3NWI0Yjc1MzdiNWIy YjA1MDIwMTUyYTUNCjI4ZDliYTRhN2NkZmM1NjI1NjE2OTcyMjYxYjIwZDhkZGMwYWI0MGRmNTc1 OTQ0YTI2ZmUzZTc3ZWVkYzNmNjA3YjFmMzAyNDQ5ZmE2OTU1NTVkNTU3Zjg2MWNjNTA2NTRhYjE3 ZDkwMjdlNGUxNGRhNmE2OTA2ZGE4MjM3NDNjDQo5N2NiNWRjMzczNzZjYWE1NWZjYzAxMjM1OTE3 NTlhNmY5YWNjNWQzMjYyY2I2N2ZlZmFlNTY4MTliMGVlMDMyOGJlNTQ5MWQwODAwMmRjYzc4YmZh MmE4Yzg2ODM3YjdmNzRlMDdmMDQ5MzkxYWExNzAzOGI0MjExYzBjOTAyMA0KMDg2ZWVkNDZkZmRj Yjk3MzVmYjA3NjZlODA0NTAwNDdhNjUyYTlkNzM5ZTU2YTAxODA0NThiMTZmZGM1ZDQ1NDJhYjNm NTBkMDBkNGFkNThiMWUyY2Y5YWE2YmQ3NWQ0NTE0N2I5MDNiYzIyMTQwY2I4ZTRmMjNiYmEyMjkx ZDcNCmViYmQyOTk1NGFiZDU3NTE5MTdkMTMyNTRlOWNjNmM2ODYwNzJjNWRhNWNlOGU4ZWFkMDAx ZWM0MzhlOTlmNDViMDRiMGFiMWFmNGVjNTJjYjc5ZWY3YzRkZWFhY2E1YzA1NjVlMjMxZDI3NWRk YjVjYmE2Zjg4NzlkNWRkYTM2DQpjYzA1MWRkYjYwMDk1ZGY1Y2NlNzk5MDQ3MDJjNWY1OTkzNzY3 MjczOWMxODA5MDVjOWU3MTNhZWYzMDljMmE3MzFkNjVjNzczOWI4NGI1MjkyYTQ2YjM1NTkyMmQz MzQ5ZjAwYjc0NzgzNDU4NDhjMjk1YTUyNTU1NWY1NmE1Mw0KNjNlMzY0MDczODFiOGQ4NGM5ZWJm NTdlZGZlZmY3ZmYxNzBmYjQ3MzcxYjIyYTQ3YzllN2YzNWQ1OTcyNGYzNTc3MWI1ZTAxNDY3Mjhi ZDU5OGNmNzEwZGUzYWIxNWQ5OGNiYjdiZWExMTI4YjM1MDE0NDUzOTA1YzAxMjQ1NTENCmFlMDk4 ODdlMGEwNjAyNDM2MGRhY2JiMTI4YmY4MWY0NDczOWI5ZjcwMDQwNDM3ZGZkM2JkOTQ0OGMzYTNh M2E5ZTlhY2M4YjllOTU3NjJjNTczYTE2MDE0MDU1ZTRiZjA1MDI4MWFmOTUzNmFjYTlhOWI5OTVl NzMzOWQwY2UwDQozNDU2ZGYyMzRlMDAyMjdjYjZlZjhjYzhlZjM1OTk0MDc0NTY1YjViZGI0Nzc4 ZTdkMzAwMGUzMTBjZTMzYjNjMmM2NzA5ODBmZGI5ZDFlMWViYjIyY2RmMTcwYTA2YThhYWIyNzIx YjAwNTQ1NDU0OWMwYzIwNjliMTMyODdkMw0KMDFhYzk0OTlhYTM3OTlhMmUzZTdlNGFiYWJiN2M2 ZTNmMWVmNjJlYzBhYWI5NzIyNjE5MjY1ZjkxZjYwZmVlYzJjOTgyM2JlYWFiMmIyNzIxOGNjMzAx NDA3NjM0OTE5MDAzOGY2ZDg2MzdmYTkyOGNhOWQzMTQzYTNmNmY2YjYNCjI3YzEwNjY5YjJkYTQ1 MThjMGM5ZDE2OGI0OGZhYmE5ZGI3ZGMzNmMyNmIzMTFhM2JiYmIyODlhMmNiOTdiNTg0ZDZhMDNh ZGI4MjY0YjZlNjk1ZTM3Y2U2ODE2NWYyNWE1MWI2ZmU0YjlkMGQzZWVmM2Y5MmVhZGFmYWY3ZjFh DQo0YzVmMmRmMGY2OTMyOTI5ZDQwM2E2YjdkZDZhMWIyYTQ1YTNkMTNmMDNmODNkODAzMzRkYzM3 ODExYzA3YzU1OGU4ZTZjMTM2ZjZhYWM4Y2FlYWI1MmQ4ODY0NmRjZjBmMjQ5MjUxYWExNmMzNmZi YWMxNDhkYWU3NzZjOGIyYw0KY2I3YTMyNjExYjI0Y2JmMmYzOTY2NTNkNTlmYzRmZDNiNGU3MTQ1 OTdlMzExMjg5YmMxYTg5NDQ1ZWI1NzQ5NTBjNTU3NmMzNjJhZWVmZWFlYTdhY2JlYmY1N2U1YjE0 YzViYmEyZTExMDcxMmJkZDk4N2ZmY2I5ZDdkNWQ2ZTQNCjA5YzBlNTUyMjQ0Yzk1OTU5NWI3MDJi OGQyZDY1NTRhMzk5NjRiZDZjN2FiMzE1ZDU5NWI1MzMzNWU2MjVhOGE0NzhlOTQwNmU5Yjc3MzM5 YTA4MjFmMWY5ZGIwNGRkNzhmYjA1ZDhjNzZkOWI0YzZlNmU2YTZhNzM3YmVmMzU2DQo0MzJhNTdm ZGQ0ZWY3ZWY3YmI3NjAwZDAxNDg5ZGVkYmI4Zjk1YzhjM2FjMDAxMDBmNWY1ZjViZjdkZjdkZDc3 ZDdhZTViYjdlZTE4MDBhZTlmMzUwOGI2ZmE3NzU0NWVlZjY4YWYyMDdjZDdiMmVkYzc4ODY4NDgx MDg0ODE2ZA0KMWY2YzllZDVkYmRmOGZiZWZlMDE0NDQyNDFmNDBkMGMyMGUwZjdlMzgzYWRkYmNl MDJiMDE2NDAyZjgwMDEzMDM3OWEwOGI2NzJhMjM1MzUzNTUzMzc2ZGRjMjhhYTlhYjZlZGY5ZTc5 ZmZmMmQ4MDY4NzU3NTc1ZDdkZmZmZmUNCmY3ODcwMGFjMDdkMDVmZTZmOTBhZDhjYTcyN2YwNzAw YTI4NTQyYTEwZTAwN2E3YjdiYzM4MjIwMGNmZGUzMWZmZmY4MDY4MGU3ZjhmYmI4ODEwZDNhODA0 MjQ1NDVjNTk5NWVhZmI3ZWRiNTU3NWZiNWFhMmE3M2Q4ZjRmZWJiDQpkOGQ2ZGI4ZjY0M2E4ZGE3 OWY3OWY2YTg0MDIwZjBiOWJlYmViZWViYzBhYWY3MTRjM2RiZDg1MDNmYjhlOWZkZjdmMGRhM2Zk ZjNjMGJjY2YwNTE5YTNjMjAwMDI4OGQ0YWI5YmRhOWIxZjFiMGJmM2VmZGI0MDcwMGYyZjlmYw0K OWZmYTNlZDhkODMyZThmMTVkYjM3NmVkZGFmMzMxNDk0Y2I1Zjk4Y2M2NjgxYWUyMTI4Yjg1OWY5 NDQ2MjNiNDRiOTExMDcxYTNjNDc2NmVjNDU5YjM2NjNlODllZDhiN2EwMjAwNTJjOTI0ODFkOTYz Njc4MzE5Y2NiZDYwOGENCmJiMDRhNmRmMzU4MjE5MWI1Y2RlNzcwMjAwYWZhMjI4OWZjMWE4YWU3 ZTI0OThiMGQ3YzBjZmQ1ODAzOTAxM2MwMGFlOGY0NDIyZTdjOGIyN2MzMTE4OGY2YzRjYTc1MmZk NjA1NmFjZDNjMTNjNTFkZGY5YWEyYTc3NjIxZTAzDQo0NmI1MTYwNzAzODE1ZjAxZDBmN2RmN2Zm ZjNlMzBhZmQ2Njc0M2ExZDBkNzAwZTRiOTdlZGMwMmE2NWQyY2U3ZmQzZDQ3MTA4NDZiYzA0OGVh YjdjMDU2NTgzYzE4MGNiZTgyZjJmYjM4MjZhNDY4ODRmNjlmM2I5Nzc0NDVhMg0KZTZlNmE2NWU5 NGI4ZjhjYTIwMTM2MGFjY2EzNWFhZjQ5ODlhZTIwYTczNjUzN2M2MWUzNzMxMzkxZWIzYjdmYTA1 ODRmYTg2M2RkN2FkNWZiZmZlNmMwMDQyMjQxYzFhZGFiMjc1ZGI2OTAwZmU1ZjQ5ZjNiOTAwNWUw MWYwOGYNCjkyZjNmYjliOWE3MjdmZmZjMDAwMzY3ZGIwZDUwNmYwNzZmMWM1ZGE5YTNjNmRkY2I0 ZjllOTlhN2NiZWY2ZjEyNzllYjhkM2UzZjEwNDgyN2VlZmMxNWJmYjA2NmUxMmJkYzIwOTMzNjdj ZjgxYWFhYWI4ZjdhN2Y3ZTBkZDhkDQo5YmJlMjQ0NWMyMWZkYmJjNjVlYmQ3OWQ1OGVjNjRjYmIy ZDZmZmY1ZTlhNzZmMGM4NzgyOTcyYzU4YjAxMDFlOGYwN2VmYmNmMzM2ZmM3ZTExZWJkNmJkODlm NmY2MGVkY2ZmY2I5ZjgzODhlMGYxNzgxMDRmYTZmMGNhMmIyZg0KMzNhYWQwM2YwMDIyMWFiOWQ2 ZGJkNzhmNzgzMjg1YjU2ZmJjMGViZmNmMzdmMjY1MDYwNzg3MTAxMGZkMTgxODFjODJjZjJiNjA2 ODc4MTg0MzQzYzMxMGZkN2VmNGY1Zjc0M2Y0ZmJkMGRiMzcwMDAyYzFlYjE1MzAzYzRjMTgNCjFh MWE4NmNmMmJhMDdmNzAxMDFlNzhlMGY1N2FkMWRiZDcxNzA2YjAwZGU1ZTEwMWIwYTJiYTMyNzdj N2E2ZjdkZjEzYWE2YmViZGVlOGVmZWZmNzNmZjFlNDkzYTUzYmIwMjAxMjg5NWMxNTBhMDYyZTc4 NjdjM2JiN2UwMDgzDQo4ZDhkOGQ3ZmQ4YjRlMWFkYWVjZTY5MzNkZWJhZjNjZTNiY2I2ZTkxMzA1 MWU2ZjkwYWM3ZDQ3ZWRjZDczZjgwZjczNjdkOTAwMjRiMjUzZDNhMTAwODdjYWJhZmFmNGY5ZGEw YzMwMDEwZjJmOTdjZTcyOWQxZjBhNThhYWEyMQ0KMTQ4OTBlOGFhMmY4Y2M1MzRmM2Q1NTVhM2Iy MjA5NjY5MmRiMDgxZTA4MDdlMDNkOGNiNWM0YzhmYzc4MmI4MGI3YzAwYzA3OWJjMGM4OTkwZTQ2 YzIzNjYyNzJkOGU2ZmVmNmQyYTU0YjFiN2VmYWQzOWYzZTMzNmZkZWJjYWENCmZiZWZiZmZmMjUw MDQzOTg5OGE1ZjRmMTNlOGM4NzRkNjA2YzYwMTM3ZjRlMzk0N2MzNDQ4ODJlNWViY2Y4Njc4ZjNm ZmFjODRjNWYyMDc4ZDNiYTc1ZWI0YjRiM2JhNWMzYTFlMDZiNWJiN2Y1MWUwMWUwNzYwMDczNGM0 ZDc5DQowMDAwZGU3OTZmNjMxMzgwZjEwYTg5OGYwYjRmM2E5OTIwMWUxMGVmNjY5MDdiNzhlNGM0 Nzg4NjhmNTkwMDNlNWU5YmFmZWU0ZGQ4ODY0YjNhZWEwMTU4NWM2ZDlhYmRiMzlkZjhkZjA2ZWU2 MGQ5MmVkMTVkMTA4NGNiMGI4NQ0KOWE3NWUwOGIzMjk1NGFmZDI0MTNiN2E5YWFiMmYyYzlkZDc5 ZGVlMThlYTliYjkxOGQ2ZTFhYzYzNGI3YjI2YjY5ZTMxNWNiMGZhNjRjZGMyNmRiZDA0ODEwODQy Yjc5ZjRmZjg1MDAzY2JhMjI1MTdiN2JkYjEzYmJkMzk5ZmYNCmM1NzAwZDNiNmU4MWJhZmQyYzZk NjQyZmMzODk4YWMzZWMxMDQyYTFiNjg2ZDI3MTliNDJhMWQwODgzM2JkYWVhZWVlOTVhYWFhYWE3 MjI1ZjMxMmJjYWNmZWQ5MDA2MDlhZTZhNWVlNGUyM2RjNmYzY2VlY2U5Y2ZmMGJiMDRjDQo1M2Nh YTY3ZmVlMDhkZTQyYTFmMGVlZmNmOWYzZGQ0MjMxYThjY2U1ZGVjZGM0NjNkNGQyZDJmMmM3M2Rk MWIxOWVhMjM4MWZkN2JkZTU5NjE4ZGUyZWVlMDg2YzY1ODcwMWNjMzU1NDk5ZjI1NTk1MzRiM2E3 Njc0YjY1NjVlZQ0KNmUzMDNmNmM4OGVmNzdiZmM3MDIwM2ZlMGRmMDExY2VhMjZlOTkzZDZiZTZj ZWRhYzZkN2YwMjg1NjM3NTc3Yjk2Y2Q2YjcxNjI0Zjk1NGEyYzE0NmE1ZjRmYzc2ZDZhNmE2YTc4 MWFhMzg2ZjY0ZjA1ODM4MTIxOGNkZDdjYzMNCjQ1MmMxYTBlYjk2NTExMmI0YWFlY2QzNjM1ODUy YzQzNzc3NWQ5ZmY3NDFjMWQwOTA1MjkxODBjNWU4NDlkMzdkZDI2Yjg1MWMzZjVlZmZhYmEzYTNi MzZhNjFkOGI4ZTNiZWViODg5MDRiZTlkNDZhNjY4MGYyNWQ3MTVlODlmDQpkYWRkM2Q1NDkxY2Q5 NmRiMmE2NzE2OWY2MTU3OTQ1ZTEwMDRlMTUyNmU1NmJiMTU2NWY4Zjg3ZjE4YTYyYTUyODRlMmYx ZjhjMzAwZmMzZDNkM2RiNDc0ZTlkMmU3MzBmMWI2ZjEyZWZjYjViNWI1OTQ0ZWE3NDcyYzVkODIy MA0KOWM5NThjOGQ2Y2Y5YmVjN2I3YmIzZjJmNjExYmFlYTdjODM1ZWFiYjk5NmQyNzk1YjRmNTJl NWRiMmU0NmY4NzFjNzJjODhmNGFjZWZiZTIzMWRiNGRlZGYwMDFiMDM0NTUyZDE2MWVmZWEzNjBk YmY2YzI4YThhOGEzYjFjNTMNCmE3Y2E1Y2VlM2UzOTFhMjE1NTkxZGZjNzI0NGE0ZWI1YjdiN2Rm YzRlNTE5NzdkNWI3ZTk4YWVjMmViMjYzMjZiODc1OTcxMTZjYThhZmE3NGNkYzI2Yzc3MTdlMGM2 ZTNjOWYzYTc1ZWE2Nzc4MDRlMTY0YTRiOTgzNzhiOGU5DQoxOTAwZTJhOTU0ZWE2Nzg2MmFiYmZi MjY3YzE4YmI5MDdlNThkMDMwZDYyZTdjYWE2M2VhZDRkMmQyYmMxOTkzZGJmOWVkMDBiZTcwNjZm MTYzYTVhZGFkOTUzMjcxOWI2YWYyNTViYmJiYjlkODg0Njg3MzM3YWI0NGQxM2U3Yg0KZDE2OGY4 YmY3NTVkMWYyZjc3NjYwNGY1ZjVmNTc3NzNkZGY4MWIzZTlmOTdiYWJhYmFmZTBlMTY4NzVkMDlh NmRmNzU2MmQ3YjNlMmY3MDUxY2NmMGJjNWI5MTVkZmQ3NjBkNDk4NzQ3Y2NjZDBhOGE1YTU2NTFk NTg1YTRjYjkNCjAyYTcwMDkwMGE4OGUyMzA1OGE0MGFmOGZkZGY0Y2M2NGM3NzY3OTViZGZiN2Qw YTg1YzIxN2UyOTZlMTRhNzE2ZWFlNmFhNGI2YjZhNmFmYjNiM2YzNGQ4YzlmMzkxN2QyMTU5OTZj NWQyNWJlYzFkNjc2YWVhZGFlYWVhZTdiDQo3MmQ5MGM4NTQyYTEzM2IwZTdiMzI0ZjYzNmU2ZjMz OGFiMDQ5OGM0N2I4NWExY2EyNGNiNzJmMTE2YmI2N2E1MWM4YjlhOWI5YWZhNTFkZTMxYWY1NGU2 NzIzNDdmZmViYzVlOGM0ZThjYjM2ZDQzNzMwYmI1MWY1YmU2OWUzZA0KMGU2ZjUzNTNkMzFmZDI4 ZTRkOTViOTBhYzJlOGFhYWQwZDg4N2UwYTg1NDJkZjQxNzkxMzY4YjY4ZGYxZGU1NTE4NjcxMjU0 NTU1NTVkMWRiNzc0OTIyMjYxOGFjNzlkNWU2YzlmZWNiY2NmNjJiZmZkZjY1Yjg3YjE0OWYwYmUN CjY5NTNhNzEyZDc3ZDVkNzIxZGU1MmE0ZmI5OTJmZmUxOTg2ZDNmY2E3NzliNzM1ZDg0YjM1NDI5 NGEwOWM2NzczZmQ0MzI4Yzc2ZGM4OTBkYTcxZDhiNmE2YTZhOWUyOWVhZDBlYzYwMjA0MGI2NmQ5 Nzg2ZGE0ZTA2NzM2MjJjDQo4YmUxMWUwMDRlMjQxMmI5NDc4YTg0YThhM2EzYTM5YzI3NjY5Zjgz MTNiM2I3YTAzOGU5OWFlMTU4MmVmMTE2MGY2ODM5Y2EyNGI2YjViNTNkYTMzMDEyZWMyZTk4MGEz OTEyYTZiNDYzNTE0NTI2ZjM5NzcxZWVkYmFiNjg1Mg0KYTQwOGE1NjIxNjc1Nzc0ZmQ5ODQ1MWQx N2YyNjM3NjU3ZTA2OTMyZmEzNmJlNjJhYjI5NDRkYzQ0OGQ3ZjU5ZjgzMDVkYzk5NWNjMjllYmVl N2JiYmVlNzcxZGE2OWE3ZmQ4ZGIzYWQ2MjYxMzFjZDYzYTk0YmUzYjg4YTExNmMNCjY4NjhmODNi NzdiN2JhYzU2Nzk0ODY4Njg2OGQ5OWI4NGQ4ZGY1ZjVjNTgzZmVhMTYzNTk5MWU4NWU5YzJlZDEx MzBhMDZjOGVmZjc3ZjAzM2JjZTY2YWY5MTY1Zjk3NmZlMWI3NzVhYmE0YTJhOWJmNTVlOGNhZGI2 ZjMyZjg1DQo2MTE4MTcxYmJhNDY5NzVkNzZlOTlmYzY2OTYyNGE5MTEwNjU1OWVlYjExYjY2YmM5 YWM3NGU4ZDk3NmUxYmFlYTlhOWY5MTNiNzMzYmIzZTczMzExMDA4NWM5Zjc2NmMzN2ExZmQ1ZmFl NWQ5Y2MyMjIzMTM1MDIyYjFiMzA1Mg0KNGMyYzFjMGM1MDU3NTdjNzhiOThjMDYyMTUwZTA1Mjll ZDU4NTQ1ZDU1YjkxNTgwM2YxMjBhYmU4Y2M5MjU5Mzc3NjQzMjk5MmZmMWI2N2I2MzYzOTAwYTMw YzdmYWMxMDA0NGNiZDBhOWE3YTdjNzlkNzhlM2Y2YzlhZDM1ZDINCmQxZGU0NjNjNTc2YWM1Mzg2 ZGI1NzgzY2ZlMTIwZjc5NzJlZGQzZGU3ODNjZmVjNWI0NjNiYjY5MmZmYmM2MDQ2ZjZiNmJiYmM1 MmRmNTAzOTYxZmU0N2U4NDZhNWQ1MzI5OTU0Y2JlOGVmMWY3NWVhYTllM2I3N2NlODAyYTQ1DQoy OTk3Y2JmZDFjZWNhNTk2NjNjNzg1YmI3MzlhMmM1MTI0MTRhNDY4MjQ0MjA3MWM3MGMwMWRkOGM1 MDJlMmJjYmZkZDE4ZmRkMGY5ODBlODc3MjdlZDE3MDE3NGYwNTUzNjE5NDc4MTAyNTY5Y2U1Njg5 NDg0YzcxNjIxYTM2OQ0KZGEzYjE2YWIxMWUyMTY2NDE1YTNkMWU4NzUyOTY3YTQyZWM5YWU1NDA4 ZGE3YjcwMWNlN2YzYWMwODg5NGViYWFlZGY4YWQxYzQyZTI3OWI0OTkzYzlmNGU0ODk0MjUyMGU2 ZDZhNmEyMjQ1OGFiOGMxNmMxNTNiNzhhNGEyMjkNCjEyMTk4NjcxMTM4MDQ4NjUyZWY3ZDc2OWQz YTY5NTQ2ZjVjZmU0M2M3MDhjNTlhZmE5YjE3MTZiNWI1YmRiMTZmMGUyMjY3MzY2Y2Y2NmYxZGM5 NmY1OWJhMjY2MGJiOTNiZWVkY2I4ZTNmYzQyMWQyYjAwZWQwZTNhYTM5MWM4DQpkMDkyMjU0Yjhh YWQ1NDExMDA5ZjRmYzUyY2Q3YTk1MzVhMGI2YjlmYzEwNTk2YWU1MjJhNjY1MjI0MTJiOTA1YTNk MTg0ODFhZWFlYWU3YjIzYTEyMDI5OGE3MjFlYzY5NzA4NDM2MGIxNTI2NTkzYTc0YWIwMzI2ZTE5 NjQxOA0KYzZiNzAwMmM2ZDZkNmRmZDRkMjY5MzE5ODkxNTA2MTAzNTc0Y2RkZDg0YjIzNGY0ZjRl NjRjZGMyNmNlMWYzYjAxZTg3YzUyMTU2ZmEwZTFkMTU1NjU2MzNhZTFmMDY4NGI4M2E2NGQ5YmVh MDYzMGVjMmFkNjcwNjFlYTk0YTINCjdlM2E0Yjk2MmM3OTM5ZWQ4YzA0YWUxZjM0ZmVlZGZiMDY4 ZWQ1MTU4OTMyNzE5YjZhNmI2YWRlYzI2ODcyMTQwMDdjNDQ1MzE0ZTIyNWY5NzYyNmRmNjkzYjM0 MzQzNGRjNjUxYjFhYjViN2I1OTIyMjQ1NWM0MWFmZDgyNjdlDQo3MjIwMjA1MjZkNGRiZWJmMmE5 NzViNTc3MmZiMzI1MzUzYzhkNjU1MzIwZDdkMTA0MDgyMTczMmZiNjg0OWJiNGY2NWUyMzZlNWYz ZjlmYjAxNWM2Y2E4YjIxYjJmN2UxMTc2YWViMmFjNTY1YjViZmIwODFmZGNlMjkyNDg3NQ0KZTk3 NGVhODU0Y2RjNzY5M2I2MjczM2IxZjcwOWNjMWVkOTlhMzU2Njk3MGExYWI1ZjU3NTc1NmU1MGY3 OTlkOGI1NzRkMzQ4YzJiMWE5YTViOWY5NmU3ZTdjMjQ0ZjQ0NzMzN2NlZjA1NDY0MzNlZmE5YWE3 YTNkODBmM2Y5YzcNCjJiY2U3YWE4ZTJjMmNkOTc1NDI5NGE4ZGY1ZjU1YjlhMWExYmZmMDAxNjdk NTI4YzQ1NWNhZTcwNDM5NDhlOTRhMzYxMGEwNTAzNjMzNmYwZGMwMTk2ODg3ZTFmNjViM2Q5MDcz MDU2ZDg5YzkzNGUyNjI4MTNiNzg5MDdlNzk3DQo4ZDNjZGQ5NzUxMzAwZDU2ZjI5MGYzOTUwYjMx M2E5ODYyMzgxY2JlM2MxYTBlNTE1NzY3NjczZjc2MmU1NjRiZjFmOTdjOTRiMDBkNGFhN2QzOGY4 M2Y5YTM4ZmUzZTRjZDlkNDgyYmY5ODBmZjE2YzBlZmI5N2JiMjc4NzU0Ng0KYjkwMzdlMjY4MDU1 MmUwOWNlNjQzMmE1ODY4YTljYWVjOGE0NmJlYTEwYjg4MDE1MGU4N2Q3YTA0YzY5ODYzMmU4ZjBm OTdjMGZmMDE0Y2ZlMjcyNTQ3ZTAwMTcxOGFhNGNjOTk4NDllOTU0NzIyMjM1NmE5Zjg3M2E3NTZh ZjcNCjNhYzdkNDI5NjE5YjM0N2RmYWI0OTczMDc2OWI4MGRhOWE5YTlhNWJhMmUxMTAyOWIyN2Mx YjI2NGZiNmViMDA5YzFmMGU4N2RlMTcwNDgxN2M1ZTJmMzUzNTM1M2QwODI2MGQzNzRjOWIzYTk1 YTY3NDc2MTA1ODAyZGM5NWI2DQphZTUyNDU0NWM1NWY4YWVlZjdkOTYzOGI5NzljMWMzMzM0YWEy ZjE0NmUyYTc5OGUzOTczZTZjY2I1NjBjZTgxYzk2NjRiZTZhM2QxZThlZDVlYWY0MDBiZTZjZjdm MWQ2M2IzNDE2YTFiMWIxYTFlNGJkYTI2NTliYTRhMzNmNg0KZGJlZjFmMTgzZmViZTFkZjA2MWUw MDFmZDU2NGM2OTdiOTM0ZmEzMThjZDUyN2E3NGU5ZjM2OGRlNDY4OThiYWE3NGM3OTA4MTM5N2Vl MmI4NzkxZjQ4ZTY4MzhiNDQ1NTcyNDU3ODBmMjAyYzgzYWI2NDkzMTczY2NkZWJhZDMNCjBkNTUy NjllMzVhOTAwYzBjYzk5MzNiZjcyYzg4YTE1M2IxYjRlNTM4Y2ZhY2VjZWNlZGYwNjQ0OTEwYWI1 YjU3ZmM2NTg2MWNjMGZlMDM0NTU4ZTUyM2EzZWEyZTM3ZTY0Mzc5ZWI1NGZhMjNlNTc5MWE1ODQ2 ZDUwYzIzNjI4DQo1NzUxZjEwYWM2OTI2NjBmODA4MzUyODkzOGM5OTEzMGNkOWEzNWViMTViMGJh ZDI5M2YxOWY0ZTg0NDQ3Nzc3ZjdkN2U2Y2Q5YmY3Mzk4YzNhZGExYjE2MmU1Y2Y4OTkyMzhlMzhl MjdjZWNiZThkNzczYTgwYmIwNDQxYTA4Ng0KODY4NjI3YjAzZGY5NWVkZTUwNWZiZjM2NjExYjY0 ZWIyYWI1YjdiN2JkODYxZGFiODBmZmI2ZjAwMWY4ODRhNTZiOTQ0ZGM0YzhkMjU1NmFhOGFmYmYx YmRiMDdlMGNkM2RmNGQwNDM0OThhODRkZDMyZjk5NzYyZGZkYWE0NWENCjA2NzBjNGNhOTUyYjA3 ZmM3ZTFmNjUzMjk5MWY2MWI0MjZiNThiMzYwMDVmYjMwZDhkOTIzMWQzYWRlZjMxOTk2NGJjZmYw ODM0NjRkMmU5NzVlZWY2ZTg4NjJhNTMyMjkxYjgwOWRiODdiMjU0MDFiODQ4OTUyNTBhODc4MmQ0 DQpkMDUwZmY0N2IwZmNhNDdmNDViMDVlMTJjMDZhNWRkNzFlMGUwNjQ0OGE4NjQzNzRlMmYxYzdi ZjgwZWQ4MzBlZjM4ZWUzZmM0MDU3NjQ0YTNiMjNlYWNmMzlkODc1MmJkYmJmMzVlNjI1MTNmMTc3 ZDk0MGM3Yzg1MDY1OWEzNg0KNzVlYWEzNjAxNTdiOGFkNTI3MmY4MDAzMWExYmViZWY4Yjg0ODIy NGZhZmQ1NDk5Y2JmZDBkYWNmOGQ4N2NlYzFkNmY0YjFhYWMzY2UzNTcxZGM3MjE5ZmNmNGI4MTQw ZTA0ZDMwOTdlMDZjNmNhZmRlNzUwMGI4NTY1NzI0NGENCmYzNDlkYmRjZGNmYzIwYzY0OTBhZmJi MGYwNjFlZGRlM2QxMTNjMDAwZTZiNmY2YmJkZWQ4ZDU3NWY0MTI4MTg0MDZmNWYzZmJjM2VmZjNm ZDdhZTdmZWI1YWIwZThjYmY1MjVlZGRiZWFlYWVhNGUwYTA0YzQ1MzVlNzhlZTM5DQoxMDAwNTk5 MmUwYzQxM2FmYmZmMmVhYWIzNzZmZGFiNGE5OTdkZmIzMTZhM2U5OWVjNWY3YWIxODRkMTk4ZGYw YmY4NzAxZjhlYWVhMGFhN2FmN2RlMzhkNjQ1ZjdmM2YwNDhmMDdiMzY2Y2ZjMWNmN2ZmMThiNTU2 MGM1ZDJkZQ0KMmFmOWFkMjA4MDEzOTI3MWU3ODZiZTZkZGIxMDBlMDViMGFkYjcwZmE2ZTNmY2U5 YjllNzVlMzgxMWMwYTQzMmVlZjcyNmY2ODUwMTJlYzZkYzU5YjM2NmRkZmE5N2E3ZmUxODhiODQ5 OTI5N2JjYmQ2NWUyNGQyOTlkYjlmNzkNCmU2OTk1ZjAzYjgwYjQwYTk1NTBhNjAyZWI1MmUwMDg1 YTM4ZTNhZWFjMjdiZWVmYTZmNzgzYzgyN2Y3MDcwMTAxZThmMDc0M2MzYzMwMDAxODJkNzAzMGY3 ZjY1MjIyNjMwN2JiZDVlMDgxZTk2MDUwODAwMWJkZWRmNzgxNTU4DQo5NmU0ZTM2MDA5NWQ0MzI1 Y2ZmMjAxZTgxMTQ1NzE1MTM4Mjg5ZTE3MDkwNWUxMTUwNDZjZWRlZGMzMzAxMWRlN2Q3ZmQzNmMw MDBmNjExZmMxYmUzNmMwMmUzMmY5N2NmZTljZjdkZmRkNzBhNjAwNDIzMDIwNjI2ODY4MTg1Yg0K N2JmYmIwZGZjYzk5Yjg3NTFkMTQ3MzAwMDAwMWFmNDk0NDQxNTRlNzllOWY1ZTAyZTAxMTAwYmZj MzBlYjIxYzUxYmU5YTFkMDE5ODZjZTE1NDJmOTg3ZWRlNTM1MTkxZGRhZjZmZGJiNjIzODYwNzA3 MTAxMGZkZTgxZjE4ODQNCjE4MGE2ZjhiMjc5MmY3M2RmNmQ4NjM5NzYyMWY1OGIxYTVkODU3MDdk ODg1MTdjMDljODY4Njg2NGZiY2ZlZWEyYjBiODNhMjFmYzE4MDA4YzA4M2ZlODEwMWY0MGYwYzIw MmEyYjJmZDUzNzM0YmVmZThiNWZmY2UyODc2MDJiDQplZTFmNjBhNDc5YmJmZDFhMjYwMTBiY2Mx MDUzMDNhMGIyYTVhOWYxNTM2ZmJmZmQzNjA2ZmE3YTExMDg4OGYwMGEwMmZhZmFmYmQxZGIzNzAw NDk1NTFmN2RmZGY1MzczZTBmZTA2NzE4YWQ2Y2IwY2Y2MTVmMWZlMDYyZjgwMQ0KNGM0ZmE3ZDMw N2M3NmNmYmFjYmZiZGY4M2MwMjdlM2Y0NGQxMGZhZmMwOTJhZjA3MDYwNzMxMzAzODg4ZTE2MTgy YTJhYTA4ODVjMmViZjJiNWI1NDIzODFjMTY2ZWJiZWRiNjNiYzAwNjdkMGIxODk5MWQzY2ZjZjBj Mzk3ZjcNCmY1ZjUyOTJmYmZmNGY3ZTFmN2RlN2IyZmRlZGJiYjBkMzQzYzBjYmZjZjBiOWY5N2E5 YzdlZTQ0YWE2YjY4YzJjYmFmYmNmMmVkYjU2YmQ3ZGUwYmUwZTc5ODM4NTc3ODlmYzFiZmQzMDA5 NzIyMGM2NjU0Njg1ZmIzZTZhNDZiDQo3ZTc4ZmI2ZDVlOGZjNzEzMDAxMTdjNWUyZmJjNWUyZmJj NWUwMTgyYzcwM2JlOWY3MDU5MTAxMTg2ODcwOTgzNDM0MzE4MWMxYWMyZDBkMDEwNDQzMTgwYjlm MzE3N2NmMDgzMWZmY2UwMTIwMDdmMDZmMDA0MjY5ZjY0YmU0Zg0KZTFkZjc5ODBjNzgzMDIxNjQ4 ZWY4MGM1MWU5YjAwY2NjMzBlM2I2YzU5MjAxMDE4N2FmYmVkYjczZDAwYzFiMjZjOTIyNDY5ZTA4 NjFiNmViODE5MmMyYjdmMmQ4MDk3MDFiYzg2ZWQ4YmExZmMxZmZlMGZmYjI2ZmUzZmYwNDFjZTU1 MmJmM2VlMGYwMDAwMDAwMDQ5NDU0ZTQ0YWU0MjYwODJ9fXtcbm9uc2hwcGljdHtccGljdFxwaWNz Y2FsZXg5OFxwaWNzY2FsZXk5OFxwaWNjcm9wbDBccGljY3JvcHIwXHBpY2Nyb3B0MFxwaWNjcm9w YjANClxwaWN3MzE3NVxwaWNoMzE3NVxwaWN3Z29hbDE4MDBccGljaGdvYWwxODAwXHdtZXRhZmls ZThcYmxpcHRhZy0xNDYwMDEzNjg1e1wqXGJsaXB1aWQgYThmOWY1OGJhMzJjOTJmNmJkY2MzNjZm NTFlOTg5NDJ9MDEwMDA5MDAwMDAzZDliNzAwMDAwMDAwODE1NDAwMDAwMDAwMTYxMDAwMDAyNjA2 MGYwMDIyMjA1NzRkNDY0MzAxMDAwMDAwMDAwMDAxMDA5NzkzMDAwMDAwMDAwNjAwMDAwMDAwMjAw MDAwNzQ5ZDAwMDA3NGJkMDAwMDAxMDANCjAwMDA2YzAwMDAwMDAwMDAwMDAwMDAwMDAwMDA3NzAw MDAwMDc3MDAwMDAwMDAwMDAwMDAwMDAwMDAwMGJlMDkwMDAwYzMwOTAwMDAyMDQ1NGQ0NjAwMDAw MTAwNzRiZDAwMDAwZjAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMDAwDQowMDAwMDAwMDAwMDA1NjA1 MDAwMDAwMDMwMDAwMWMwMTAwMDBhMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDYwNTUw NDAwMDA3MTAyMDA0NjAwMDAwMDJjMDAwMDAwMjAwMDAwMDA0NTRkNDYyYjAxNDAwMTAwMWMwMA0K MDAwMDEwMDAwMDAwMDIxMGMwZGIwMTAwMDAwMDYwMDAwMDAwNjAwMDAwMDA0NjAwMDAwMGYwNDIw MDAwZTQ0MjAwMDA0NTRkNDYyYjIyNDAwNDAwMGMwMDAwMDAwMDAwMDAwMDFlNDAwOTAwMGMwMDAw MDAwMDAwMDAwMDI0NDANCjAxMDAwYzAwMDAwMDAwMDAwMDAwMzA0MDAyMDAxMDAwMDAwMDA0MDAw MDAwMDAwMDgwM2YyMTQwMDcwMDBjMDAwMDAwMDAwMDAwMDAwODQwMDAwNTNjNDIwMDAwMzA0MjAw MDAwMjEwYzBkYjAxMDAwMDAwMDAwMDAwMDAwMDAwDQowMDAwMDAwMDAwMDAwMDAwMDAwMDAxMDAw MDAwODk1MDRlNDcwZDBhMWEwYTAwMDAwMDBkNDk0ODQ0NTIwMDAwMDA3ODAwMDAwMDc4MDgwNjAw MDAwMDM5NjQzNmQyMDAwMDAwMDY2MjRiNDc0NDAwZmYwMGZmMDBmZmEwYmRhNw0KOTMwMDAwMjAw MDQ5NDQ0MTU0Nzg5Y2VkN2Q3OTk4MWM1NWI5ZmVkYmQ1ZGRkNTZiZWQ0YjU3ZWZkMzMzZDMzMzNk ZmI5ZTQ5NDIyNjFiNTk0OTA4MjQxMDk2YjA2MzA4OWIyMDgyNmM4MmIyMjkwODhhZTBjNjBmZjUy YWUwODINCjgwY2ExNTUwZDQwYjIyYTAyMjA4ODgwYmJiMjJhYjIxMDEwMjI0MjFjOWVjZGZlZjhm NzM2YWE2YTdkMzMzOTk2YzE4YmRmNzdkOWUzYzk5YWEzYWQ1NzVhYWNlMzlkZmZlN2QwN2Y4M2Zm YzQ3YzNmM2FmZWVjMDFlODIwYWEwDQoxNTQwMmQwMGI1YjViNWU1OGNiN2Q3YWY0ZjBlMTNjMTAz YzBlYmYzNjFhMGJmYmZhODM5YzEyMzc4MTExMDQ1YThiYWZlY2ZhYWNhMmFmYWYxOWQ3N2RlMDg2 MDAzODA2NzAwM2MwZGUwYmQwZmZkMmRmNjAyZmU1ZDA3MzgwZg0KNjBkOWUyYzU4YmJlMjAwODAy MWVmOWNkYzMxMGZkN2U4OGEyMWY4Mjg3YmRkMmYwZjAzMDg4MDAwMjYxNzg5ODQwNDQwMDAwOGYw N2YwNzgzY2YwZjA3NjgyYzcwMzQxMTBmODNkODRjMWExNDEwYzBlMGU2MTY4NzgxOGVkOWQNCjVk NzhmODM3MGY1ZmQyZGYzZmY4MDQ4MGRmMDBkOGZjMmY3OGQ3ZGRjMmJmY2IwMDA3MDEyYzQ4YTdk MzBiOTI4OWY4ZTk3ZjdiZTE3OTg0MDIwMTc4YmQwMjg2ODY4N2QxZDczZjgwNjEwMjAyYTJmOGNm YjlmMzE3N2NmMGJkDQplZjdkZWY2ZTAwOWJjMDU2ZTQzYjAwMzYwMjE4ZTBlNzAwYzAwZjQwMDI1 YmY5MzEwMDM2MDA1YWI1NmFkNTExNGYzZWZlNThjZDNiNmZiZjBkZDFlZjgzZGZlNzgzYzdlMzQx ZmZjMDIwN2FmYmZhNjFkYTM2MDRhZmVmN2IyZg0KYmNmMGMyY2QwMDFlMDQzMGY0YTE3ZTg1NWRj MGJlM2NjMDYxMDA4YjMzZTlkNDU1MWJkZjdmMmYxZjBhMDQxMDEwZmRmYzYzZjdhMWIyMmFiZmUx YzlhNzllZmEzNDgwNzcwMWZjMTljMDhiZDg3MzFmZGMwNGQwMDVhMDI1OWINCjRlY2ZmNDc4YjA3 OGNiMDc5YjExZTAxNGEyYjdhZjFmYmRmZGZkOTgzMjc1ZmFlM2Y3ZGY3ZmZmNjkwMDllZDg0M2Nm ZGRlM2Q4MTcwN2Q4MDY3MDljYTlhOWQ3Zjg3ZDAyNDRiZjFmYmQ3ZGZkMTg4NjA3YmRmZDAzMzc2 ZGRlDQpiY2Y5ZDcwMGVlMDU1YjlkZTMyMTBhMjAwNzM2NTAxMTAwMjEwMDMyMDA2ZjQ5YmI1ZTMw NWViYjk2ZmY1YjA3ODBjYWZjOWUwNzQwMjM4MDU5YTY2OWQ2MGZmNWY3OWUxYTBjMDRlMGY3Nzli MWFkYjcwZjFlYWZlZjgzYjdkZQ0KZDlmMDA5MDBiNzgxNTE4YmZmNDMxOTU0MmU1YWI4ZjAwNTVk OTEyODFkYjcyOTE5MzM0OTk1MjUwYTA2ODNkZjA2YjAxMjZjOTA0YTExMDRkMDEzMGE4NWNlM2Y2 OWY1NmE1MmE0MDgwNTAzMjIwMTIwNDExMDI4MTgxMDQ5OTUNCjI1ZDI1NDg1NGM1ZDI1NTM1NzQ5 ZTc3ZjZiOGE0YzhhMTRhNTcwMjg0OGUxNjA4MDQyYzEwMDg1ODMwMTRhMjc5M2U0MTM4NDJmMDEz ODBkNDAwYmI2OWYxNGUwN2Q1OTAxZTA3MzlhMmM1MTMyNjZmMmZlNDYyOTEyODk1YzA1DQoyNjIz ZmMxZjM4ZWFlYWViZWI5ZTM0NTQ5OTMyNzE5YjYyODY0NmE2YTFiZjBlZTAyYzMwMWU1OThhNDIy MDEwMzg3YmY2YWM1OTZjNTA0MjQxNmE2YjY5YTY4NTBiMTdkZTAzZTAxYzAwODcwMWU4MDQ5MDAx YTA4ZGYzNGM5MQ0KNWZkM2MwNTY3YTE1ODAxOTAwOGUwMTcwYzE5YzM5NzM5ZWNlYTQ1MzE0MGM4 ODE0MGEwNDQ4OTZhNDlmMDI1ODBkMjA1NWU2Yjc2NDAwYTc3Nzc0NzQzY2ViOTgzYTY1ZTIzNjE5 YWE0Yzg5NDRlMjM3MDAxYTc2ZjlhYmZjMDcNCjIwOTNjZmU3YmY2ZmE4MzI2NTEzMzFiMjc1OTVi MmQ5Y2M2ZjAxMWM4YWVkNTc0ZDQ3MmE5NWZhNjYzODE0MjI0MWYwOTBlOGY3M2YwYWUwNzIwMDhi YzA4NGE1YmQ4NTFhMDBjNzM5OGU3MzkzNjU5YWU0ZjE3OGM4MzRmNDAxDQowMDU3MDA5ODg2YjEy YzRlMDA3MDcwNjUyZWY3YmMzYmQwYmEyMmQxOTQyOTUzN2UwOTIwYmUxN2ZiYjhjZjQxMDQ3MDgx MmE0NTQ3NTZhY2EyMjhkZjA0MTM2YThhMjEwMzM4NGQ1Mzk1YzE4MGU4YTdiOGUzZmMwMmMwZjEw MA0KZjQ1ZDdjNmUxNzgwNTMwMTljMGNlMDYzNjA4M2I3YjNhODBlMDQwMmU3NGU5ZjM2OGQ5MTdm NDUyNjAwMjc4MTA5ODRjNTM4ZjhjMGE1NGIyOTE5MzMyOTFkYjcyOTY2MTlhNDY5ZGFhOTYwOTNl MDNmMWFkMzliOWI5YmRmNDkNCmQ4MDYyNTYzMjZkNTE1NmEzNzAzNTg1ZWQyMjZhZDI4Y2FkNzA1 OGY4N2UyZjE3ODJmODAzMzAxMThiYmY5NWNjMTM2NGQzMjU1ODVkYTVhNWIzN2E2NTJjOTJkYTE2 MDgwMjI5MWM4MzUyOGNmNjMyNzgzMmEwMGE3Y2JkMTQ4DQo2ZjI0MTQyNGM3NzFhZTA2OTAyZWJh MmUwMjM4YzNkNDU0NGEzYjRjYTY1ODcyYzAwMTFmZTAzZjk0NmMwNzAxNWNhNjJiOGNjZjZhYjI0 NDAwMmVjNDU4YzEyOWQ3ZDhkOGY4MzNkMWVmMjM1NTU1N2YwNWM2MTNmNzE0ZGFhNA0KNDg4OGMw NzgyY2MwNTZkMmVhNjgzODQ0ZDk2Y2U2N2UwMGM5ZGRmODZkMWY4MDQzYjNlOWQ0YjY3MDI4NDhm NWY1NzUzZjAxOTAyOGJhNmUwM2Y4YmMyNjQ3NDdjODc2NTU1NWQ1MTVmODBmNWFjZGQ1MDkyN2Q2 OWY4Yzk5OTQNCmI0NGRhYWM4NjY5ZjAxZDA1Njc0M2RkZWQ4ZDg3ODRiMjgyMDUyMmU5NzdiMTk0 YzQwZGExZDM4NjAxMzBhMDBiMDY4ZDFjMjNmZTliYWJlNTE1NzY0NGFjNDFkNGEyNDEyZmY5YzNl N2RmYWNiOGIxNzJkN2FiZWEzYWRlZGY1DQo1NGNjYTI3OGNjMjIwMDFmYzVlZTBkYjQwN2MwOGFm YWJhM2EwYTg3ODJiNDYyYzU4YTNmMDFiMDhhYWVjZmVlNjg2ZmE3ODQ2ZDUwZGMzMjI4NWY1NWY1 MzI4MGVjNmUzYzZmOWZjMDEyNGQ5NjQ2MjQ0YjlmY2Y3NzMxMThlOQ0KMDJkOGNjM2YyYjFjMGNk MDhjMTkzMzA4YzA5MjVkZjhmZDA4YmZlZmQyYzY4NmZhY2RjMTgwNDgzZWFmOTc0YzQzMmZkNjY1 NWIwMDVjYTg0YTUxZDIxNGM5ZTU5OTY3MDJiODU4OTZlNWFmMDk4MmYwNDU1MzUzMjg2ZWU5MTQN CjBhMDQyODFhMGVkMWRjYjk3MzNlMDA3MDM2MThkZmRlZDk5NWU2MDNiMDVhOGU0NjI4MTIwYTEy ODAwYjMwNGFhOTAyMDBjZTM1MzU4NTMyNzE5YmU0Njg4NDAwMmNkZTg1ZjdmZWQ3NDMxMDg0YjM0 ZDRkYTE1NGNjYTI2NGRjDQoyMThjNWQ5OTlkZDk3NDlhMGM0ZDI1MDA2YmMwM2VjYTY0OTEwNjcw ZGFmY2Y5ZjNjOGUzZjE5MGM0M2VkMjRmMWM1MzI3MDA1ZmM2MzhmY2JhYTFiZWZlZGU2OWQzYTY5 NjMzNjIwMGMwMjdhYTJhNzMwNDYwMjk5OGZlZmIxOQ0KZGIzNDdhODNhMjQ4MDFkMTRmOWQ5ZDlk N2YwMzcwMTRjNmFlYzgxZDIxMGFlMDMyNGQ1MWM4MzIwZDAyMzBhYmU4ZGFkNGFhNWNjNTUwMjY2 ZTkzYTkyOWVlYTRmYmI3ODFkOGQyZDJmNDRiZGI1MDI5NmUxOTk0NGVhN2VmMDINCmEwZjA2Yjll ZDliMzY3N2YyNTFjMGE1MjUzNTNkM2VmYzBjODY5MzExNGIwNTk1ZThhMTA4MGEzYjJkOWNjOWJj MTgwNDhiNmFlNTI3NTU1ZDU0YjAwMGFlZWVmMTY2YTZhYThiM2JkZmRmMWYxM2EzNTdiZjZhYzlm NGY5ZDNhDQozYWMwZTE2MDgwYjJkOWVjNzcwMGVjM2ZhNWFiOTM3NDU1MmUzN2Y4MTY5ODkxZTUw NmRiYjZiNjdhMDU4MTY2ZWMzNzdkMzM5ODJhNTdhZTlmZTU5MGFhY2FlNTdlMWUwZDg3NjhjZTlj MzkzZjAxYjM4MzAzNDBhYTUwMjhiYw0KOTBiNDRkYjI3NTk1M2EzYTNhMWVjMGJmMDE1ZjBlNzc3 Njc2NmM3MjRjOWQ2YzQzYTNiYWJhYmFhZjYyYjRkMzZhMmU5N2JiM2QxYTBlMTE5OGFhNTJhYzQz Y2ViMTBjOWRhNDQ4OTgxNDI5NDI5NTE1MTkwMjcwMzE4MDgzMDANCjVjMjcwODFlYjIyZDhiMDA3 YzBhYzAxNDUxMTQ2ZmQ2NGEwNjI0NWY1NTQ1M2QzM2Y2MWI2Zjg1YTJhN2E3ZTc5N2IzNjZjZDFj Yjk1ZTU1NTlmOTdjY2FiMTQ4OGU4NDI5NWY1NTQ1MDBhNmYzNGI2ZDAwNjZmMmJmMDUzMDY3DQo4 NDhiZmQyYzRkMjFjN2Q0NDk5NmEyMDRlMDIyMzA3M2U4OGVlMDAxNzA0NjM0MWNhMjdjNzVkNTY2 OGMxYTRjODJlMTcwZjhjNjk4YTE5MTYzNmEwNGUwYmZjMGQ4Y2UzZTg5NzA0ZjRmY2Y2MGMyMzZj ODYwMWZmZmEzNDVkNw0KM2FlNTY4ODRiMjk5MzQ2MWFjODAwNTAwZDA2NGE5NzdmNmFjNTkyZWE5 M2FjMWU3ZjNkZDkzNzYyYzRhYzY0Y2UyMTM2MjIxNDYyNzQ0MmUxODBjZGU5YTRhYzQ4YjA3ZjM3 Y2M3ZDQ0OTY3N2E2OWE2NWNlN2JhYmEzYTFmNGMNCjI2MTI1NGY0M2I0YjYyODY0NjAwYmU1Mjc0 MGVhYjU2MWQzOWQwNTg1ZmU3M2EyZGVhMTUyOWUyNWFhNmJlMGNlMDZhNTM1M2M4ZWJmNWRlMGNl MGQ4NzAzMDQ4YTE0MDgwMTYyZDVhZjQwMGM2MWEzMzUyNTNhNzc2YmZhMWIxDQpmZWFjMjhmZTBl MzVkNWQ1MjQ0NWMyMDRhMGI5ZThmYzQ5ODYyYTUzMzI2NjUyNjM0M2ZkMTBjNjRlYWE3ZDAyODFl OWQzYTc1M2MyMzY0ODk1YTNhNTNjZTVhODQ4Mjg0ODBiMTcyZTdjMTllM2NjZjYzOWIzNjdmNzgy OTkxOQ0KNzNmMTc4ZmM0YjVlYWY0MGY1ZjVmNWNmNTU1NWU2YjZjZTk4M2VmZGM5YTJhNmMxNjA0 MGE0ODQ2ZDkyYTIyOGY3MDJmOGI0NjU1OTNmNTZhNTI4MzUzNjM0YWM0YmQ4MDYwMWY4NzQ5OTQ3 Zjg3NDk1YWQzYzMwNWUwYTAwOWUNCjU0YzJlOWI3NzRkNTNkMTcwNjgwZjZiNmI2YmI0YzRkN2Qw OTZjZDAxN2M3MmQ5ZDcyMTVkOWI1YmEyMjhmZDg5YjMxYWEwNjc5MDBhY2FjYWFhY2RjY2MwNzZk MGQwMGIxYTlhMTgxNGMyNjVmN2MyOTE0MGMxMDgwOGFhMmJlDQozODg1NDJlMTJmNWMwMGRiYmZl OGZjOTJhNDEzYTM0Y2RjNzYyN2I1ODI3ZDA0ZGU2YzI2ZjM2NGMyMzZjODYyMmJlMmE4YTI2YmFi N2M1ZTJmMDFmODIyMjYxNmE0ZDY2OGIyNDQ5YTFjYTU2ODM0YjIwNWMwMDI3ZWZlMDRhZQ0KMzMx NzBiMjgxNjgwOGI2YWYyNzk1MmEyMTE1Mjk4OTA3NTdjMmU5N2ZiNDYzMjY2NTIyODEwMjAzMDIz NDQzMWE0YjZiNmI2YzdkYmRiZGJmZjgwNTE1MjBjMDAxZDUyMjQ0YzUyMjQ0YzMxZGIyMjAwNDgy NDEyZTdmMzQxYmYNCmI2YmFiYWZhMTE5ZDQ5ZGU1OTAwY2RhNmE2NTA1YjViZGJmZGZjNWVhNWFk YWRlNTU3Yzk0NGUyMDFiMDgxM2RjZmQwNTQ5MmEzNjEzMjM1ODVkNmFjMzk4OTAwMDhlOTY0ODIw MDRjMjllOTRmMThjMDdmZjE4MTJjZDYxZTE2DQoxOWFhNGMyOWM3YTJmNmY2ZjY0N2IxZWI0Njk4 M2QwNjRmNDc0N2M3NGYxM2I2NDE4YTE0MjEwMDA3MTQ1ZDNiMGNjY2Y1NTY2ZTQ1MTVhMzkwY2Q2 NGRlNTNhNTI4MjU2YzgzMmNjYmZhNDFkMWI1ODAyNjRiZDRkZGRkZmQxMg0KYjY3ZjU5MDE0YzZm MTUwMDYwYzk5MjI1OTc4MzA5M2ZiYjYyZjc4ZDYzZDRiMTExNzExY2ZiOGYyZTY5OWUzZDdiZDZi YmZjZmMxN2Y4YzAyZmUzYzc2NzE4YWE0YzUzYmJiYmM5YjY0Y2Q3NmMzOTNmOWJjZDNlNTBjNGE2 NGENCmNkYWZjNWYwMDJiODkyYWZlNDYyNmJkZTMyNDM5NTI5Njk5YmI0NjhkMWEyM2ZlY2MyYmJl YzUxNWM5NGIwNDZjODcyNzdkMWY5ODMwNTQxMjAzMDk1NjMyMjFjZWExNTA0ZjJmYmZkNzc4MGY5 NWJhZmUzNmE0MzRmNTE5YmMzDQpmOWI5NTNmNzY4Y2Y3NzhjMmViMDc3ZjIwMDU4YWE0NDIzYzQw N2Q4YTUwZTg3NzJiMjJjODJiMTllMmY4YjdlMWYwMTM4Yzc1NDE1YjIwZGNkNzU1ZGVlNDg2OGZh NzQ5ODBkZjJhMTQ1ZTdkNmQ4YmE0YTVjNDYzODdiNGZiZQ0KZDRjZWUwNDg1YjU3ZGQ5NzNlYTZl OGZjMjJkMWVmMjczMGY3ZGE3ODEwYTY0ZDliZjZjMzgwZTgyNzAwNjdmMDczODVkYTdjMzVmMzJj OTkyNjYxOTRhNDdiMWNkYjIyNTM1MzY4NmFmNzk0NzFhNWU0YmQwMDg1ZjM0ZjA1NmMNCjkwMGY3 MzZjN2IwOGMwN2M3ZWRkOTBhMzExYjI2ZGZiNjY4Y2RhYTBhZjRlNTgwNjU5NmM0MjFlMDFmNjBk NGExZDExZTU3MDAxNWZjOWYzOGFjZTdkY2EzMTc1NTc0ZjNlNzAwZmJjY2Y0ZWExNGQ1NzY0NTc2 OGY5NTRkMWY5DQpmZGMzZWNhMzljM2JjMWJkNDY0NTQ1YzVmMzdlOWY4ZjAwY2NlMWU3OTYyOTUy YzQzNTg4N2M5ZDkzYjc0ZmJhMzc4NDAyMjIzNTM3MzdmZjE4YmJlZjc0ZDg1OTFjODE4OWY5ZTA0 MjI5MTIyMjI5MTIyMmM3YjZhODUwYTg3ZA0KMjAxNWIzMjg5ZDRlZmY2MDgyN2IwMGEwMjE5N2Ni M2Q1Y2YyZGI2N2YyMDllNTUyNDIwZjgwZWI5MmI2ZTlkYWVlNzNiYmZjMTYzYjA5YWRhNmJhYmEz NzE5MzNjOWI2ZWQ1YjMwYWE2MmNjZTA4MzdiZDkwNGY3MmE5MTcwZTgNCjBkYWVkM2JhNTEwZjI3 NDRjMzIxNzIxY2U3MjYzMDNlZTg5OTMzNjdjZWIwYTVhYmM0MDU5NDdkMWQwMTAwMmIyNTQ5ZmE2 MTNhNmU5M2M5MjhkYTc4NzJjMDIxYmM3ZDhkMWMwZDEzODBjMzhiMmYwYTgyZjA2OTRlZDY5YmY4 DQoyOWIxYjFiMWYxYjliNDYzNTM2YjRiZjMyMDI2NmY1Y2Q5NjU3OGRiZGJkYjFmNGQzYjE2ZWQz Zjc3NmUzZjQ2ZWRjYTE5YmUyMjNmOGJmMWUzYmNlYzhlOGUwZThhM2JiMTQxOGNhYTBkNDEyZTA1 N2ZiMWI4NjFkYzcxYThhNg0KMjZmZjFhYjY5Nzg2Zjc1NTA0NDNjMTAwYTVlMzc2Mjk0NTFiMDM1 MTE0YmY5NTYwNTRhYTNhZTFkODA0ZTAyMjQxMTAzZThiYjE2YWQ3OTdmOTQyNzFkZjNkYTE3MTE1 MmQxODBjNWViYTE3ZGYwMTA4ODdjMzk3YzVhZDExODMNCmMyMzQ3ZTNhMTg4YmQ5OWJhNjRmOWRm YTFhYzYxZjVjNDc1MzE0NGFkODA2NzU3NTc2OGNkMWYxZWEwYWI1MWY3MDEyNzQ3MDUxN2I3MWJi NWZkOGY3YjE4NDBiNWQwYmNiNWM5YjAxZTY1NDcwOTJjOWU0YmQ5MTUwZDBlNWFkDQoxNzc0NzY3 NDUwMmE5NWZhNTE1MTViYjFiYWJhZmEwOWNlOTM1ZDk2NzQ4MGE5MmFlZTNkZDNiMDk3ZDBhZTJi MzI3Mzc3YzVlM2Q3YmEyNzBiODVjMjBmYjlkOWFlNWNmYzE0MDA1ODE1MTUxNTJmZTU3MmI5Mjcw MDdjNTY1Nw0KNjQ4YTQ0MjJkNzE2NWQzN2FhYWE3MmJmZTZiMzc2YWY3NWZlNWY4ODE5ZDE3MDg4 MGM1NTc2MmQ1ODRiZDJhOWQ0YmQ3MWNiMjAwMDk3Y2M5OTNkN2I1ZDIyOTFiOGFiZTQxZTMzZTEz ODQzZjVmNTc1NmY4MmYzZTljZWNlY2UNCjVmYTcxYzhiMTI0ZThjNTAzZTAwNzFiN2UwZWRlY2U4 ZThjYmM0NmRhYWFlYWU3ZTBlYTMyYmVjMjAyZTMxOGZhN2VmODU2ZGNiZWNhZDY2YjY1ZTBiMDAz MmU5ZTQ0YjJhOWIxMGM1ZjA4MGNkZjAzZDFkNWZlNTAxZjA3MTAwDQoyN2VlZTFkZjlkMzQ4MmEy ZjgzZDRlYTFiYTJkNGQ3MTU1Y2E0YzZiNmJjYjA3Yjk2YzY2ODBmM2UyNzllZGVkZWRlZjYwMmNl ZjllY2RhZmI5MDJhYjYyOWIyNmE1MWQ4YjRjZDNmY2ZjOWVlZWU3Mjk0NWI2ZGU1NjdlMmVjNQ0K YWQ1NDY3OGQ3MzhmMTg4YmM1MWVkMDk5YzlhZTNhOTE0ODljMTgwODA0N2VhNDJiMTIxOTg2NzEw MTZmNTM4NWJkNGI4ZTIzMDBiZWNkYzlkZGQyODY4Njg2NzJlNDczNmZlMzEwZWVmN2JkNTY5MTIy NjRlYTJhYjViNGI0ZGMNCjBkNjA4NmFlNDhjNDJkNjUyZGU3OWVmYjg5NGRkOGRlYmI3NjIxZWY3 Yjk2MWYxZjU4YTQ5YWVlYjE4ODk3ODhhMTI5OTQ3MjJjMDI3MDg5N2IzMjliY2RkZWRiZGFkYWZh MDJjNjcxNzEwOTgyNzAxNWQ3NzNlNzAyODBhZTJhDQo5NDhjOTkxNGI3NzRjYWU3ZjNmNzAwZjgx Yzk3MThhYmY3NTQ0NzI3YzAxNzc0NDUyMmRlOWYwZjFiYmU2YzI2ZmRiZTYzZWE3NGQ0NTE0NzZk MDZmMDMxNDM5NTY5ZWVkY2I5ZGIxYzUzMjc0Mzk1MjkxYzBlN2Y3YjljN2I4Mw0KMzVkNWQ1ZWYw NjAyODFmZjcyNGY2ODlhNzY2MzI2NmU5M2MyYThlMGVlN2I5ZWE2NGQ5Yjc2NWRkYTE5ODkzZTkw ZjllOTQzZjhjY2FhMWNlN2I2MTk1ZTY2YzkyYTVlZGQwOTAwZTc3NmI2Yjc5M2ExY2FhZTI5NmZl NTZlNzYNCmVmOTRmNmI2NTYwMmQwMDFhMGJiYTVhNWU1NWEwMDM4ZThhMDgzYzZlOGExMGIxNzJl YTA5OGE5NTEyNjk1NzQwNzc4NDczY2NjZGJkY2Q0ZjgzZTQ2NTdjZTIxOTg5YzViNzAzYzY0ZWIw YWI1NjRhODMyYzlkMWYwZWY1MzhlDQplNWJlZmZjNzAwNWNjMGUzYzU2NjhmNzNlZjJjNmViMzc2 YmY1NWNhZDQ1NDRhYzY0YzAyNzNhOWVlMTYxNDRkOTYyODYxMWIyNDA4ODI2YjJhMGNkYTk2NDkz ZTlmZWZiYzcxZWU4OTI0ZTJmMTJkMDljYjcwNjc1OWI5NTA5Yw0KMjRmNjhjNGJhY2I1MjI5Yjcx ODU5NzlmNzE4NzgxOGZhZmQ0NjJiNzYxYzBlZmY3N2Y5M2YzYjQyZjgyMDVmYzk1YzMxOTAwYTY3 Nzc1NzVmZGMwODljNTA4ODA1N2QzYjQ2YjU0NTU3ZDE3NGMzZTkwYjFlYjVlOWUwZTAwNGYNCjY3 MTMzMTk3MGZiYjE2MzE4NGMzZTExYjE1YzZhN2NiZWFiOWFhYWE3ZTg1MmYyODU3NDZiOTMwZWQ1 OGFlYTM2NWQ3Mjc5ZWFhYWE5N2E2MWQ4YmE2NzQ3NTZkNzMxZjJlNDlkMmQ5ZDJkOGQ1NWM4YTJm YTZkM2U5M2UwMGU3DQphYTcyOTQwYzU1MjY0MTEwMmU0NzUxMjBkYzFlODYwZmMwZTk5YTJjNTM4 YzM5Y2QzZmNlNjdmYzIxNDU2ZDgyZTE3MGY4OTZjYWNhY2E3NTVjNWEyZjFlN2M1N2I1Y2I3MjVi NzI4MWNiMGQzN2M5YjI3YzJiNWY2OTM3MDBiOA0KOGU3YmFhOGUwMTBiYzczOTFhM2JhN2E3OWYx NWI3NzQ3N2U1Y2UwNGQwZTFmM2Y5YWViMzZkZmIzYzAwOTY2NTE4YzMxOGRmZWU5YzhlODQ4MjY0 OWFlNjM1ZmNkODM0MzhjYmMzYzQ4NmE1MDkyMWFhNTI5NGI4MzhlZmFlZGUNCjcwNzRkNGVmNTkw ZWIzMzk1ZjZkZTdjN2Y1MGRmNWY1ZWZkYTg2NDYwNzJkNWJiNmI1YTIyMmYzMjI3NmRkMWExM2Vk ZWM2OGE3NzAyODQ4NzIzNDRjNzU4NTAyMzUzNzM3ZGYwNzM2OTAxYTgwNzg0YjczZjNkM2FhMTRh NWE0DQo2ZGJhNDY5NzYyNWM2NWE4MzJhNTk4NzVlY2I4ZjZiNmI2N2ZmMmYzYTc4MDc5NzMyZWU0 MmJmYzZhYzdkNGM5MzEzNThhMTkxYTY1MTMzMTkyYTM2MThhMTkxYTI1NjMyNmY5YmM1ZTZhNmQ2 OTc2N2RiNmRkOTgzY2E0ZGFkYQ0KZGEzZjgzOTE2NTY0ZDNlOTZkODYyYTkzMTI4ZDUwNDc0N2M3 MTMwMDE2ZjA2ZjM3ZGVhNGY5MTQyN2U1MzYwMDA4ODI3MDQxZGFiMTVkMmZkZTJlYWRlMmEzOTNi NjQ5OTk1NGFhOTg3NDljMTcwYzA2M2Y0MDc5ZGZhZTRmNTcNCjE1NmE2ZjZiN2IwMjYzMDUyZjNm ODAyZjNiYTY0ZTVkNWQ1ZGNmZWY0YTQ3OGFkMGQyZDVkOTQ5MDBjZTA3ZjAxNTU1OGU5MjFjOGQ1 MDQwMTRhOWIzYTNlM2E3NjBhYWQ4MTUzNjkzMzI3Zjk0ODhjN2I3NjIzNDA2Y2E5YjRhDQphNWJl OTc3NjJjZDI1NDc1MGIzODdmZWRlODY4YmYwN2MwNDU0ZDBkZjU5NGI0NGQ4YTk5MWEyNTZjODNh Njc0NzUxMTgwZjM2YjZhZjI5NGFmYWU3ZTFhYzA5OWRjZWI3MzRhNDM3ZDNkYTk4YTQyODIyMDdj NjI1NzVmYzRkNg0KYjUzZTAwZDcwMjY4OGE4NDQyMDRlMDg0YzY4Njg2NDc2MmIxZDhkM2UzZGMy MjFiOWE0YThkMGQwZGI3ZjE2MzRiOTMyNTU3ZjhiZDY4YTczYjkwNzA2MmMzOWMwNGI4ODI1MmM4 ZTdmMzZlNjczZjJkYzI4OTI2OGY1NzhhYzUNCjYyZGYwNzlmNjkxYzMxM2UzYmY3OThjMTVjZDNi NDFlMzBjMWEzMDdjMGRkNzE0Yjc3NzlmZTIxM2U5ZmVmMzI1ZDkxNWNkZTVjMDkwMGE3OWY3ZWZh NGRjOTY0NzI4MDBmZmUzYzAwYWEyY2NiNzcwM2Y4NjI0NTQ1NzY4OGU1DQoxM2M1NjhkYWI0YTk1 YjAxOWM5MTRjMjRkZTE1NDVmMTBlMDBiMTk5MzM3YjA4ODA4NzY3M2EyZTAwOWIxY2JiOTVhMTEw MGE4NTNlNWY1NTU1ZjUyZWZiMzM3NDNkOGYzMGJkOTg1Mzg2ODNjN2I5ZWQ5MzljMTdhYjAwZTBm Mw0KZjlhZTQ4Yzc2ZDRhYjM0NWI4MzM5MWE5ZThiNDBkOTUyYzVkMmIzNjk3YWQwZWIzOTk1NjU2 MmRlMjAzNzg0YjMyMWVkZjYwZWJhYTFiYjI3MjJjMjZlNzJlZGI1NTA0MDMwMTkxYTQ0ODk4Y2Uz OWU3OWMzN2YyZDU1NWRiMzgNCjhmM2IxYWMwMzVkYzlmZmE2NWIwZTA4MzcwM2E5OWU4NGJjNTRj Mzc1ZTU5ZjU3OWJkZDRkZDNkODU5MjMxOTNkYWRiZGIxZjA0NzA4N2FkYWIzNDc3ZWU5Y2U3YzEy YzQ4YTU5MTE4MWU4YzRhZTA1ZWVjNWU5YTY4ZDg3MTYyDQpkNGRhZGFmYTYyMjI5MWY4NDFkYWIx Mjk2ZTE5ZTQ1ODI2ZTllY2JiOTc2MzY1YTYyYzQ1Mjk5M2M5NWNjZjhmMzM5YTJjYjk3ZWUzNjU2 NWRhOTdjN2VjZDliM2ZmOTI2MTg2NzM5N2E5NDNkN2Q0NDE4Y2VmMDZiNDliOWI5Yg0KNWVjN2E4 YzA3MmExMWJjMWRmZDVkOTQxODdhYzU4YjFiYmZhZTdjOGNiYjZiN2I2N2UxNTYzNWY3ZWM0ZmEz NTZmZmZmZDlmNTJlNWE4YmI3MjY3MjRlMmNlNDY0NTUxOWVjM2E4YzA3NTA1OTcyOTNlMGQ0MDg5 M2IzNjY1ZTINCjMxOGE5OTFhZTk4YTQ0YTZhYTUwMzYxMWEzMzgzMzA3MTYxYjQ1YTY0ZDlkM2Fm NWY2YTJlMzgzMDJhMjQ4YTIyODE2MGI3MjdlZWMxYzc0MDBhNzM1ZDRkNTUxMzYxMWEzNmMyMjQ2 NzU4NWMyMTYwMGYzMGM1ZDdmY2ZlZmY3DQo4ZjI3ZTc1Y2MyNzliMTA4MDBmOTdjZmVhOTRjZGNh NmZkZjY5YmJlNjk5Y2Y2ZGI0MTUyYTVhODZiZDg3NjIzMjA2NzczYWI1NTM5NjYxZTA2Y2JmYTli MDMzNmMwMGJiODI5ZjJmNDcwMzhmYzM1MmUwNDc0NGNmNmUxZTUxMA0KMGMwNjJmNzcxY2U3OGYw MGE2MDIzOGE5NTAyOGZjMTM0MDQ2OTFhNTk3YzFkNDE2MTFhMzU2YTBmOWI2NmQzZmQzZDBkMGYw MWIwMDZiMzQ3OTQ0NTVhYjRmMjcxMzViZjkwYTNmMzgxNDBjYmM1ZTE0YWE3YTcwM2E5OTFjZjkN CmQwNjA4MjkwNmI2MTViY2VmZGI0NGIwMWY4MzU0ZGJiMjEyMDhhYWVlMDE5MDI3MDk2MTQ4ZDky NmRkYmE3ZWNlNDZiZDUyYTUyODQxMjk2NDE1M2JhM2E0OTkyYTJmZjZkZWIyYWQ1ZDVkNjNlMDY2 MDE2YjcyMzk0MzM2NGU0DQo0YmY0ZTJlOTg2MmFiYmFhZDdhNDg0YWRhMzEzYjY0MTg3MWQ3NmQ4 YzhhYTliMzI2NWNhNmJhMjI4ZGU1Y2E2NmRiMGE5YjE2MTI4NjY2OGE0MmIzMjU1NTdlNTA2ZDI4 OTM4NzViM2M4MGIwZjAwYzdlYmY1OGVjNzRmNzYwNA0KMmY5OGU1ZWM2MzAwN2U2ZDZhMGExOWFh NGM5YTIyOGQ0NDZmZGE4NmU2NTYwMGU4ZTAzNjcxMjcxMjBhOTIxNDA5YmIxM2Y0MGMzZTMxM2Yw ZjIwYTljOTIzYTZjMTZiZDMwZThiMTJmMTMzZDU0ODU5YmM3OGYxMjMyYzM5NGMNCjI2NTExNDM3 ODJlOWM0OGUyMjQ1MjhlZWM0ZGUwNDUwMGZlMDNiM2M1YWUzNGEwMDhiYTU0ODk4MzQ1NTcxMjdi MDAwYzYwYTNlOGI0OWYyYzM0NDIyZjFiNWE2YzYwNjk3ZWQ3OTEyODljNDZkN2NhMGVjMTkzMzY2 MGMwMTM4DQpiMmRjN2QyYjU3YWU1Y2Q3ZDRkNGI4OGQxZjdhYmFiYmJiZGZlM2YyZDI4ZTQyYTQ4 MGI4ZTMzYzljNjI4ZGRkMTk5OWYxN2E4NWYxNTY2MTc3OTBlOTg2MjcwMjM4YzdkMjk5NWE5MWNi NjVlZmMxZWU0NWU5ZmIwMTc0ZTVhYg0KYWIyODE5MzNkZDQxZjk0MTMyOTE3ODhkZGI2MWFmMzE0 ZGYzMzdkOTQ0OGMxYzUzMjcyNTFhYTFiODM1MTI1ZDcyMTA4MDYwNTU2NThlNWE5YTliMDhjMDc1 N2NkNThhMzFkYjdlMzMxMjBlNTFiZWFhZDI5NTNlNmYwNTI3ZjcNCmMxNjBmMGRlNDgyNGYyMzMw MGI3NThiYTRhZjNlN2NkMjMzNzg3Mzk2ZWIxYTBjMjk0NjM1MWMyMzZlOGE4NTVhYmM4ZDQxNDRh MjdlMzA0NDYzOTkyMWRlZDZkNmU2NGU2MjFkYmJmY2ViODEwYzA1NGJjOTMxMzg5YzRmZjAwDQpm ODA2MWZlMDY5NjA4MmQ0Yjg4MTAzNWM4ZTcwMDNlODJmNGMzOTE2Y2Q5ODMxZTNjZjNiN2FhMGEy NGE1MWY3ODNiYTI0ZWZmY2M2ODZmYWYxNzhhOGQzZDFkMWYxNjVmNzQwMTRmZDM3YTdlM2I2YWI4 NzhlYzc0Mzc2ODQ0MA0KMzgxY2RlNjA2YTBhNTU1NzU3ZmY2NWUxYzI4NWViYzE2MjliNjY3MTUy NzkyMDAwZDNlZmYzNTE1YjViZGJlZjAxOWM1NGE4YWQyNWM3ZDRjOWQ2NTUwYTMxNjFhZmExYTVi OWU5NzU2ZWQ0YjhjZWIxMmQwYTA1MDNjNDgzMTINCmZlM2JlNTU4OTQ0YzI2OWY2YjZiNmQ3ZDBj Y2M2MGIzOWYyNjRiOTQ0Y2M2MWZkMzE1OTk1MjMxYTYyZTM5OGVmMzZjYzIzNjI4OTM0ZTNmNWI1 NTU1NzU1ZmNhYjFhODJhOTdmYmJkOWIwNmNiMjdkYjI3YWFhYjcyZDRkY2Q0DQo0ODE4OWIxZmJj MzM2ODhjODQ4MmE0Y2E1MTk3ZmY0Nzc3ZjQ4ZGI4OWNlMTdhYzkxYTRjNGQyMWNlOGUyNmJjNzdi OTYzZWE5NDRjMjQ3ZWViOWU2ODY5NmUyNjAwZTM5OTI1NGIxMWNlNjZiM2Q3Mzg0ZWVjMWU4YzZm YTdkZQ0KMjE2MjMxOWJmOGUwMTQ4YTRlM2IxODE1YThmMjk1OTU5NTZlMTRjODAxYzk3OGZjYzcw MGNlOTYyMjIxNGEzYjE2NGQ5OTMyNjU2ZDU3NjdlNzdkNDFmNjFiYjc1YTk2YjUzOTlmY2ZmZjNl NjY1OWI0ZjI5MDQzNWU3NjYyZjYNCjNhYjAxNWIyMDJjMGU3MzM5OWY0M2JkOTQ0Y2M5NTQ2YWYw MzcwMjk3ZmZlNzFiMTU4ZWNjMTVjMzY0MzAwMTRjN2I2MDdjMDMyMTM5Yjc1NDVhMjIzMGUzYjhj NmM1ZDY1ODM2ZDE4NzcwMmI4MjQ5MzRhOTJkZmU3NzMyMzJhDQo3N2VhYjUwMWVjODc0OTdhZDc0 MmExZDBiNTM1ZDVkNTdmZTc4NzllYjgxMzczOGQ1MmUzYjNjNDUwMjhmNDA1NGViYTVjNzc5ZWMy Nzk1ODYxZGM5YmZlNzUyODJlZTUxMDAzZTNmOWQzMDE3Y2RlOTUwOWYyZjlmYzViMWU4Zg0KZTdh ZDZjMzZmMzZlNmQ0ZDBkMDFmOGIxYTVhYjU0NTk5OTdiMTM0MDQ1NjU0NTk2NTIzMTkzYjg1MGY4 ZjFlNmE2YTY2MTQxMTA1Y2JkM2YwYjk2N2E2YWYxOTU5ZjA0NzBjNmI0NjlkMzM2MDA0MDQ3NDdj N2Y3MDQ0MWI4M2UNCjkzNGVkZjk2NzYyY2IyZjg0MDc3NzQ3NGJjODEzMmU5Mzk3YjAxOGJiOWIw MTUwNTgwNjgzNGZhZTU2YzIyNDZiYWFhZGUzOWVlMWQ4YTE0NzE0MzNlNWQxM2RjODEzMjMzODJl ZjRiYTgwNjUwMjE4YWUyMGIzNWY5NmE0YTI2DQo5Mzc3Y2JkMTMwYzVlM2YxN2IxZGM3ZmVkMThj ZTlkM2JmN2RlMjg5MjdiZTY4ZWJhYWNiOTdhOWI5YTllOTRkZDdlYzlhNGUyNTI5MWU4ZjNmNWM5 OWNiNTE2MzQzMDNhZDVlYmRmYWFmZDg3MTQwNDAyMzk4ODQxYTlkMzc2Zg0KZGU1YmZjOWMxYmVj ZTBjNjQ3OWY5ODRkYTdjOGQyNTU0YWE3ZDNmZjVkNTM1MzczMzM0NjdkZTc3YjAzMDE2ZTU5NzM1 N2VjYzlhOTk4ZTk5YTJlY2IyMmE1MmI5MjZiYWJmNTAyODAyY2NiMzdjOGIyN2NjMzBlMWVmNDYx MTUNCjUzMzNjMTcyOGNlZjc3MjVlOGU2YTY0NjlhYjFkZjc0NzI0YzlkNmE2YmYyZTQ0YWRhNGQ0 ZDRkOGYyNzkzYzkxZmE1MTkzNTIyMDA5ZjMxNTQ5OWJhYTc0YzIxMDAyNzczYjcxZGY5N2NiZTVm MDAzOGI3YWFhYWVhZjFjYWNhDQpjYTI3NmI2YTZhN2UwZjY2ZjZlYjk4YzQ3YjM1NTRiMTQ4OTU0 ZTJlMWJhNDAwNWM5MTg5ZGI5NDRkYzQ2OGZmZmRlNzEyYjgyZjdjMTdkMThlMWRhODNkNGQwZDBk ZGY5ZjNlNmRkYTRiZmNiMGQ2N2Q3ZjhjY2Q4NTFhYzFhMQ0KNzE0YmE3Y2VjZWNlNjdkZDEzOTY2 NTEyYzY0NmRjNmYwN2M3YjZkYzQ0ZWVmMWJjNGI3YjAyZmIwNTQ0M2Y2OWIyNDRiNmMxOGMxMmIx OThiZDFlNDAzZGQ3NDk0ZjAzYjA1YTk2NjUwMmYwYTU0ODI4NDg4NTQyZTE2ZjNjNmUNCjliMDA3 Yzg2Y2ZmNjEzZTQ2ODk4OTYyZjNmYjg1ZjkzMjViMjM0ODUwZTNhNjgxOWU5MGE0YjE1OTkzZjZm MWUyNTYzMmM1ZmQ3NjY0OWRiMmIzMWZlNDBjYjkyMjQxZDA0MjBjNjU1MmQwMWMwNTU5NmFlNTIy Njk1NzRjMzY3DQoyNzRhNWQ5OTA4ZGRiYTIyOGRlNDRiNGQ4MGQzMzlmNTAwMDBjNDJjZDNmNTMw MWRlYjllMmI1NjY1NWE3YzNlMWY5ZTc4ZTIwOTk3ODY4YjFiZGVkOTAwMDBiZmM1MDQxODIyZmE1 ZDNmMmJkNWJiYjM5NjljNDljMzMwMGNkMw0KZWJmNTAyMjA5MGUwYmI0MTU2MzRhYzVmZmY1NjFi ODAyZDdkZmRmZGU3MDBiOGUxOTg2MzhlYjk2MWQzYTY0ZDM2ODA0ZjBhM2VmZmEzOWIzNmJjNWQz ZDMwMzgwOGQxZWY4MzYxMThkZDViYjdmNWRlOWM0YTI2YmVhZDRhNTENCjNjZjI5Yjg3ZmNiM2U2 ZWVmZjJjM2MxZTc4ZTAxOTc4NzdlM2E2MTVkYmZhZmFmMGQ4MWYxZWZkNjE0N2Y3YjQwMThmYzc4 MzQwMzAzODY0MWJkYTFkMTUxNWQ5NWU5NGFmZGRiMTY5ZjNlNmNkNzcwMWQ4Mjg0OTEyMDAwYzBi DQo4MmEwZTk1NmVjYjVkN2RlZjhlN2ExNWU4ZjA3YTZhYWZjYTFhZGFkNmQ0NzQxZjBlNTMwMzgz ODM0OGNmNTZmYmQ3ZGM2MGVkYTNkM2UzYzNjMGM3MGM3NDkzMDE0ZmU5OWNmZWI0NTMyOTlkYzll MzVkNDE1NmFkZmUxMzNkZQ0KZDVlM2RhZjhlYWQ4MTFmY2Q4YmQ2ODg3MzFkZGE4YWZhYjdiMThl NWVkZDdlMjk0Y2VjZWZmYzJlNGY0NmI2ZjMwMjBmZTNjYzZkNGI1ZmQzYzFlMGZlNWYzZjkyYjky ZjEzOGM1NGNjZDU1NmYwZTAxYjA5Y2FiNTU2NzAyMzgNCmI1YjVhNTg1MDA1NDcyYTE2YTY5MzAy MDkyZGZlZjdiODAxYjMzZGFjNzdmMWM5M2VlMTcyYzU4ZTBhYTcxNzUzYTM3YzgwMDU4MzVkOTk3 ZGYwNTg0YjhiNGJmODgxZjdmM2MxNWIzZGNlODliYjEzMDc1Y2RhNWRmYWU5N2U0DQpjNDg2ODY4 NjBmZjY2MmU3NGFmMTExZGJiMmRlMDM3MzYwN2Y3NzM3N2Y2YmE2MjY0NzI5OWJjZGZjMTBjMDI3 NTJhOWQ0NDZiMDQxZjhhZWE2YWExNDBlODc2ZjlhM2Y2ZjdmZjcyM2NjNmI2ZTZjN2M5MWZmNmQw MTgwNjE2OA0KNTc4MzRkYjIyYjAxNTRjNzFkZTdiNTQ4MzhlYzVhZTcyNjgyZWI3YzU4MTUwZTA2 NWNiZGY0ZWI5M2I4NmZiMmQ4YWUzNDYzNzU1NWQ1ZDNiOTVjY2VmNTExNGMzNzM1YzUxNWI0YzYw NDU4NjhjY2ZlYWM4ZTE4YjEwMTdjMDkNCmNjMTNiM2I3NjEwMmY4NDYyYTk1ZGEwNjk2ZjUxZTBi ODU0MjhmODA4NWQ2ZWM1MmZjNmYzNDFhYmQ4ZmFiMTAwNTg5MzlmMWNmYTlhZWNjNTE1NTY1MjU2 MWQ3NGExN2U1NjNiMWQ4Nzg2ZWQyZWQzMDY3Y2U5YzA3MDFjY2YxDQpmOTdjZDczYWE2NGUzMzY3 Y2ViYzdkNDdmNzRjMDI4NzQ3MjNlMWQ3NGE0ZmQ2ZDVkNjNlZTVmM2Y5YWVlMDg3OTEyMjMzZWQx OGQ1NzYzZjUzNTM0ODhlNDY0NjRhZTE3Njc2NzY2ZTA1MjM1ZGM1OTBiOGYxYTAxZDYzMTU3Mg0K MWZjNjk2MjQ5ODA4MTliZmRmN2Y2MzIyOTFhMDcwMzg0YzVlNDE3MGJkM2Y4N2E3NTM0OWVhZWVl ZWJlMTFjMDYxODYyYTUzMmMxNmEzZjlmM2U3OTM2ZGRiOTc4MGY5NzAyNzUzYzZiMDkxOTNhOGFm MDA1OGNlMDdiYTM5Y2ENCmNlN2Q2ZTkyN2RkYzUzYjgyNDE1YjMyOGM4M2M0ZmJiMWE2MDU4Mjc0 OWQyMTcyYzVkNzVmNWY1NTI2YTcwYmVjN2UzNzlkMDNkNjg2YTZhZmEyYjM3ZDhjYzAzNDZmOTU5 Y2NlZmYzNjJlZWZlYTNkOThiY2YzZGYzNGMwOGMwDQozZjMxMTYxNTcyMjQwYzUzNTM5ZTU0ZTU2 ODlmMmE0NWE5N2I0YTE3MTUwYWI1ZWYyODUyNzQ4Nzc2NTAwMGIzNDRiZmZmZDU4MTgxODFiZWI1 NmJkNzc2NmNkZGJhMzUzYzM0M2NlY2Q5YmM2NWFiMDdjMDFmYTM5MmI0MzkxNA0KMGFmZDA5YzA5 NjYxMDhkOGZhYzEyNmRjNzdkZjdkMmYwOTgyZTc1MjAwZjc3OWJkZGUwZDAxZDE0Zjg1NDJlMTFl MDBhN2EzN2NiOWRmNzY1ZWFlZmY2MTAwZDNlNjJmNWMwNDAwZjFmZWJlN2U4MGQ5OWUzZjJjZjhj M2MxYzANCmE1ZmQ4MzgzZThlZGVmM2ZhOGJmYmZmZjY3M2I3OTdmNWQyZTk3YmJjNzUwZTU2N2Q1 NjhlODFjYzM3NmZlMWEwODg1ODBlZDJkNWRhZjc5MDU2MTk2N2I1MDVmNWYzZmU4ZjM3YTgxMTJi M2U5NmEyZTVlYmJhMTFmMjI4ZjRjDQpkY2FmZTRjN2JhNGNkMzU4MGZlMGIyOWU5ZTllMTc5MzRl OGM0ZTNjZTEzODVhYjE3YzM5NjliMjM0Yjg4MzBlY2ZlNDU2YjFmMzBmNWNiYWY0MGY2MGE5OTkx NTAwZDBkNWQ1NTkyYzE0MzgzMzY3Y2VmYzViM2U5ZjdmMGJjMA0KNjkzYzkxYmMyM2MyNTZmOTUy MDBkNzViYmE0YTlhYWFiZWUxZjUwYWU0MTUwNDMyMGNlMzM1MzBkZTdkMjI4MDFiNmRhNmRlMmRi Mzc1OTU4MmMxZTA4NTAwMTY4YmEzYWFjYzg3ODUwMDgwYzMzOWU1ZDhhOTQ4OTY0YzI2NzMNCjlm YWU0ODE0MzMzNWFhY2FlNWJlYTE2YmNhMDYzMDRmNTUzOTJjMDE1MzA1NWQxZmY5MjdiODJmZmY5 MmUyNDZlN2YzOTMyZWIzY2VmMzAxMmUxN2IxZTA5Mjg4MmIyYTczMzk5NzI3OWNkMmQzMzM2MzYw ODIzZTM3NzEzZDc0DQpiZTZkZGIxYmEyZDFlODhkM2U0MTM4YjdlOGY3N2JjMDBiYTUzOWI2ZTUw NmE4YmI4MTdlMzdiN2I1YjU2ZTA2NzA3NDIyMTExZmQ0MzRlZDYxMDAzNzE3ZjVhNTU1MTA4NDVi ZGRkYzlmODRjNTBhOWQ5YWJhNGFkOTQ0OGNhYQ0KYWJhYWM4MzRjZGJiNmM0NmI2OGUwNThiNTBk OTliNTEyNjYzNjA5YWU2ZTQyMzJkMzgyYTMyMjk2NmI0ZDFiNDQxMDAzNzQ3YzNhMWQ3MDBkYzA0 MTYzZTU1MmE0MzJjZjA3ODNjODRkMTcwZGVmM2I5NGY3Yjc0ODA5NzJmNWYNCmZlMTgzZmU5MDY5 MTM1NzEzMzVjNjlhZTUwNWQzODE4YmNkMjJiMDgzN2M2MGM4ZDU2YWQ1YWY1MzIwMDM4OGU3M2Nk YzkyNzlmM2NkZTBhOTZiODRiNzE3ZjMwZTMzZTYxNmMzNjQzMjgxYzBhYWRjNzY4MmE0NjA2NjMw ZDA0DQo1MTZlYzA1ODEwOGYzYjAzNDU2YTgxMDAwMDk2NjU1ZDAxMTZmZjc1M2M5OGIxZTViYzlh OWE5YThkMDBiZWFmYzkxMmY5YmRkZWRiYTQ0ODc4NDMzMjY2NTI0MGY0YmIxZTI1ZjI3ODNjMTQx MGZkYWMzMmJjMjg1MjI4MTYxMA0KMDAwMDI2MDYwZjAwMjIyMDU3NGQ0NjQzMDEwMDAwMDAwMDAw MDEwMDAwMDAwMDAwMDAwMDA2MDAwMDAwMDAyMDAwMDA3NDdkMDAwMDc0YmQwMDAwMThhMGE2YTYy NmYyMGFjMjRkM2U5ZmVmZGVkYWRhZGFiNTFkMWRlZGE0NDgNCjExNTJlNTI4ZjlmZDNlOTIyMjIx ZWFlY2VjMjQ1MTE0NmYwYTA2ODNjNzgzYjE4OGJkYTVmZjNiMDA4ZWVmZTllOTc5MzY2Njk5MjQ0 N2MyYWU5NjUzOWFiMjMyODMyZjA4Nzc4MDJmYzkyNjYyYjQ3Y2Y5ZjJiNzQ2NWEyYzViDQpiNmVj NDEzZWMwYWU1MGQ1MjRiMDU5MzEwNmUxNTA5MDBhYjViNTZmZTVhYmFiZmY5YWNkNjZmZjZhNmEw YTJkNWQ3MjgwZWI1ZTJjZWIxZWFjYWVhZTNlMWRjMGQ1MDBkMGQ2ZDZmNjYzMWVhOTUwNWMzOWRk MTM4ZDQ2ODdjMQ0KMDZjZDk3Y2Q2NjVmYThhZGE5NzFmOWY5MzJiMGE0YjRhMzM0NTVmZDAwYzA3 OTVjZDAxMGFmYmVmYWVhODc3OTliZjMyY2NiZmEwNzAwZGY0OTFmZjljODk1MTgyZGI5ZTAwN2Yw NzU5ZTdmYWI3M2VmY2VkYzQyYTFmMDBjMTgNCjA1NTgzYTZmZGViY2M3YzFjYzkyYzc4MDkxYmEw YjIzZTEyMDgxMDUxNjllMTY4OTQ0YmUwMGUwMDQ1ZTUyZTI0MDAwMTdlNWFiYWIzNzAwMzg1YzU1 NjQwYTA2NDQwYTA2ODM5YjkyODljNDY2MzA4YWIzYjdhYzc5MDI4MDJlDQo0NTUxMWVjMmY2NzVj MGRhOGI0YTRkMDA3YzgwNTdhYzU4MzEzYWMwZGQ1M2E2M2NjNDQ5YjQ2Yjc0Nzc1MzRmYzY2MGVh ZDRhOTM3MzczNTM1M2RjNDBmZmRiYWFlNWZhZTJiMTIyZDVjYjNjNjQwZmIwMDAwMjAwMDQ5NDQ0 MQ0KNTQzMDdmMjI1M2U1ZTE1ZWFmZDdjZGJkNTllMGYzNzljOTMwMGMzYWZlZjhlMzdmZWQzNjg4 M2IwZTgxMDk0NTJhMTg1Zjc2YzM3ZmUyOWM2ZjA3NjU0OTIyMDA1ZmFhNjRhNTBmMDA1NjVhZTkx MzAwNDIyNjFiODBjZjAxZjgNCjRlNGY0ZmNmNmIwMGMwZjU1NmJiYzg2ZGU3ZmFiNzAzMTgzNWNj ZjhjMTQ5ZGVmOWU3OWZmZjI4NDZkOWNmOGU0MjhjYzIwMDlhMzgzNTM4MTNjMDQ3NTgyOTg3OTFj Yzg5MGZiMzI2NzQxMzFmNjAzNzUzZTRhYTZjMjI0NjRiDQo5NjJjNzk2N2E0ODUyYTQ3ZWU0YmIz OGM3M2Q3ZWEzMjQzOTJmNjk4MTcyOWMyNGIzNjdjODVhYjJjNzc4MjBkZTYyNzhiZGEyY2Q1NjQ4 OTM0NTUxZDAyYjAzYTFlOGZhZjAxMTcxYTdjM2VkZmZmMDA1OGRkZGNkY2ZjMDMwMA0KNmY3YTNk OWVmYjc5M2YzZGIyMmNiZjAzZTA5MGI2ZDY1NjMyNTQ5OWRhNWE1Yjg5YjM4MzYzYmJiYmJiMWYw MDJiYzhiNjlkMDNkY2IyYWMzYmMwMjY1MTllNDc0NjIwMWE4ZGJlMDYxNjY4MjdmMjQ5YTU4MmM1 NWZiYjA1NTANCjdjZTA4NjA2Y2UyNjlhMDBkNGYyYjZjYjAwZTQ5NzJkNWIzNjFjOGZjNzdmZTdm MTc4NjhmMWUyYzViZDI4YmZjN2MzNjRkMDgwYzk2NzVkNjZiOTdjZTM0YWNkNTc2NTEzMzEzYWY0 ZDA0M2Q3OGZiNDUwYTI5MWZiZjkwMDFmDQpjZjRmNzUxODg2YjEzMzAzNWNjMGM0OTEwNDI5YzM2 MGU5YTcwYjE2MmM3ODE3YWM1OGRhODgzZTc3ZThhMTg3OWUwNjE2NmVmMzIwYjdjMjM0MTVkZDdi NzgzODFjMWUwNjUwYTEyOTEyNDVjMmUxN2I4YjllNzU3MDM0MWM3Mg0KYTMzODVhYzE0ODU5M2Ux NDBjMTI4MDQ2MjcxNmZiMDNjMDU4MGI2ZmRmMDYwMGYxNzhlY2M2NDJhMWY2NzcwMDA0NjVkNDFk N2E2NDQ1NDVjNWFkMDA2MGRiZjZjYjYwZDkwZTJhNDYwMzE3ODI5Y2Q3NGQwN2QwNjllODNhODEN CjY1MjFiNDc4ZDkyMDFmNTFkNGU3NzgzNjkzNzk5ZmJmY2I5OWQ4Yzk5OGU1OTY5Njk2YjVkMTY4 ZjQzNmIwMDliYTg2ZmY3ZjU0N2Q1ZDVkMzljZGE2YTk4NDQ0N2Y5NWFkZTAwM2RlMWU2OWExY2E5 MWZmZTEzY2Q4OTU1YzliDQpmOGNjMWMwM2JmZGZmYjY1YjA1OWJkOTJmZjViMGRlMGUzMDY4YmUz MWQ0ZjhjNzdiMTMyMjBmYTVlYzdlOGNjY2MxNTZhNmIwOGMwNTU3NTg1YzI2MDM2OTMyNjU1OGU1 MjY1NDU4NWJiMGE1M2E3OWU3Y2YyZmYwMzEwZTQzMQ0KNjEwN2E0NTNhOWM3OTYxYzcwMDAwMTAw YWY3Yjc5OWVhZWNhMTQ2MTk0MDEwMDFhMzNlY2ZjNzE1NTk1OTU0ZjYzYjRmNjQ1MmRmZmRmOTU5 ZTAzMTgyZDM4NWEwZTg3NjViM2Q5MWI3OGJiZTI4OWRiYzU0OWJmMDU2MDE2MTcNCmZlNGMwMDZi ODIwMTkxZGFkYWRhMWUwMTMwNmJkOWIyNjVjZjgzYTk0NjE3MDQwMjgxMmQxNWQ5MmM2MWM3NjEz ODIzOTgzMTYzYzYyYjA5ZGJhMDk4YTE4ZGY5YzdmZGRiYTVjOTdjNGQ5YzBkYjkwMzdjNDMzNjEx YTM4NTBiDQoxNzhlOTI2ODRkOTY3ZTVlMjI2NDU1NzAxN2Q4MTgwNDQ1ZjE1MzY5YzdhMmI4YTU1 M2NhYjEyODY5OWI2NDY5OGExYjJhYjJhMzU0YzY3MDI4MThhMDgwZGY3NzFmODA4YmZkM2UxZjY1 MzI5OWJiMzhkOWZlYjNhNjY5OGYyNA0KMTkxNWI5NTI5NWEzZDRkNGQ0ZjgyNmU3NzFmMmUyYzU4 YjFmNmY2MzI5MzE1NTdjZTI1OWIyMmM1ZmNmMmQ1NjU3ODA5OTM0MGQzMGU5N2MwZDgwZTViOTVj ZWUxMTRjM2M4OGUzMjEwOWMwNzdlNDkxNDdiYzAxNDY0OTRhNDMNCjYwYTZmMGZjYWMwNmIwZDU1 ZDBiZTAwYzlkMzkyNDdlZTRmNzc5Yzk1MDY1ZWFlOWU5NTkwZjI2MjA0ZTJkMTQwYWFmZDYxNTZh ZGQ4OWIxNDM5YzdhZWFjOTRmODMwNWVmNTc4MjRkYTAwNDgwNWFjYmIyOWVjMGQ4MjI3MWMwDQph OGM2MzM2NjgwOGYzOWU2OThiMjJiZDgwZDU3NDlmMzM0OTUzMTY2MzFiZmRmZjcwNTRkNTVmZjA4 ZTA2MzUzYTY0Yzc5YTBhZGFkNmQzZDE4OWZiOTE4YzA2NzI2ZDFmNzNjNTgzMGZkYjExODE1NzQ4 ZWY1NzliZDE0MGQ4Nw0KNDg5NWEyZDRkZWRlZmVhZDMzY2UzODYzNTg1NzI0NzdlMjljOGJkMWIw ZDg0NjMwMWJmOWM1MDAxNmYwMDllMGRhYWI5M2EyZGY0N2IyMmM1ZjBmNDYxMjZiNTJhOWU0NzA2 OTA3M2EzYjNhZGM1NWU3NGZhNTUyZGI5OTJlYzMNCmExNjAzZjQ2NTU5ZjQ2OGNiMjJkODBmOWM2 MWIwMGI0OGE4YzVjYWYwNGUwYTlhZGFkN2Q4Y2FmYWVlYjkzYzllNGFmNWE5YTliNjllOTkyMjUx YmE0NDg4ODZjZDMxODA2NTBhNWFiOGFlYjM3ZGY1MzllMzcxN2RkZGM4OGUzDQowZWYwMzdmOTU4 NWUzNWQyYTJiZWJlZWUyMTdlZjIxYzdlNGFlMTFmNmY0YzBlNmY2NTY1ZTU3NTZkNmQ2ZGJmMDI4 MDAzMGUzODYwMjgxYTBlNTE1ZDVkZGRhOTAwNGU1ZWI0NjhlMTQ0ODY4ZTFkYzE4M2VkM2QyNTM5 YzdiNg0KZGMyMjYwNTMwMTdjNzRmNmVjNTk3NzgyZGJjM2JiM2EzYjI5OWJjZDNlYzJkYjFlMmNj YmYyNzcwMTFjY2EyN2MyZmUwMDJhYjhhMGQ4ZTJiZTEzZmZmZjA0ZjBlYTdhYjY2NTBkODA5M2Nl MTUyYjU2N2MxZjAwNjQ1OWJlMWMNCmFjYWUwN2MwYzI1NmJmYzBmZjRlMDI1MDJjMjYzMGNlMDU5 MGIwNmQ5YjQyYTFkMGFkMDBiNGQ5MzM2NzNlZWE5ODNhYzUyZDgzNWE1YjlhNWRlYWI3M2M2Njli MjQ4YWUyZjcwMWI0MDYwMjgxYmI1NWI2ZDIyNzIzNDAzNWQ1DQpkNGQ0N2MyMzFhMGRkZjg4ZDE4 MjcxZTUzMDhmOGY5NWNiZTdiZmJhOWQyNWViZTA4MzBmN2UzNDliODhkMWM3Y2UzOGUzN2Q3ZWNh Y2IwNThhZDIwZDMyY2UwZTA1YzQzZjgyZjFhNjc2MzAxMmU2MDc3MGEzYzEzYWJlYTdmMQ0KNTEw MDM3NDUyMzExYWFhY2FjN2MwYTJjNjlkYTBiNjA0YTRkNGRjZDQzYmM3ZjczMDE4OGU5NTQ5MjRj MjYwYjc0MDE0MDNhOWRmZThkMjY0YjI0OGFlMjY1MDBkMGRjZGNmYzViYjA0YzgxODQyMjRiN2Rm Y2Y3NGYwNzFmNmMNCjU1NTE1ZTAwZGZkMDgzYWI1ZDExMDA2MjI0MTIxOTAyMTA2ODZhNmFmYTM2 OThmYTY0Yzc2YzliYzA0ODY4YTBiM2IzZjMzMTZlOGVmY2Y2NDlhYjU3MGYwM2I4MjYzMjJhZDQw MTQwNTUyMDIwMGU3OGJkZGU1NzAxMmM5NTI0DQplOWY5N2MzZTdmZTMwZWRlN2JiOTE0MDk5MzI2 NGI2NGE4MzJlOThhNDQ4ZDBkZjVjMzI4NGZlMjBmZTMwMzBjMDBlOGVhZWM3YzlhMDc0ZThlNzEx NDVkOWU4OWRiMzQ3ZGRhYjQxMTZmNTJhNDdjOTY1YjBmZGJlNzJmNDgxOA0KYjU3ZDg2OTNjOWU0 ZWRkOGY1ZjA5NDg5YjAwYTRjOTAxMzAwNGNhZmE4YzhmY2M0MTViMjM4MWEwM2EyOWZlYWViZWI1 ZjA1ZDA5YzRhYzQ2OWNkOWEzNWVlNzVhNWJkYWRlZDBkZDdmOTFkMGE4NWNlZTJiZjg3NzQzYTRk NjANCmQ2MmYzNTFhMDkwZjgzNTE5MDUzNTM4OTg0OWI4YmY1NDk3MDliNDAzYzFlZmYzNTk4NjAw OWIwMDliZDBjODA5YzRlYTdkZmY3Zjk3YzU3ZjE3YjhmNTU2NWM5MmQ3MTc0MGQ5NzZhOGI1NzY5 OWRhMWE5YjQ3OGYxZTJjZDAwDQpiYWE1Njg5NDMwODE3ZDlhNGJmNjVmMDM1YjNjM2E4MGEzMzJl OTM0MzUzNTM1YmQ1Y2E2ZjkxOWI5NWM2ZWU0OWJkNDU0NTdiOTgxMDZjNWY1NDNmMWIxODQ2ZGI4 NzE0ODAwMDBjYjMyN2JjMTkzOTU0YjkwOTlhODczN2IxOA0KYWJjMDY2NjIzZGI2YTcyNmYzYzEz ZTZlNzA2YTc3Nzc3MTU2ODEzYmNiYTcyNDkzNDlkN2Y5ZWQwMGU4OTAyNGU5ZjcwMDkwY2ZlNzdm MDQ1ZTJjZDVlYmY1ZmUwY2NjNjg1MjIzOGUwYTk2ZDM0NDlmZWYwZGIwMGY1Y2M1NmQNCmJkMDcw MGYwZDhiNmZkNTc0MTEwNmUwNzUzNTdjZWY2NzgzYzc3ODNlOWEwMDY4MDhmZGI5NjM1NWNhMjk3 YmE1ODI2NDlkMjEwZDhmNzNiODllZmY2NTYwZTA1ZWU2MDI5MzU4MTllMjI5NThiZDQwMDJlMGQw NjgzYWVhNzRhDQo1MGE0ODgxYmRmYmRhMGI4ZDE1MjViNTdkZDZkNjcwYzAwMzhlOGEwODMzNjQ2 YTNkMWViYjE2M2U4ZWRlZGVkNTc4MzA5MjAzYmE1ZWY0ZDAyYWJjMGFjNTUzMjc4ZTZmYmZlNzNl NzEyODBjNmI4ZTMzYzA0YTZkNjU5MDBhZQ0KNDgzODBlODU4MjQxZWFlODY4ZmIwOWQ4YzA3YjAw NWNjOTRkOWJmMzAwNzhmZDhjM2YxYjAwMGU4OWM3ZTMyZmYwNjc3YzcyZDZhYzU5MmYwMTAwMjc3 NTA1MDA5ZTQyYTFmMDc4MzI5OWZjMzU4MGUzZTI4ZTQzNGEzNDQyODINCjIwN2MwZTQwN2I2ZDRk ZmUzZDU1OGFiYTc1NGFhYTZiNmI2YmRmYThjOWU3MDk0YzgyNGZhYWFhZmE0ZjMwY2ZkNzE4ODQ0 MmExNWIzOWViNmJlMGFhNWYzOWVmZDZjNzc4ZmFjYTU1YmNkZjZlNjQ0NjUzMzRiMmZkMDBkN2Q1 DQpkNWJkODhkMTZhMDZlOWEyMDIzNzYzMTY2MTVjOTNhM2VlYzhiYmQ1ZTYyZTljMzI2NTRhYjk5 MDFkMGY4MDU1Y2RkYzY0NTk1ZDU1YjU0ZTU3NjQwYTg3ODJkNGRlZGVmNjdlOTlmNmJiODMzNWIz NjZjZTc0MDdjODlkZDFkNQ0KMTIxYmI0MzVhMmU4YTc0ODM4MzQwOGUwNDI2ZTNiNGY4NTk4MTRk YzcyZDI0OTI3ZGQwNWJlMTEwNjk4NjA4NTQyYTFiMDAxY2MyNWVhZjA1NWQ5MGE2MDhlYTIyODVi YzEyNmQxOTFhYWEyMTA1ODkxOTZjZjViOWFlMjdlOTMNCjFmYjZiNGI0ZmNjMzUwNjUwYTg4MjIx OTg2ZjExYThmMWYzZmFlYThhZjU5Y2JiMmJlMjUwODAyYWIzZWNiOGFhYjk2MjJlZTY2MmE1NjU0 NTRmNGExNGM5YzU3NjM0M2MzYWI3MTRiMWY0OWM1NTFhNTI4NjUzMzk5NjdlYWVhDQplYTllZWVl YWVhN2FhM2I0YmRjNWU0MDU5NzFjY2Y3MjRjZGRhNTVhNjNmZGU0OGU2ZDExOGYyMzc2YzlmMjMy YWU0MDk3M2FkNDhmZDExNDg5NDJhMWQwZWRlMDE5N2I4YjE3MmYyMjAwNzNmODQ3ZGU5M2FiZjhl M2I2YTE1MQ0KMmMxNjFiZjY3OWJkYTRhYWVhZDY0MzU3YWM1ODA3NjAzYTk3OTY3ZmM5NTVhOWQz MzQ0ZGZiMWRjNjQ2NmNhODk2NjVkZGE0Yzk1MWVhZTllOTc5MWVjMDhjOGU4ZThlNzVhZDJkMmRl YjAxZjQ5OGE2NDFjMTYwZjAxNzAwNjYNCjQ2MjI5MTU3OWM1ODZjMGI4MGRiYTUwOGFiYzdjMWNk OTEwZjA1ODNjMWVmMDcwM2EyYmIyYTRlMDU5MDc3NzM5MDA1NDFiODBkODBjMGY3NWNiYTBjNGM1 Zjk1MDE5Y2MzZWQwODJkMjg0MTFkYjM0NjVkYjA3MmU1Y2FjZDE4DQo0ZGYwMWJjMWVhZDVhYjVk NzYzMDFkYzBkOTNkM2QzMzQ4OTNhMzZlMzhlY2U5MjVjZDQzOWNlYWI4NTE5NDI3YTUxZDhiY2E1 NDEyMDQ3MmQ5Y2M1MDM2MTFhMzQwMjBmMDI1N2UyYWNkNjc1YmE5ZjBkNGM2Nzk0YzA0YzAxYw0K MWVhMTc4MTE4MDc5N2M1NWVjY2FhZTllNjUzMTdmZGViYzVmYWJhYTdhMzMxODI5MTMwMGQ0MWI4 NmIxMDVjMGM5Y2RjZGNkNzdkYjA2NGIxN2YxZjk3Yzc3MDNhOGU0YmM2YjA2OTg2ZTZlMDA4ODhi N2UxZmM1NGM4MzAyYTINCjQ4N2U5ZjhmNTQyOTRhN2U5ZjhmYmM1ZTJmMjk1Mjg0N2MzZWRmMTA4 MDVmMDFmODA2ZDgwNGI5ODFhZmZhM2JmODI0NWFiOTZjZDliMjViMzQ0NTIyYmZjZjQ3NzIyNDRj ODVkYWRhMjcwMTljY2UxN2MwNDFiY2JiY2I5Mzg5DQpjNDYwNzc3N2Y3N2EzMGRkZjk4ZTAzMGYz Y2IwYjdjYzZiN2RiNWJhYmE5YWMwZDI4MzJlMjg3M2JkMWNhYWY5NGFjZDk2OWM5ZmNkNDliZTA4 MDBhMjI4NWU5NDRkYzRjOGVmZjc1ZmJiZGQyZjAwMzgzYjEzYjcyOTk1NGM4Yw0KYjg5OWI4Nzdl NDljOTI3NjM2MGZhNzE1MDE5Y2NlMDNiY2Y2M2ZlYWE4YTM1Y2QyYjBkMzBlZWVmMWMwYjdjMWY5 MjgxODg5Y2U4MTBkNzIzMzlmNDhkZjRkZjNlZDY5ODNjMWUwYjY4Njg2ODYyZjgyMTk0MTVjZGU1 N2VmZjMNCmY5NDhkN2Y1ZDJkOWVjZWFkYzM2YzYyZmVkNzRiMTY1NTk0ZjAyOThjNjI3ZjlmNTYw YjZlOTdiMjNlMWYwMDA4MDhjMjJjYmRiNzJkOWVjZWIxZThmODc0Y2QzNzQzNzIyZjEwMTM4M2E5 NTRjOTBhOTI5NmUxZGFiNTI1Y2NhDQo1N2ZjZDc1MGIyMjI2NTU5NWUwMmI2YTdkNDY0ZjFhOTFl YjYyZDIwMDA2MGNlZWM1OWM0NzVlMGIyMTM2NzQ2OGM2NzBkODBiYmQ2MTYyZDVhNDQyOGE5ZTUw Y2MwYzNlZGIxM2ZhY2NkNTdiYjgzMWEwMDkzNmFlNzYyMGY4Ng0KYzU3MGIzZTQ4OGVkOTU2NzVh NTRmYjdjYmUwNzIzYTEyMDU5YmFlYWFhMDRkZjE0NDU3MTBiODAzYWIwMDE3NDAzMGE1NjcxN2Jm MWNlMjIyYWIyNDlkYzBkZTYzOGI4MmY5ZDRhMTIyZmIzMzRhZGE5YjFmMTU5YjBjMTExMDANCjM4 ODk0NDYyMDM0NjkzYjU1ZGNiZGEzMTI1OTExNjAwODA0NDNjZmUxMzAwMTc4NjQzYTE3ZTk0MjRh OWE5NTI5NGEyZTExMDg1NDJhMWVmODMxOTc3MjY0NDdkYTFmMDNhNDZiNzQ0YzhiMTIyMzg5YTZi ZThkOTBlMDE3N2U3DQoxMzhjM2EwZTRlZTY2NTk0NGEyM2Y5OWE4ZjM4ZTJmMDIxNmU2NWRhNWIw NTNlNjVmZTgxNWMzZmFlMjQ4YWUyZTVlOTc0ZWEwM2NlNzczZTU1OTljYjBkZDhiNjdkOGJjZmVi YTU3NDNhZmQ5NzU4MmNmNjUzZGUzNjA2ZTY1Nw0KM2U3NDI3YmQ2MjIzZThlOGU4Nzg5MWViZDBh ZTkzZTBlNGM2ODYwNjAyMGI0Y2I4YjRhNGI5MjI0OWQyNTYwMDVkOTU5NTE1MTcxYTg2ZDYwYmUw YzdkY2NiNTQzY2MwMjdhOGFjODhjYWIzNjUyODBiNmNkYmJlMGNjMGQxZjUNCmY1NzVlZjQ0YzMy MThhYzdlYzRkMDAzZTgyZjJhNTFjMTRlZWIzYWZlM2M3YTdhNWY5ZjZiNTE4MmZkY2I4YjNhMzgz YjI4OTE4YjViNmI2YmE3YTU1MjJjODY2NzJlM2M0OWY2MzBjNTZmOGZkZmU5ZGFkNTc1MTBlZDNj MmEzDQo1ZTIyODQ5OTcxZTU3NDRlMzJjZjExMDRlMTNjNWUxMmU5ZDMwMGRhYTc0ZTlkYmE4NWYz NGUzNzJiZGUwOTg4N2VjYTU1NTRlY2FhODVlZDBlNzBlYWI1ZTQ4MDAzYjYyZTVkYmE5NDU2YWQ1 YWU1YzY1Njk3OTMzMzBlNWZiOA0KNjA4MTZiZmJlZTg5M2JiMTIxNGVkZDEyNjAxNGVlMjNiYzdm Nzc4NzQyYTExNzMwZDZjNjBkMzBmMmRlMGUxNmQ2NzQ2YTNlNWZjZDFjM2EzMTkzOTRmMjE5OWVj NzczNGEwYWRlNDdjYTI2NjIzNDY3ZTZjYzJkZTNiZTkxYWUNCmViOTdhNGUzYjZiYjM5ODYxZjAw ZjJmOTZhYzJjNDliNmNiOGYwMDA5ODYzMThjNjJmNzgxNTk4ZGRhZDg0ZmE1OTAwYWUzMTIwMGRl MGNjNTAzMDQ4YzE2MGYwZjcwMGJjZTE3MGY4ZGVhMjJjZmVlNTAwODI4YTE0YTE1MDI4DQo1NDZj YTIzYjk1MDcxYmVjMmM3YzRlMmM0NjU1OTU5NTZlZjQ4OGQ2ZGFkMmYyZmUzMTQ3MWY0ZDdjNTU5 NmRiYThhMzZlNjY0ZjhmM2JjMGNiMDAyYzUxYTUyODc1YjRiNzUzN2I1YjJiMDUwMjAxNTJhNTI4 ZDliYTRhN2NkZg0KYzU2MjU2MTY5NzIyNjFiMjBkOGRkYzBhYjQwZGY1NzU5NDRhMjZmZTNlNzdl ZWRjM2Y2MDdiMWYzMDI0NDlmYTY5NTU1NWQ1NTdmODYxY2M1MDY1NGFiMTdkOTAyN2U0ZTE0ZGE2 YTY5MDZkYTgyMzc0M2M5N2NiNWRjMzczNzYNCmNhYTU1ZmNjMDEyMzU5MTc1OWE2ZjlhY2M1ZDMy NjJjYjY3ZmVmYWU1NjgxOWIwZWUwMzI4YmU1NDkxZDA4MDAyZGNjNzhiZmEyYThjODY4MzdiN2Y3 NGUwN2YwNDkzOTFhYTE3MDM4YjQyMTFjMGM5MDIwMDg2ZWVkNDZkZmRjDQpiOTczNWZiMDc2NmU4 MDQ1MDA0N2E2NTJhOWQ3MzllNTZhMDE4MDQ1OGIxNmZkYzVkNDU0MmFiM2Y1MGQwMGQ0YWQ1OGIx ZTJjZjlhYTZiZDc1ZDQ1MTQ3YjkwM2JjMjIxNDBjYjhlNGYyM2JiYTIyOTFkN2ViYmQyOTk1NGFi ZA0KNTc1MTkxN2QxMzI1NGU5Y2M2YzY4NjA3MmM1ZGE1Y2U4ZThlYWQwMDFlYzQzOGU5OWY0NWIw NGIwYWIxYWY0ZWM1MmNiNzllZjdjNGRlYWFjYTVjMDU2NWUyMzFkMjc1ZGRiNWNiYTZmODg3OWQ1 ZGRhMzZjYzA1MWRkYjYwMDkNCjVkZjVjY2U3OTkwNDcwMmM1ZjU5OTM3NjcyNzM5YzE4MDkwNWM5 ZTcxM2FlZjMwOWMyYTczMWQ2NWM3NzM5Yjg0YjUyOTJhNDZiMzU1OTIyZDMzNDlmMDBiNzQ3ODM0 NTg0OGMyOTVhNTI1NTU1ZjU2YTUzNjNlMzY0MDczODFiDQo4ZDg0YzllYmY1N2VkZmVmZjdmZjE3 MGZiNDczNzFiMjJhNDdjOWU3ZjM1ZDU5NzI0ZjM1NzcxYjVlMDE0NjcyOGJkNTk4Y2Y3MTBkZTNh YjE1ZDk4Y2JiN2JlYTExMjhiMzUwMTQ0NTM5MDVjMDEyNDU1MWFlMDk4ODdlMGEwNg0KMDI0MzYw ZGFjYmIxMjhiZjgxZjQ0NzM5YjlmNzAwNDA0MzdkZmQzYmQ5NDQ4YzNhM2EzYTllOWFjYzhiOWU5 NTc2MmM1NzNhMTYwMTQwNTVlNGJmMDUwMjgxYWY5NTM2YWNhOWE5Yjk5NWU3MzM5ZDBjZTAzNDU2 ZGYyMzRlMDANCjIyN2NiNmVmOGNjOGVmMzU5OTQwNzQ1NjViNWJkYjQ3NzhlN2QzMDAwZTMxMGNl MzNiM2MyYzY3MDk4MGZkYjlkMWUxZWJiMjJjZGYxNzBhMDZhOGFhYjI3MjFiMDA1NDU0NTQ5YzBj MjA2OWIxMzI4N2QzMDFhYzk0OTlhYTM3DQo5OWEyZTNlN2U0YWJhYmI3YzZlM2YxZWY2MmVjMGFh Yjk3MjI2MTkyNjVmOTFmNjBmZWVjMmM5ODIzYmVhYWIyYjI3MjE4Y2MzMDE0MDc2MzQ5MTkwMDM4 ZjZkODYzN2ZhOTI4Y2E5ZDMxNDNhM2Y2ZjZiNjI3YzEwNjY5YjJkYQ0KNDUxOGMwYzlkMTY4YjQ4 ZmFiYTlkYjdkYzM2YzI2YjMxMWEzYmJiYjI4OWEyY2I5N2I1ODRkNmEwM2FkYjgyNjRiNmU2OTVl MzdjZTY4MTY1ZjI1YTUxYjZmZTRiOWQwZDNlZWYzZjkyZWFkYWZhZjdmMWE0YzVmMmRmMGY2OTMN CjI5MjlkNDAzYTZiN2RkNmExYjJhNDVhM2QxM2YwM2Y4M2Q4MDMzNGRjMzc4MTFjMDdjNTU4ZThl NmMxMzZmNmFhYzhjYWVhYjUyZDg4NjQ2ZGNmMGYyNDkyNTFhYTE2YzM2ZmJhYzE0OGRhZTc3NmM4 YjJjY2I3YTMyNjExYjI0DQpjYmYyZjM5NjY1M2Q1OWZjNGZkM2I0ZTcxNDU5N2UzMTEyODliYzFh ODk0NDVlYjU3NDk1MGM1NTc2YzM2MmFlZWZlYWVhN2FjYmViZjU3ZTViMTRjNWJiYTJlMTEwNzEy YmRkOTg3ZmZjYjlkN2Q1ZDZlNDA5YzBlNTUyMjQ0Yw0KOTU5NTk1YjcwMmI4ZDJkNjU1NGEzOTk2 NGJkNmM3YWIzMTVkNTk1YjUzMzM1ZTYyNWE4YTQ3OGU5NDA2ZTliNzczMzlhMDgyMWYxZjlkYjA0 ZGQ3OGZiMDVkOGM3NmQ5YjRjNmU2ZTZhNmE3MzdiZWYzNTY0MzJhNTdmZGQ0ZWYNCjdlZjdiYjc2 MDBkMDE0ODlkZWRiYjhmOTVjOGMzYWMwMDEwMGY1ZjVmNWJmN2RmN2RkNzdkN2FlNWJiN2VlMTgw MGFlOWYzNTA4YjZmYTc3NTQ1ZWVmNjhhZjIwN2NkN2IyZWRjNzg4Njg0ODEwODQ4MTZkMWY2Yzll ZDVkYmRmDQo4ZmJlZmUwMTQ0NDI0MWY0MGQwYzIwZTBmN2UzODNhZGRiY2UwMmIwMTY0MDJmODAw MTMwMzc5YTA4YjY3MmEyMzUzNTM1NTMzNzZkZGMyOGFhOWFiNmVkZjllNzlmZmYyZDgwNjg3NTc1 NzVkN2RmZmZmZWY3ODcwMGFjMDdkMA0KNWZlNmY5MGFkOGNhNzI3ZjA3MDBhMjg1NDJhMTBlMDA3 YTdiN2JjMzgyMjAwY2ZkZTMxZmZmZjgwNjgwZTdmOGZiYjg4MTBkM2E4MDQyNDU0NWM1OTk1ZWFm YjdlZGI1NTc1ZmI1YWEyYTczZDhmNGZlYmJkOGQ2ZGI4ZjY0M2ENCjhkYTc5Zjc5ZjZhODQwMjBm MGI5YmViZWJlZWJjMGFhZjcxNGMzZGJkODUwM2ZiOGU5ZmRmN2YwZGEzZmRmM2MwYmNjZjA1MTlh M2MyMDAwMjg4ZDRhYjliZGE5YjFmMWIwYmYzZWZkYjQwNzAwZjJmOWZjOWZmYTNlZDhkODMyDQpl OGYxNWRiMzc2ZWRkYWYzMzE0OTRjYjVmOThjYzY2ODFhZTIxMjhiODU5Zjk0NDYyM2I0NGI5MTEw NzFhM2M0NzY2ZWM0NTliMzY2M2U4OWVkOGI3YTAyMDA1MmM5MjQ4MWQ5NjM2NzgzMTljY2JkNjA4 YWJiMDRhNmRmMzU4Mg0KMTkxYjVjZGU3NzAyMDBhZmEyMjg5ZmMxYThhZTdlMjQ5OGIwZDdjMGNm ZDU4MDM5MDEzYzAwYWU4ZjQ0MjJlN2M4YjI3YzMxMTg4ZjZjNGNhNzUyZmQ2MDU2YWNkM2MxM2M1 MWRkZjlhYTJhNzc2MjFlMDM0NmI1MTYwNzAzODENCjVmMDFkMGY3ZGY3ZmZmM2UzMGFmZDY2NzQz YTFkMGQ3MDBlNGI5N2VkYzAyYTY1ZDJjZTdmZDNkNDcxMDg0NmJjMDQ4ZWFiN2MwNTY1ODNjMTgw Y2JlODJmMmZiMzgyNmE0Njg4NGY2OWYzYjk3NzQ0NWEyZTZlNmE2NWU5NGI4DQpmOGNhMjAxMzYw YWNjYTM1YWFmNDk4OWFlMjBhNzM2NTM3YzYxZTM3MzEzOTFlYjNiN2ZhMDU4NGZhODYzZGQ3YWQ1 ZmJmZmU2YzAwNDIyNDFjMWFkYWIyNzVkYjY5MDBmZTVmNDlmM2I5MDA1ZTAxZjA4ZjkyZjNmYjli OWE3Mg0KN2ZmZmMwMDAzNjdkYjBkNTA2ZjA3NmYxYzVkYTlhM2M2ZGRjYjRmOWU5OWE3Y2JlZjZm MTI3OWViOGQzZTNmMTA0ODI3ZWVmYzE1YmZiMDY2ZTEyYmRjMjA5MzM2N2NmODFhYWFhYjhmN2E3 ZjdlMGRkOGQ5YmJlMjQ0NWMyMWYNCmRiYmM2NWViZDc5ZDU4ZWM2NGNiYjJkNmZmZjVlOWE3NmYw Yzg3ODI5NzJjNThiMDEwMWU4ZjA3ZWZiY2YzMzZmYzdlMTFlYmQ2YmQ4OWY2ZjYwZWRjZmZjYjlm ODM4OGUwZjE3ODEwNGZhNmYwY2EyYjJmMzNhYWQwM2YwMDIyDQoxYWI5ZDZkYmQ3OGY3ODMyODVi NTZmYmMwZWJmY2YzN2YyNjUwNjA3ODcxMDEwZmQxODE4MWM4MmNmMmI2MDY4NzgxODQzNDNjMzEw ZmQ3ZWY0ZjVmNzQzZjRmYmQwZGIzNzAwMDJjMWViMTUzMDNjNGMxODFhMWE4NmNmMmJhMA0KN2Y3 MDEwMWU3OGUwZjU3YWQxZGJkNzE3MDZiMDBkZTVlMTAxYjBhMmJhMzI3N2M3YTZmN2RmMTNhYTZi ZWJkZWU4ZWZlZmY3M2ZmMWU0OTNhNTNiYjAyMDEyODk1YzE1MGEwNjJlNzg2N2MzYmI3ZTAwODM4 ZDhkOGQ3ZmQ4YjQNCmUxYWRhZWNlNjkzM2RlYmFmM2NlM2JjYjZlOTEzMDUxZTZmOTBhYzdkNDdl ZGNkNzNmODBmNzM2N2Q5MDAyNGIyNTNkM2ExMDA4N2NhYmFmYWY0ZjlkYTBjMzAwMTBmMmY5N2Nl NzI5ZDFmMGE1OGFhYTIxMTQ4OTBlOGFhMmY4DQpjYzUzNGYzZDU1NWEzYjIyMDk2NjkyZGIwODFl MDgwN2UwM2Q4Y2I1YzRjOGZjNzgyYjgwYjdjMDBjMDc5YmMwYzg5OTBlNDZjMjM2NjI3MmQ4ZTZm ZWY2ZDJhNTRiMWI3ZWZhZDM5ZjNlMzM2ZmRlYmNhYWZiZWZiZmZmMjUwMA0KNDM5ODk4YTVmNGYx M2U4Yzg3NGQ2MDZjNjAxMzdmNGUzOTQ3YzM0NDg4MmU1ZWJjZjg2NzhmM2ZmYWM4NGM1ZjIwNzhk M2JhNzVlYjRiNGIzYmE1YzNhMWUwNmI1YmI3ZjUxZTAxZTA3NjAwNzM0YzRkNzkwMDAwZGU3OTZm NjMNCjEzODBmMTBhODk4ZjBiNGYzYTk5MjAxZTEwZWY2NjkwN2I3OGU0YzQ3ODg2OGY1OTAwM2U1 ZTliYWZlZTRkZDg4NjRiM2FlYTAxNTg1YzZkOWFiZGIzOWRmOGRmMDZlZTYwZDkyZWQxNWQxMDg0 Y2IwYjg1OWE3NWUwOGIzMjk1DQo0YWZkMjQxM2I3YTlhYWIyZjJjOWRkNzlkZWUxOGVhOWJiOTE4 ZDZlMWFjNjM0YjdiMjZiNjllMzE1Y2IwZmE2NGNkYzI2ZGJkMDQ4MTA4NDJiNzlmNGZmODUwMDNj YmEyMjUxN2I3YmRiMTNiYmQzOTlmZmM1NzAwZDNiNmU4MQ0KYmFmZDJjNmQ2NDJmYzM4OThhYzNl YzEwNDJhMWI2ODZkMjcxOWI0MmExZDA4ODMzYmRhZWFlZWU5NWFhYWFhYTcyMjVmMzEyYmNhY2Zl ZDkwMDYwOWFlNmE1ZWU0ZTIzZGM2ZjNjZWVjZTljZmYwYmIwNGM1M2NhYTY3ZmVlMDgNCmRlNDJh MWYwZWVmY2Y5ZjNkZDQyMzFhOGNjZTVkZWNkYzQ2M2Q0ZDJkMmYyYzczZGQxYjE5ZWEyMzgxZmQ3 YmRlNTk2MThkZTJlZWUwODZjNjU4NzAxY2MzNTU0OTlmMjU1OTUzNGIzYTc2NzRiNjU2NWVlNmUz MDNmNmM4OGVmDQo3N2JmYzcwMjAzZmUwZGYwMTFjZWEyNmU5OTNkNmJlNmNlZGFjNmQ3ZjAyODU2 Mzc1NzdiOTZjZDZiNzE2MjRmOTU0YTJjMTQ2YTVmNGZjNzZkNmE2YTZhNzgxYWEzODZmNjRmMDU4 MzgxMjE4Y2RkN2NjMzQ1MmMxYTBlYjk2NQ0KMTEyYjRhYWVjZDM2MzU4NTJjNDM3Nzc1ZDlmZjc0 MWMxZDA5MDUyOTE4MGM1ZTg0OWQzN2RkMjZiODUxYzNmNWVmZmFiYTNhM2IzNmE2MWQ4YjhlM2Jl ZWI4ODkwNGJlOWQ0NmE2NjgwZjI1ZDcxNWU4OWZkYWRkM2Q1NDkxY2QNCjk2ZGIyYTY3MTY5ZjYx NTc5NDVlMTAwNGUxNTI2ZTU2YmIxNTY1ZjhmODdmMThhNjJhNTI4NGUyZjFmOGMzMDBmYzNkM2Qz ZGI0NzRlOWQyZTczMGYxYjZmMTJlZmNiNWI1YjU5NDRlYTc0NzJjNWQ4MjIwOWM5NThjOGQ2Y2Y5 DQpiZWM3YjdiYjNmMmY2MTFiYWVhN2M4MzVlYWJiOTk2ZDI3OTViNGY1MmU1ZGIyZTQ2Zjg3MWM3 MmM4OGY0YWNlZmJlMjMxZGI0ZGVkZjAwMWIwMzQ1NTJkMTYxZWZlYTM2MGRiZjZjMjhhOGE4YTNi MWM1M2E3Y2E1Y2VlM2UzOQ0KMWEyMTU1OTFkZmM3MjQ0YTRlYjViN2I3ZGZjNGU1MTk3N2Q1Yjdl OThhZWMyZWIyNjMyNmI4NzU5NzExNmNhOGFmYTc0Y2RjMjZjNzcxN2UwYzZlM2M5ZjNhNzVlYTY3 NzgwNGUxNjRhNGI5ODM3OGI4ZTkxOTAwZTJhOTU0ZWENCjY3ODYyYWJiZmIyNjdjMThiYjkwN2U1 OGQwMzBkNjJlN2NhYTYzZWFkNGQyZDJiYzE5OTNkYmY5ZWQwMGJlNzA2NmYxNjNhNWFkYWQ5NTMy NzE5YjZhZjI1NWJiYmJiOWQ4ODQ2ODczMzdhYjQ0ZDEzZTdiZDE2OGY4YmY3NTVkDQoxZjJmNzc2 NjA0ZjVmNWY1Nzc3M2RkZjgxYjNlOWY5N2JhYmFiYWZlMGUxNjg3NWQwOWE2ZGY3NTYyZDdiM2Uy ZjcwNTFjY2YwYmM1YjkxNWRmZDc2MGQ0OTg3NDdjY2NkMGE4YTVhNTY1MWQ1ODVhNGNiOTAyYTcw MDkwMGE4OA0KZTIzMDU4YTQwYWY4ZmRkZjRjYzY0Yzc3Njc5NWJkZmI3ZDBhODVjMjE3ZTI5NmUx NGE3MTZlYWU2YWE0YjZiNmE2YWZiM2IzZjM0ZDhjOWYzOTE3ZDIxNTk5NmM1ZDI1YmVjMWQ2NzZh ZWFkYWVhZWFlN2I3MmQ5MGM4NTQyYTENCjMzYjBlN2IzMjRmNjM2ZTZmMzM4YWIwNDk4YzQ3Yjg1 YTFjYTI0Y2I3MmYxMTZiYjY3YTUxYzhiOWE5YjlhZmE1MWRlMzFhZjU0ZTY3MjM0N2ZmZWJjNWU4 YzRlOGNiMzZkNDM3MzBiYjUxZjViZTY5ZTNkMGU2ZjUzNTNkMzFmDQpkMjhlNGQ5NWI5MGFjMmU4 YWFhZDBkODg3ZTBhODU0MmRmNDE3OTEzNjhiNjhkZjFkZTU1MTg2NzEyNTQ1NTU1NWQxZGI3NzQ5 MjIyNjE4YWM3OWQ1ZTZjOWZlY2JjY2Y2MmJmZmRmNjViODdiMTQ5ZjBiZTY5NTNhNzEyZDc3ZA0K NWQ3MjFkZTUyYTRmYjk5MmZmZTE5ODZkM2ZjYTc3OWI3MzVkODRiMzU0Mjk0YTA5YzY3NzNmZDQz MjhjNzZkYzg5MGRhNzFkOGI2YTZhNmE5ZTI5ZWFkMGVjNjAyMDQwYjY2ZDk3ODZkYTRlMDY3MzYy MmM4YmUxMWUwMDRlMjQNCjEyYjk0NzhhODRhOGEzYTNhMzljMjc2NjlmODMxM2IzYjdhMDM4ZTk5 YWUxNTgyZWYxMTYwZjY4MzljYTI0YjZiNWI1M2RhMzMwMTJlYzJlOTgwYTM5MTJhNmI0NjM1MTQ1 MjZmMzk3NzFlZWRiYWI2ODUyYTQwOGE1NjIxNjc1DQo3NzRmZDk4NDUxZDE3ZjI2Mzc2NTdlMDY5 MzJmYTM2YmU2MmFiMjk0NGRjNDQ4ZDdmNTlmODMwNWRjOTk1Y2MyOWViZWU3YmJiZWU3NzFkYTY5 YTdmZDhkYjNhZDYyNjEzMWNkNjNhOTRiZTNiODhhMTE2YzY4NjhmODNiNzdiNw0KYmFjNTY3OTQ4 Njg2ODY4ZDk5Yjg0ZDhkZjVmNWM1ODNmZWExNjM1OTkxZTg1ZTljMmVkMTEzMGEwNmM4ZWZmNzdm MDMzYmNlNjZhZjkxNjVmOTc2ZmUxYjc3NWFiYTRhMmE5YmY1NWU4Y2FkYjZmMzJmODU2MTE4MTcx YmJhNDYNCjk3NWQ3NmU5OWZjNjY5NjI0YTkxMTA2NTU5ZWViMTFiNjZiYzlhYzc0ZThkOTc2ZTFi YWVhOWE5ZjkxM2I3MzNiYjNlNzMzMTEwMDg1YzlmNzY2YzM3YTFmZDVmYWU1ZDljYzIyMjMxMzUw MjJiMWIzMDUyNGMyYzFjMGM1MDU3DQo1N2M3OGI5OGMwNjIxNTBlMDUyOWVkNTg1NDVkNTViOTE1 ODAzZjEyMGFiZThjYzkyNTkzNzc2NDMyOTkyZmYxYjY3YjYzNjM5MDBhMzBjN2ZhYzEwMDQ0Y2Jk MGE5YTdhN2M3OWQ3OGUzZjZjOWFkMzVkMmQxZGU0NjNjNTc2YQ0KYzUzODZkYjU3ODNjZmUxMjBm Nzk3MmVkZDNkZTc4M2NmZWM1YjQ2M2JiNjkyZmZiYzYwNDZmNmI2YmJiYzUyZGY1MDM5NjFmZTQ3 ZTg0NmE1ZDUzMjk5NTRjYmU4ZWYxZjc1ZWFhOWUzYjc3Y2U4MDJhNDUyOTk3Y2JmZDFjZWMNCmE1 OTY2M2M3ODViYjczOWEyYzUxMjQxNGE0NjgyNDQyMDcxYzcwYzAxZGQ4YzUwMmUyYmNiZmRkMThm ZGQwZjk4MGU4NzcyN2VkMTcwMTc0ZjA1NTM2MTk0NzgxMDI1NjljZTU2ODk0ODRjNzE2MjFhMzY5 ZGEzYjE2YWIxMWUyDQoxNjY0MTVhM2QxZTg3NTI5NjdhNDJlYzlhZTU0MDhkYTdiNzAxY2U3ZjNh YzA4ODk0ZWJhYWVkZjhhZDFjNDJlMjc5YjQ5OTNjOWY0ZTQ4OTQyNTIwZTZkNmE2YTIyNDU4YWI4 YzE2YzE1M2I3OGE0YTIyOTEyMTk4NjcxMTM4MA0KNDg2NTJlZjdkNzY5ZDNhNjk1NDZmNWNmZTQz YzcwOGM1OWFmYTliMTcxNmI1YjViZGIxNmYwZTIyNjczNjZjZjY2ZjFkYzk2ZjU5YmEyNjYwYmI5 M2JlZWRjYjhlM2ZjNDIxZDJiMDBlZDBlM2FhMzkxYzhkMDkyMjU0YjhhYWQNCjU0MTEwMDlmNGZj NTJjZDdhOTUzNWEwYjZiOWZjMTA1OTZhZTUyMmE2NjUyMjQxMmI5MDVhM2QxODQ4MWFlYWVhZTdi MjNhMTIwMjk4YTcyMWVjNjk3MDg0MzYwYjE1MjY1OTNhNzRhYjAzMjZlMTk2NDE4YzZiNzAwMmM2 ZDZkDQo2ZGZkNGQyNjkzMTk4OTE1MDYxMDM1NzRjZGRkODRiMjM0ZjRmNGU2NGNkYzI2Y2UxZjNi MDFlODdjNTIxNTZmYTBlMWQxNTU2NTYzM2FlMWYwNjg0YjgzYTY0ZDliZWEwNjMwZWMyYWQ2NzA2 MWVhOTRhMjdlM2E0Yjk2MmM3OQ0KMzllZDhjMDRhZTFmMzRmZWVkZmIwNjhlZDUxNTg5MzI3MTli NmE2YjZhZGVjMjY4NzIxNDAwN2M0NDUzMTRlMjI1Zjk3NjI2ZGY2OTNiMzQzNDM0ZGM2NTFiMWFi NWI3YjU5MjIyNDU1YzQxYWZkODI2N2U3MjIwMjA1MjZkNGQNCmJlYmYyYTk3NWI1NzcyZmIzMjUz NTNjOGQ2NTUzMjBkN2QxMDQwODIxNzMyZmI2ODQ5YmI0ZjY1ZTIzNmU1ZjNmOWZiMDE1YzZjYThi MjFiMmY3ZTExNzZhZWIyYWM1NjViNWJmYjA4MWZkY2UyOTI0ODc1ZTk3NGVhODU0Y2RjDQo3Njkz YjYyNzMzYjFmNzA5Y2MxZWQ5OWEzNTY2OTcwYTFhYjVmNTc1NzU2ZTUwZjc5OWQ4YjU3NGQzNDhj MmIxYTlhNWI5Zjk2ZTdlN2MyNDRmNDQ3MzM3Y2VmMDU0NjQzM2VmYTlhYTdhM2Q4MGYzZjljNzJi Y2U3YWE4ZTJjMg0KY2Q5NzU0Mjk0YThkZjVmNTViOWExYTFiZmYwMDE2N2Q1MjhjNDU1Y2FlNzA0 Mzk0OGU5NGEzNjEwYTA1MDM2MzM2ZjBkYzAxOTY4ODdlMWY2NWIzZDkwNzMwNTZkODljOTM0ZTI2 MjgxM2I3ODkwN2U3OTc4ZDNjZGQ5NzUxMzANCjBkNTZmMjkwZjM5NTBiMzEzYTk4NjIzODFjYmUz YzFhMGU1MTU3Njc2NzNmNzYyZTU2NGJmMWY5N2M5NGIwMGQ0YWE3ZDM4ZjgzZjlhMzhmZTNlNGNk OWQ0ODJiZjk4MGZmMTZjMGVmYjk3YmIyNzg3NTQ2YjkwMzdlMjY4MDU1DQoyZTA5Y2U2NDMyYTU4 NjhhOWNhZWM4YTQ2YmVhMTBiODgwMTUwZTg3ZDdhMDRjNjk4NjMyZThmMGY5N2MwZmYwMTRjZmUy NzI1NDdlMDAxNzE4YWE0Y2M5OTg0OWU5NTQ3MjIyMzU2YTlmODczYTc1NmFmNzNhYzdkNDI5NjE5 Yg0KMzQ3ZGZhYjQ5NzMwNzY5YjgwZGE5YTlhOWE1YmEyZTExMDI5YjI3YzFiMjY0ZmI2ZWIwMDlj MWYwZTg3ZGUxNzA0ODE3YzVlMmYzNTM1MzUzZDA4MjYwZDM3NGM5YjNhOTVhNjc0NzYxMDU4MDJk Yzk1YjZhZTUyNDU0NWM1NWYNCjhhZWVmN2Q5NjM4Yjk3OWMxYzMzMzRhYTJmMTQ2ZTJhNzk4ZTM5 NzNlNmNjYjU2MGNlODFjOTY2NGJlNmEzZDFlOGVkNWVhZjQwMGJlNmNmN2YxZDYzYjM0MTZhMWIx YjFhMWU0YmRhMjY1OWJhNGEzM2Y2ZGJlZjFmMTgzZmViDQplMWRmMDYxZTAwMWZkNTY0YzY5N2I5 MzRmYTMxOGNkNTI3YTc0ZTlmMzY4ZGU0Njg5OGJhYTc0Yzc5MDgxMzk3ZWUyYjg3OTFmNDhlNjgz OGI0NDU1NzI0NTc4MGYyMDJjODNhYjY0OTMxNzNjY2RlYmFkMzBkNTUyNjllMzVhOQ0KMDBjMGNj OTkzM2JmNzJjODhhMTUzYjFiNGU1MzhjZmFjZWNlY2VkZjA2NDQ5MTBhYjViNTdmYzY1ODYxY2Mw ZmUwMzQ1NThlNTIzYTNlYTJlMzdlNjQzNzllYjU0ZmEyM2U1NzkxYTU4NDZkNTBjMjM2Mjg1NzUx ZjEwYWM2OTINCjY2MGY4MDgzNTI4OTM4Yzk5MTMwY2Q5YTM1ZWIxNWIwYmFkMjkzZjE5ZjRlODQ0 NDc3NzdmN2Q3ZTZjZDliZjczOThjM2FkYTFiMTYyZTVjZjg5OTIzOGUzOGUyN2NlY2JlOGQ3NzNh ODBiYjA0NDFhMDg2ODY4NjI3YjAzZGY5DQo1ZWRlNTA1ZmJmMzY2MTFiNjRlYjJhYjViN2I3YmQ4 NjFkYWI4MGZmYjZmMDAxZjg4NGE1NmI5NDRkYzRjOGQyNTU2YWE4YWZiZjFiZGIwN2UwY2QzZGY0 ZDA0MzQ5OGE4NGRkMzJmOTk3NjJkZmRhYTQ1YTA2NzBjNGNhOTUyYg0KMDdmYzdlMWY2NTMyOTkx ZjYxYjQyNmI1OGIzNjAwNWZiMzBkOGQ5MjMxZDNhZGVmMzE5OTY0YmNmZjA4MzQ2NGQyZTk3NWVl ZjZlODg2MmE1MzIyOTFiODA5ZGI4N2IyNTQwMWI4NDg5NTI1MGE4NzgyZDRkMDUwZmY0N2IwZmMN CmE0N2Y0NWIwNWUxMmMwNmE1ZGQ3MWUwZTA2NDQ4YTg2NDM3NGUyZjFjN2JmODBlZDgzMGVmMzhl ZTNmYzQwNTc2NDRhM2IyM2VhY2YzOWQ4NzUyYmRiYmYzNWU2MjUxM2YxNzdkOTQwYzdjODUwNjU5 YTM2NzVlYWEzNjAxNTdiDQo4YWQ1MjcyZjgwMDMxYTFiZWJlZjhiODQ4MjI0ZmFmZDU0OTljYmZk MGRhY2Y4ZDg3Y2VjMWQ2ZjRiMWFhYzNjZTM1NzFkYzcyMTlmY2Y0YjgxNDAxNjEwMDAwMDI2MDYw ZjAwMjIyMDU3NGQ0NjQzMDEwMDAwMDAwMDAwMDEwMA0KMDAwMDAwMDAwMDAwMDYwMDAwMDAwMDIw MDAwMDc0NWQwMDAwNzRiZDAwMDBlMDRkMzA5N2UwNmM2Y2FmZGU3NTAwYjg1NjU3MjQ0YWYzNDlk YmRjZGNmYzIwYzY0OTBhZmJiMGYwNjFlZGRlM2QxMTNjMDAwZTZiNmY2YmJkZWQNCjhkNTc1ZjQx MjgxODQwNmY1ZjNmYmMzZWZmM2ZkN2FlN2ZlYjVhYjBlOGNiZjUyNWVkZGJlYWVhZWE0ZTBhMDRj NDUzNWU3OGVlMzkxMDAwNTk5MmUwYzQxM2FmYmZmMmVhYWIzNzZmZGFiNGE5OTdkZmIzMTZhM2U5 OWVjNWY3DQphYjE4NGQxOThkZjBiZjg3MDFmOGVhZWEwYWE3YWY3ZGUzOGQ2NDVmN2YzZjA0OGYw N2IzNjZjZmMxY2Y3ZmYxOGI1NTYwYzVkMmRlMmFmOWFkMjA4MDEzOTI3MWU3ODZiZTZkZGIxMDBl MDViMGFkYjcwZmE2ZTNmY2U5YjllNw0KNWUzODExYzBhNDMyZWVmNzI2ZjY4NTAxMmVjNmRjNTli MzY2ZGRmYTk3YTdmZTE4OGI4NDk5Mjk3YmNiZDY1ZTI0ZDI5OWRiOWY3OWU2OTk1ZjAzYjgwYjQw YTk1NTBhNjAyZWI1MmUwMDg1YTM4ZTNhZWFjMjdiZWVmYTZmNzgNCjNjODI3ZjcwNzAxMDFlOGYw NzQzYzNjMzAwMDE4MmQ3MDMwZjdmNjUyMjI2MzA3YmJkNWUwODFlOTYwNTA4MDAxYmRlZGY3ODE1 NTg5NmU0ZTM2MDA5NWQ0MzI1Y2ZmMjAxZTgxMTQ1NzE1MTM4Mjg5ZTE3MDkwNWUxMTUwNDZjDQpl ZGVkYzMzMDExZGU3ZDdmZDM2YzAwMGY2MTFmYzFiZTM2YzAyZTMyZjk3Y2ZlOWNmN2RmZGQ3MGE2 MDA0MjMwMjA2MjY4NjgxODViN2JmYmIwZGZjYzk5Yjg3NTFkMTQ3MzAwMDAwMWFmNDk0NDQxNTRl NzllOWY1ZTAyZTAxMQ0KMDBiZmMzMGViMjFjNTFiZTlhMWQwMTk4NmNlMTU0MmY5ODdlZGU1MzUx OTFkZGFmNmZkYmI2MjM4NjA3MDcxMDEwZmRlODFmMTg4NDE4MGE2ZjhiMjc5MmY3M2RmNmQ4NjM5 NzYyMWY1OGIxYTVkODU3MDdkODg1MTdjMDljODYNCjg2ODY0ZmJjZmVlYTJiMGI4M2EyMWZjMTgw MDhjMDgzZmU4MTAxZjQwZjBjMjAyYTJiMmZkNTM3MzRiZWZlOGI1ZmZjZTI4NzYwMmJlZTFmNjBh NDc5YmJmZDFhMjYwMTBiY2MxMDUzMDNhMGIyYTVhOWYxNTM2ZmJmZmQzNjA2DQpmYTdhMTEwODg4 ZjAwYTAyZmFmYWZiZDFkYjM3MDA0OTU1MWY3ZGZkZjUzNzNlMGZlMDY3MThhZDZjYjBjZjYxNWYx ZmUwNjJmODAxNGM0ZmE3ZDMwN2M3NmNmYmFjYmZiZGY4M2MwMjdlM2Y0NGQxMGZhZmMwOTJhZjA3 MDYwNw0KMzEzMDM4ODhlMTYxODJhMmFhMDg4NWMyZWJmMmI1YjU0MjM4MWMxNjZlYmJlZGI2M2Jj MDA2N2QwYjE4OTkxZDNjZmNmMGMzOTdmN2Y1ZjUyOTJmYmZmNGY3ZTFmN2RlN2IyZmRlZGJiYjBk MzQzYzBjYmZjZjBiOWY5N2E5YzcNCmVlNDRhYTZiNjhjMmNiYWZiY2YyZWRiNTZiZDdkZTBiZTBl Nzk4Mzg1Nzc4OWZjMWJmZDMwMDk3MjIwYzY2NTQ2ODVmYjNlNmE0NmI3ZTc4ZmI2ZDVlOGZjNzEz MDAxMTdjNWUyZmJjNWUyZmJjNWUwMTgyYzcwM2JlOWY3MDU5DQoxMDExODY4NzA5ODM0MzQzMTgx YzFhYzJkMGQwMTA0NDMxODBiOWYzMTc3Y2YwODMxZmZjZTAxMjAwN2YwNmYwMDQyNjlmNjRiZTRm ZTFkZjc5ODBjNzgzMDIxNjQ4ZWY4MGM1MWU5YjAwY2NjMzBlM2I2YzU5MjAxMDE4N2FmYg0KZWRi NzNkMDBjMWIyNmM5MjI0NjllMDg2MWI2ZWI4MTkyYzJiN2YyZDgwOTcwMWJjODZlZDhiYTFmYzFm ZmUwZmZiMjZmZTNmZjA0MWNlNTUyYmYzZWUwZjAwMDAwMDAwNDk0NTRlNDRhZTQyNjA4MjAwMDAw ODQwMDEwODI0MDANCjAwMDAxODAwMDAwMDAyMTBjMGRiMDEwMDAwMDAwMzAwMDAwMDAwMDAwMDAw MDAwMDAwMDAwMDAwMDAwMDFiNDAwMDAwNDAwMDAwMDAzNDAwMDAwMDAxMDAwMDAwMDIwMDAwMDAw MDAwMDBiZjAwMDAwMGJmMDAwMGYwNDIwMDAwDQpmMDQyMDMwMDAwMDAwMDAwODBiMzAwMDA4MGIz ZmZmZmVmNDIwMDAwODBiMzAwMDA4MGIzZmZmZmVmNDIyMTAwMDAwMDA4MDAwMDAwNjIwMDAwMDAw YzAwMDAwMDAxMDAwMDAwMTUwMDAwMDAwYzAwMDAwMDA0MDAwMDAwMTUwMA0KMDAwMDBjMDAwMDAw MDQwMDAwMDA0NjAwMDAwMDE0MDAwMDAwMDgwMDAwMDA1NDRlNTA1MDA2MDEwMDAwNTEwMDAwMDAw MDA4MDAwMDAwMDAwMDAwMDAwMDAwMDA3NzAwMDAwMDc3MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw MDANCjAwMDAwMDAwMDAwMDc4MDAwMDAwNzgwMDAwMDA1MDAwMDAwMDMwMDAwMDAwODAwMDAwMDA4 MDA3MDAwMDAwMDAwMDAwODYwMGVlMDA3ODAwMDAwMDc4MDAwMDAwMjgwMDAwMDA3ODAwMDAwMDc4 MDAwMDAwMDEwMDAxMDAwMDAwDQowMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw MDAwMDAwMDAwMDAwMDAwZmZmZmZmMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBmZjAw MDAwMDAwMDAwMDAyYmZhMDAwMDAwMDAwMDAwMGZmMDAwMA0KMDAwMDAwMDA3ZmZmZmYwMDAwMDAw MDAwMDBmZjAwMDAwMDAwMDAwZmZmZWZmZmU4MDAwMDAwMDAwMGZmMDAwMDAwMDAwMDdmNDAwMDAx ZmMwMDAwMDAwMDAwZmYwMDAwMDAwMDAzZmEwMDAwMDAzZmUwMDAwMDAwMDBmZjAwMDANCjAwMDAw ZmMwMWZmZmY0MDFmMDAwMDAwMDAwZmYwMDAwMDAwMGJlODNmYWFhYWY4MGZlMDAwMDAwMDBmZjAw MDAwMDAwNzAxZjAwMDAwMDcwMWYwMDAwMDAwMGZmMDAwMDAwMDNlMGY4MDAwMDAwMGYwMzgwMDAw MDAwZmYwMDAwDQowMDA3MDNjMDAwMDAwMDAxYzFlMDAwMDAwMGZmMDAwMDAwMWUwZTAwMDBlMjAw MDBmOGY4MDAwMDAwZmYwMDAwMDAzODMwMDAwNjYzMTAwMDFjMWMwMDAwMDBmZjAwMDAwMGYwZTAw M2U2ZTIzMDgwMDMwZjAwMDAwMGZmMDAwMA0KMDFjMTgwMDc2N2MyNzBjMDAxYzc4MDAwMDBmZjAw MDAwMzhlMDAwMzIyYzJlMDhlMDBlM2UwMDAwMGZmMDAwMDA3MWMwMDAxZjE0MzMxZGMwMDEwNjAw MDAwZmYwMDAwMGUzODA4MDNiMTgzMjFmMDAwMDg3ODAwMDBmZjAwMDANCjFjNjAxYzAxMTA4Njcx NjAwMDA2MWMwMDAwZmYwMDAwNzhjMGY4MDFlMDAwMjNhMDBhMDM4ZTAwMDBmZjAwMDA3MTAwZTAw MTAwMDAwMTMwMGYwMTg2MDAwMGZmMDAwMGUzMDAzYzAwMDAwMDAwMzgzODgwZTMwMDAwZmYwMDAx DQpjNDAwMzUwMDAwMDAwMDAwMTBjMDYzODAwMGZmMDAwMzhjMDAzYjgwMDAwMDAwMDAyMDgwMzlj MDAwZmYwMDA3MTAxMDFlMDAwMDAwMDAwMDMxODgxOGMwMDBmZjAwMGUzMDFlMTgwMDAwMDAwMDAw MzM4YzBjZTAwMGZmMDAwYw0KNjAxZjAwMDAwMDAwMDAwMDBlMWMwNDcwMDBmZjAwMWNlMDA5YzAw MDAwMDAwMDAwMDAzODAyMzgwMGZmMDAxODgxMGM4MDAwMDAwMDAwMDAwMDUwMDExODAwZmYwMDM5 ODIwZTAwMDAwMDAwMDAwMDAwZDgwMThjMDBmZjAwNzENCjAzMDYwMDAwMDAwMDAwMDAwMDQwMDBj ZTAwZmYwMGUyMGJlNDAwMDAwMDAwMDAwMDAwMjgwMGNlMDBmZjAwYzQwOWYwMDAwMDAwMDAwMDAw MDAxMDAwNDcwMGZmMDBjZTFmYjAwMDAwMDAwMDAwMDAwMDAwMDAyMzAwZmYwMWNjDQowNzIwMDAw MDAwMDAwMDAwMDAwMDA4MTE4MGZmMDM4ODAzZTBhYWFhYWFhYWFhYWE4ODAwMWMxYjgwZmYwMzEw MDBjMTVmZDdmZmZmZmZmZmZmODAzNDE5YzBmZjAzMzBlMDgxYWE4MmEwYWFjYWI2YWE4MWUwMDhl MGZmMDczMA0KYzAwMGRmYzA1NTQ0NTU0MDdlYzFjMDA0YzBmZjBlMjBiYTAwYmZmZmZmZmZmZWZm ZmI4MDgxOGNlMGZmMDY0MTliMDAxMDY1ZDA4MDEwNjEwNTAwMDMwNDYwZmYwZTYxZjIwMDBhMjM2 MTgwMWEyMGEzZTAyZTgyNzBmZjBjNDANCjVjMDAwNjUyNTE4MDA2NzA1NzU4NzAwMjcwZmYwYzgw MGMwMDAyM2I5ODgwMDMzODEzZmMzZjgyMzhmZjFjODAwMDAwMDEzOTMxODAwMTc4MTMxNDAzYzEz MGZmMTg4MzgwMDAwMTBmZjI4MDAzMzgyZjBlMGY4MTM4ZmYxOTA1DQo4MDAwMDExN2UwODAwMjc0 NDEwNjFjMDExOGZmMzk4Y2I4MDAwMThmZTk4MDAyZmI4ZjBlMDgwMDk4ZmYzMTA0OTAwMDAxMDFk MGZmZDU3ZDExMDUwMDIwOWNmZjNiMGVmMDAwMDBmYmExZmJmZmU3NjIwYTBhZTA4Y2ZmMzEwNA0K ZjAwMDAxODVlOWQyNGRkZTFjMGUwZmQwY2NmZjNhMDBhMDAwMDA4YWI4OWFkYmVlZWUwYTBlMTA4 Y2ZmMzMwMDAwMDAwMTAwNzE5NDEyNDUxYzEwMDQxMDRjZmYzMjBjMjAwMDAwYjhmOWE0YTI4YTNj MzYwNjMwY2VmZjcyMTgNCjYwMDAwMTQwMzEwNTA0ODRkNDRjMDdlMDRjZmY2MjBiYTAwMDAxYmYy OTg5YTg4OWJjZjgwMjgwY2VmZjcyMTEwMDAwNzcyNTExMDkwODAyNzdiMDAwMDA0NGZmMjIwZmUw MWJmZjZiOGEwMDAyOGUzZTYwMDYzODRlZmY2MjE0DQo0MDExN2Q1YmNjMDAwNDA5NzVjMDA3ZjA0 NmZmNjIwMDAwMzgzOGQ4ZWY0NmE2OWFlMzgwMDZiOGNlZmY3MjAwMDA1NDMwMTE3OTA0YTUwNDk2 MDAwMDAwNDZmZjYyMThjMDhlNjBhYTdhYTAyMDAzYjgwMDAwMDA2ZWZmNzIxZA0KYzA1ODRjNzg1 MTJkNWQ1ZmMwMDAwMDEwNDRmZjYyMGY2MGU4ZThmOGFmZmZmZmZlODAwMDAwZjhjZWZmMzIwMTIw MjQwYzU0N2ZlMDAwMDAwMDAwMDc1MDQ0ZmYyMjBiZTAzZTQ2YWZlZmEwMDAwMDAwODAwN2UwY2Vm ZjcyMGYNCmUwMGMxN2ZjMDVhMDAwMDAwMTgwMDFkMDRjZmYzMjA4MjAwZmZiYTAwZWEwMDAwMDAw ZTAwMGIwY2VmZjMxMDAwMDAwNjQwMDA2ZjAwMDAwMDVjMDAwMTA0Y2ZmMzMwMDAwMDAzODAwMDNk YWMwNjAwMzgwMDAwMDhjZmYzMTAwDQowMDAwMDAxMDAxNWNkNTQwMTMwMDAwMDBkY2ZmMzk4MGMw MDAwMDNjYWZmZmJmODBjYjgwMDIwMDljZmYxMTAwYzAwMDAwM2U5N2ZmZmUwMDVlMDAwMzAxOThm ZjE4ODAwMDAwMDAwZmZmYmZmODAzNGUwMDAyMDFiOGZmMTg4MA0KMDAwMDAwMDE1N2ZmYzAwOTVj MDAwMDAxMThmZjA4ODAwMDAwMDAwMDBmZWRmOGNhZjgwMDAwMDMzOGZmMGNjMDA0MDAwNjAwNWQ1 NDc3NTNkZTAwMDAwMTMwZmYwY2MwOWUwMDA3YmJmYmZmM2ZmZmUwMDAzODAyMzBmZjA0NDANCmRj MDAwMWRkZjM1ZjE3ZmYzMDAwNTgwNjcwZmYwZTYwZmM4MDAwZmZhZWRmYmVmYjg4MDA5YTA2NjBm ZjA2MjAwNTgwMDA0NTA1OWIzODQ0NDAwMWQyMDQ2MGZmMDYyMDIzYzAwMDA4MWY4OWZlMjIwMDAw ZmUwY2UwZmYwMzEwDQozZTAwMDAwMGRkNWRkYzAwMDAwMWZjMGNjMGZmMDM5ODNjMjAwMDAyZmJi OWZiY2EwMDAzNjgwOGMwZmYwMTkwMTA3MDAwMDljNTFjN2ZkNzAwMDM1MDExYzBmZjAxODgwOGYw MDAxZmJlM2FiZmZlMDAxYmYwMzM4MGZmMDFjNA0KMDVjMDAwMDA3NDE4MTVkMDAwMTkzMDMzMDBm ZjAwZTYwZjgwMDAwMGY0MzgwZWM4MDAzZTYwNjM4MGZmMDA2MjAzMWUwMDAxOTQ3MDAyMDAwMDM3 NDA0NzAwZmYwMDYzMDNiYjAwMDAwMDMwMDAwMDAwN2Y4MDhlMDBmZjAwNzENCjAxOWMwMDAwMDA0 MDAwMDAwMDVkYTE4YzAwZmYwMDM4ODBjYzIwMDAwMDgwMDAwMDAwZmJhMzljMDBmZjAwMWM0MDVj NjAwMDAwMDAwMDAwMDA3NzQzMTgwMGZmMDAwZTYwMzhlMDAwMDAwMDAwMDAzODJlODYzMDAwZmYw MDA2DQozMDE4YzQwMDAwMDAwMDAwMzAxYjA0NzAwMGZmMDAwZTM4MGNlNzAwMDAwMDAwMDBiODAy MDhlMDAwZmYwMDAzMGMwNjM0NDAwMDAwMDEwMGZjMDAxMWMwMDBmZjAwMDM4ZTAzYmM3MDAwMDAw MTM5OGUwMDIzODAwMGZmMDAwMQ0KYzcwMGQ4NDAwMDAwMDAzMTE3MDA0NzAwMDBmZjAwMDBlMzgw ZjhjMDI4MDAwZmJiZWUwMDhmMDAwMGZmMDAwMDcxYzAzMTg3OTgxMGU1OTExZTgxMGMwMDAwZmYw MDAwMzhlMDZmOGVmODM5OGNmOGU2ODYzYzAwMDBmZjAwMDANCjFjMzA3N2M2NzAxMTBjZGRjMTBj NzgwMDAwZmYwMDAwMGUxODNlZWUzMDMzZTg4ZTgwMzhlODAwMDBmZjAwMDAwNzA0MDAxZTMwMTM2 MDcwMDA3MWMwMDAwMGZmMDAwMDAzZTM4MDAzYTAzMDJiZTAwMGUzODAwMDAwZmYwMDAwDQowMGYx YzAwMDdjNzU3YzAwMDcwNzAwMDAwMGZmMDAwMDAwZjhmODAwMDhmZmUwMDAwZTNlMDAwMDAwZmYw MDAwMDAxYzFjMDAwMDMxMDAwMDMwN2MwMDAwMDBmZjAwMDAwMDBmODM4MDAwM2UwMDAyZTBmMDAw MDAwMGZmMDAwMA0KMDAwN2MwYzAwMDE0MDAwNzA3YzAwMDAwMDBmZjAwMDAwMDAwZjgzZTgwMDAw MGZhMGY4MDAwMDAwMGZmMDAwMDAwMDA3YzAzZDAwMDE3YzAxYzAwMDAwMDAwZmYwMDAwMDAwMDNm ODBiZmZmZmEwMmY4MDAwMDAwMDBmZjAwMDANCjAwMDAwN2YwMDA0NDAwMDdjMDAwMDAwMDAwZmYw MDAwMDAwMDAwZmU4MDAwMDJmZjgwMDAwMDAwMDBmZjAwMDAwMDAwMDAxZmY1MDA1ZmYwMDAwMDAw MDAwMGZmMDAwMDAwMDAwMDAzZmZmZmZmODAwMDAwMDAwMDAwZmYwMDAwDQowMDAwMDAwMDE3ZmZk MDAwMDAwMDAwMDAwMGZmMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwZmY1MTAwMDAwMGY4 NzAwMDAwMDAwMDAwMDAwMDAwMDAwMDc3MDAwMDAwNzcwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw MA0KMDAwMDAwMDAwMDAwNzgwMDAwMDA3ODAwMDAwMDUwMDAwMDAwMjgwMDAwMDA3ODAwMDAwMDgw NzAwMDAwMDAwMDAwMDBjNjAwODgwMDc4MDAwMDAwNzgwMDAwMDAyODAwMDAwMDc4MDAwMDAwNzgw MDAwMDAwMTAwMTAwMDAwMDANCjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw MDAwMDAwZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3 ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmDQpmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZm N2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3 ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3Zg0KZmY3ZmZm N2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3 ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdm ZmY3ZmZmN2YNCmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3 ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdm ZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmDQpmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3 ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdm ZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3Zg0KZmY3ZmZmN2ZmZjdmZmY3 ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdm ZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZjAwMDBmZjdmMDAwMGZmN2Y2YjJkOGMzMTI5MjUN CjI5MjU4YzMxYWQzNTAwMDBmZjdmMDAwMGZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdm ZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2Zm ZjdmZmY3ZmZmN2ZmZjdmDQpmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdm ZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2Zm ZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3Zg0KZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdm ZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2Zm ZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2YNCmZmN2ZmZjdm ZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmFkMzUyMTA4NDIwODQxMDg0 MjBjNDIwYzYzMTA2MjBjNjMxMDYyMGM2MzEwNjMxMDYzMTA2MjBjNjMxMDYyMGM2MzEwNDIwYzQy MGMyMTA4DQo2MzBjNmIyZDAwMDBmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2Zm ZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZm N2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3Zg0KZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2Zm ZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZm N2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2YNCmZmN2ZmZjdmZmY3ZmZmN2Zm ZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZm N2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2Y4NDEwDQpj NjE4NDIwODQyMGM2MzEwNjMxMDYzMTA0MjBjNDIwYzQyMDg4NDEwYTUxNDRhMjk2YjJkMDAwMGZm N2YwMDAwMDAwMDAwMDA2YjJkNGEyOWM1MTg4NDEwNDIwYzYyMGM2MjBjNjMxMDYzMTA2MzBjNDIw ODA4MjFmZjdmMDAwMA0KZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZm N2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3 ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2YNCmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZm N2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3 ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmDQpmZjdmZmY3ZmZm N2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3 ZmZmN2ZmZjdmZmY3ZmE1MTQyMTA0NDIwYzYyMGM2MzEwNDIwYzQyMDhmZjdmMjkyNWZmN2ZmZjdm ZmY3Zg0KZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3 ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmYzYxODYyMGM0MjBjNjIwYzYzMTA0MjBjNDIwOGZmN2ZmZjdm ZmY3ZmZmN2ZmZjdmZmY3ZmZmN2YNCmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3 ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdm ZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmDQpmZjdmZmY3ZmZmN2ZmZjdmZmY3 ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdm ZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3Zg0KZmY3 ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmYTUxNDQyMGM2MjBjNjMxMDYzMTA0MjA4 NGEyOWZmN2YwMDAwZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2Zm ZjdmZmY3ZmZmN2YNCmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdm ZmY3ZmZmN2YwMDAwODQxMDYzMGM0MjBjODMxMDQyMGM4NDEwZTcxYzAwMDBmZjdmZmY3ZmZmN2Zm ZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmDQpmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdm ZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2Zm ZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3Zg0KZmY3ZmZmN2ZmZjdm ZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2Zm ZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZjA4 MjENCjQyMDg2MjBjNjMxMDIxMDhjNjE4ZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2Zm ZjdmMDAwMDZiMmQ0MTA4MjEwNDIxMDQyMTA0MjEwNDAwMDQyMTA0MjEwNDIxMDgyMTA0MjEwNDIx MDQ0MjA4NDEwODQyMDhmZjdmDQowMDAwZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2Zm ZjdmNDIwODYyMGM2MzEwNDEwODQyMDhmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZm N2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3Zg0KZmY3ZmZmN2ZmZjdmZmY3ZmZmN2Zm ZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZm N2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2YNCmZmN2Zm ZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZm N2ZmZjdmZmY3ZmZmN2YwMDAwZmY3ZmM2MWM0MjBjODMxMDQyMGM2MzEwZmY3ZjAwMDBmZjdmZmY3 ZmZmN2ZmZjdmDQpmZjdmYTUxNGM2MTgyMTA4MjEwNDYzMGNhNTE4NDIwOGZmN2YwMDAwZmY3ZjAw MDBmZjdmMDAwMGZmN2YwMDAwZmY3ZjAwMDBmZjdmMDAwMGZmN2YwMDAwZmY3ZmM1MTg0MTA4MjEw NDIxMDQyOTI5ZmY3ZmZmN2ZmZjdmZmY3Zg0KZmY3ZmZmN2ZmZjdmMDAwMDYzMGM0MjBjNjMxMDYy MGNhNTE0MDAwMGZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3 ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2YNCmZmN2ZmZjdmZmY3ZmZm N2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3 ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdm DQpmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2Y0MjBjNjMw YzQyMGNmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmYzUxODIxMDQyMTA0ODQxMDAwMDBmZjdm ZmY3ZmZmN2ZmZjdmZmY3Zg0KZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3 ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2Y2MzBjMDAwMDIxMDRmZjdm ZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmMDAwMDIxMDgNCjYzMTA0MTA4YzYxOGZmN2ZmZjdmZmY3 ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdm ZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmDQpmZjdmZmY3 ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdm ZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2Zm ZjdmZmY3Zg0KZmY3Zjg0MTA0MjBjNjMxMDQyMDg4NDEwZmY3ZmZmN2ZmZjdmZmY3ZmZmN2YwMDAw NDEwODQxMDhhNTE0MDAwMGZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2Zm ZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2YNCmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdm ZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZjYyMGMyMTA0NDIwODhjMzFmZjdmZmY3ZmZmN2Zm ZjdmZmY3ZmZmN2Y0MjBjNjMxMDQyMDhmZjdmZmY3ZmZmN2ZmZjdmDQpmZjdmZmY3ZmZmN2ZmZjdm ZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2Zm ZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3Zg0K ZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2Zm ZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmNDIwYzYyMGM0MjBjZmY3ZmZm N2ZmZjdmZmY3ZmZmN2YNCmZmN2Y0YTI5MjEwODIxMDQwMDAwZmY3ZmZmN2ZmZjdmZmY3ZmZmN2Zm ZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZm N2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmDQpmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2Zm ZjdmZmY3ZmZmN2ZmZjdmNmIyZDAwMDA4NDEwZmY3ZmZmN2ZmZjdmZmY3ZmZmN2YwMDAwNDIwODYz MTAyMTA0ZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3Zg0KZmY3ZmZmN2Zm ZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZm N2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3 ZmZmN2YNCmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZm N2ZmZjdmODQxMDYzMTA2MjBjODQxMGZmN2ZmZjdmZmY3ZmZmN2ZmZjdmODQxMDIxMDgwODIxZmY3 ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmDQpmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZm N2ZmZjdmZmY3ZjAwMDBlNzFjMjkyNWZmN2ZmZjdmZmY3ZjI5MjVmZjdmZmY3ZmZmN2ZmZjdmZmY3 ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3Zg0KZmY3ZmZmN2ZmZjdmMDAwMDAw MDAyMTA0YTUxNDAwMDBmZjdmZmY3ZmZmN2YwMDAwYTUxNDYzMTA0MjBjZTcxY2ZmN2ZmZjdmZmY3 ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2YNCmZm N2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3 ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdm ZmY3ZmZmN2ZmZjdmDQpmZjdmZmY3ZmZmN2ZmZjdmZmY3ZjIxMDg2MzEwMjEwOGZmN2ZmZjdmZmY3 ZmZmN2ZmZjdmZTcxYzQxMDhmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdm ZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3Zg0KNDIwODIxMDRmZjdmZmY3ZjYzMGM0MjBjZmY3 ZmZmN2ZmZjdmNDEwOGM2MThmZjdmZmY3ZmZmN2Y0YTJkZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdm ZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZTcxYzAwMDANCmE1MTRmZjdmZmY3 ZmZmN2ZmZjdmZmY3ZjQyMDg2MjBjNDEwOGZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdm ZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2Zm ZjdmDQpmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdm ZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2Zl NzFjNDIwYzYzMTBlNzFjZmY3Zg0KZmY3ZmZmN2ZmZjdmYTUxNDIxMDQ0MjA4ZmY3ZmZmN2ZmZjdm ZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2YwMDAwMjEwNDIxMDQwMDAwYzYxOGZmN2Zm ZjdmZTcxY2U3MWNmZjdmMDAwMDQyMGM4NDEwZmY3ZmZmN2YNCmZmN2Y2MzBjZmY3ZmZmN2ZmZjdm NjMwY2E1MTRmZjdmZmY3ZmZmN2ZmZjdmMDgyMWZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2Zm ZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2YyMTA0MjkyNWZmN2ZmZjdmZmY3ZmZmN2ZjNjE4DQo2MjBj NjIwY2U3MWNmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2Zm ZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZm N2ZmZjdmZmY3Zg0KZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2Zm ZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmNDIwYzYyMGM0MjBjZmY3ZmZmN2ZmZjdmZmY3ZmZm N2YyMTA4YzYxOGZmN2ZmZjdmZmY3ZmZmN2YNCmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2Zm ZjdmMjEwNDQyMGM4NDEwZmY3ZjAwMDAyMTA4ZmY3ZmZmN2YwMDAwNDIwODAwMDAwMDAwNjIwY2Zm N2ZmZjdmZmY3ZmZmN2YyMDA0ZmY3ZmZmN2Y0MjBjNDIwYzg0MTBmZjdmDQpmZjdmZmY3ZmZmN2Y0 MTA4NDIwOGZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZm N2YyMTA0MDAwMDAwMDBmZjdmZmY3ZmZmN2YwMDAwNDEwODYzMGM2MzBjZmY3ZmZmN2ZmZjdmZmY3 Zg0KZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZm N2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3 ZmZmN2ZmZjdmZmY3ZmZmN2YNCmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZjQy MDg2MzEwNjMxMGZmN2ZmZjdmZmY3ZjAwMDBhNTE0NDIwOGZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3 ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmDQpmZjdmNjMxMGM2MThmZjdmZmY3ZjYy MGNmZjdmZmY3ZmZmN2Y4NDEwZmY3ZjAwMDA0MTA4ZmY3ZmZmN2ZmZjdmZmY3ZjIxMDRmZjdmNDIw OGE1MTRjNjE4ZmY3ZmZmN2ZmZjdmZmY3ZmZmN2Y2MzBjZmY3ZmZmN2ZmZjdmNDIwOA0KMjEwNDg0 MTBmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2YwMDAwMjAwNDg0MTBmZjdmZmY3 ZmZmN2YwMDAwNjMwYzgzMTAyMTA4MDAwMGZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdm ZmY3ZmZmN2YNCmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3 ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdm ZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmDQo0MjA4NjIwY2E1MTRmZjdmZmY3ZmZmN2YwMDAwMjEw OGE1MTRmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdm ZmY3ZmZmN2ZmZjdmZmY3ZjYyMGNjNjE4NDEwODQyMGMwMDAwZmY3Zg0KZmY3ZmZmN2YyMTA0ZmY3 Zjg0MTBmZjdmZmY3ZmZmN2ZmZjdmNDIwODQyMGNmZjdmZmY3ZjQyMDgwMDAwZmY3ZmZmN2ZmZjdm MDAwMDYyMGNhNTE0ZmY3ZjQyMGMyMTA0MDAwMGZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2YN CmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZjIxMDRmZjdmZmY3ZmZmN2ZmZjdmZmY3ZjYzMTAyMTA4 ZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2Zm ZjdmZmY3ZmZmN2ZmZjdmDQpmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdm ZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZjYyMGM2 MjBjNDIwOGZmN2ZmZjdmZmY3ZmU3MWMyMTA0NDIwOA0KZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdm ZmY3ZjAwMDBmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2YwMDAwNjIwYzYzMGNm ZjdmYzYxODg0MTBmZjdmZmY3ZmZmN2Y0MjA4NjMxMGZmN2ZmZjdmZmY3ZmZmN2YNCmZmN2Y4MzEw MjEwNGZmN2ZmZjdmNDEwOGZmN2ZmZjdmZmY3ZmZmN2Y0MjA4ODMxMDQyMDg2MzEwZTcxY2ZmN2Zm ZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZm N2YyMTA0DQpmZjdmZmY3ZmZmN2ZmZjdmMjkyNTYzMTA0MjA4MDAwMGZmN2ZmZjdmZmY3ZmZmN2Zm ZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZm N2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3Zg0KZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2Zm ZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2Y2MjBjNDIwYzQyMDhmZjdmZmY3ZmZmN2Y4NDEwNDIwOGZm N2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmYzYxODIxMDgNCjIxMDRmZjdmZmY3ZmZmN2Zm ZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2Y0MjA4ZmY3ZmZmN2ZmZjdmZTcxY2ZmN2ZmZjdmZmY3ZmZm N2YyMTA0ZmY3ZmZmN2ZmZjdmZmY3ZmM2MThjNjE4ZmY3ZmZmN2YwODIxMjEwNDYzMGNmZjdmDQpm ZjdmZmY3ZjQyMGNmZjdmNjMwYzIxMDhmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZm N2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2Y0MjA4MjkyNWZmN2ZmZjdmZmY3 ZmZmN2Y2MzEwNDEwOA0KMDAwMGZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZm N2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3 ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2YNCmZmN2ZmZjdmZmY3ZmZmN2ZjNjE4NjIwYzQy MGMwMDAwZmY3ZmZmN2ZmZjdmNjIwYzYzMGNmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2YwMDAwMDgy MTQyMDg4NDEwMDAwMGZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmDQpmZjdmZmY3ZjQx MDg0MTA4MjEwNDRhMjlmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3 ZmZmN2ZmZjdmZmY3ZmZmN2YwMDAwZmY3ZmZmN2ZmZjdmMjEwNDQyMGMwMDAwZmY3ZjIxMDhmZjdm ZmY3Zg0KZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZjAwMDBmZjdmMDAwMGZmN2ZmZjdmZmY3 ZmZmN2ZmZjdmZmY3ZmZmN2Y0MjA4NDIwODAwMDBmZjdmZmY3ZmZmN2Y2MzEwNDIwODAwMDBmZjdm ZmY3ZmZmN2ZmZjdmZmY3ZmZmN2YNCmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3 ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdm ZmY3ZmZmN2ZmZjdmZmY3ZmZmN2Y0MjBjNDIwODAwMDBmZjdmDQpmZjdmZmY3ZjIxMDRmZjdmZmY3 ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZjIxMDQ2MzEwODQxMGZmN2ZmZjdmZmY3ZmZmN2ZmZjdm ZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3Zjg0MTBmZjdmZmY3ZmZmN2ZmZjdmZmY3Zg0KZmY3 ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdm ZmY3ZmZmN2ZmZjdmMDAwMGZmN2ZmZjdmNDIwODA4MjFmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2Zm ZjdmZmY3ZjIxMDQNCjQyMDhjNjE4MDAwMGZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2Y2MzBj MjAwNGZmN2ZmZjdmZmY3ZmZmN2Y2MzEwMjEwOGZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2Zm ZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmDQpmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdm ZmY3ZmZmN2ZmZjdmZmY3ZjE2MTAwMDAwMjYwNjBmMDAyMjIwNTc0ZDQ2NDMwMTAwMDAwMDAwMDAw MTAwMDAwMDAwMDAwMDAwMDYwMDAwMDAwMDIwMDAwMDc0M2QwMDAwNzRiZA0KMDAwMGZmN2ZmZjdm ZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmNDIwYzQyMGMwMDAwZmY3ZmZmN2ZmZjdmMjEwODIxMDRm ZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmNjMxMDAwMDA2MjBjNDEwOGZm N2YNCmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2Zm ZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZm N2ZmZjdmZmY3ZmZmN2ZmZjdmDQpmZjdmZmY3ZmZmN2Y2MzBjNDIwODEwNDJmZjdmZmY3ZmZmN2Zm ZjdmZmY3ZjAwMDAyMTA4ODQxMGZmN2ZmZjdmZmY3ZjQxMDhmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZm N2ZmZjdmYTUxNDIxMDQwMDAwZmY3ZmZmN2ZmZjdmNjMxMA0KNDIwOGZmN2ZmZjdmZmY3ZmZmN2Zm ZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZm N2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2YNCjQxMDg2 MjBjZTcxY2ZmN2ZmZjdmZmY3ZjIxMDRmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZm N2ZmZjdmZmY3ZmZmN2Y4MzEwNjMxMGZmN2YwMDAwZmY3ZjQyMDhmZjdmZmY3ZmZmN2ZmZjdmZmY3 ZmZmN2ZmZjdmDQpmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZm N2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3 ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3Zg0KZmY3ZmZmN2ZmZjdmZmY3ZjQyMDhmZjdmZmY3ZmZm N2ZmZjdmMjEwNDAwMDBmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmYzYxODAwMDBmZjdmZmY3 ZmZmN2ZhNTE0NjMxMGE1MTRmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2YNCmZmN2ZmZjdmZmY3ZmZm N2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3 ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmNjMwYzYyMGNhNTE0ZmY3ZmZmN2ZmZjdmMjEwNDYzMGNmZjdm DQpmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZjAwMDA0MjBjNjMw Y2ZmN2Y0MjA4MjEwNGU3MWNmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdm ZmY3ZmZmN2ZmZjdmZmY3Zg0KZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3 ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdm ZmY3ZmZmN2ZmZjdmNjMwY2ZmN2ZmZjdmZmY3ZmZmN2YNCmZmN2Y0MjBjZmY3ZmZmN2ZmZjdmZmY3 ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmYzYxODQxMDgwMDAwZmY3ZmZmN2YyMTA4NjMxMDg0MTBmZjdm ZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmDQpmZjdmZmY3 ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmM2MTg2MjBj ODQxMGZmN2ZmZjdmZmY3ZjIxMDRmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmYzYxOGZmN2Zm ZjdmZmY3Zg0KZmY3ZmZmN2ZmZjdmZmY3ZmE1MTQ0MjBjMjEwODYzMGNmZjdmZmY3ZmZmN2ZmZjdm ZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2Zm ZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2YNCmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdm ZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZlNzFjMDAwMGZmN2Zm ZjdmZmY3ZmU3MWMyMTA4ZmY3ZmZmN2ZmZjdmMjEwNGZmN2ZmZjdmDQpmZjdmZmY3ZmZmN2ZmZjdm NjMwYzQyMDhmZjdmZmY3ZmZmN2YyMTA4NjIwY2ZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2Zm ZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3Zg0K ZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZhNTE0NDIwYzQyMGNmZjdmZmY3ZmZmN2ZhNTE0YzYxOGZmN2Zm ZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2Y0MjA4NjIwYzIxMDQwMDAwZmY3ZmZmN2ZmZjdmZmY3ZmU3 MWM4NDEwZmY3ZmZmN2YNCmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2Zm ZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZm N2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmDQpmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2Zm ZjdmZmY3ZmZmN2ZmZjdmZmY3ZjAwMDA0MjA4ZmY3ZmZmN2YwMDAwNDIwODQyMDhmZjdmZmY3ZmZm N2Y2MzEwYTUxOGZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3Zjg0MTQwODIxZmY3Zg0KZmY3ZjAwMDA0 MjBjNjIwY2ZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZm N2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2YyMTA4NjMw Y2ZmN2YNCmZmN2ZmZjdmNDEwODQyMDhmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmE1 MTQ0MTA4MDAwMDAwMDBlNzFjZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3 ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmDQpmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZm N2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3 ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3Zg0KZmY3ZmZmN2ZmZjdmZmY3ZmZm N2YyMTA0MDAwMDAwMDRmZjdmZmY3ZmZmN2ZmZjdmNDIwY2M2MTgwMDAwZmY3ZmZmN2ZmZjdmZmY3 ZmZmN2ZmZjdmZmY3ZjIxMDRmZjdmZmY3ZmZmN2YwMDAwNDIwYzQyMDhmZjdmZmY3ZmZmN2YNCmZm N2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3 ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmYTUxNDgzMTA2MzBjZmY3ZmZmN2ZlNzFjMjAwNDAwMDBmZjdm ZmY3ZmZmN2ZmZjdmDQpmZjdmZmY3ZmZmN2ZmZjdmZmY3ZjYyMGNmZjdmZmY3ZjYzMGM0MjBjMjAw NGZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdm ZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3Zg0KZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3 ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdm ZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2YNCmZmN2ZmZjdmZmY3 ZjYzMGNjNjE4MDAwMGZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZjIxMDRmZjdm ZmY3ZmZmN2ZjNjE4NjMxMGE1MTRmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2Zm ZjdmDQpmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2Y2MzBj NDIwOGZmN2ZmZjdmZmY3ZjAwMDRmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2Y2YjJkZmY3ZmZmN2Zm ZjdmZmY3ZjQyMGNjNjE4ZmY3Zg0KZmY3ZjQyMDhmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdm ZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2Zm ZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2YNCmZmN2ZmZjdmZmY3ZmZmN2ZmZjdm ZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2Zm ZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmNjIwY2ZmN2Y0MjA4ZmY3ZmZmN2ZmZjdmDQpmZjdm ZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZjQyMDhmZjdmZmY3ZmZmN2Y0MjA4NDIwY2ZmN2Zm ZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZm N2ZmZjdmZmY3Zg0KZmY3ZmZmN2ZmZjdmNDIwODYyMGMwMDAwZmY3ZmZmN2ZlNzFjODQxMGZmN2Zm ZjdmZmY3ZmZmN2ZmZjdmNDIwY2ZmN2ZmZjdmZmY3ZmZmN2ZmZjdmMjEwNDQyMGMwMDAwZmY3ZmZm N2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2YNCmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2Zm ZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZm N2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmDQpmZjdmZmY3ZmZmN2Zm ZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZjQy MDg2MzBjZmY3ZjA4MjE0YTI5ZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3 Zg0KYTUxNDg0MTBmZjdmZmY3ZmZmN2Y2MzEwNDEwOGZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZm N2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZhNTE0NjIw Y2M1MThmZjdmZmY3ZmZmN2YNCjIxMDRmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2YyMTA0NjMxMGZm N2ZmZjdmZmY3ZmZmN2ZmZjdmNDIwYzQyMDhmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3 ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmDQpmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZm N2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3 ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3Zg0KZmY3ZmZm N2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZjIxMDhmZjdmZmY3ZmZmN2ZmZjdmZmY3 ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZjAwMDAwMDAwZmY3ZmZmN2ZjNjE4 NjMxMDZiMmQNCmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3 ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmMDAwMDQyMDg0MjBjZmY3ZmZmN2ZmZjdmMjEwNGZmN2ZmZjdm ZmY3ZmZmN2ZmZjdmMDAwMGZmN2YwMDAwDQo0MjA4YTUxNDA4MjFhNDE0ZmY3ZmZmN2Y0MjA4ZmY3 ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdm ZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3Zg0KZmY3ZmZmN2ZmZjdmZmY3 ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdm ZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2YN CmZmN2ZmZjdmZmY3ZjIxMDhmZjdmMDgyMWZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdm ZmY3ZmZmN2ZmZjdmMDAwMDIxMDRmZjdmZmY3ZjAwMDA0MjBjNDIwY2ZmN2ZmZjdmZmY3ZmZmN2Zm ZjdmZmY3ZmZmN2ZmZjdmDQpmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2Y4NDE0 NjMxMGZmN2ZmZjdmZmY3ZmE1MTRmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2YyMTA0ZmY3ZmZmN2Y2 MzBjNDIwYzQyMDg0MjA4MDAwMGZmN2ZmZjdmZmY3Zg0KZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdm ZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2Zm ZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2YNCmZmN2ZmZjdm ZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2Zm ZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2Y0MjA4ZmY3ZmZm N2ZmZjdmDQpmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmYTUxNGZmN2Zm ZjdmZmY3Zjg0MTA2MzBjYzYxOGZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZm N2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3Zg0KZmY3ZjYzMGM0MTA4ZmY3ZmZmN2YwMDAwMDAwNDAwMDBm ZjdmZmY3ZmZmN2ZmZjdmNGEyOTYzMTA0MjBjMjEwNDQyMDgwMDAwZmY3ZjQyMGNjNjE4ZmY3ZmZm N2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2YNCmZmN2ZmZjdmZmY3ZmZmN2Zm ZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZm N2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmDQpm ZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZm N2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3 ZmZmN2ZmZjdmZmY3Zg0KZmY3ZmZmN2ZmZjdmNDEwOGZmN2ZmZjdmZmY3ZjYyMGM0MjA4ZmY3ZmZm N2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmNjMx MDYyMGMwMDAwZmY3ZmZmN2Y0MjBjMDAwMGZmN2YNCmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmE1 MTQ0MjBjNDIwOGZmN2ZmZjdmMjAwNGZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3 ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmDQpmZjdmZmY3ZmZm N2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3 ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdm ZmY3Zg0KZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3 ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmNjMwY2ZmN2ZmZjdmZmY3ZmZmN2ZmZjdm ZmY3ZmE1MTRmZjdmZmY3ZmZmN2YNCjYzMTA4NDEwZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3 ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZjAwMDA0MjBjNDIwY2ZmN2ZmZjdmZmY3ZjIxMDRmZjdm ZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2YyMTA0DQo0MjA4ODQxNGE1MTRjNjE4ZmY3 ZmZmN2ZmZjdmZmY3ZmZmN2YwMDAwZmY3ZjAwMDBmZjdmMDAwMGZmN2YwMDAwZmY3ZjAwMDBmZjdm MDAwMGZmN2YwMDAwZmY3ZjAwMDBmZjdmMDAwMGZmN2YwMDAwZmY3ZjAwMDBmZjdmMDAwMA0KZmY3 ZjAwMDBmZjdmMDAwMGZmN2YwMDAwZmY3ZjRhMjlmZjdmMjkyNWZmN2YwMDAwZmY3ZjAwMDBmZjdm MDAwMGZmN2YwMDAwZmY3ZjAwMDBmZjdmMDAwMGZmN2YwMDAwZmY3ZjAwMDBmZjdmZmY3ZmZmN2Yw MDAwZmY3ZmZmN2YNCmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdm ZmY3ZjI5MjU2MjBjNjMwY2ZmN2ZmZjdmZmY3ZmZmN2ZmZjdmMjEwNDAwMDBmZjdmMDAwMDQyMDg2 MjBjZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmDQpmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdm NjIwYzYzMTBmZjdmZmY3ZmZmN2YyMTA4ZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2Zm ZjdmZmY3ZmZmN2ZmZjdmNDEwODQxMDhmZjdmZmY3ZmZmN2ZmZjdmZmY3Zg0KYTUxNGZmN2YwODIx ZmY3ZjIxMDQyMTA4MjEwNDIxMDQ0YTI5NmIyZDQyMDhmZjdmNDEwOGZmN2Y2MzBjYTUxNDAwMDAy MTA0NGEyOTRhMjkwODIxMDgyMWE1MTQ2YjJkNjIwYzQyMDg2MjBjYzUxODQyMDg2MjBjNDIwYzQy MDgNCjQyMGM0MTA4MjEwODg0MTAyMTA4MjEwODQyMDgyMTA4MjEwODQxMDg0MTA4NDEwODQyMDgy MTA0NDIwODIxMDQ0MjA4MDAwNDIxMDQyMTA0MjEwNDAwMDAyMTA0MDAwMDIxMDQwMDA0ZmY3ZmZm N2ZmZjdmZmY3ZmZmN2ZmZjdmDQpmZjdmZmY3ZmZmN2Y4NDEwNDIwY2ZmN2ZjNjFjZmY3ZmZmN2Zm ZjdmZmY3ZmZmN2Y0MjA4NDIwOGZmN2ZmZjdmYzYxODYyMGM0YTI5ZmY3ZmZmN2ZmZjdmZmY3ZmZm N2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmNjIwYw0KNDIwOGZmN2ZmZjdmMDAwMDQyMGNm ZjdmZmY3ZmZmN2ZmZjdmMDAwMDIxMDQyMTA0ZmY3ZmZmN2ZmZjdmZmY3ZmZmN2YwODIxZmY3ZmZm N2ZmZjdmZmY3ZmZmN2ZmZjdmNjMwYzAwMDBmZjdmMDAwMGZmN2YwMDAwZmY3ZjAwMDANCmZmN2Yw MDAwZmY3ZmZmN2ZmZjdmZmY3ZmZmN2YwMDAwZmY3ZjAwMDBmZjdmMDAwMGZmN2ZmZjdmZmY3ZmZm N2ZmZjdmNDIwOGZmN2YwMDAwZmY3Zjg0MTBmZjdmMDAwMGZmN2YwMDAwODQxMGZmN2ZmZjdmMDAw MGZmN2YyMTA0DQpmZjdmMjkyNWZmN2YwMDAwMjEwNGZmN2YyMTA4MDAwMGZmN2YwMDAwZmY3ZjAw MDBmZjdmMDAwMGZmN2YwMDAwZmY3ZjIxMDRmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2YyMTA4Mjky NTQxMDhjNjE4ZmY3ZmZmN2ZmZjdmZmY3Zg0KZmY3ZmZmN2ZmZjdmZmY3ZmZmN2YyMTA0ZmY3ZmZm N2ZmZjdmNDIwYzQxMDgwMDAwZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3 ZmM2MTg2MjBjZTcxY2ZmN2ZmZjdmMjEwODAwMDBmZjdmZmY3ZmZmN2YNCmZmN2ZhNTE0NjMwY2Zm N2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmMDAw MDYzMGNmZjdmNjMwYzIxMDgyMTA0MDAwMDIxMDgwMDAwMjEwOGZmN2ZmZjdmZmY3ZmZmN2ZmZjdm DQpmZjdmZmY3ZjAwMDBmZjdmNjMwY2ZmN2YwMDAwZmY3ZmE1MTRmZjdmMDAwMGZmN2ZmZjdmZmY3 ZjAwMDBmZjdmZmY3ZmZmN2YwMDAwZmY3ZjAwMDBmZjdmYTUxNGZmN2Y4NDEwZmY3ZjAwMDBmZjdm ZmY3ZmZmN2ZmZjdmZmY3Zg0KZmY3ZmZmN2ZhNTE0MDAwMGE1MTQ0MjBjNDIwOGE1MTRmZjdmMjEw NDAwMDBmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmE1MTg2MzBjMDAwMGZmN2ZmZjdmZmY3ZmZmN2ZmZjdm ZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmYzYxOGZmN2YNCmZmN2Y4NDEwNjMxMGZmN2ZmZjdmZmY3 ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2YwMDAwNDIwODYyMGNmZjdmZmY3ZmZmN2YyMTA0 ZmY3ZmZmN2ZmZjdmZmY3ZmZmN2YyMTA4ZmY3ZjIxMDRhNTE0MDAwMGZmN2YyMTA0DQpmZjdmZmY3 ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2YwMDAwZmY3ZjAwMDA0MjBjNDIwODAwMDAwMDAw NDIwODAwMDA0MTA4NjMxMDQyMDg2MjBjNjIwYzQyMDgyMTA0NjMwYzIxMDQwMDAwMjEwODg0MTAy MTA4NjMwYw0KNDIwODYzMTA0MjA4NjMwYzQyMDg2MzBjNjMwYzQyMDg0MjA4NDIwODIxMDQ2MjBj NDIwODYzMTAwMDAwZTcxY2ZmN2YyMTA0MjEwNDAwMDQwMDAwMDAwMDAwMDAwMDAwMjEwNDAwMDBh NTE0MDAwMDIxMDRhNTE0ZmY3ZjYyMGMNCjYyMGM0MTA4ZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdm ZmY3ZmE1MTRmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2YyMTA0MDAwMGZmN2ZmZjdmZmY3ZjAwMDAw MDAwZmY3ZmZmN2YwMDAwNjIwYzQyMDhmZjdmZmY3ZmZmN2ZmZjdmDQpmZjdmZmY3ZmZmN2ZmZjdm ZmY3ZmZmN2Y2MzEwMjEwOGZmN2ZmZjdmNDIwOGZmN2ZmZjdmZmY3ZmZmN2ZmZjdmYTUxNDQyMDhm ZjdmZmY3ZjYyMGM2MzBjZmY3ZjIxMDQwMDAwZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3Zg0K ZmY3ZmZmN2ZmZjdmZmY3ZjYzMGNmZjdmZmY3ZmZmN2ZmZjdmZmY3ZjQyMDgyMDA0ZmY3ZmZmN2Y0 MjA4ZmY3ZjQyMDgyMDA0ODQxMGZmN2Y4NDEwZmY3ZmZmN2ZmZjdmZmY3ZjIxMDRmZjdmZmY3ZmZm N2ZmZjdmZmY3ZmZmN2YNCmZmN2ZmZjdmZmY3ZmZmN2ZhNTE0ZmY3ZmZmN2ZmZjdmZmY3ZmZmN2Yy MTA4MjEwNGZmN2ZmZjdmZmY3ZmZmN2Y4NDEwZmY3ZmZmN2ZmZjdmZmY3ZmZmN2Y4YzMxZmY3ZjYy MGNmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmDQpmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2Zm ZjdmMjEwNDQxMDhmZjdmZmY3ZmZmN2ZmZjdmZmY3Zjg0MTBmZjdmZmY3ZmZmN2Y0MjA4NDIwY2Zm N2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3Zjg0MTQ2MzEwNjMwYw0KZmY3ZmZmN2Yy MDA0MDAwMGZmN2ZmZjdmZmY3ZmZmN2YyMTA0NjIwYzQyMGM2MjBjYTUxNGZmN2ZmZjdmMjEwOGZm N2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2YyMTA4ZmY3 ZjIxMDQNCmZmN2ZmZjdmZmY3ZjAwMDBmZjdmZmY3ZmZmN2Y0MjBjNDIwOGZmN2YyMDA0MDAwMGZm N2ZmZjdmZmY3ZmZmN2Y4NDEwYzYxOGZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3 ZmZmN2YyMTA0MjEwNGZmN2Y2MzBjDQpmZjdmZmY3ZmZmN2Y0MjA4ZmY3ZmZmN2ZmZjdmZmY3ZmZm N2YyMTA0ZmY3ZjAwMDBmZjdmZmY3ZmZmN2YwMDAwNDIwODAwMDA4NDEwNjMwY2ZmN2ZmZjdmZmY3 ZmZmN2ZmZjdmZmY3ZmZmN2YwMDAwZmY3ZjIxMDQyMTA0MDAwMA0KZmY3ZjAwMDBmZjdmZmY3ZmZm N2ZmZjdmZmY3ZjQyMDhmZjdmZmY3ZmE1MTQ4MzEwYzYxOGZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3 ZmZmN2ZmZjdmNDIwODYyMGNmZjdmZmY3ZmZmN2ZjNjE4ZmY3ZmZmN2ZmZjdmZmY3ZmZmN2YNCmZm N2ZmZjdmMDAwMGZmN2Y0MjBjMjEwODYyMGNmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3 ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2YwMDAwNDIwOGZmN2ZmZjdmYzYxOGZmN2YyMTA0 ZmY3ZmZmN2YyMTA0DQpmZjdmZmY3ZjQyMDhmZjdmMjEwNGZmN2ZmZjdmZmY3ZjA4MjE0MjA4ZmY3 ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmODQxMDAwMDRmZjdm ZmY3ZjI5MjU0MjA4MjEwNGZmN2ZmZjdmZmY3Zg0KZmY3ZmZmN2Y0YTI5ZmY3ZjZiMmRmZjdmMDAw MDIwMDQ0MjA4ZmY3ZjQyMDhmZjdmODQxMDg0MTBmZjdmZmY3ZmZmN2ZmZjdmYzYxODQyMDhjNjFj ZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZjAwMDANCmZmN2ZmZjdmMDAw MDQyMGM0MjA4ZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2Y4MzEwNjMwY2ZmN2ZmZjdm YTUxNGZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmNjMwYzIxMDhm ZjdmDQpmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdm ZmY3ZmZmN2YwMDAwZmY3ZmZmN2ZmZjdmMDAwMDIxMDQyMTA0ZmY3ZjQyMDhjNTE4MjEwOGZmN2Zm ZjdmMjEwODQyMDhmZjdmZmY3Zg0KZmY3ZjYzMGNmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdm ZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmNjMwYzg0MTBmZjdmZmY3ZmM2MTg2YjJkMjEwNGZmN2Zm ZjdmZmY3ZmZmN2ZmZjdmZmY3ZmU3MjBmZjdmZmY3ZjAwMDANCjIxMDhlNzFjYzYxODIxMDQyMTA4 NjIwYzQyMDhmZjdmZmY3ZmZmN2ZmZjdmNDIwODQyMGM2MzBjNDIwOGM1MTg2MzBjMjkyNWZmN2Zm ZjdmZmY3ZmZmN2ZmZjdmNDIwOGZmN2ZmZjdmZmY3ZjQyMGM2MjBjMDAwMGZmN2ZmZjdmDQpmZjdm ZmY3ZmZmN2ZmZjdmZTcxYzYyMGNjNjE4ZmY3ZmZmN2YwMDA0ZmY3ZmZmN2ZmZjdmZmY3ZmZmN2Zm ZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZm N2ZmZjdmZmY3Zg0KZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2YyMTA0ZmY3ZmZmN2Yy MTA0MDAwMDIwMDRmZjdmZmY3ZjQyMGNmZjdmZmY3ZmU3MWMyMTA4ZmY3ZmZmN2ZmZjdmMjEwNDg0 MTBmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2YNCmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2Zm ZjdmMDAwMGZmN2YyOTI1MjkyNTZiMmQ4NDEwZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmMjkyNWZm N2ZmZjdmNjMwYzQyMDhmZjdmZmY3ZmZmN2YyMTA4ZmY3ZjIxMDRmZjdmDQpmZjdmZmY3ZmZmN2Zm ZjdmZmY3ZmZmN2ZmZjdmODQxMDYzMTA0MjBjNDIwOGZmN2ZmZjdmZmY3ZmZmN2ZmZjdmMjEwOGZm N2ZmZjdmMjkyNTYzMTBmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmNDEwODYzMTBmZjdmZmY3 Zg0KZmY3Zjg0MTBmZjdmZmY3ZmZmN2ZmZjdmZmY3ZjZiMmQ0MjA4MDAwMGZmN2ZmZjdmZmY3ZmZm N2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3 ZmZmN2ZmZjdmZmY3ZmZmN2YNCjAwMDBmZjdmZmY3ZmZmN2ZmZjdmODQxMDAwMDAwMDAwODQxMDYz MGMwMDAwODQxMDYzMGNmZjdmZmY3ZjAwMDBmZjdmNjMwY2ZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3 ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZlNzFjDQoyMTA4ZmY3ZmZmN2YwMDAwYTUxNDAw MDBmZjdmZmY3ZmZmN2ZmZjdmZmY3ZjQyMDhmZjdmYTQxNDQyMDgwMDAwMDAwMGZmN2ZmZjdmZmY3 ZmZmN2Y0MjA4ODQxMDYzMGNmZjdmZmY3ZmZmN2ZmZjdmZmY3ZjAwMDBhNTE0NDIwOA0KNjMwYzAw MDBmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2YwMDAwZmY3ZmZmN2YwMDAwNjMxMDQyMGNmZjdmZmY3 ZmZmN2ZmZjdmZmY3ZmZmN2Y0MjBjNDEwOGZmN2ZmZjdmMjkyNWZmN2ZmZjdmZmY3ZmZmN2ZmZjdm MjEwOGZmN2YNCmE1MTQyMTA4ZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3 ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZjAwMDRmZjdm ZmY3ZmZmN2Y2MzBjZmY3ZjIxMDQyMTA0DQo0MjBjNDIwYzAwMDAwMDAwZmY3ZmZmN2ZmZjdmZmY3 ZmZmN2YyMTA0ZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdm ZmY3ZjAwMDBmZjdmZmY3Zjg0MTA2MzBjNDEwOGZmN2ZjNjE4ZmY3Zg0KZmY3ZmZmN2Y2MzBjZmY3 ZmZmN2ZmZjdmZmY3ZmZmN2YwMDAwZmY3ZmZmN2ZmZjdmZmY3ZmZmN2YwMDAwMjEwNGZmN2ZmZjdm ZmY3ZmZmN2Y0MjA4MjEwNDIxMDRmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2YN CmE1MTRmZjdmZmY3ZmZmN2Y0MjBjNDIwY2ZmN2ZmZjdmZmY3ZmZmN2ZmZjdmMDAwMDYzMTA4NDEw ZmY3ZmZmN2YyMTA0MDAwMGZmN2ZmZjdmZmY3ZjAwMDAyMTA0ZmY3ZmZmN2Y2MjBjZmY3ZjhjMzEy MTA4MDAwMGZmN2ZmZjdmDQpmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdm ZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmNjMwYzAwMDBmZjdmZmY3ZmZmN2YwMDAwMDAwMDAwMDA2 MzBjNjMwYzIxMDRjNjE4ZmY3ZjAwMDBmZjdmZmY3Zg0KMDAwMDYzMGNmZjdmZmY3ZmZmN2ZmZjdm ZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmNjMwY2ZmN2YyMTA4MDAwMDAwMDAw MDAwNDIwOGZmN2Y0MjA4ODQxMDIxMDRmZjdmZmY3ZmZmN2YwMDAwNjMwYzQyMGMNCjIxMDhmZjdm ZmY3ZmZmN2ZmZjdmMDAwMDg0MTAwMDAwZmY3ZmZmN2ZmZjdmZmY3ZmZmN2YwMDAwZmY3ZmZmN2Zm ZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2YwODIxZmY3ZmZmN2YwODIxODMxMGZm N2ZmZjdmDQpmZjdmZmY3ZmZmN2Y4MzEwNjMxMGZmN2ZmZjdmZmY3ZjIxMDRmZjdmZmY3ZmZmN2Zm ZjdmZmY3ZjIxMDRmZjdmZmY3ZjQyMDhmZjdmZmY3ZjAwMDBmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZm N2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3Zg0KZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2Yy OTI1ZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZjYyMGM2MjBjMjEwNGZmN2YwMDAwZmY3ZmZm N2ZmZjdmZmY3ZjAwMDA2MjBjMDAwNDIxMDQyMTA4MjEwNDAwMDANCjQyMDgwMDAwMDAwMGZmN2Yw MDAwZmY3ZjIxMDhmZjdmMjEwNGZmN2Y0YTI5NDEwODIxMDQyMTA0YTUxNGZmN2YyMTA0ZmY3ZmZm N2ZmZjdmNjMxMGZmN2ZmZjdmZmY3ZjRhMjlmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmE1MTRmZjdmDQow MDAwZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZjQyMDhmZjdmZmY3ZmZm N2ZmZjdmZmY3ZjAwMDBmZjdmZmY3ZjIxMDQ2MjBjMjEwNGZmN2ZmZjdmZmY3ZmZmN2Y2MzBjNjMx MDAwMDBmZjdmMDAwMA0KMjEwNGZmN2ZmZjdmZmY3ZmZmN2YwMDAwNDEwODQyMDhmZjdmNDIwODI5 MjUwMDAwMDAwMGZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3 ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2YNCmZmN2Y2MjBjNjMwYzIxMDQ0MjA4NmIyZGZm N2YyMTA0MDAwMDYzMGNmZjdmNjMwY2ZmN2ZmZjdmZmY3ZmZmN2Y2MzBjNDIwOGU3MWMwMDAwYzYx OGM2MThmZjdmNjMwYzIxMDQwMDAwMjEwNDYzMGMwMDAwNDIwODQyMGMyMTA4DQowMDAwMjEwNDIx MDQ0MjBjZmY3ZmZmN2Y0MTA4NDIwODAwMDBmZjdmODQxMDAwMDBmZjdmZmY3ZmZmN2YyMTA0ZmY3 ZmZmN2ZmZjdmZmY3ZmZmN2ZhNTE0ZmY3ZjZiMmRmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmFkMzVmZjdm MDAwMA0KZmY3ZjA4MjE0MTA4NjMxMGZmN2ZmZjdmZmY3ZmZmN2ZmZjdmMjEwNGZmN2ZmZjdmZmY3 ZjYzMTAyMTA4ZmY3ZmZmN2ZmZjdmZmY3ZjIxMDg0MjBjZmY3ZmZmN2ZmZjdmZTcxY2ZmN2ZmZjdm ZmY3ZmZmN2ZmZjdmMDAwMGZmN2YNCmZmN2Y4NDEwNDIwODIxMDRjNjE4ZmY3ZmZmN2ZmZjdmZmY3 ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdm ZmY3ZjAwMDBlNzIwZmY3ZmZmN2ZmZjdmZmY3ZjQyMDhmZjdmDQoyMTA0MjEwNDAwMDAwMDAwZmY3 ZjIxMDRmZjdmZmY3ZjAwMDAyMTA0MDAwMGZmN2ZhNTE0ZmY3ZmZmN2YwMDAwZmY3ZmZmN2Y0MjA4 ZmY3ZmZmN2Y0MjA4MDAwMGZmN2Y0MjBjNDIwYzAwMDBmZjdmNDIwODAwMDQ2MzBjNDEwOA0KZmY3 ZmZmN2ZmZjdmZmY3ZjYzMGMwMDAwNDEwOGZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZjIxMDQwMDAw ODQxMGZmN2ZmZjdmZmY3ZmZmN2ZmZjdmYTUxNDYyMGM0MjBjNDIwYzIxMDg4NDEwZmY3ZmU3MWNm ZjdmZmY3ZmZmN2YNCmZmN2Y0MjA4MDAwMGZmN2ZmZjdmNDIwYzQyMDhmZjdmZmY3ZmZmN2ZmZjdm NjIwYzQxMDgwMDAwZmY3ZjRhMjlmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2Yw MDAwZmY3ZjAwMDBmZjdmZmY3ZmZmN2ZmZjdmDQpmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdm ZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZjAwMDBmZjdmZmY3ZmZmN2Yy OTI1ZmY3ZjYzMGNmZjdmMDAwMGZmN2Y2MzEwMjEwNGU3MWNmZjdmZmY3Zg0KZmY3ZjQyMDhmZjdm ZmY3ZjAwMDAwMDAwZmY3ZjYzMGNmZjdmMDAwMDA4MjFmZjdmMDAwMDAwMDBmZjdmYTUxNDYzMGMw MDAwNjMwYzQyMDhmZjdmMDAwMGE1MTQ0MjA4ZmY3ZjAwMDBhNTE0YTUxNGZmN2YwMDAwNDIwODAw MDANCmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmMjEwNGZmN2YyMTA0ZmY3ZmZmN2ZmZjdmZmY3ZmZmN2Yw MDAwNDEwODAwMDBmZjdmZmY3ZmZmN2ZmZjdmMjEwNGZmN2ZmZjdmZmY3ZmZmN2ZjNjE4ZmY3ZmZm N2ZmZjdmNDIwYzQyMDhmZjdmDQpmZjdmZmY3ZmZmN2Y0MjBjNjMwY2ZmN2ZmZjdmNDIwODAwMDBm ZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZm N2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3Zg0KZmY3ZmZmN2ZmZjdmZmY3ZmZmN2Zm ZjdmZmY3ZmZmN2YwMDAwZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZTcxYzQy MGMwMDAwZmY3ZmZmN2ZmZjdmODQxMDIxMDRmZjdmZmY3ZjQyMDhmZjdmYTUxNGZmN2YNCmZmN2Zm ZjdmZmY3ZmZmN2YyMTA0ZmY3ZmZmN2YwMDAwZmY3ZmZmN2YwMDAwZmY3ZmZmN2ZmZjdmMDAwMGZm N2YwMDAwZmY3ZmZmN2ZmZjdmMDAwMDQyMDgyMTA0ZmY3ZmZmN2ZmZjdmZmY3ZmZmN2Y0MjA4ZmY3 ZmZmN2ZmZjdmDQpmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2YwMDAwZmY3ZmZmN2ZmZjdmZmY3ZmZm N2Y0MjA4ZmY3ZmZmN2ZmZjdmZmY3ZmZmN2YyMTA0ZmY3ZmZmN2YyMTA0NDIwY2ZmN2ZmZjdmZmY3 ZmZmN2Y4MzEwZTcxY2ZmN2ZmZjdmNDIwOA0KZmY3ZmZmN2ZmZjdmZmY3ZmZmN2YyMTA4MjEwNGZm N2ZmZjdmZmY3ZmZmN2YwMDAwZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3 ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2YNCmZmN2YwMDAwZmY3ZjAw MDA4NDEwNGEyOWZmN2ZmZjdmZmY3ZjIxMDRhNTE0MDAwMDYzMGNhZDM1ZmY3ZmZmN2ZjNjE4NDIw OGZmN2Y0MjA4ZmY3ZmZmN2Y2MzBjZmY3ZmZmN2Y0MjA4ZmY3ZjAwMDBmZjdmZmY3ZmZmN2YwMDAw DQpmZjdmNjMwY2ZmN2ZmZjdmZmY3ZjAwMDBmZjdmODQxMGZmN2ZmZjdmZmY3ZjQyMDg2MzBjMDAw MDIxMDRmZjdmZmY3ZmZmN2ZmZjdmNjIwYzI5MjVmZjdmMjEwNDAwMDBmZjdmZmY3ZmZmN2ZmZjdm ZmY3ZmZmN2Y0MTA4MDAwMA0KZmY3ZmZmN2ZmZjdmODQxMGM2MThmZjdmZmY3ZmZmN2ZmZjdmMDAw MDg0MTBmZjdmZmY3ZmE1MTQ2MjBjMDAwMGZmN2ZmZjdmNGEyOTYyMGNjZTM5ZmY3ZmZmN2YwMDAw ZmY3ZmZmN2ZmZjdmZmY3ZjAwMDAyMDA0ZmY3ZmZmN2YNCmZmN2ZmZjdmMDAwMDQxMDhmZjdmZmY3 ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdm ZmY3ZmZmN2ZmZjdmZmY3ZjAwMDBmZjdmNDIwOGZmN2ZmZjdmZmY3ZmZmN2ZmZjdmDQpmZjdmZmY3 ZmZmN2Y2MzBjNDIwY2ZmN2ZmZjdmZmY3ZjQyMDhmZjdmZmY3ZmZmN2ZmZjdmZmY3ZjQyMDhmZjdm MDAwMGZmN2ZmZjdmZmY3ZmZmN2ZmZjdmNjMwY2ZmN2ZmZjdmMjEwNGZmN2ZmZjdmZmY3ZmZmN2Y2 MzBjZmY3Zg0KZmY3ZmM2MTg0MjA4ZmY3ZmFkMzVmZjdmMjEwOGZmN2ZmZjdmZmY3ZjIxMDRmZjdm ZmY3ZjIxMDRhNTE0ZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZjAwMDAyMTA0NDIwODQxMDg0 MjA4YTUxNGZmN2ZmZjdmZmY3ZmZmN2YNCmZmN2ZmZjdmMjEwNGZmN2ZmZjdmYzYxODYzMTBmZjdm ZmY3ZmZmN2ZhNTE0ODMxMGZmN2ZmZjdmZmY3ZjIxMDRmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmU3MWNm ZjdmNGEyOTIxMDRjNjE4ZmY3ZjI5MjVmZjdmZmY3ZmZmN2ZmZjdmDQpmZjdmMTYxMDAwMDAyNjA2 MGYwMDIyMjA1NzRkNDY0MzAxMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwNjAwMDAwMDAwMjAw MDAwNzQxZDAwMDA3NGJkMDAwMGZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3Zg0K ZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmNjIwYzQyMGNmZjdmMDAwMDA4MjEwMDAwMjEwNGU3MWM4 NDEwZmY3ZmZmN2Y0MjA4ZmY3ZjIxMDRmZjdmZmY3ZjIxMDQwMDAwZmY3ZmZmN2ZmZjdmMDAwMGZm N2ZmZjdmNDIwYzAwMDANCmZmN2Y2YjJkZmY3ZjQyMDhmZjdmZmY3ZmZmN2YwMDAwZmY3ZmZmN2Zm ZjdmNjMwY2ZmN2ZmZjdmNjMwYzQyMDhmZjdmMDgyMTQyMGM2MzEwYzYxOGZmN2ZmZjdmNjMwYzIx MDQwMDAwMjEwNDQyMDhmZjdmZmY3ZmZmN2ZmZjdmDQpmZjdmZmY3ZmZmN2ZmZjdmZmY3ZjAwMDBm ZjdmNDIwOGZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2YwMDAwMDAwNGZmN2ZmZjdmMDAwMDYz MTAwMDAwZmY3ZmZmN2Y0MTA4NjMxMDAwMDBmZjdmZmY3ZjAwMDBmZjdmZmY3Zg0KZmY3ZmZmN2Yy MTA0ZmY3ZmZmN2ZmZjdmYzYxOGZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZm N2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmMDAwNDIxMDQ0MjA4ZmY3ZmNlMzk0MTA4NjMw Y2ZmN2YNCmZmN2YwMDAwZmY3ZmZmN2YwMDAwZmY3ZjIxMDRmZjdmZmY3ZmZmN2YyMTA0ZmY3ZmZm N2ZmZjdmODQxMGZmN2ZmZjdmZmY3ZmZmN2ZjNjE4ZmY3ZmZmN2Y4NDEwZmY3ZmZmN2ZmZjdmZmY3 ZjIxMDRmZjdmZmY3ZmZmN2ZmZjdmDQpmZjdmZmY3ZmZmN2ZmZjdmZmY3ZjAwMDBmZjdmZmY3ZmE1 MTQ0MjBjMDAwMGZmN2ZjNjE4MjkyNTQxMDg0MjA4ZmY3ZjQyMDg0MjBjZmY3ZmZmN2ZmZjdmZmY3 ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3Zg0KZmY3ZmZmN2ZmZjdmZmY3ZmZm N2ZmZjdmZmY3ZmZmN2YyMTA0ZmY3ZmZmN2ZmZjdmNjMxMGZmN2ZmZjdmZmY3ZmZmN2Y4MzEwZmY3 ZmZmN2ZmZjdmMjEwNGZmN2ZmZjdmZmY3ZmZmN2ZmZjdmNjMxMDQyMGM2MzEwNjIwYzQyMGMNCjQy MGMwMDAwZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2YyMTA0MjEwNGZmN2YyMTA0ODQx MDQxMDgwMDAwNjMwYzYzMGMwMDAwNDEwOGM2MTgwMDA0ZmY3ZjI5MjVlNzFjZmY3ZjIxMDRmZjdm NDIwODIxMDgwMDAwDQpmZjdmZmY3ZmZmN2YwMDAwZmY3ZmE1MTRmZjdmZmY3ZmZmN2ZmZjdmZmY3 ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2Y4YjMxZmY3ZjAwMDBmZjdm ZmY3ZmZmN2YwMDAwMjEwNDAwMDBmZjdmZmY3Zg0KZmY3ZjQyMGMwMDAwMjEwNDQyMDgwODIxZmY3 ZmZmN2ZhNTE0YTUxOGZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZhZDM1 MDAwMGZmN2ZmZjdmZmY3ZjAwMDA2MzBjMDAwMGZmN2ZmZjdmZmY3ZmZmN2YNCjAwMDRmZjdmZmY3 ZjAwMDA2MzEwOGMzMWZmN2ZmZjdmNDIwODYyMGNmZjdmZmY3ZmZmN2YwMDAwZmY3ZmZmN2ZmZjdm ZmY3ZjIwMDRmZjdmMDAwMGZmN2ZmZjdmZmY3ZjQyMGNmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2Zm ZjdmDQpmZjdmZmY3ZjIxMDRmZjdmZmY3ZmZmN2ZhNTE0ZmY3ZmE1MTQ2MzBjNDIwODg0MTAyMTA0 ZmY3ZmFkMzVmZjdmMjAwNGZmN2Y4NDEwMjkyNWZmN2Y2MzBjMDAwMDQxMDgyMTA4ZmY3ZmZmN2Y2 MzBjMDAwMGZmN2ZmZjdmZmY3Zg0KZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdm ZmY3ZmZmN2ZmZjdmMDAwMGZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZjIxMDRmZjdmZmY3ZjQyMDhm ZjdmMDAwMDAwMDRjNjE4ZmY3ZjRhMjlmZjdmMDAwMDIxMDQNCjg0MTBmZjdmZmY3ZmZmN2ZmZjdm ZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZjA4MjE0MjBjNDIwYzQyMGM2MjBjNDIwODYyMGNm ZjdmZmY3ZmZmN2ZmZjdmZmY3ZjIxMDRmZjdmZmY3ZmZmN2Y2MzEwMDgyMWZmN2ZmZjdmDQoyMTA4 NjMxMGZmN2ZmZjdmZmY3ZjYzMGNmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2Zm ZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmNjMwYzQyMDgyOTI1ZmY3ZmZm N2ZmZjdmZmY3Zg0KZmY3ZjAwMDAwMDAwNDIwOGZmN2ZmZjdmZmY3ZjAwMDAyMTA0ZmY3ZjQxMDg0 MjA4ZmY3ZmZmN2ZmZjdmNDIwODIxMDQwMDAwZmY3ZjAwMDAyMTA0MDAwMDYzMGNmZjdmMjEwNGZm N2ZmZjdmZmY3ZjYzMGNhNTE0ZmY3ZjQyMDgNCmZmN2YwMDAwZmY3ZmZmN2Y2MzBjMDAwMGZmN2Yw MDAwZmY3ZmZmN2YyMDA0MDAwMGZmN2Y2MzBjZmY3ZjAwMDAwMDAwMDAwMGZmN2ZmZjdmZmY3Zjg0 MTAyMTA4MDAwMGZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmDQpmZjdmZmY3ZmZmN2Zm ZjdmYzYxODQyMDhmZjdmMDAwMGZmN2YwMDAwYTUxNDAwMDBmZjdmZmY3ZmZmN2YwMDAwMjEwNGZm N2ZmZjdmMDAwMDYzMTA0YTI5ZmY3ZmZmN2Y0MTA4NjIwYzAwMDBmZjdmZmY3ZjIxMDRmZjdmZmY3 Zg0KZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZm N2ZmZjdmZmY3ZjYzMGNmZjdmMjEwOGZmN2YwMDAwZmY3ZmZmN2ZmZjdmZmY3ZjIxMDg0MjA4ZmY3 ZmZmN2ZmZjdmZmY3ZmZmN2YNCmZmN2ZmZjdmMDAwMGZmN2ZmZjdmZmY3ZjQyMDhmZjdmYzYxODQx MDhjNjE4MDAwNGZmN2ZmZjdmMDAwMGZmN2ZmZjdmZmY3ZmZmN2ZmZjdmNjMwY2ZmN2ZmZjdmMjEw NGZmN2YyMTA0ZmY3ZmZmN2YwMDA0ZmY3ZjAwMDBmZjdmDQpmZjdmZmY3ZmZmN2ZmZjdmMjEwNGZm N2ZmZjdmMDAwMGZmN2ZmZjdmNGEyOWZmN2YwMDAwMjkyNWZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3 ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3Zg0KZmY3ZmZm N2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2YyMTA0ZmY3ZmZmN2ZmZjdmNjMxMDRhMjlmZjdmZmY3 ZmU3MWM4MzEwZmY3ZmZmN2ZmZjdmMjEwNGZmN2ZmZjdmZmY3ZmZmN2ZlNzFjYzYxOGZmN2ZmZjdm ZmY3ZjQyMGMNCjI4MjVmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2YwMDAwZmY3ZmZmN2ZmZjdmMjEw NDQyMDg4YzMxZmY3ZmZmN2Y2MzBjMDAwMGZmN2ZmZjdmZmY3ZmZmN2ZmZjdmMjEwNGZmN2Y0MjA4 ZmY3Zjg0MTRmZjdmMDAwMGZmN2ZmZjdmDQo0MjA4MDAwMDAwMDAwODIxZmY3ZjQyMDhmZjdmMjEw NGZmN2YwMDAwZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmVmM2RmZjdmZmY3ZmZmN2ZmZjdm ZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZjAwMDAwMDA0MDAwMA0KZmY3ZjQyMDgyMTA4MDAw MGZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdm ZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2YN CjIxMDQwMDAwZmY3ZjAwMDA2MzEwNGEyOWZmN2ZmZjdmNGEyOTYyMGMwMDAwZmY3ZmZmN2YwMDAw ZmY3ZmZmN2ZmZjdmZmY3ZjIxMDRhNTE0YTUxNGZmN2Y0MjBjMjkyNTQyMDhmZjdmZmY3ZmZmN2Zm ZjdmZmY3ZmZmN2ZmZjdmDQowMDAwZmY3ZmM2MTgwMDAwZmY3ZmZmN2ZmZjdmZmY3ZjQyMDhmZjdm ZmY3Zjg0MTBhNTE0ZmY3ZmZmN2ZmZjdmMDAwMDQyMDgwMDAwMjEwOGZmN2ZmZjdmZmY3ZmZmN2Y2 MzBjZmY3ZjhjMzVmZjdmZmY3ZmZmN2YwMDAwZmY3Zg0KZmY3ZjAwMDRmZjdmYTUxNDAwMDBmZjdm MjkyNWZmN2YwMDAwZmY3ZjAwMDAyMTA0MDAwMGZmN2YyMTA0ZmY3ZjYzMGNmZjdmMDAwMDg0MTAw MDAwMjEwODIxMDQyMTA0NjMxMGZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2YNCmZmN2ZmZjdm ZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2Zm ZjdmZmY3ZjQyMDhmZjdmZmY3ZmZmN2ZmZjdmZmY3ZjIxMDRmZjdmZmY3ZmZmN2Y2MzEwZmY3ZmZm N2ZmZjdmDQo0YTI5ODMxMGZmN2ZmZjdmZmY3ZjIxMDRmZjdmZmY3ZmZmN2ZmZjdmZmY3ZjIxMDgw MDAwNjIwYzZiMmRmZjdmNjMwY2FkMzVmZjdmZmY3ZmZmN2ZmZjdmZmY3ZjAwMDAyMTA0MDAwMGZm N2YwMDAwZmY3ZmZmN2ZmZjdmMDAwMA0KMjEwNDAwMDBmZjdmMDAwMGZmN2ZmZjdmZmY3ZjAwMDA0 MjA4MDAwMDYzMGMyMTA4ZmY3ZmZmN2ZmZjdmNjMwY2ZmN2YwMDAwZmY3ZjAwMDBhNTE0MDAwMDQx MDgyMTA0MjEwODYzMTAyMDA0MjEwNDAwMDAwMDAwMjAwNDIxMDQNCjIxMDQyMTA0YTUxNDIxMDQw MDAwYTUxNGM2MTg0MjA4NDEwODIxMDQyMTA0ZTcxYzIxMDQyMTA0ZmY3ZjAwMDBmZjdmZmY3ZmZm N2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmDQpm ZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmMDgyMTYyMGM0MjA4NDIwODAwMDBmZjdmZmY3ZmZm N2YwMDAwMjEwNGZmN2ZmZjdmMDAwMDYzMTA0YTI5ZmY3ZmZmN2ZmZjdmNjIwYzAwMDBmZjdmZmY3 ZjAwMDRmZjdmZmY3Zg0KZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmODQxMGZmN2ZmZjdmZTcxY2Zm N2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2YyMTA0ZmY3ZmZmN2Y0MjA4ZmY3ZmZmN2ZmZjdmZmY3 ZmZmN2ZmZjdmNDIwYzIxMDRmZjdmZmY3ZmZmN2YNCmM2MThmZjdmNjMwY2ZmN2YwMDAwZmY3ZmZm N2ZmZjdmMDAwMDQxMDg0MTA4NDIwYzYzMGM0MjA4NjMxMDg0MTA2MzBjNDIwOGZmN2ZmZjdmZmY3 ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmDQpmZjdmZmY3ZmZm N2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3 ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmODQxMDQyMDg0MjBj ZmY3Zg0KMjEwOGZmN2YwMDAwZmY3ZmZmN2ZmZjdmZmY3ZmZmN2YwMDAwZmY3ZmZmN2ZmZjdmNjMx MGZmN2ZmZjdmZmY3ZmZmN2Y2MzEwZmY3ZmZmN2ZmZjdmMjEwNGZmN2ZmZjdmZmY3ZmZmN2ZmZjdm NjMwY2ZmN2YwODIxNjMwYzhjMzUNCjRhMjk0MjBjZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3 ZjAwMDAwMDAwMDAwMDI5MjUwMDAwZmY3ZmZmN2ZjNjE4ZmY3ZmZmN2ZmZjdmMDgyMWE1MTRmZjdm MjEwNGZmN2Y0MjA4ZmY3ZjAwMDA0MjA4NDIwYzAwMDAyMTA0DQo0MjA4MDAwMGZmN2YwMDAwNDIw YzAwMDA0MjBjMjEwNGZmN2YyMTA0ZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdm ZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3Zg0KZmY3 ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZjQyMDhmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdm ZmY3ZmZmN2ZmZjdmZmY3ZmZmN2Y4NDEwNDIwYzQyMGM4NDE0NDIwODAwMDBmZjdmZmY3ZmZmN2Zm ZjdmZmY3ZjAwMDANCjAwMDBmZjdmZmY3ZjAwMDA2MzEwMDAwMGZmN2ZmZjdmMDAwMDQyMGM0YTI5 ZmY3ZmZmN2YyMTA0ZmY3ZmZmN2ZmZjdmZmY3ZmZmN2Y0MjA4NDIwYzIxMDg0MjA4YzYxY2E1MTQy MTA0ZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmDQpmZjdmZmY3ZmZmN2YwMDAwMDAwMGZmN2ZmZjdm ZmY3ZmZmN2ZmZjdmYTUxNGZmN2YwMDAwNDIwODIxMDgwMDAwNjMwYzAwMDAwMDAwMDAwNGE1MTRm ZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmNDIwOGZmN2YwMDAwNGEyOQ0KZmY3ZjAwMDBmZjdm ZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2Zm ZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmMjEwNDQy MDgNCmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2Zm ZjdmODQxMDQxMDg2MzEwZmY3ZjYzMGNmZjdmZmY3ZmZmN2ZmZjdmZmY3ZjIxMDRmZjdmZmY3ZjZi MmQ2MzEwZmY3ZmZmN2ZmZjdmDQpmZjdmNDIwYzIxMDhmZjdmZmY3ZmU3MWNmZjdmZmY3ZmZmN2Zm ZjdmZmY3ZjIxMDRmZjdmZmY3ZmZmN2ZmZjdmZmY3ZjAwMDBmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZm N2ZmZjdmZmY3ZmZmN2YwMDAwMjEwNDg0MTAyMTA0MjEwNA0KMjEwODAwMDA2MzBjZTcxY2ZmN2Y0 MjBjNjMwYzI5MjVmZjdmMDAwMGZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZjAw MDAyMTA4MDAwMGZmN2Y0MjA4ZmY3ZjQyMDhmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2YNCmZmN2Zm ZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZm N2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmNjMxMDIxMDQyMTA0ZmY3ZmZmN2ZmZjdmZmY3 ZmZmN2ZmZjdmDQpmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmMDAwMGZmN2Y2MjBjMjEwOGZm N2ZmZjdmZmY3ZmZmN2YwMDAwMDAwMGZmN2ZmZjdmYzYxODQyMGMwMDAwZmY3ZmZmN2ZmZjdmMjEw ODQyMGNmZjdmZmY3ZmZmN2YwMDAwZmY3Zg0KZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZm N2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3 ZmZmN2ZmZjdmMDAwMDYzMGNmZjdmZmY3ZjIxMDRmZjdmZmY3ZmZmN2YNCmZmN2ZmZjdmZmY3ZmZm N2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZjQyMDgyMTA0ZmY3ZjIxMDQwMDAwODQx MDg0MTRmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdm DQpmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2YwODIxZmY3 ZjIxMDQ0MjBjMDgyMWZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdm ZmY3ZmZmN2ZmZjdmZmY3Zg0KZmY3ZmZmN2Y0MTA4ZmY3ZmZmN2ZmZjdmZmY3ZmZmN2YyMTA0ZmY3 ZmZmN2YyMTA0NDIwY2ZmN2ZmZjdmZmY3ZmZmN2Y2MzBjNDIwOGZmN2ZmZjdmMDAwMGE1MTRmZjdm ZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2YNCmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3 ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmMDAwMDYzMGMwMDAw ZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmDQpmZjdmZmY3 ZmZmN2ZmZjdmZmY3ZjQyMGM4NDEwMDAwMDYzMGNmZjdmMDAwMDQyMDhmZjdmMjkyNWZmN2YwMDAw YTUxOGZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2Y2MzBjNDIwOGZmN2ZmZjdmZmY3ZmZmN2Zm ZjdmZmY3Zg0KZmY3ZmZmN2ZmZjdmZmY3ZmZmN2YyMTA4NDEwODAwMDBmZjdmZmY3ZmZmN2ZmZjdm ZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2Zm ZjdmZmY3ZmZmN2ZmZjdmZmY3ZmE1MTQNCmZmN2ZmZjdmZmY3ZjQyMGMyMTA4ZmY3ZmZmN2ZmZjdm ZmY3ZmE0MTQ2MjBjZmY3ZmZmN2ZmZjdmMjEwNGZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2Zm ZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmDQpmZjdmZmY3ZmZmN2ZmZjdm ZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2Zl NzFjZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2Y2MzBjZmY3Zg0K MDAwMGZmN2Y2MzBjNDIwYzQyMGNmZjdmZmY3ZjIwMDQwMDAwZmY3ZmM2MThmZjdmMjEwNGZmN2Yy MTA0ZmY3ZjQyMDhmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2YyOTI1ZmY3ZmZm N2YyMTA4NjIwY2ZmN2YNCmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2Zm ZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmMjEwNDAw MDBmZjdmMDAwMDYyMGM0MjA4ZmY3ZmZmN2ZmZjdmDQpmZjdmMDAwMDYzMGMwMDAwZmY3ZmZmN2Yw MDAwMDAwMGZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2Y2MzBjMjEwOGZmN2ZmZjdmZmY3ZmZm N2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3Zg0KZmY3ZmZmN2Zm ZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmMjEwODQxMDg2MzBjODQxMGZmN2ZmZjdmMDAwMGZm N2Y4YzMxZmY3ZjAwMDA0MjA4NjMxMDQyMDgyMTA0NDIwODAwMDA2MzBjODMxMDQyMGM0YTI5NDIw ODRhMjkNCmZmN2Y0MjBjNDEwODRhMjk0MjBjODQxMDQyMGM4NDEwZmY3ZmZmN2ZmZjdmZmY3ZmZm N2ZmZjdmZmY3ZjAwMDA0MjA4ZmY3ZmZmN2ZhNTE0ZmY3ZjYyMGM0MjA4ZTcxY2ZmN2ZmZjdmZmY3 ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmDQpmZjdmZmY3ZmZmN2ZmZjdmZmY3ZjQyMDhmZjdmZmY3ZmZm N2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2Y0MTA4ZmY3ZmZmN2Y4NDEwODMxMDYzMGNmZjdmZmY3 ZmZmN2ZmZjdmZmY3ZjYyMGNmZjdmZmY3ZmZmN2Y2MzBjZmY3Zg0KZmY3ZmZmN2ZmZjdmZmY3ZmZm N2ZmZjdmZmY3ZjQyMGM0MjA4ZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3 ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2YNCmZm N2YwMDA0NDIwODQyMDg0MjA4NjIwY2ZmN2YwMDAwZmY3ZmZmN2Y0MjA4ZmY3ZjIxMDRhNTE0NjIw YzAwMDAwMDAwMjEwNDAwMDAyMTA0NGEyOTIxMDg0MjBjMjkyNTQyMDg0MjBjMjkyNTQyMGM0MjBj NDIwOGZmN2ZmZjdmDQpmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZjIxMDRmZjdmMDAw MDQyMDg4MzEwNDIwOGZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdm ZmY3ZmZmN2ZmZjdmZmY3ZjQxMDg2MzBjZmY3Zg0KZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmMDAw MDIxMDRmZjdmZmY3ZjYzMGM0MjBjZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmNDIwODg0MTBmZjdm ZmY3ZmZmN2Y0MjA4ZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2YNCmZmN2ZmZjdmZmY3 ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdm ZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZjAwMDA0MTA4NjMwY2M1MTgw ODIxDQo0MjBjYTUxNDQyMDg0MjBjYTUxNDg0MTA2MzEwMDAwMGZmN2Y0MjBjZTcxYzAwMDA0MjA4 NDIwODAwMDAwMDAwODQxMGE1MTRhNTE0MDAwMGZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2Zm ZjdmZmY3ZjAwMDA4NDEwZmY3Zg0KMjEwNGZmN2ZmZjdmNjMxMDYzMTAyOTI1ZmY3ZmZmN2ZmZjdm ZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmMDAwMGZmN2Zm ZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmYTUxOGU3MjANCmZmN2YwMDAwNDIwODQyMGNmZjdm ZmY3ZmZmN2ZmZjdmZmY3ZmZmN2Y0MTA4NDIwOGZmN2ZmZjdmZmY3ZjIxMDRmZjdmZmY3ZmZmN2Zm ZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmDQpmZjdm ZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2Zm ZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmYTUxNGZmN2Y0MTA4ZmY3ZjYzMGNmZjdmOGMzMTQy MDg2MjBjMDAwMA0KYzYxODIxMDg2MjBjNjMwYzYzMGM4NDEwYTUxODhjMzEwMDAwZmY3ZmZmN2Zm ZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZjA4MjFmZjdmZmY3ZjIxMDRmZjdmNDEwOGZm N2Y4NDEwNDIwODg0MTBmZjdmZmY3ZmZmN2YNCmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2Zm ZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZm N2YyMTA0ZmY3ZmZmN2ZmZjdmNjMxMDIxMDhmZjdmZmY3ZmZmN2ZmZjdmDQpmZjdmZmY3ZmZmN2Y2 MzEwZmY3ZmZmN2ZmZjdmMjEwNGZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZm N2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3 Zg0KZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZm N2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZjAwMDA0MjBjNDIwYzg0MTAyMTA0ODQxMGE1MTRmZjdmNjIw Yzg0MTBmZjdmODQxMDYzMTANCjQxMDgwMDAwYTUxODIxMDRmZjdmZmY3ZmZmN2YwMDAwMDAwNGZm N2ZmZjdmMDgyMWZmN2ZlNzFjZmY3Zjg0MTA2MzEwNjIwYzYzMTBlNzFjZmY3ZmZmN2ZmZjdmZmY3 ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmDQpmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZm N2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmMDAwMDIxMDRmZjdmZmY3ZjQyMDg2MzEwNDIw Y2ZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2Y0MjBjNjMwY2ZmN2ZmZjdmYTUxNA0KMDAwMGZm N2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmNjMwY2ZmN2ZmZjdmZmY3 ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZjYzMGMyMTA0 ZmY3ZmZmN2YNCmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmNjMwY2ZmN2Y0MTA4NjIw Y2U3MWNmZjdmMjEwNGZmN2Y2MzBjZmY3ZjYzMGNmZjdmNjMwY2ZmN2ZmZjdmZmY3Zjg0MTA2MzEw NjIwY2ZmN2YwMDAwMjEwNDAwMDBmZjdmDQo4NDEwZmY3ZjYzMGNmZjdmZmY3ZjQxMDg2YjJkNDIw ODYzMTBmZjdmMDAwMDYzMGMyMTA0MjAwNGZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdm ZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3Zg0KZmY3ZmZmN2ZmZjdmZmY3 ZmZmN2ZmZjdmYTUxNGZmN2ZmZjdmNjMwYzYzMGNmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdm ZmY3ZjQyMDg0MTA4ZmY3ZmZmN2YwMDAwYTUxNGZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmU3MWMN CmZmN2ZmZjdmMjEwNDYzMTA2MjBjMDAwMGZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdm ZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmMjEwNDYyMGM4NDEwMjkyNWZmN2YwMDAwMjEwNDAwMDBm ZjdmMjEwNGM2MTgwMDAwDQphNTE0NjMwYzQyMGMyMTA0ZmY3ZmM2MTgyMTA0MDAwMDYyMGMyMTA4 MDAwNDAwMDA2MjBjODQxMGM2MThmZjdmZmY3ZjQyMGM2MzBjNDIwYzYyMGM2MzBjNjMwYzYzMTA2 MzEwYTUxNDYzMGM4NDE0NDIwODgzMTA0MjBjMDAwMA0KODQxMGM2MThmZjdmZmY3ZmZmN2ZmZjdm ZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2Y0MTA4NDEwODYzMGNm ZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2Y0MjA4ZmY3ZmZmN2YNCmZmN2Y2MjBj NDEwOGZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZjYzMTBmZjdmZmY3ZmZmN2Yy MDA0ZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmMjEwNDAwMDBmZjdmNDIwYzYzMTA4NDEwZmY3ZmZm N2ZmZjdmDQpmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2Zm ZjdmZmY3ZmE0MTQ2MjBjNDIwOGZmN2Y2MzBjNDIwODAwMDBmZjdmNjMxMDQyMGM0MjA4NDIwYzAw MDBmZjdmZmY3Zjg0MTBjNjE4ZmY3Zg0KNDIwY2ZmN2Y2MzBjMjEwNGE0MTQ2MjBjMDAwMGZmN2Zm ZjdmZmY3ZjIxMDRmZjdmNDIwYzA4MjE0MjA4NjIwYzYzMGMyMTA0NjMxMDQyMGM2YjMxNDEwODYz MTBmZjdmZmY3ZmM2MTg2MzBjZmY3ZmZmN2ZmZjdmZmY3ZmZmN2YNCmZmN2ZmZjdmZmY3ZmZmN2Zm ZjdmZmY3ZmZmN2ZmZjdmMDAwMGZmN2YwMDAwMjEwOGZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZm N2ZmZjdmMDAwMDIxMDRmZjdmZmY3ZjAwMDA2MjBjMDgyMWZmN2ZmZjdmZmY3ZmZmN2ZmZjdmDQpm ZjdmZmY3ZmZmN2YwMDAwNjIwYzZiMmRmZjdmZmY3ZmU3MWMyMTA0ZmY3ZmZmN2ZmZjdmZmY3ZmZm N2ZjNjE4NDIwYzQyMGM4NDEwODQxMGU3MWNmZjdmZmY3ZjIxMDRmZjdmZmY3ZmZmN2ZmZjdmZmY3 ZmZmN2ZmZjdmZmY3Zg0KZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZjAwMDAwMDAwNDIwYzQy MDg0MjBjNjIwYzQyMDg0MjBjMjEwNGZmN2YyMTA0ZmY3ZjQxMDgyMTA4NDIwY2ZmN2YyMTA0MDAw MGZmN2Y0MTA4NDIwYzAwMDA2MzEwNDIwODIxMDQNCmZmN2YyOTI1NjMxMDQyMGMyMTA0MDAwMGZm N2Y0MjA4NjMwYzAwMDAwMDAwNjIwY2ZmN2YwMDAwMjEwNDQyMGNmZjdmZmY3ZmZmN2YwMDAwZmY3 ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZjNjE4DQpmZjdmZmY3ZjYz MGM0MjA4ZmY3ZjA4MjFmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2Y2YjJkYzYxOGZmN2ZmZjdmZTcx YzYzMTBmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmNDIwODQyMDhmZjdm ZmY3Zg0KZmY3ZjAwMDBmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmNDIw OGZmN2YyMTA0MjEwNGZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdm ZmY3ZmZmN2ZmZjdmZmY3ZmZmN2YNCjIxMDRmZjdmZmY3ZmZmN2ZhNTE0ZmY3ZjQyMDhmZjdmZmY3 ZmZmN2ZmZjdmZmY3ZjYzMGNmZjdmMDAwMDIxMDhmZjdmZmY3ZjgzMTA0MTA4ZmY3ZjIxMDQ2MjBj ZmY3ZmZmN2Y2MzBjNjMxMDYyMGNmZjdmZmY3ZmZmN2ZmZjdmDQoyMTA0ZmY3ZmZmN2ZmZjdmMjEw NGZmN2ZmZjdmZmY3ZjQyMDhmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdm ZmY3ZmZmN2ZmZjdmNDIwODQyMGNlNzFjZmY3ZjQyMGNmZjdmZmY3ZjAwMDBmZjdmZmY3Zg0KZmY3 ZmZmN2ZmZjdmZmY3ZjIxMDhmZjdmZmY3ZmZmN2Y0MjA4MjEwOGZmN2ZmZjdmZmY3ZmZmN2ZmZjdm ZmY3ZmZmN2ZmZjdmZmY3ZmZmN2YwODIxODMxMGZmN2ZmZjdmZmY3ZjYyMGNmZjdmZmY3ZmZmN2Zm ZjdmZmY3ZmZmN2YNCmZmN2ZjNjE4ZmY3ZmZmN2ZmZjdmNjMxMDYyMGNlNzFjNGEyOWZmN2ZmZjdm ZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2Zm ZjdmZmY3ZmM2MWNmZjdmZmY3ZmZmN2ZmZjdmDQpmZjdmZmY3ZjA4MjE0MjA4MjEwNDAwMDA2MzBj NDIwOGZmN2ZmZjdmZmY3ZjYzMGNmZjdmZmY3ZjYzMGM2MzEwNDIwYzQyMGM0MjA4ODMxMDYzMGMw MDAwZmY3ZmZmN2ZmZjdmZTcxY2ZmN2ZmZjdmZmY3ZjIxMDRmZjdmZmY3Zg0KZmY3ZmZmN2ZmZjdm ZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmYTUxODYzMTA4 MzEwYTUxNDAwMDA0MjA4MjEwNGZmN2ZmZjdmZmY3ZmZmN2ZmZjdmMDAwMDIxMDRmZjdmZmY3ZmE1 MTQNCjYzMTAwODIxZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2Y0 MjA4NDIwY2ZmN2ZmZjdmZmY3ZjIxMDRmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2YwMDA0MDAwMDYz MGM0MjBjNDIwOGZmN2ZmZjdmDQpmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2Zm ZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZjIw MDQ0MTA4ZmY3ZmE0MTQ0MTA4MDAwMGZmN2Y0MjBjZmY3Zg0KMDAwMGZmN2Y2MzEwNjIwYzIxMDhm ZjdmMDAwNGU2MWM2MzEwZmY3ZjAwMDA0MjA4MDgyMWZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZm N2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2YNCmZmN2Zm ZjdmZmY3ZmZmN2ZmZjdmZmY3ZjYzMGNjNjE4NjMwYzYyMGM2MjBjNDIwYzQyMDhmZjdmZmY3ZmZm N2ZmZjdmZmY3ZmZmN2YyMTA0ODQxMGZmN2ZmZjdmMjEwODYyMGNmZjdmZmY3ZmZmN2ZmZjdmZmY3 ZmZmN2ZmZjdmDQpmZjdmZmY3ZmZmN2ZmZjdmZmY3ZjYzMTA2MjBjMDAwMGZmN2ZmZjdmMDAwMDAw MDBmZjdmZmY3ZmZmN2ZmZjdmZmY3ZjAwMDA0MjA4NjMwYzYzMGNmZjdmZmY3ZmZmN2ZmZjdmMjEw NGZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3Zg0KZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZm N2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZjQyMDhmZjdmMDAwMDAwMDA2MzBjMjEwODAwMDBmZjdmNDIw YzIxMDQwMDAwZmY3ZmNlMzk2MzBjNjIwY2ZmN2ZmZjdmNDIwODAwMDANCjg0MTA2MzBjNjMxMDA3 MjFmZjdmODQxMDIxMDQwMDAwMDgyMWZmN2ZmZjdmMDAwMGZmN2YwMDAwZmY3ZmZmN2ZmZjdmZmY3 ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmMjEwNDg0MTBmZjdm DQoyMTA0NDIwY2ZmN2Y0MjA4ZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZjQxMDhmZjdmZmY3 ZmZmN2Y4MzEwNjMxMGZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdm ZmY3ZmZmN2Y2MzEwNjMwYw0KZmY3ZmZmN2YwMDAwZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3 ZjQyMDhmZjdmZmY3ZmZmN2ZmZjdmZmY3ZjAwMDA0MjBjZTcxY2ZmN2ZmZjdmZmY3ZmZmN2ZmZjdm ZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2YNCmZmN2ZmZjdmZmY3ZmM2MThmZjdmZmY3 ZjQyMDgyMTA0MjEwNGZmN2ZmZjdmZmY3ZjQyMGNmZjdmNjMwY2ZmN2ZmZjdmZmY3Zjg0MTA2MjBj NDIwOGZmN2ZmZjdmZmY3ZjAwMDBhNTE0NjMxMDQyMDg2MjBjYzYxODAwMDA4NDEwDQphNTE0ZmY3 ZjIxMDRmZjdmYTUxNDQyMDgwMDAwZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdm ZmY3ZmZmN2ZmZjdmZmY3ZmZmN2Y0MjA4MDAwMGZmN2YyMTA0ZmY3ZmM2MThmZjdmZmY3ZmZmN2Zm ZjdmZmY3Zg0KZmY3ZmZmN2Y0MjBjZmY3ZmZmN2ZmZjdmNDIwODYyMGMwMDAwZmY3ZmZmN2ZmZjdm ZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZjQxMDg2MzBjZmY3ZmZmN2Zm ZjdmNDIwOGZmN2ZmZjdmZmY3ZmZmN2YNCmZmN2ZmZjdmZmY3ZjIxMDRmZjdmZmY3ZmZmN2ZjNjE4 NDIwYzRhMjk4NDEwZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2Zm ZjdmZmY3ZmZmN2ZmZjdmYzYxODIxMDgyMTA4YTUxOGM2MTgwMDAwDQpmZjdmMDAwMGM2MTg0MjA4 NjIwYzAwMDBmZjdmZmY3ZmZmN2YwMDAwNDIwODg0MTBmZjdmZTcxY2ZmN2YwMDAwZmY3ZjAwMDAy MTA4MDAwMDQyMGM2MzBjNDIwYzgzMTAyMTA4NjMwYzYyMGMyMTA0YzYxODQyMDhmZjdmZmY3Zg0K ZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmE1MTQwMDAwZmY3Zjg0MTA0 MjA4NDIwOGM2MTgwMDAwMjEwNGZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZjAwMDAyMTA4ZmY3ZmZm N2YyMTA0NjMxMDQyMDgNCmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2Zm ZjdmZmY3ZmZmN2ZmZjdmNDIwODYyMGNlNzFjZmY3ZmZmN2ZmZjdmNDIwOGZmN2ZmZjdmZmY3ZmZm N2ZmZjdmZmY3ZmZmN2Y4NDEwZmY3ZjQyMDg0MTA4DQowMDAwZmY3ZmZmN2ZmZjdmZmY3ZmZmN2Zm ZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZm N2ZmZjdmZmY3ZmZmN2YwMDAwMjEwODYyMGNmZjdmMjEwOGZmN2ZmZjdmZmY3Zg0KZmY3ZmZmN2Y4 NDEwMjEwNGZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZjIxMDRmZjdmNDIwOGZmN2Y0MjA4NDEwODAw MDBmZjdmMjEwNGZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3 ZmZmN2YNCmZmN2ZmZjdmNjIwYzQxMDhmZjdmZmY3ZjIxMDRmZjdmZmY3ZjQyMDgwMDAwZmY3ZmZm N2ZmZjdmZmY3ZmZmN2ZmZjdmMjEwNDYzMGNmZjdmZmY3ZjQxMDg2MzBjZmY3ZmZmN2ZmZjdmZmY3 ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmDQpmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmNDIwYzYy MGMyMTA0ZmY3ZmZmN2Y2MjBjMjEwNGZmN2ZmZjdmZmY3ZmZmN2ZmZjdmMDAwMDYzMGM2MzEwMjEw ODAwMDBmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3Zg0KZmY3ZmZmN2ZmZjdmZmY3ZmZm N2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmODQxMDIxMDgwMDAwNjIw Y2ZmN2YyMTA0ZmY3ZmZmN2ZmZjdmZmY3ZjIxMDQyMTA4MDAwMGZmN2ZmZjdmZmY3ZmZmN2YNCmZm N2ZmZjdmZmY3ZjAwMDBlNzFjNjMwY2ZmN2Y2MzBjNDIwOGZmN2ZmZjdmMDAwMGZmN2ZmZjdmZmY3 ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2YwMDAwMDAwMDgzMTA0MTA4 MDAwMGZmN2ZmZjdmDQoyMTA0NDIwOGZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZjQyMDgyMTA4ZmY3 ZmZmN2ZmZjdmNjMxMDIxMDgwMDAwZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdm ZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3Zg0KNjMxMDIxMDRmZjdmZmY3ZmZmN2YyMTA0ZmY3 ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZjAwMDAwMDAwZmY3ZmZmN2ZmZjdmMDAwMGM2MTg0MjA4 NDEwOGZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2YNCmZmN2ZmZjdmZmY3 ZmZmN2ZmZjdmZmY3ZjAwMDBjNjE4ZmY3ZmZmN2ZjNjE4ZmY3ZjRhMjlmZjdmZmY3ZmZmN2YyOTI1 NDIwYzg0MTBmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmYTUxNGZmN2Zm ZjdmDQpmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdm ZmY3ZmZmN2ZmZjdmZmY3ZmE1MTQ0MjBjZmY3ZjYzMTA0MTA4MDAwMGZmN2YyMTA4ZmY3ZmZmN2Zm ZjdmZmY3ZmZmN2ZmZjdmZmY3Zg0KMjEwOGZmN2ZmZjdmZmY3ZjQyMGM2MjBjMDAwMGZmN2ZmZjdm ZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2Zm ZjdmNDIwODYzMTBmZjdmZmY3ZmZmN2Y4NDEwYzYxOGZmN2YNCmZmN2ZmZjdmZmY3ZmZmN2ZmZjdm MjEwNDIxMDQwMDAwZmY3ZjQyMGM2MjBjNjMwY2ZmN2YwMDAwMjEwNGZmN2ZmZjdmZmY3ZmZmN2Zm ZjdmZmY3ZmZmN2ZmZjdmZDAwZTAwMDAyNjA2MGYwMDk2MWQ1NzRkNDY0MzAxMDAwMDAwDQowMDAw MDEwMDAwMDAwMDAwMDAwMDA2MDAwMDAwNzQxZDAwMDAwMDAwMDAwMDc0YmQwMDAwZmY3ZmZmN2Zm ZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZm N2ZmZjdmNDIwYw0KMjEwNGZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2Zm ZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZm N2ZmZjdmZmY3ZmZmN2ZmZjdmODMxMDYzMGMNCjZiMmQwMDAwNDIwODI5MjU0MjBjNDIwY2ZmN2Zm ZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZhNTE0ZmY3ZmZmN2ZmZjdmNDIwODYzMTA0MjA4ZmY3ZmZm N2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmDQpmZjdmZmY3ZmZmN2Zm ZjdmZmY3ZmZmN2YwMDAwNDIwYzQyMDhmZjdmZmY3ZmZmN2YwMDA0ZmY3ZmZmN2ZmZjdmZmY3ZmZm N2ZmZjdmZmY3ZjYzMGM0MjA4ZmY3ZmZmN2YyMTA0NDEwODYzMGNmZjdmZmY3ZmZmN2ZmZjdmZmY3 Zg0KZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZm N2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZjIxMDhmZjdmZmY3ZmZmN2ZmZjdmZmY3 ZmZmN2ZmZjdmZmY3ZmZmN2YNCmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZm N2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2Y0MjA4ZmY3 ZjQxMDg0MjA4YzYxOGZmN2Y0MjA4NDEwOGZmN2ZjZTM5DQpmZjdmZmY3ZmZmN2ZmZjdmMDAwMDIx MDRmZjdmZmY3ZmZmN2Y0MjA4NDIwY2ZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3 ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZTcxYw0KNjMxMGE1 MTRmZjdmZmY3ZmZmN2YyMTA0ZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZjYzMGM4NDEwZmY3 ZmZmN2Y4NDEwNDEwOGZmN2ZmZjdmZmY3ZmZmN2YwMDAwZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdm ZmY3ZmZmN2YNCmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3 ZmZmN2YwMDAwZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdm ZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmDQpmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3 ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmMjEwNDQyMDgwMDAwNDIwODQyMDhmZjdmYzYxODg0MTA0MjA4 ZmY3ZmU3MWNmZjdmZmY3ZmZmN2YwMDAwMjEwODAwMDBmZjdmZmY3Zg0KNDIwYzYzMTA0MjA4ZmY3 ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdm ZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmNDIwODQyMGM2MzBjZmY3ZmZmN2ZmZjdmNDIwOGZmN2YN CmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3Zjg0MTBmZjdmMDAwMDIxMDgyMTA0ZmY3ZmZmN2ZmZjdm ODQxMDIxMDRmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2Zm ZjdmZmY3ZmZmN2ZmZjdmDQpmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdm ZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2Zm ZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3Zg0KZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdm MjEwODQxMDg0MTA4ZmY3Zjg0MTA0MjBjMDAwMGZmN2Y2MzBjZmY3ZmZmN2ZmZjdmZmY3ZjYzMGNh NTE0ZmY3ZmZmN2ZmZjdmNjMxMDYyMGNmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2YNCmZmN2ZmZjdm ZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2Zm ZjdmNjMwYzQyMDgwMDAwZmY3ZmZmN2Y2MzBjZTcyMGZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZm N2Y0MjBjDQo2MjBjZTcxY2ZmN2ZmZjdmZmY3ZmE1MTQ0MTA4MDAwMGZmN2ZmZjdmZmY3ZmZmN2Zm ZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZm N2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3Zg0KZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2Zm ZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZm N2YwMDAwMjEwODAwMDBmZjdmZmY3ZmZmN2ZmZjdmZmY3ZjAwMDANCmZmN2Y4NDEwMjEwNDYyMGNm ZjdmZTcxY2ZmN2ZmZjdmZmY3ZmZmN2Y4NDEwNDEwOGZmN2ZmZjdmZmY3ZjQyMGM0MjA4ZmY3ZmZm N2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmDQpm ZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmNjMxMDA4MjFmZjdmZmY3ZmZm N2YwMDAwMDAwMGZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZjNjE4NjMwY2ZmN2ZmZjdmZmY3 ZjIxMDgwMDAwZmY3Zg0KZmY3ZmZmN2Y2MzBjZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZm N2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3 ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2YNCmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZm N2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZjIwMDQ2MzEwZmY3ZmZmN2ZmZjdmZmY3 ZmZmN2ZmZjdmZmY3ZjIxMDQ2MzBjZmY3ZjYyMGMwMDAwZmY3ZmZmN2ZmZjdmDQpmZjdmZmY3ZjIx MDRmZjdmZmY3ZmZmN2Y0MjA4NDIwYzIxMDRmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3 ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdm ZmY3Zg0KZmY3ZjAwMDA4NDE0NjMxMGZmN2ZmZjdmZmY3ZjAwMDAyMTA0MDAwMGZmN2ZmZjdmZmY3 ZmZmN2ZmZjdmZmY3ZmZmN2Y0MjA4NjMwY2ZmN2ZmZjdmMDAwMDIxMDQ2MzBjZmY3ZmZmN2YwODIx NjIwYzYzMGNmZjdmZmY3ZmZmN2YNCmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3 ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdm ZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmDQpmZjdmZmY3ZmZmN2ZmZjdmZmY3 ZjAwMDBmZjdmNDIwODYzMGM2MjBjZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdm NDIwOGZmN2ZmZjdmZmY3ZmZmN2ZmZjdmMjEwNGZmN2ZmZjdmZmY3ZmM2MTg2MzEwYzYxOA0KZmY3 ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdm ZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmNDEwODYyMGNm ZjdmZmY3ZmZmN2YNCmZmN2YyMDA0MDAwMGZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2Y4NDEw MDAwMGZmN2ZmZjdmZmY3ZjIxMDg2MzEwZmY3ZjQyMDhmZjdmZmY3ZmZmN2YyMTA0ZmY3ZmZmN2Zm ZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmDQpmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdm ZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZjAwMDBm ZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZjIxMDQyMTA4NDIwYw0KYTUxNDQyMGM4NDEw ZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZjIxMDRm ZjdmZmY3ZmZmN2YwMDAwNDIwYzQyMDhmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZm N2YNCmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2Zm ZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2YwMDAwNDIwYzYyMGNmZjdmZmY3ZmZmN2YwMDAwMDAwNDAw MDBmZjdmZmY3ZmZmN2ZmZjdmDQpmZjdmZmY3ZmZmN2YwODIxMjEwNDAwMDBmZjdmMDAwMGE0MTQ4 MzEwNDIwY2ZmN2ZmZjdmZmY3ZjYyMGM2MjBjZTcxY2ZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZm N2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3Zg0KZmY3ZmZmN2ZmZjdmZmY3ZmZmN2Zm ZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmMjEwNGZmN2ZmZjdmMDAwMDYzMGMwMDAwZmY3ZmZm N2YyMTA4NjMwY2ZmN2ZmZjdmZmY3ZjYzMTA0MjA4MDAwMGZmN2ZmZjdmZmY3ZmZmN2YNCmZmN2Zm ZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2Y0MTA4ZmY3ZmZmN2ZmZjdmMDAwMDQyMGM0MjBjZmY3ZmZm N2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3 ZmZmN2ZmZjdmDQpmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZm N2YwMDAwNDIwYzQyMDhmZjdmZmY3ZmZmN2YwMDAwMDAwMDAwMDBmZjdmZmY3ZmZmN2ZmZjdmZmY3 ZmZmN2ZmZjdmZmY3ZjAwMDAyMTA0ZmY3Zg0KMDAwMDQyMDhmZjdmZmY3ZmZmN2ZmZjdmNDIwY2Zm N2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3 ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2YNCmZmN2ZmZjdmZmY3ZmZm N2ZmZjdmZmY3ZmZmN2YyMTA0NDIwY2ZmN2ZmZjdmZmY3ZjIxMDhmZjdmZmY3ZmZmN2YyMTA0ZmY3 ZjQyMGM0MjA4MjEwNGZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZjIxMDRmZjdm DQpmZjdmZmY3ZjAwMDA0MjA4NDIwY2ZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3 ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdm ZmY3ZmZmN2ZmZjdmZmY3Zg0KZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZlNzFjNjIwYzQyMDhmZjdmZmY3 ZmZmN2YwMDAwMDAwMDAwMDBmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmMDAwMDg0MTA0MjA4 NjIwYzYzMGNmZjdmZmY3ZmZmN2Y0MjBjZTcxY2ZmN2YNCmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3 ZmZmN2Y0YTI5ZmY3ZjAwMDBmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdm ZmY3ZmZmN2ZmZjdmZmY3ZmZmN2YwMDAwNjMwYzQyMDg0MjA4MDgyMWZmN2YwMDAwDQo0MjA4MDAw MGZmN2YwMDAwNDIwOGU3MWM2MjBjNDIwOGZmN2Y4NDEwNjIwYzQyMGNmZjdmZmY3ZmZmN2ZmZjdm ZmY3ZmZmN2ZmZjdmZmY3ZmZmN2Y0MTA4ZmY3ZmZmN2ZmZjdmMDAwMDQyMDg2MzEwMjkyNWZmN2Zm ZjdmZmY3Zg0KZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdm ZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2Zm ZjdmZmY3ZmZmN2ZmZjdmODQxMDQyMGMNCjYyMGNmZjdmZmY3ZmZmN2YwMDAwMDAwMDAwMDBmZjdm ZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZjIxMDg0MjA4ZmY3ZmZmN2ZmZjdmMDAwMDIxMDhm ZjdmZmY3ZmZmN2ZmZjdmMDAwMDg0MTA0MjA4MjEwNGZmN2ZmZjdmDQo2MzEwMDAwNGZmN2ZmZjdm ZmY3ZmZmN2ZmZjdmZmY3ZmM2MThmZjdmZmY3ZmZmN2ZmZjdmMjEwNDIxMDg0MjBjZmY3ZmZmN2Y0 MjBjZmY3ZmE1MTQyMTA4ZmY3ZmZmN2Y0MjBjZmY3ZmZmN2ZmZjdmYzYxOGZmN2ZmZjdmZmY3Zg0K NDIwYzIxMDQ0MjBjOGMzMWZmN2Y2MzBjZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmMjEwOGZmN2Zm ZjdmZmY3ZmZmN2Y0MTA4NjMxMGZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZm N2ZmZjdmZmY3ZmZmN2YNCmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2Zm ZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmMDgyMTYy MGM0MjA4ZmY3ZmZmN2ZmZjdmMDAwMDIxMDQyOTI1DQpmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2Yw ODIxMDAwMGZmN2Y2MzBjMDAwMGM2MTg4NDEwMDgyMWZmN2ZmZjdmZmY3ZjIxMDQ2MjBjNDIwOGZm N2Y2MzBjMjEwOGM2MTg2MjBjMDAwMGZmN2ZmZjdmZmY3ZmZmN2ZmZjdmNDIwYw0KNDIwYzAwMDBm ZjdmZmY3ZjYzMGM2MjBjZmY3ZmZmN2ZmZjdmYzYxYzQyMDhmZjdmZmY3ZjYzMGM4NDEwNDIwYzYy MGM0MjA4ZmY3ZmZmN2ZmZjdmMDAwMDg0MTA0MjA4ZmY3ZmZmN2ZhNTE0NjIwY2ZmN2YyMTA0ZmY3 ZmZmN2YNCmZmN2ZmZjdmYTUxNDQxMDhmZjdmZmY3ZmZmN2YwMDAwNjMwYzYzMTAyMTA0ZmY3ZmZm N2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3 ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmDQpmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZm N2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmMDgyMTQyMGM0MjBjZmY3ZmZmN2ZmZjdmZmY3 ZjIxMDQ4NDEwZmY3ZmZmN2ZmZjdmZmY3ZmZmN2Y0MjA4ZTcyMA0KMDAwMGZmN2YyMTA0NjIwYzYz MGMyMTA0MDAwMGZmN2ZmZjdmZmY3ZjIxMDQ2MzBjZmY3ZmZmN2YwMDAwNDIwYzQyMDhmZjdmZmY3 ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmNjMwY2ZmN2ZmZjdmZmY3ZjQyMGNmZjdmZmY3ZmZmN2YNCmZm N2Y2YjJkYTUxOGZmN2ZmZjdmMjEwODQyMGNmZjdmMDAwMDQyMDgyMTA0ZmY3ZjIxMDQyMTA0Mjky NWZmN2ZmZjdmZmY3ZmZmN2ZmZjdmNDIwOGZmN2ZmZjdmZmY3ZmZmN2Y4NDEwNDEwOGZmN2ZmZjdm ZmY3ZjAwMDA0MTA4DQo2MzBjYTUxNGZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3 ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdm ZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3Zg0KZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3 ZmZmN2ZmZjdmZTcxYzQyMGM2MjBjZmY3ZmZmN2ZmZjdmZmY3Zjg0MTA0MjA4ZmY3ZmZmN2ZmZjdm ZmY3ZmZmN2Y2MzBjMjEwNDQyMDg4NDEwMDAwMGZmN2YwMDAwMDAwMDYzMGMNCmZmN2YwMDAwMjEw NDQyMDhmZjdmZmY3ZmZmN2ZhNTE0ZTcxY2ZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZjA4MjEwODIx ZmY3ZmZmN2ZhNTE0NjIwYzQyMDg4NDE0MDAwMGZmN2YwMDAwZmY3ZmZmN2ZmZjdmMDAwMGZmN2Zm ZjdmDQpmZjdmNjIwYzQyMGM0MjA4ZmY3ZjAwMDBmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdm ZmY3ZmZmN2YwMDAwMjEwNGE1MTRmZjdmZmY3ZmZmN2Y0MjA4NDIwYzYyMGNmZjdmMDAwMGZmN2Zm ZjdmZmY3ZmZmN2ZmZjdmZmY3Zg0KZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdm ZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2Zm ZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2YNCmZmN2ZmZjdmYzYxODQyMDg2MzBj ZmY3ZmZmN2ZmZjdmZmY3ZmZmN2YyMTA0ZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2Zm ZjdmZmY3ZmZmN2ZmZjdmZmY3Zjg0MTAwMDA0NDIwYzg0MTBmZjdmZmY3ZmZmN2Y4NDE0DQpjNjFj ZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmU3MWNmZjdmZmY3ZjIxMDQ4NDEwZmY3ZmU3MWM0 MTA4ZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmMDAwMDQyMDgwMDA0ZmY3ZmZmN2ZmZjdmZmY3ZmZm N2ZmZjdmZmY3Zg0KZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmODQxMDIxMDQwODIxZmY3ZmZmN2Zm ZjdmYTUxNDQyMGM0MjBjZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZm N2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2YNCmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2Zm ZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZm N2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZjIxMDQ0MjA4NjMxMDYzMGMwMDAwDQpmZjdmZmY3ZmZmN2Y4 NDEwNDIwODAwMDBmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZm N2ZmZjdmMjkyNTAwMDA0MjA4ZmY3ZjYzMGNmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmYzYx OA0KZTcxY2ZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmE1MTRmZjdmMDAwMGZmN2Y2MzBjMjEwNDIx MDRjNjE4MDAwMGZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3 ZmZmN2Y0MjA4NDIwODAwMDANCmZmN2ZmZjdmZmY3ZmE0MTQ2MzEwNDIwY2ZmN2ZmZjdmZmY3ZmZm N2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3 ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmDQpmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZm N2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3 ZmZmN2YyMTA4NjMxMDQxMDgyMTA0ZmY3ZmZmN2ZmZjdmMDAwMDIxMDQwODIxZmY3Zg0KZmY3ZmZm N2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2YwMDAwYTUx NDIxMDQwMDAwNjIwY2ZmN2ZmZjdmZmY3ZjAwMDAyMTA4NDIwOGZmN2YwMDAwZmY3ZjQyMDhmZjdm NDIwYzQyMGMNCjIxMDQyMTA0MDgyMWZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3 ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZjAwMDAyMTA0MjEwNGZmN2ZmZjdmZmY3ZmZmN2ZmZjdm NDIwYzYyMGM0MTA4ZmY3ZmZmN2ZmZjdmDQpmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3 ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdm ZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3Zg0KZmY3ZmZmN2ZmZjdmZmY3 ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZjAwMDA2MzBjNjMxMDYyMGM4NDEw ZmY3ZmZmN2ZmZjdmMDAwMGE1MTQyMTA0ODQxMDAwMDBmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2YN CmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZjAwMDBmZjdmZmY3ZmZmN2YyOTI1 NDIwODQyMGM2MzBjODQxMGU3MWMyOTI1YzYxODYzMTA2MzBjMDAwMGZmN2ZmZjdmZmY3ZmZmN2Zm ZjdmZmY3ZmZmN2ZmZjdmDQpmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZjNjE4 MjEwNDZiMmRmZjdmZmY3ZmZmN2YwMDAwYzYxODYzMTA2MjBjYTUxNGZmN2ZmZjdmZmY3ZmZmN2Zm ZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3Zg0KZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdm ZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2Zm ZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2YNCmZmN2ZmZjdm ZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmNDIwODYyMGM0MjA4ZmY3ZmZmN2ZmZjdmZmY3ZmZmN2Zj NjE4MDAwMDQyMDhmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZm N2ZmZjdmDQpmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmMjEwNDAwMDBmZjdmZmY3ZmZmN2Yy MTA4ZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZm N2ZmZjdmZmY3ZmZmN2ZmZjdmNjMxMA0KMjEwNGZmN2ZmZjdmZmY3ZmZmN2ZmZjdmMDAwMDIxMDg2 MzEwMjEwODg0MTBmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZm N2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2YNCmZmN2ZmZjdmZmY3ZmZmN2Zm ZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZm N2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmDQpm ZjdmYzYxODYyMGM2MzEwYTUxNDAwMDBmZjdmZmY3ZmZmN2ZmZjdmZmY3ZjIxMDQ2MzBjMDAwMGZm N2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3 ZmZmN2ZmZjdmNjMwYw0KNDIwOGM2MTg2MzBjMjEwOGZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZm N2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZjAwMDBmZjdmNDIwODIxMDQ2MzBjZmY3 ZmZmN2ZmZjdmZmY3ZmZmN2Y0MjBjNjMwYzYzMTANCjI5MjVmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZm N2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3 ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmDQpmZjdmZmY3ZmZm N2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3 ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZjAwMDAyMTA4NjMxMDQyMGM0MjA4 ZmY3Zg0KZmY3ZmZmN2ZmZjdmZmY3ZmZmN2Y0MjA4MjEwNGZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3 ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmMDAwMGZmN2YwMDAw ZmY3ZmZmN2ZmZjdmZmY3ZmZmN2YNCmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3 ZmZmN2ZlNzFjMDAwNDQyMDhmZjdmZmY3ZmZmN2ZmZjdmZmY3ZjAwMDAyOTI1NjMwYzYyMGM2MzBj ZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmDQpmZjdmZmY3ZmZmN2ZmZjdmZmY3 ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdm ZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3Zg0KZmY3 ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdm ZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmNDIwYzYzMTA2MjBjODQxMDAwMDBmZjdmZmY3ZmZmN2Zm ZjdmZmY3Zjg0MTANCjIxMDQyMTA0MjEwNDAwMDBmZjdmMDAwMGZmN2ZmZjdmZmY3ZmZmN2ZmZjdm ZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2Zm ZjdmZmY3ZmZmN2ZmZjdmMDAwMDYzMGM2MzBjDQowMDAwNjMwY2ZmN2YwMDAwZmY3ZmZmN2ZmZjdm ZmY3ZmZmN2ZhNTE0NDIwYzYzMTA0MTA4ZTcxY2ZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2Zm ZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3Zg0KZmY3ZmZmN2ZmZjdm ZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2Zm ZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZm N2YNCmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2Zm ZjdmYTUxNDQxMDg2MzEwNDIwODQyMGNmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZjA4 MjEyMTA0MjEwNGM2MThmZjdmDQowMDAwZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2Zm ZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmMDAwMGZmN2YwODIxNjMwYzIxMDQwMDA0NDIwOGZm N2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3Zg0KNjIwYzYyMGM0MjA4ZmY3ZmZmN2Zm ZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZm N2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2YNCmZmN2Zm ZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZm N2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3 ZmZmN2ZmZjdmDQpmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmMDAwMDI5MjU0MjBjNjMwYzYz MTA0MjA4MjEwNGZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2YwMDAwZmY3ZmFkMzU0MTA4MjEw NDAwMDAyMTA0MjEwNDQyMDg0MjA4NjIwYw0KNDIwODQyMGM0MjA4NDIwYzQxMDgyMTA4MjEwNDIx MDgyMTA0ODQxMGZmN2YwMDAwZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZjAwMDBmZjdmNDIw ODYyMGM2MzEwNDEwODQyMDhmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2YNCmZmN2ZmZjdmZmY3ZmZm N2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3 ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdm DQpmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3 ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdm ZmY3ZmZmN2ZmZjdmZmY3Zg0KZmY3ZmZmN2YwMDAwNDIwODYyMGM2MzEwNjIwYzQyMDg0MjA4ZmY3 ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZjAwMDBmZjdm ZmY3ZmZmN2YwMDAwZmY3ZmZmN2ZmZjdmZmY3ZmZmN2YNCmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3 ZmZmN2ZmZjdmZmY3ZmZmN2Y0MjA4NDIwYzYzMTA0MjA4NjMwY2ZmN2ZmZjdmZmY3ZmZmN2ZmZjdm ZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmDQpmZjdmZmY3 ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdm ZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2Zm ZjdmZmY3Zg0KZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdm ZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2Zm ZjdmZmY3ZmZmN2Y4NDEwNDEwODYzMGMNCjYzMTA2MzEwNDEwOGM2MWNmZjdmMDAwMGZmN2ZmZjdm ZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2Zm ZjdmZmY3ZmZmN2ZmZjdmZmY3ZjAwMDBmZjdmODQxMDg0MTA2MjBjDQo2MjBjODMxMDQyMGM0MjA4 MDgyMTAwMDBmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2Zm ZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3Zg0K ZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2Zm ZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZm N2ZmZjdmZmY3ZmZmN2YNCmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2Zm ZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3Zjg0 MTBjNjFjNDIwODYyMGM2MzEwNjIwYzQyMGM0MjA4DQo2MzBjZmY3ZjAwMDBmZjdmMDAwMGZmN2Zm ZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZjAwMDBmZjdmNmIyZDg0MTA0MjA4NDIwYzYz MTA2MjBjNjIwYzIxMDhhNTE0ZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3Zg0KZmY3ZmZmN2Zm ZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZm N2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3 ZmZmN2YNCmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZm N2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3 ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmDQpmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZm N2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmMDAwMDI5MjU0YTI5NDEw ODYzMGM2MzEwODMxMDYzMTA2MzEwNjMwYzYzMTA0MjBjNjMwYw0KNDIwYzYzMGM2MjBjNjMxMDYy MGM2MzEwNjMxMDgzMTA2MzEwNjMwYzQyMDg0MjBjMDgyMTIxMDRmZjdmZmY3ZmZmN2ZmZjdmZmY3 ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2YNCmZm N2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3 ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdm ZmY3ZmZmN2ZmZjdmDQpmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3 ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdm ZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3Zg0KZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3 ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZjAwMDBmZjdmYzYxODYzMGM2MzBj NjMwYzg0MTA0MjBjNjMwYzQyMGM2MzBjNjIwYzg0MTBjNjE4NGEyZGZmN2YNCjAwMDBmZjdmZmY3 ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdm ZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2Zm ZjdmDQpmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdm ZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2Zm ZjdmZmY3ZmZmN2ZmZjdmZmY3Zg0KZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdm ZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2Zm ZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2YNCmZmN2ZmZjdmZmY3ZmZmN2ZmZjdm ZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2Zm ZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmDQpmZjdm ZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2Zm ZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZm N2ZmZjdmZmY3Zg0KZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2ZmZjdmZmY3ZmZmN2Zm ZjdmZmY3ZjQ2MDAwMDAwMTQwMDAwMDAwODAwMDAwMDU0NGU1MDUwMDcwMTAwMDA0YzAwMDAwMDY0 MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDc3MDANCjAwMDA3NzAwMDAwMDAwMDAwMDAwMDAwMDAwMDA3 ODAwMDAwMDc4MDAwMDAwMjkwMGFhMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDgwM2YwMDAwMDAwMDAw MDAwMDAwMDAwMDgwM2YwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwDQowMDAwMDAwMDAwMDAw MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAyMjAwMDAwMDBjMDAwMDAwZmZmZmZmZmY0NjAwMDAwMDFj MDAwMDAwMTAwMDAwMDA0NTRkNDYyYjAyNDAwMDAwMGMwMDAwMDAwMDAwMDAwMDBlMDAwMDAwMTQw MA0KMDAwMDAwMDAwMDAwMTAwMDAwMDAxNDAwMDAwMDA0MDAwMDAwMDMwMTA4MDAwNTAwMDAwMDBi MDIwMDAwMDAwMDA1MDAwMDAwMGMwMjc4MDA3ODAwMDMwMDAwMDAxZTAwMDQwMDAwMDAwNzAxMDQw MDA0MDAwMDAwMDcwMTA0MDANCmU1MDMwMDAwNDEwYjg2MDBlZTAwNzgwMDc4MDAwMDAwMDAwMDc4 MDA3ODAwMDAwMDAwMDAyODAwMDAwMDc4MDAwMDAwNzgwMDAwMDAwMTAwMDEwMDAwMDAwMDAwMDAw MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwDQowMDAwMDAwMDAwMDBmZmZmZmYwMDAw MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMGZmMDAwMDAwMDAwMDAwMDJiZmEwMDAwMDAwMDAw MDAwZmYwMDAwMDAwMDAwMDA3ZmZmZmYwMDAwMDAwMDAwMDBmZjAwMDAwMDAwMDAwZg0KZmZlZmZm ZTgwMDAwMDAwMDAwZmYwMDAwMDAwMDAwN2Y0MDAwMDFmYzAwMDAwMDAwMDBmZjAwMDAwMDAwMDNm YTAwMDAwMDNmZTAwMDAwMDAwMGZmMDAwMDAwMDAwZmMwMWZmZmY0MDFmMDAwMDAwMDAwZmYwMDAw MDAwMGJlODMNCmZhYWFhZjgwZmUwMDAwMDAwMGZmMDAwMDAwMDA3MDFmMDAwMDAwNzAxZjAwMDAw MDAwZmYwMDAwMDAwM2UwZjgwMDAwMDAwZjAzODAwMDAwMDBmZjAwMDAwMDA3MDNjMDAwMDAwMDAx YzFlMDAwMDAwMGZmMDAwMDAwMWUwZTAwDQowMGUyMDAwMGY4ZjgwMDAwMDBmZjAwMDAwMDM4MzAw MDA2NjMxMDAwMWMxYzAwMDAwMGZmMDAwMDAwZjBlMDAzZTZlMjMwODAwMzBmMDAwMDAwZmYwMDAw MDFjMTgwMDc2N2MyNzBjMDAxYzc4MDAwMDBmZjAwMDAwMzhlMDAwMw0KMjJjMmUwOGUwMGUzZTAw MDAwZmYwMDAwMDcxYzAwMDFmMTQzMzFkYzAwMTA2MDAwMDBmZjAwMDAwZTM4MDgwM2IxODMyMWYw MDAwODc4MDAwMGZmMDAwMDFjNjAxYzAxMTA4NjcxNjAwMDA2MWMwMDAwZmYwMDAwNzhjMGY4MDEN CmUwMDAyM2EwMGEwMzhlMDAwMGZmMDAwMDcxMDBlMDAxMDAwMDAxMzAwZjAxODYwMDAwZmYwMDAw ZTMwMDNjMDAwMDAwMDAzODM4ODBlMzAwMDBmZjAwMDFjNDAwMzUwMDAwMDAwMDAwMTBjMDYzODAw MGZmMDAwMzhjMDAzYjgwDQowMDAwMDAwMDIwODAzOWMwMDBmZjAwMDcxMDEwMWUwMDAwMDAwMDAw MzE4ODE4YzAwMGZmMDAwZTMwMWUxODAwMDAwMDAwMDAzMzhjMGNlMDAwZmYwMDBjNjAxZjAwMDAw MDAwMDAwMDBlMWMwNDcwMDBmZjAwMWNlMDA5YzAwMA0KMDAwMDAwMDAwMDM4MDIzODAwZmYwMDE4 ODEwYzgwMDAwMDAwMDAwMDAwNTAwMTE4MDBmZjAwMzk4MjBlMDAwMDAwMDAwMDAwMDBkODAxOGMw MGZmMDA3MTAzMDYwMDAwMDAwMDAwMDAwMDQwMDBjZTAwZmYwMGUyMGJlNDAwMDANCjAwMDAwMDAw MDAyODAwY2UwMGZmMDBjNDA5ZjAwMDAwMDAwMDAwMDAwMDEwMDA0NzAwZmYwMGNlMWZiMDAwMDAw MDAwMDAwMDAwMDAwMDIzMDBmZjAxY2MwNzIwMDAwMDAwMDAwMDAwMDAwMDA4MTE4MGZmMDM4ODAz ZTBhYWFhDQphYWFhYWFhYTg4MDAxYzFiODBmZjAzMTAwMGMxNWZkN2ZmZmZmZmZmZmY4MDM0MTlj MGZmMDMzMGUwODFhYTgyYTBhYWNhYjZhYTgxZTAwOGUwZmYwNzMwYzAwMGRmYzA1NTQ0NTU0MDdl YzFjMDA0YzBmZjBlMjBiYTAwYmZmZg0KZmZmZmZlZmZmYjgwODE4Y2UwZmYwNjQxOWIwMDEwNjVk MDgwMTA2MTA1MDAwMzA0NjBmZjBlNjFmMjAwMGEyMzYxODAxYTIwYTNlMDJlODI3MGZmMGM0MDVj MDAwNjUyNTE4MDA2NzA1NzU4NzAwMjcwZmYwYzgwMGMwMDAyM2INCjk4ODAwMzM4MTNmYzNmODIz OGZmMWM4MDAwMDAwMTM5MzE4MDAxNzgxMzE0MDNjMTMwZmYxODgzODAwMDAxMGZmMjgwMDMzODJm MGUwZjgxMzhmZjE5MDU4MDAwMDExN2UwODAwMjc0NDEwNjFjMDExOGZmMzk4Y2I4MDAwMThmDQpl OTgwMDJmYjhmMGUwODAwOThmZjMxMDQ5MDAwMDEwMWQwZmZkNTdkMTEwNTAwMjA5Y2ZmM2IwZWYw MDAwMGZiYTFmYmZmZTc2MjBhMGFlMDhjZmYzMTA0ZjAwMDAxODVlOWQyNGRkZTFjMGUwZmQwY2Nm ZjNhMDBhMDAwMDA4YQ0KYjg5YWRiZWVlZTBhMGUxMDhjZmYzMzAwMDAwMDAxMDA3MTk0MTI0NTFj MTAwNDEwNGNmZjMyMGMyMDAwMDBiOGY5YTRhMjhhM2MzNjA2MzBjZWZmNzIxODYwMDAwMTQwMzEw NTA0ODRkNDRjMDdlMDRjZmY2MjBiYTAwMDAxYmYNCjI5ODlhODg5YmNmODAyODBjZWZmNzIxMTAw MDA3NzI1MTEwOTA4MDI3N2IwMDAwMDQ0ZmYyMjBmZTAxYmZmNmI4YTAwMDI4ZTNlNjAwNjM4NGVm ZjYyMTQ0MDExN2Q1YmNjMDAwNDA5NzVjMDA3ZjA0NmZmNjIwMDAwMzgzOGQ4DQplZjQ2YTY5YWUz ODAwNmI4Y2VmZjcyMDAwMDU0MzAxMTc5MDRhNTA0OTYwMDAwMDA0NmZmNjIxOGMwOGU2MGFhN2Fh MDIwMDNiODAwMDAwMDZlZmY3MjFkYzA1ODRjNzg1MTJkNWQ1ZmMwMDAwMDEwNDRmZjYyMGY2MGU4 ZThmOA0KYWZmZmZmZmU4MDAwMDBmOGNlZmYzMjAxMjAyNDBjNTQ3ZmUwMDAwMDAwMDAwNzUwNDRm ZjIyMGJlMDNlNDZhZmVmYTAwMDAwMDA4MDA3ZTBjZWZmNzIwZmUwMGMxN2ZjMDVhMDAwMDAwMTgw MDFkMDRjZmYzMjA4MjAwZmZiYTANCjBlYTAwMDAwMDBlMDAwYjBjZWZmMzEwMDAwMDA2NDAwMDZm MDAwMDAwNWMwMDAxMDRjZmYzMzAwMDAwMDM4MDAwM2RhYzA2MDAzODAwMDAwOGNmZjMxMDAwMDAw MDAxMDAxNWNkNTQwMTMwMDAwMDBkY2ZmMzk4MGMwMDAwMDNjDQphZmZmYmY4MGNiODAwMjAwOWNm ZjExMDBjMDAwMDAzZTk3ZmZmZTAwNWUwMDAzMDE5OGZmMTg4MDAwMDAwMDBmZmZiZmY4MDM0ZTAw MDIwMWI4ZmYxODgwMDAwMDAwMDE1N2ZmYzAwOTVjMDAwMDAxMThmZjA4ODAwMDAwMDAwMA0KMGZl ZGY4Y2FmODAwMDAwMzM4ZmYwY2MwMDQwMDA2MDA1ZDU0Nzc1M2RlMDAwMDAxMzBmZjBjYzA5ZTAw MDdiYmZiZmYzZmZmZTAwMDM4MDIzMGZmMDQ0MGRjMDAwMWRkZjM1ZjE3ZmYzMDAwNTgwNjcwZmYw ZTYwZmM4MDAwZmYNCmFlZGZiZWZiODgwMDlhMDY2MGZmMDYyMDA1ODAwMDQ1MDU5YjM4NDQ0MDAx ZDIwNDYwZmYwNjIwMjNjMDAwMDgxZjg5ZmUyMjAwMDBmZTBjZTBmZjAzMTAzZTAwMDAwMGRkNWRk YzAwMDAwMWZjMGNjMGZmMDM5ODNjMjAwMDAyDQpmYmI5ZmJjYTAwMDM2ODA4YzBmZjAxOTAxMDcw MDAwOWM1MWM3ZmQ3MDAwMzUwMTFjMGZmMDE4ODA4ZjAwMDFmYmUzYWJmZmUwMDFiZjAzMzgwZmYw MWM0MDVjMDAwMDA3NDE4MTVkMDAwMTkzMDMzMDBmZjAwZTYwZjgwMDAwMA0KZjQzODBlYzgwMDNl NjA2MzgwZmYwMDYyMDMxZTAwMDE5NDcwMDIwMDAwMzc0MDQ3MDBmZjAwNjMwM2JiMDAwMDAwMzAw MDAwMDA3ZjgwOGUwMGZmMDA3MTAxOWMwMDAwMDA0MDAwMDAwMDVkYTE4YzAwZmYwMDM4ODBjYzIw MDANCjAwODAwMDAwMDBmYmEzOWMwMGZmMDAxYzQwNWM2MDAwMDAwMDAwMDAwMDc3NDMxODAwZmYw MDBlNjAzOGUwMDAwMDAwMDAwMDM4MmU4NjMwMDBmZjAwMDYzMDE4YzQwMDAwMDAwMDAwMzAxYjA0 NzAwMGZmMDAwZTM4MGNlNzAwDQowMDAwMDAwMGI4MDIwOGUwMDBmZjAwMDMwYzA2MzQ0MDAwMDAw MTAwZmMwMDExYzAwMGZmMDAwMzhlMDNiYzcwMDAwMDAxMzk4ZTAwMjM4MDAwZmYwMDAxYzcwMGQ4 NDAwMDAwMDAzMTE3MDA0NzAwMDBmZjAwMDBlMzgwZjhjMA0KMjgwMDBmYmJlZTAwOGYwMDAwZmYw MDAwNzFjMDMxODc5ODEwZTU5MTFlODEwYzAwMDBmZjAwMDAzOGUwNmY4ZWY4Mzk4Y2Y4ZTY4NjNj MDAwMGZmMDAwMDFjMzA3N2M2NzAxMTBjZGRjMTBjNzgwMDAwZmYwMDAwMGUxODNlZWUNCjMwMzNl ODhlODAzOGU4MDAwMGZmMDAwMDA3MDQwMDFlMzAxMzYwNzAwMDcxYzAwMDAwZmYwMDAwMDNlMzgw MDNhMDMwMmJlMDAwZTM4MDAwMDBmZjAwMDAwMGYxYzAwMDdjNzU3YzAwMDcwNzAwMDAwMGZmMDAw MDAwZjhmODAwDQowOGZmZTAwMDBlM2UwMDAwMDBmZjAwMDAwMDFjMWMwMDAwMzEwMDAwMzA3YzAw MDAwMGZmMDAwMDAwMGY4MzgwMDAzZTAwMDJlMGYwMDAwMDAwZmYwMDAwMDAwN2MwYzAwMDE0MDAw NzA3YzAwMDAwMDBmZjAwMDAwMDAwZjgzZQ0KODAwMDAwZmEwZjgwMDAwMDAwZmYwMDAwMDAwMDdj MDNkMDAwMTdjMDFjMDAwMDAwMDBmZjAwMDAwMDAwM2Y4MGJmZmZmYTAyZjgwMDAwMDAwMGZmMDAw MDAwMDAwN2YwMDA0NDAwMDdjMDAwMDAwMDAwZmYwMDAwMDAwMDAwZmUNCjgwMDAwMmZmODAwMDAw MDAwMGZmMDAwMDAwMDAwMDFmZjUwMDVmZjAwMDAwMDAwMDAwZmYwMDAwMDAwMDAwMDNmZmZmZmY4 MDAwMDAwMDAwMDBmZjAwMDAwMDAwMDAwMDE3ZmZkMDAwMDAwMDAwMDAwMGZmMDAwMDAwMDAwMDAw DQowMDAwMDAwMDAwMDAwMDAwMDBmZjgxNTQwMDAwNDEwYmM2MDA4ODAwNzgwMDc4MDAwMDAwMDAw MDc4MDA3ODAwMDAwMDAwMDAyODAwMDAwMDc4MDAwMDAwNzgwMDAwMDAwMTAwMTgwMDAwMDAwMDAw YzBhODAwMDAwMDAwMDAwMA0KMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYNCmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmDQpmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZg0KZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYNCmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmDQpmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZg0K ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmYNCmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmDQpmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZjAwMDAwMGZmZmZmZjAwMDAwMGZmZmZmZjVhNWE1YTYzNjM2MzRh NGE0YTRhNGE0YTYzNjM2MzZiNmI2YjAwMDAwMGZmZmZmZjAwMDAwMGZmZmZmZg0KZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmYNCmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmDQpmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZg0KZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYNCmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmY2YjZiNmIwODA4MTAxMDEwMTAwODEw MTAxMDEwMTgxMDEwDQoxODE4MTgyMTEwMTgxODE4MTgyMTEwMTgxODE4MTgyMTE4MTgyMTE4MTgy MTEwMTgxODE4MTgyMTEwMTgxODE4MTgyMTEwMTAxODEwMTAxODA4MDgxMDE4MTgxODVhNWE1YTAw MDAwMGZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZg0KZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYNCmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmDQpmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZg0KZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYNCmZmZmZmZmZmZmZmZmZmZmYyMTIx MjEzMTMxMzExMDEwMTAxMDEwMTgxODE4MjExODE4MjExODE4MjExMDEwMTgxMDEwMTgxMDEwMTAy MTIxMjEyOTI5Mjk1MjUyNTI1YTVhNWEwMDAwMDBmZmZmZmYwMDAwMDAwMDAwMDAwMDAwDQowMDVh NWE1YTUyNTI1MjI5MzEzMTIxMjEyMTEwMTAxODEwMTgxODEwMTgxODE4MTgyMTE4MTgyMTE4MTgx ODEwMTAxMDQyNDI0MmZmZmZmZjAwMDAwMGZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZg0KZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYNCmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmDQpmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm Zg0KZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmMjkyOTI5MDgwODA4MTAxMDE4MTAxODE4MTgxODIxMTAx MDE4MTAxMDEwZmZmZmZmNGENCjRhNGFmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmDQpmZjMxMzEzMTEwMTgxODEwMTAxODEw MTgxODE4MTgyMTEwMTAxODEwMTAxMGZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZg0KZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmYNCmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmDQpmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZg0KZmZmZmZmZmZmZmZmMjky OTI5MTAxMDE4MTAxODE4MTgxODIxMTgxODIxMTAxMDEwNTI1MjUyZmZmZmZmMDAwMDAwZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYN CmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYwMDAwMDAyMTIxMjEx ODE4MTgxMDEwMTgxODIxDQoyMTEwMTAxODIxMjEyMTM5MzkzOTAwMDAwMGZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZg0KZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYNCmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmDQpmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZjQyNDI0MjEwMTAxMDEwMTgxODE4MTgyMTA4 MDgxMDMxMzEzMWZmZmZmZmZmZmZmZg0KZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmMDAwMDAwNWE1YTVhMDgxMDEwMDgwODA4MDgwODA4MDgwODA4MDgwODA4MDAwMDA4 MDgwODA4MDgwODA4MDgwODEwMDgwODA4MDgwODA4MDgwODA4MTANCjEwMTAwODEwMTAxMDEwMTBm ZmZmZmYwMDAwMDBmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmYxMDEwMTAxMDE4MTgxODE4MjEwODEwMTAxMDEwMTBmZmZmZmZmZmZmZmZmZmZmDQpm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZg0KZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYNCmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmDQpmZmZmZmZmZjAw MDAwMGZmZmZmZjMxMzEzOTEwMTAxODE4MjEyMTEwMTAxODE4MTgyMWZmZmZmZjAwMDAwMGZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZjI5MjkyOTMxMzEzMTA4MDgxMDA4MDgwODE4MTgxODI5 MjkzMQ0KMTAxMDEwZmZmZmZmMDAwMDAwZmZmZmZmMDAwMDAwZmZmZmZmMDAwMDAwZmZmZmZmMDAw MDAwZmZmZmZmMDAwMDAwZmZmZmZmMDAwMDAwZmZmZmZmMDAwMDAwZmZmZmZmMjkzMTMxMDgxMDEw MDgwODA4MDgwODA4NGE0YTUyZmYNCmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmYwMDAwMDAxODE4MTgxMDEwMTgxODE4MjExMDE4MTgyOTI5MjkwMDAwMDBmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmDQpmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZg0KZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmYNCmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYxMDEwMTgx ODE4MTgxMDEwMThmZmZmZmZmZmZmZmZmZmZmDQpmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZjI5 MzEzMTA4MDgwODA4MDgwODIxMjEyMTAwMDAwMGZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZg0KZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmMTgxODE4MDAwMDAwMDgwODA4ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmYNCmZmZmZmZmZmZmYwMDAwMDAwODA4MTAxODE4MjEwODEwMTAzMTMxMzFmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmDQpmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZg0KZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYNCmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYyMTIxMjExMDEwMTgxODE4MjExMDEwMTAyMTIxMjFmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYwMDAwMDAwODEwMTAwODEwMTAyOTI5MjkwMDAwMDBm ZmZmZmZmZmZmDQpmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZg0KZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmMTAxODE4MDgwODA4MTAxMDEwNjM2MzYzZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmMTAxMDE4MTgxODIxMTAxMDEwZmYNCmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm DQpmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZg0KZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmMTAxMDE4MTAxODE4MTAxMDE4ZmZmZmZmZmYNCmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmY1MjUyNTIwODA4MTAwODA4MDgwMDAwMDBmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmDQpmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZg0KZmZmZmZmZmZmZmZmZmZmZmZmNWE1YTVhMDAwMDAwMjEyMTIxZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmMDAwMDAwMTAxMDEwMTgxODIxMDgwODA4ZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYNCmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmDQpmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZg0K ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmMjEyMTIxMTgxODIxMTAx ODE4MjEyMTIxZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmMjEyMTIxMDgwODEwNDI0MjQy ZmZmZmZmZmZmZmZmZmYNCmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYwMDAwMDAzOTM5 Mzk0YTRhNGFmZmZmZmZmZmZmZmZmZmZmZmY0YTRhDQo0YWZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZjAwMDAwMDAwMDAwMDA4MDgwODI5MjkyOQ0KMDAwMDAwZmZm ZmZmZmZmZmZmZmZmZmZmMDAwMDAwMjkyOTI5MTgxODIxMTAxMDE4MzkzOTM5ZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmYNCmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmDQpmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZjA4MDgxMDE4MTgyMQ0KMDgwODEwZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmMzkzOTM5MDgxMDEwZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYNCmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmYxMDEwMTAwODA4MDhmZmZmZmZmZmZmZmYxODE4MTgxMDEwMThm ZmZmZmZmZmZmZmZmZmZmZmYwODEwMTAzMTMxMzFmZmZmZmZmZmZmZmZmZmZmZmY1MjUyNWFmZmZm ZmZmZmZmZmZmZmZmDQpmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZjM5MzkzOTAwMDAwMDI5MjkyOWZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZjEwMTAxMA0KMTAxODE4MDgxMDEwZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYNCmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmDQpmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZjM5MzkzOTEwMTAxODE4MTgyMTM5MzkzOWZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZjI5Mjky OTA4MDgwODEwMTAxMGZmZmZmZg0KZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmMDAwMDAwMDgwODA4MDgwODA4MDAwMDAwMzEzMTMxZmZm ZmZmZmZmZmZmMzkzOTM5MzkzOTM5ZmZmZmZmMDAwMDAwMTANCjEwMTgyMTIxMjFmZmZmZmZmZmZm ZmZmZmZmZmYxODE4MThmZmZmZmZmZmZmZmZmZmZmZmYxODE4MTgyOTI5MjlmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmY0MjQyNDJmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmDQpmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZjA4MDgwODRhNGE0YWZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZjMxMzEzMTEwMTgxODEwMTgxODM5MzkzOWZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZg0KZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYNCmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmDQpmZjEwMTAxODEwMTgx ODEwMTAxOGZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZjA4MDgxMDMxMzEzMWZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm Zg0KZmZmZmZmMDgwODA4MTAxMDE4MjEyMTIxZmZmZmZmMDAwMDAwMDgwODEwZmZmZmZmZmZmZmZm MDAwMDAwMTAxMDEwMDAwMDAwMDAwMDAwMTAxODE4ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmMDAw ODA4ZmZmZmZmZmZmZmZmMTANCjEwMTgxMDEwMTgyMTIxMjFmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmYwODEwMTAxMDEwMTBmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmDQpmZjA4MDgwODAwMDAwMDAwMDAwMGZm ZmZmZmZmZmZmZmZmZmZmZjAwMDAwMDA4MTAxMDE4MTgxODE4MTgxOGZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZg0KZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmYNCmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYxMDEwMTAxODE4MjExODE4MjFmZmZmZmZmZmZm ZmZmZmZmZmYwMDAwMDAyOTI5MjkxMDEwDQoxMGZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZjE4MTgyMTMxMzEzMWZmZmZmZmZmZmZmZjEwMTgxOGZmZmZmZg0KZmZmZmZmZmZmZmZmMjEy MTIxZmZmZmZmMDAwMDAwMDgxMDEwZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmMDgwODA4ZmZmZmZm MTAxMDEwMjkyOTI5MzEzMTMxZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmMTgxODE4ZmYN CmZmZmZmZmZmZmZmZmZmZmYxMDEwMTAwODA4MDgyMTIxMjFmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYwMDAwMDAwMDA4MDgyMTIxMjFmZmZmZmZm ZmZmZmZmZmZmZmYwMDAwDQowMDE4MTgxODE4MjEyMTA4MDgxMDAwMDAwMGZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZg0KZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYNCmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmYxMDEwMTAxMDE4MTgyOTI5MjlmZmZmZmZmZmZmZmZmZmZmZmYwMDAwMDAw ODA4MTAyOTI5MjlmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmDQpmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZjEwMTgxODMxMzEzMTA4MTAxMDEwMTAxODAwMDAwMGZmZmZmZmZmZmZmZmZmZmZmZjA4MDgwOGZm ZmZmZjIxMjEyMWZmZmZmZmZmZmZmZg0KZmZmZmZmZmZmZmZmMTAxMDEwMTAxMDE4ZmZmZmZmZmZm ZmZmMTAxMDEwMDAwMDAwZmZmZmZmZmZmZmZmZmZmZmZmMDAwMDAwMTAxODE4MjkyOTI5ZmZmZmZm MTAxMDE4MDgwODA4MDAwMDAwZmZmZmZmZmZmZmZmZmZmZmZmZmYNCmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYwODA4MDhmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmYxODE4MjEwODA4MTBmZmZmZmZmZmZmZmZmZmZmZmZmZmZmDQpm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZg0KZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmMTAx ODE4MTAxODE4MTAxMDEwZmZmZmZmZmZmZmZmZmYNCmZmZmYzOTM5MzkwODA4MDgxMDEwMTBmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYwMDAwMDBmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYwMDAwDQowMDEwMTgxODE4 MTgxOGZmZmZmZjMxMzEzMTIxMjEyMWZmZmZmZmZmZmZmZmZmZmZmZjEwMTAxMDE4MTgyMWZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZjE4MjEyMTA4MDgwOGZmZmZmZmZmZmZmZjA4MTAxMGZm ZmZmZg0KZmZmZmZmZmZmZmZmZmZmZmZmMTAxMDEwMTgyMTIxMTAxMDEwMTgxODIxMzkzOTM5ZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmYNCmZmZmZmZmZmZmZmZmZmZmYwODA4MDhmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmY0YTRhNGExODE4MjExMDEwMTAwMDAwMDBmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmDQpmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZg0KZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmMTAxODE4MTAxMDE4MTAxMDEw ZmZmZmZmZmZmZmZmZmZmZmZmMjEyMTIxMTAxMDEwZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmYNCmZmZmZmZmZmZmYzMTMxMzEwODA4MTAwODA4MDhmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYxMDEwMTBmZmZmZmZmZmZmZmZm ZmZmZmYzOTM5MzlmZmZmZmZmZmZmZmZmZmZmDQpmZmZmZmZmZjA4MDgwOGZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZjMxMzEzMTMxMzEzMWZmZmZmZmZmZmZmZjQyNDI0MjA4MDgwODE4MTgxOGZmZmZm ZmZmZmZmZmZmZmZmZjEwMTAxOGZmZmZmZjE4MTgxODA4MDgxMGZmZmZmZg0KZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmMTAxMDEwNGE0YTRhZmZmZmZmZmZmZmZm ZmYNCmZmZmZmZmZmZmYxODE4MjEwODEwMTAwMDAwMDBmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmDQpmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZjMxMzEzMTEwMTgxODEwMTAxOA0KMDAwMDAwZmZmZmZmZmZmZmZmZmZm ZmZmMTAxODE4MTgxODE4ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmMDAwMDAw NDI0MjQyMTAxMDEwMjEyMTIxMDAwMDAwZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYNCmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYwODEwMTAwODEwMTAwODA4MDg1MjUyNTJmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmDQpmZmZmZmZmZmZmZmZmZmZmZmZmZjAwMDAwMGZmZmZmZmZmZmZmZmZmZmZmZjA4 MDgwODEwMTAxODAwMDAwMGZmZmZmZjA4MDgxMGZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZg0KMDAwMDAwZmZmZmZmMDAwMDAwZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmMTAxMDEwMTAxMDEwMDAwMDAwZmZmZmZmZmZm ZmZmZmZmZmZmMTgxODIxMTAxMDEwMDAwMDAwZmZmZmZmZmZmZmZmZmYNCmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm DQpmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZjEwMTAxODEwMTAxMDAwMDAwMGZmZmZmZmZmZmZmZmZmZmZmZjA4MDgwOGZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZg0KZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmMDgwODA4MTgxODIxMjEy MTIxZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmMjEyMTIxZmZmZmZmZmYNCmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmDQpmZjAwMDAw MGZmZmZmZmZmZmZmZjEwMTAxMDQyNDI0MmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZjA4MDgwODEwMTAxMDMxMzEzMTAwMDAwMGZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZg0KZmZmZmZmZmZmZmZmZmZmZmZmMTgxODE4MDAwODA4ZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmMTgxODIxMDgwODEwZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYNCmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmDQpmZmZmZmZmZjEwMTAxODEw MTAxODAwMDAwMGZmZmZmZmZmZmZmZmZmZmZmZjA4MDgxMDA4MDgwOGZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZjE4MTgyMTAwMDAwMA0K MTAxODE4MDgxMDEwZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmYNCmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmYxODE4MTgxMDEwMTA4NDg0ODRmZmZmZmZmZmZmDQpmZmZmZmZmZmZmZmZmZmZmZmZmZjAwMDAw MDA4MDgxMDIxMjEyMWZmZmZmZmZmZmZmZmZmZmZmZjA4MTAxMGZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZjI5MjkyOTA4MDgwODAwMDAwMGZmZmZmZg0KZmZmZmZmZmZm ZmZmMTgxODIxMTAxMDEwZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmYNCmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYwODEwMTAxMDE4MTgzOTM5MzlmZmZmZmZm ZmZmZmZmZmZmZmYwODA4MDhmZmZmDQpmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZjE4MjEyMTE4MTgyMWZmZmZmZjAwMDAw MGZmZmZmZjEwMTAxMGZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZg0KZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYNCmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYxMDEwMTBmZmZm ZmZmZmZmZmZmZmZmDQpmZmZmZmZmZjA4MDgwODAwMDAwMGZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZjMxMzEzMTAwMDAwMGZmZmZmZmZmZmZmZmZmZmZmZjI5MjkyOTE4 MTgyMTI5MjkyOWZmZmZmZmZmZmZmZmZmZmZmZg0KZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYNCmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmYxODE4MTgxMDE4MTgyOTI5MjlmZmZmZmZmZmZmZmZmZmZmZmYwODA4 MDgxODE4MThmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmDQpmZmZmZmZmZmZmZmZmZmZmZmZmZjAwMDAwMDEwMTAxODE4MTgxOGZmZmZmZjEwMTAxMDA4 MDgwODM5MzkzOWZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZg0KZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYNCmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYxODE4MThmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmYxMDEwMThmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmDQpmZmZm ZmZmZmZmZmZmZmZmZmZmZjMxMzEzMTA4MTAxMDAwMDAwMGZmZmZmZmZmZmZmZjA4MDgxMDE4MTgy MTIxMjEyMWZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZg0KZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm MzEzMTMxMTAxODE4MjEyMTIxZmZmZmZmZmYNCmZmZmZmZmZmZmYwODA4MDhmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYzMTMxMzFmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmYyOTI5MjkxMDEwMTgwODA4MTAxODE4DQoxOGZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm Zg0KZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmYNCmZmZmYzOTM5MzkwMDAwMDBmZmZmZmZmZmZmZmZmZmZmZmYzOTM5 MzkwODA4MTBmZmZmZmZmZmZmZmZmZmZmZmYwODA4MDhmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmYxODE4MTgxMDEwMTBmZmZmZmZmZmZmDQpmZmZmZmZmZjA4MDgxMDEwMTgxOGZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZg0KZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmMjkyOTI5MTAxMDE4MTAx MDE4ZmZmZmZmZmZmZmZmZmZmZmZmMjkyOTI5MzEzMTMxZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmYNCmZmZmZmZmZmZmYxMDEwMTAxMDE4MTgwODA4MDgwMDAwMDBmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmYzOTM5MzkyMTIxMjFmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmDQpmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZg0KZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmMDAwMDAwMTAxMDEwZmZmZmZmZmZmZmZmMDAwMDAwMTAxMDEwMTAxMDEwZmYN CmZmZmZmZmZmZmZmZmZmZmYxODE4MjEyOTI5MzFmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmYyMTIxMjk0MjQyNDJmZmZmZmZmZmZmZmYwMDAwMDAxMDEwMTgxMDE4MThmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmDQpmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZg0KMDgwODEwMTgxODE4ZmZmZmZmZmZmZmZm ZmZmZmZmMDgxMDEwMTAxMDEwZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmMjkyOTI5MDgxMDEwMDAwMDAwMDAwMDAwMzkzOTM5ZmZmZmZmZmYNCmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmDQpmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZg0KZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmMDgwODA4MDAwMDAwMDAwMDA4ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm MTAxMDE4MzEzMTMxMDAwMDAwZmZmZmZmZmZmZmZmZmZmZmZmZmYNCmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmYwODA4MDhmZmZmZmZmZmZmZmZmZmZmZmYwMDAwMDAxMDEwMTgxMDEwMTBmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmDQpm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZjI5MjkyOTE4MjEyMTE4MTgxOGZmZmZmZmZmZmZmZjM5MzkzOTAwMDgw ODAwMDAwMGZmZmZmZg0KZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmMTAxODE4ZmZmZmZmZmZmZmZmMTgxODE4MTAxMDE4MDAwODA4ZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYNCmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmDQpmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZg0KZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmMTgxODE4MzEzMTMxMDAw MDAwZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm MDgwODA4ZmZmZmZmZmZmZmZmZmYNCmZmZmYzMTMxMzExODE4MjEyOTI5MjlmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmDQpmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZjE4MTgxODEwMTAxMGZmZmZmZmZmZmZmZmZmZmZmZjAwMDAwOGZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZjVhNWE1YWZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZg0KMTAx MDE4MzEzMTMxZmZmZmZmZmZmZmZmMTAxMDEwZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmYNCmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmDQpmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZjEwMTgxOGZmZmZmZjEwMTAxMA0KZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmMTAx MDEwZmZmZmZmZmZmZmZmZmZmZmZmMTAxMDEwMTAxMDE4ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmYNCmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYxMDEwMTAxMDE4 MTgwMDAwMDBmZmZmZmZmZmZmDQpmZjM5MzkzOTIxMjEyMWZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZjEwMTAxOGZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZjA4MDgwODEwMTAxODAw MDAwMGZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZg0KZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYNCmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmDQpmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZjEwMTAxMDE4MTgxOGZmZmZmZjQyNDI0MjUyNTI1MmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZg0KZmZmZmZmZmZmZmZmZmZmZmZmMjkyOTI5MjEyMTIx ZmZmZmZmZmZmZmZmZmZmZmZmMTgxODIxMDgxMDEwZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYNCmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYyOTI5MjkxMDE4MTgyOTMxMzFmZmZmZmZm ZmZmZmZmZmZmZmYwODA4MDhmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYwODA4 DQowODE4MTgyMWZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZjEwMTAxODEwMTAxMGZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZg0KZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYNCmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmDQpmZmZmZmZm ZmZmZmZmZjA4MDgxMGZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZjAwMDAwMDAwMDAwMGZmZmZm ZmZmZmZmZg0KMzEzMTMxMTgxODIxNWE1YTVhZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmMDAwMDAwMTANCjEwMTAxMDEwMThmZmZmZmZmZmZmZmZmZmZmZmYwODA4 MDhmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYwMDAwMDBmZmZmZmYwMDAwMDAxMDEwMTAy OTI5Mjk0MjQyNDIyMTI5MjlmZmZmZmZmZmZmZmYxMDEwMTBmZmZmDQpmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZg0K ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmYNCmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmYwODA4MTBmZmZmZmY0MjQyNDJmZmZmZmZmZmZmDQpmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZjAwMDAwMDA4MDgwOGZmZmZmZmZmZmZmZjAw MDAwMDEwMTAxODEwMTAxOGZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZg0KZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmMjEyMTI5MTgxODIxZmZmZmZmZmZmZmZmZmZmZmZmMjkyOTI5ZmZmZmZmZmZmZmZmZmZm ZmZmZmYNCmZmZmZmZmZmZmZmZmZmZmYwODA4MDhmZmZmZmZmZmZmZmYxODE4MTgxMDEwMTgxMDEw MTAxMDEwMTAwMDAwMDBmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmDQpmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZg0KZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYNCmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYx MDEwMTBmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmDQpmZmZmZmZmZmZmZmZmZjI5MjkyOWZmZmZmZmZmZmZmZmZmZmZmZjIxMjEy MTE4MTgxODMxMzEzMWZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZg0KZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmMTgx ODE4MDgxMDEwZmZmZmZmZmZmZmZmMDAwMDAwMDAwMDA4MDAwMDAwZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmNTI1MjUyMTgxODIxMTAxMDE4MDgwODA4MTAxMDEwMDAwMDAwZmYNCmZmZmYxMDEwMTgz MTMxMzFmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmDQpmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZg0KZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYNCmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYwODEwMTBmZmZmZmZmZmZmZmZmZmZmZmYxMDE4DQoxODEw MTAxMGZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZjE4MTgyMTEwMTgxODAwMDAwMGZm ZmZmZmZmZmZmZg0KMTAxMDE4MDAwMDAwZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmMjkyOTI5MTAxMDE4MTAxMDEwZmZmZmZmZmZmZmZmMDAwODA4ZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYNCmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmDQpmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm Zg0KZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmYNCmZmZmZmZmZmZmZmZmZmZmYxODE4MThmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmYyOTI5MjlmZmZmZmZmZmZmZmZmZmZmZmYxODE4MjEyMTIxMjFm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmDQpmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZjAwMDAwMDEwMTAxODEwMTAxOGZmZmZmZmZmZmZmZmZmZmZm ZjA4MDgwOGZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZg0KZmZmZmZm ZmZmZmZmMDgwODA4MTAxMDEwMjEyMTI5MjkyOTI5MzEzMTMxZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmMDAwMDAwZmZmZmZmMDAwMDAwZmZmZmZmMDAwMDAwZmZmZmZmMDAwMDAwZmZmZmZm MDAwMDAwZmYNCmZmZmYwMDAwMDBmZmZmZmYwMDAwMDBmZmZmZmYwMDAwMDBmZmZmZmYwMDAwMDBm ZmZmZmYwMDAwMDBmZmZmZmYwMDAwMDBmZmZmZmYwMDAwMDBmZmZmZmYwMDAwMDBmZmZmZmYwMDAw MDBmZmZmZmYwMDAwMDBmZmZmZmY1MjUyDQo1MmZmZmZmZjRhNGE0YWZmZmZmZjAwMDAwMGZmZmZm ZjAwMDAwMGZmZmZmZjAwMDAwMGZmZmZmZjAwMDAwMGZmZmZmZjAwMDAwMGZmZmZmZjAwMDAwMGZm ZmZmZjAwMDAwMGZmZmZmZjAwMDAwMGZmZmZmZmZmZmZmZmZmZmZmZg0KMDAwMDAwZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmNGE0YTRhMTAxODE4MTgxODE4ZmZmZmZmZmZmZmZmZmZmZmZmZmYN CmZmZmZmZmZmZmYwODA4MDgwMDAwMDBmZmZmZmYwMDAwMDAxMDEwMTAxMDE4MThmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmYxMDE4DQoxODE4MTgyMWZmZmZmZmZmZmZmZmZmZmZmZjA4MDgxMGZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZjA4MTAxMDA4MTAxMGZmZmZmZmZmZmZmZg0KZmZmZmZmZmZmZmZmZmZmZmZmMjkyOTI5 ZmZmZmZmNDI0MjQyZmZmZmZmMDgwODA4MDgwODEwMDgwODA4MDgwODA4NTI1MjUyNWE1YTVhMTAx MDEwZmZmZmZmMDgxMDEwZmZmZmZmMTgxODE4MjkyOTI5MDAwMDAwMDgwODA4NTINCjUyNTI1MjUy NTI0MjQyNDI0MjQyNDIyOTI5Mjk1YTVhNWExMDE4MTgxMDEwMTAxMDE4MTgyOTMxMzExMDEwMTAx MDE4MTgxMDEwMTgxMDEwMTAxMDEwMTgwODEwMTAwODA4MTAyMTIxMjEwODA4MTAwODA4MTAxMDEw MTAwODA4DQoxMDA4MDgxMDA4MTAxMDA4MTAxMDA4MTAxMDEwMTAxMDA4MDgwODEwMTAxMDA4MDgw ODEwMTAxMDAwMDAwODA4MDgwODA4MDgwODA4MDgwODAwMDAwMDA4MDgwODAwMDAwMDA4MDgwODAw MDAwOGZmZmZmZmZmZmZmZmZmZmZmZg0KZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmMjEyMTIxMTAxMDE4ZmZmZmZmMzEzMTM5ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm MTAxMDEwMTAxMDEwZmZmZmZmZmZmZmZmMzEzMTMxMTAxODE4NTINCjUyNTJmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmYxMDE4MTgxMDEwMTBmZmZmZmZmZmZmZmYwMDAwMDAxMDEwMThmZmZmZmZmZmZmZmZmZmZmDQpm ZmZmZmZmZjAwMDAwMDA4MDgwODA4MDgwOGZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZjQy NDI0MmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZjE4MTgxODAwMDAwMGZmZmZm ZjAwMDAwMGZmZmZmZg0KMDAwMDAwZmZmZmZmMDAwMDAwZmZmZmZmMDAwMDAwZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmMDAwMDAwZmZmZmZmMDAwMDAwZmZmZmZmMDAwMDAwZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmMTAxMDEwZmYNCmZmZmYwMDAwMDBmZmZmZmYyMTIxMjFmZmZm ZmYwMDAwMDBmZmZmZmYwMDAwMDAyMTIxMjFmZmZmZmZmZmZmZmYwMDAwMDBmZmZmZmYwODA4MDhm ZmZmZmY0YTRhNGFmZmZmZmYwMDAwMDAwODA4MDhmZmZmZmYwODA4MTAwMDAwDQowMGZmZmZmZjAw MDAwMGZmZmZmZjAwMDAwMGZmZmZmZjAwMDAwMGZmZmZmZjAwMDAwMGZmZmZmZjA4MDgwOGZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZjA4MDgxMDRhNGE0YTA4MTAxMDMxMzEzMWZm ZmZmZg0KZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmMDgw ODA4ZmZmZmZmZmZmZmZmZmZmZmZmMTAxMDE4MDgxMDEwMDAwMDAwZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmYNCmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYzMTMxMzExMDE4MTgz OTM5MzlmZmZmZmZmZmZmZmYwODA4MTAwMDAwMDBmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYyOTI5 MjkxODE4MThmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmDQpmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZjAwMDAwMDE4MTgxOGZmZmZmZjE4 MTgxODA4MDgxMDA4MDgwODAwMDAwMDA4MDgxMDAwMDAwMDA4MDgxMGZmZmZmZmZmZmZmZg0KZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmMDAwMDAwZmZmZmZmMTgxODE4ZmZmZmZmMDAwMDAw ZmZmZmZmMjkyOTI5ZmZmZmZmMDAwMDAwZmZmZmZmZmZmZmZmZmZmZmZmMDAwMDAwZmZmZmZmZmZm ZmZmZmZmZmZmMDANCjAwMDBmZmZmZmYwMDAwMDBmZmZmZmYyOTI5MjlmZmZmZmYyMTIxMjFmZmZm ZmYwMDAwMDBmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYyOTI5Mjkw MDAwMDAyOTI5MjkxMDEwMTgxMDEwMTAyOTI5DQoyOWZmZmZmZjA4MDgwODAwMDAwMGZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZjI5MjkzMTE4MTgxODAwMDAwMGZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZg0KZmZmZmZmMzEzMTMx ZmZmZmZmZmZmZmZmMjEyMTIxMTgxODIxZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmMDAwMDAwMTAxMDEwMTAxODE4ZmZmZmZmZmZmZmZm ZmYNCmZmZmYwODA4MDhmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYwODA4MTBmZmZmZmYw ODA4MDgyOTI5MjkwMDAwMDBmZmZmZmYwODA4MDhmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmDQpmZmZmZmZmZjAwMDAwMGZmZmZmZjAwMDAwMDEwMTAxODEwMTAx MDAwMDAwMDAwMDAwMDEwMTAxMDAwMDAwMDA4MTAxMDE4MTgyMTEwMTAxMDEwMTgxODEwMTgxODEw MTAxMDA4MDgwODE4MTgxODA4MDgwODAwMDAwMDA4MDgxMA0KMjEyMTIxMDgwODEwMTgxODE4MTAx MDEwMTgxODIxMTAxMDEwMTgxODE4MTAxMDEwMTgxODE4MTgxODE4MTAxMDEwMTAxMDEwMTAxMDEw MDgwODA4MTAxODE4MTAxMDEwMTgxODIxMDAwMDAwMzkzOTM5ZmZmZmZmMDgwODA4MDgNCjA4MDgw MDAwMDgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwODA4MDgwMDAwMDAyOTI5MjkwMDAwMDAwODA4 MDgyOTI5MjlmZmZmZmYxMDE4MTgxMDE4MTgwODEwMTBmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmDQpmZmZmZmZmZjI5MjkyOWZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZjA4MDgwODAwMDAwMGZmZmZmZmZmZmZmZmZmZmZmZjAwMDAwMDAwMDAwMGZmZmZmZmZmZmZm ZjAwMDAwMDEwMTgxODEwMTAxMGZmZmZmZg0KZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmMTgxODIxMDgwODEwZmZmZmZmZmZmZmZmMTAxMDEwZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmMjkyOTI5MTAxMDEwZmYNCmZmZmZmZmZmZmYxMDE4 MTgxODE4MThmZmZmZmYwODA4MDgwMDAwMDBmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYxODE4MThmZmZmZmZmZmZmZmZmZmZm DQpmZmZmZmZmZmZmZmZmZjEwMTAxMDAwMDgwOGZmZmZmZmZmZmZmZjEwMTAxMGZmZmZmZjEwMTAx MDAwMDgwODIxMjEyMWZmZmZmZjIxMjEyMWZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZjA4MDgwOGZm ZmZmZmZmZmZmZmZmZmZmZg0KZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmMjkyOTI5ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmMDgwODEwMDgwODA4ZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmMjEyMTIxZmZmZmZmZmYNCmZmZmZmZmZmZmZmZmZmZmZmZmZmZmY2 MzYzNjNmZmZmZmYxMDE4MThmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYwODA4DQowODA4MTAx MGZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZjIxMjEyMWZmZmZmZmZmZmZmZmZmZmZmZjEw MTAxMDEwMTAxOGZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZg0KMjEyMTI5MTgxODIxMTgxODE4ZmZmZmZmZmZmZmZmMDAwODA4MDAwMDAwZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmMDgwODA4MTAxODE4MTAxMDE4MTAxODE4MjkyOTI5ZmZmZmZmZmZm ZmZmMDgwODEwZmZmZmZmZmZmZmZmZmYNCmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYwODA4MTBmZmZmZmYwODA4MDhmZmZmZmZm ZmZmZmZmZmZmZmYwMDAwMDBmZmZmZmZmZmZmZmZmZmZmZmYxMDEwDQoxODEwMTAxMGZmZmZmZjAw MDgwODAwMDAwMGZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZjIxMjEyMTMxMzEzMWZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZjA4MDgwOA0K MDgwODA4ZmZmZmZmMTgxODE4ZmZmZmZmZmZmZmZmZmZmZmZmMTAxMDEwZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmMDgwODA4ZmZmZmZmMDAwMDAwZmZmZmZmZmZmZmZmZmZmZmZmMDAwMDAw MTAxMDEwMDAwMDAwMjENCjIxMjExODE4MThmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmYwMDAwMDBmZmZmZmYwODA4MDgwODA4MDgwMDAwMDBmZmZmZmYwMDAwMDBmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYxMDEwDQoxMGZmZmZmZmZmZmZmZjI5MjkyOTE4MjEy MTMxMzEzMWZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZjEw MTAxMDEwMTgxOGZmZmZmZmZmZmZmZmZmZmZmZjMxMzEzMWZmZmZmZmZmZmZmZg0KZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmMDAwMDAwZmZmZmZmMTAxMDE4MDgwODEwMTAxODE4ZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmYNCmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYwMDAwMDAxMDEwMTBmZmZmZmZmZmZmZmYzMTMx MzFmZmZmZmYwODA4MDhmZmZmZmZmZmZmZmYwODA4MDhmZmZmZmZmZmZmZmYxMDEwMTBmZmZmZmYw ODA4MDhmZmZmZmZmZmZmZmZmZmZmDQpmZjQyNDI0MjEwMTAxMGZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZjIxMjEy MTAwMDAwOGZmZmZmZmZmZmZmZjRhNGE0YTEwMTAxMDA4MDgwOA0KZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmNTI1MjUyZmZmZmZmNWE1YTVhZmZmZmZmMDAwMDAwMDAwODA4MTAxMDEwZmZm ZmZmMTAxMDEwZmZmZmZmMjEyMTIxMjEyMTIxZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmMzENCjMx MzExMDEwMTAzMTMxMzlmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmYwMDAwMDBmZmZmZmZmZmZmZmYwMDAwMDAxMDEwMTgxMDEwMTBmZmZm ZmZmZmZmZmZmZmZmDQpmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZjE4MjEyMTE4MTgx OGZmZmZmZmZmZmZmZjI5MjkyOWZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZg0KMTgxODE4MDgwODEwZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmMDAwMDAwZmZmZmZmZmZmZmZmZmYNCmZmZmYwMDAwMDAw ODA4MDgwODA4MDhmZmZmZmYxMDEwMTAyOTMxMzEwODA4MTBmZmZmZmZmZmZmZmYwODA4MTAxMDEw MTBmZmZmZmZmZmZmZmZmZmZmZmYxODE4MThmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmDQpmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZjE4MTgxODIx MjEyMWZmZmZmZmZmZmZmZjMxMzEzMTVhNWE1YTA4MDgwOGZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZjM5Mzk0Mg0KZmZmZmZmZmZmZmZmMDAwMDAwMDgwODEwMzkzOTM5MzEzMTMx MDgwODA4MDgwODEwMTAxODE4MTAxMDEwZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmMTAxMDEwMTAx MDE4MTgxODE4MTAxMDEwMjkzMTMxMTgxODE4NGE0YTRhZmYNCmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmYxMDEwMTBmZmZmZmZmZmZmZmZmZmZmZmYxMDEwMTgxMDE4MTgwMDAwMDBmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYzOTM5MzkxMDE4MTgzMTMxMzFmZmZmDQpmZmZm ZmZmZjAwMDAwOGZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZg0KZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmMDgwODA4ZmZmZmZmZmZmZmZmMDgwODA4MDAwMDAwMDAwODA4 ZmZmZmZmZmZmZmZmMTAxMDE4ZmZmZmZmZmYNCmZmZmYzOTM5MzkwODA4MTBmZmZmZmZmZmZmZmZm ZmZmZmYwODA4MDgyMTIxMjFmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmDQpmZjAwMDAwMGZmZmZm ZjRhNGE0YTRhNGE0YTVhNWE1YTIxMjEyMWZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZjRhNGE0YWZmZmZmZmZmZmZmZjE4MTgxODEwMTAxMGZmZmZmZmZmZmZmZmZmZmZmZjA4MDgx MA0KZmZmZmZmMDgwODA4ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmMjEyMTIxMTgxODIxMTAxMDE4MTAxMDEwZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmMDgwODEwZmZmZmZmZmYNCmZmZmY0YTRhNGExODE4MjFmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmYwODEwMTAxODE4MjFmZmZmZmZmZmZmZmZmZmZmZmYyMTIxMjFm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmY1YTVhDQo1YTEwMTAxMDAwMDAwMGZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZg0KZmZmZmZm ZmZmZmZmZmZmZmZmMDAwMDAwZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmMjEyMTIxMDAwMDAwMDAw MDAwMjEyMTIxMTgxODE4MDAwMDAwMjEyMTIxMTgxODE4ZmZmZmZmZmZmZmZmMDAwMDAwZmZmZmZm MTgxODE4ZmYNCmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYzOTM5MzkwODA4MTBmZmZmZmZmZmZmZmYwMDAw MDAyOTI5MjkwMDAwMDBmZmZmZmZmZmZmDQpmZmZmZmZmZmZmZmZmZmZmZmZmZjEwMTAxMGZmZmZm ZjIxMjkyOTEwMTAxMDAwMDAwMDAwMDAwMGZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZjEwMTAxMDIx MjEyMTE4MTgxOGZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZg0KMDAwMDAwMjkyOTI5MTAx MDEwMTgxODE4MDAwMDAwZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmMDAwMDAw ZmZmZmZmZmZmZmZmMDAwMDAwMTgxODIxMTAxMDE4ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYN CmZmZmZmZmZmZmYxMDEwMTgwODEwMTBmZmZmZmZmZmZmZmY0YTRhNGFmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmYwODA4MTBmZmZmZmYyOTI5MjkwODA4MTBmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmDQpmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZjAwMDAwOGZmZmZmZmZmZmZmZmZmZmZmZjE4MTgxOA0KZmZmZmZmMDgwODA4MDgwODA4MTAxMDE4 MTAxMDE4MDAwMDAwMDAwMDAwZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmMDgwODA4ZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYNCmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmYwMDAwMDBmZmZmZmZmZmZmZmYyMTIxMjExODE4MTgwODEwMTBm ZmZmZmYzMTMxMzFmZmZmZmZmZmZmZmZmZmZmZmYxODE4MThmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmDQpmZjAwMDAwMGZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZjAwMDAwMDA4MDgw OGZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZjEwMTAxMDA4MDgwODA4MDgwOGZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZg0KZmZmZmZmZmZmZmZmZmZmZmZmMjkyOTI5ZmZmZmZmZmZm ZmZmZmZmZmZmMTAxMDE4MTAxMDE4ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmMDAwMDAw MTgxODIxMjEyMTIxZmZmZmZmZmZmZmZmMDgwODA4MDAwMDAwZmYNCmZmZmZmZmZmZmZmZmZmZmYw MDAwMDAwODA4MDhmZmZmZmZmZmZmZmYxMDE4MThmZmZmZmY2MzYzNjMwODA4MTAwMDAwMDBmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmDQpm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZjE4MTgxODAw MDAwMGZmZmZmZmZmZmZmZmZmZmZmZjAwMDAwMDAwMDAwMDAwMDAwMDE4MTgxODE4MTgxODA4MDgw ODMxMzEzMWZmZmZmZg0KMDAwMDAwZmZmZmZmZmZmZmZmMDAwMDAwMTgxODE4ZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmMTgxODE4ZmZmZmZmMDgwODEwMDANCjAwMDAwMDAwMDAwMDAwMDAxMDEwMTBmZmZm ZmYxMDEwMTAyMTIxMjEwODA4MDhmZmZmZmZmZmZmZmZmZmZmZmYwMDAwMDAxODE4MTgxMDEwMTgw ODA4MTBmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYwMDAwMDAyMTIxMjEwMDAwDQowMGZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZjAwMDAwMGZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZjQyNDI0MmZmZmZmZmZmZmZmZjQy NDI0Mg0KMTgyMTIxZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmMTgyMTIxMTgxODIxZmZm ZmZmZmZmZmZmZmZmZmZmMDgwODA4ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmMDgwODA4 ZmZmZmZmZmZmZmZmMTAxMDEwZmYNCmZmZmZmZmZmZmYwMDAwMDBmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmDQpmZjRhNGE0YWZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZjEwMTgxODEwMTgxODA4MDgwOGZmZmZmZjAw MDAwMGZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZjAwMDAwMDEwMTgxODAwMDAwODA4MDgwOA0KMDgw ODEwMDgwODA4MDAwMDAwMTAxMDEwMDAwMDAwMDAwMDAwZmZmZmZmMDAwMDAwZmZmZmZmMDgwODEw ZmZmZmZmMDgwODA4ZmZmZmZmNTI1MjUyMDgxMDEwMDgwODA4MDgwODA4MjkyOTI5ZmZmZmZmMDgw ODA4ZmZmZmZmZmYNCmZmZmZmZmZmZmYxODE4MjFmZmZmZmZmZmZmZmZmZmZmZmY1MjUyNTJmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYyOTI5MjlmZmZmZmYwMDAwMDBmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmDQpmZmZmZmZmZmZmZmZmZmZmZmZmZjEwMTAxMGZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZjAwMDAwMGZmZmZmZmZmZmZmZjA4MDgwODEwMTgx ODA4MDgwOGZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZjE4MTgxODE4MTgyMQ0KMDAwMDAwZmZmZmZm MDAwMDAwMDgwODA4ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmMDAwMDAwMDgxMDEwMTAxMDEwZmZm ZmZmMTAxMDEwNGE0YTRhMDAwMDAwMDAwMDAwZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmYNCmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYxMDE4MTgxODE4MTgwODA4MDgxMDEw MTA1YTVhNWFmZmZmZmYwODA4DQowODAwMDAwMDE4MTgxOGZmZmZmZjE4MTgxOGZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZjE4MTgxODEwMTAxMDM5MzkzOTAwMDAwMDMxMzEzMTMxMzEzMWZmZmZmZjE4 MTgxODA4MDgwODAwMDAwMDA4MDgwODE4MTgxODAwMDAwMA0KMTAxMDEwMTAxMDE4MDgwODEwMDAw MDAwMDgwODA4MDgwODA4MTAxMDE4ZmZmZmZmZmZmZmZmMDgxMDEwMTAxMDEwMDAwMDAwZmZmZmZm MjEyMTIxMDAwMDAwZmZmZmZmZmZmZmZmZmZmZmZmMDgwODA4ZmZmZmZmZmZmZmZmZmYNCmZmZmZm ZmZmZmZmZmZmZmYyOTI5MjlmZmZmZmY1YTVhNWFmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmY2YjZiNmJmZmZmZmYwMDAwMDBmZmZmZmY0MjQyNDIwODEwMTAxODE4MjFmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmDQpmZmZmZmZmZjA4MDgwOGZmZmZmZmZmZmZmZmZmZmZmZjE4MTgyMTA4MDgxMGZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZjA4MDgxMDEwMTAxOGZmZmZmZmZmZmZmZmZmZmZmZjM5Mzkz OWZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZg0KZmZmZmZmMDAwMDAwZmZmZmZmZmZmZmZmMjEyMTIx MTAxMDEwMDgwODA4MzEzMTMxZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYNCmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmYwMDAwMDAzOTM5NDJmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYx MDEwMTBmZmZmZmYwODA4MDgwODA4MDgwMDAwMDAwMDAwMDBmZmZmZmYwODA4MDhmZmZmZmZmZmZm DQpmZjAwMDAwMDA4MDgwODAwMDAwMGZmZmZmZjI5MjkyOWZmZmZmZmZmZmZmZjAwMDAwMGZmZmZm ZmZmZmZmZjEwMTAxMGZmZmZmZmZmZmZmZjEwMTAxMDAwMDAwMGZmZmZmZjEwMTAxODEwMTAxODAw MDAwMGZmZmZmZjEwMTAxMA0KMDAwMDA4MTgxODE4MDgxMDEwZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmMTgxODE4MDAwMDAwMDgxMDEwZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm MDgwODA4MDAwMDAwMjEyMTIxZmZmZmZmZmZmZmZmZmYNCmZmZmZmZmZmZmZmZmZmZmYyOTI5Mjkx MDE4MTgxMDEwMTgxMDEwMTgwODA4MTAyMTIxMjFmZmZmZmYzOTM5MzlmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmYxMDEwMTAwMDAwMDBmZmZmZmZmZmZmZmYxMDEwMTgxMDEwMTBmZmZmDQpmZmZmZmZm ZmZmZmZmZmZmZmZmZjEwMTgxODA4MTAxMDAwMDAwMGZmZmZmZjUyNTI1MmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZjAwMDAwMGZmZmZmZjAwMDAw MGZmZmZmZg0KZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmMDAwMDAwZmYNCmZmZmZmZmZmZmZmZmZmZmY0YTRhNGFmZmZmZmYxODE4 MThmZmZmZmYwMDAwMDBmZmZmZmYxODE4MjEwODA4MDgzOTM5MzlmZmZmZmZmZmZmZmZmZmZmZmYx MDEwMTBmZmZmZmZmZmZmZmYwMDAwMDAwMDAwMDBmZmZmZmYxODE4DQoxOGZmZmZmZjAwMDAwMDQy NDI0MmZmZmZmZjAwMDAwMDAwMDAwMGZmZmZmZjI5MjkyOTE4MTgxODAwMDAwMDE4MTgxODEwMTAx MGZmZmZmZjAwMDAwMDI5MjkyOTEwMTAxMGZmZmZmZjAwMDAwMDI5MjkyOTI5MjkyOWZmZmZmZg0K MDAwMDAwMTAxMDEwMDAwMDAwZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmMDgwODA4ZmZm ZmZmMDgwODA4ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmMDAwMDAwMDgxMDEwMDAwMDAw ZmZmZmZmZmZmZmZmZmYNCmZmZmZmZmZmZmYwODA4MDhmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYz MTMxMzFmZmZmZmZmZmZmZmZmZmZmZmYxMDEwMTgxMDEwMTBmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmYxMDEwMTgxODE4MThmZmZmZmZmZmZmZmYxMDEwDQoxMDAwMDAwMGZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZg0KZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm MDAwMDAwZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmMzkNCjM5MzkxMDEwMTgwMDAwMDBmZmZmZmZmZmZmZmZmZmZmZmYyMTIxMjEwODA4MDhmZmZm ZmZmZmZmZmYxMDEwMTBmZmZmZmYyOTI5MjlmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYw ODA4MDhmZmZmZmZmZmZmZmYwMDAwDQowMGZmZmZmZmZmZmZmZjAwMDAwMGZmZmZmZmZmZmZmZmZm ZmZmZjAwMDAwMGZmZmZmZjAwMDAwMGZmZmZmZmZmZmZmZmZmZmZmZjAwMDAwMDEwMTAxMDA4MDgw OGZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZjEwMTAxMA0KZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmMDAwMDAwZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmMTAxMDEwZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmMDgNCjA4 MDhmZmZmZmZmZmZmZmYwODA4MDgxMDEwMThmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYxODIxMjEz OTM5MzlmZmZmZmZmZmZmZmYxMDEwMTBmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYwODA4 MTAwODA4MDhmZmZmDQpmZmZmZmZmZmZmZmZmZmZmZmZmZjAwMDAwMGZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZg0KZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmMDAw MDAwZmZmZmZmMDAwMDAwMjEyMTIxNTI1MjUyZmZmZmZmZmZmZmZmZmZmZmZmMDgwODA4MjkyOTI5 MDAwMDAwMTgxODE4NmI2YjZiZmZmZmZmZmZmZmZmMzEzMTMxMTAxMDEwZmYNCmZmZmYxMDEwMTBm ZmZmZmZmZmZmZmYxODE4MThmZmZmZmZmZmZmZmYxMDEwMTBmZmZmZmYwMDAwMDBmZmZmZmZmZmZm ZmZmZmZmZmYwMDAwMDBmZmZmZmYxODE4MThmZmZmZmZmZmZmZmZmZmZmZmYwMDAwMDBmZmZmZmYy MTIxDQoyMWZmZmZmZmZmZmZmZmZmZmZmZjEwMTAxMDE4MTgxODAwMDAwMDA4MDgwOGZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZjEwMTgxODRhNGE0YWZmZmZmZjA4MDgwODAwMDAwMGZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZg0KZmZmZmZmMDgxMDEwMDAwMDAwZmZmZmZmZmZmZmZmZmZmZmZm MjEyMTIxMzEzMTMxZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmMDAwMDAwMjEyMTIxZmZmZmZmZmZm ZmZmMjkyOTI5MTAxODE4MDAwMDAwZmZmZmZmZmZmZmZmNTINCjUyNTIxMDE4MTg3MzczNzNmZmZm ZmZmZmZmZmYwMDAwMDBmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYwMDAwMDAwMDA4MDhmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmYwMDAwMDAwODEwMTBmZmZmZmZmZmZmZmZmZmZmZmZmZmZmDQpmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZjAwMDAwMGZmZmZmZjEwMTAxMGZm ZmZmZmZmZmZmZg0KZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmMTgxODE4MTAx MDE4ZmZmZmZmZmZmZmZmZmZmZmZmMTAxMDEwZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm MTAxMDEwZmZmZmZmMDAwMDAwZmZmZmZmZmYNCmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYxODE4MThm ZmZmZmZmZmZmZmYwODA4MDhmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYxODE4MThmZmZmZmZmZmZm ZmYzMTMxMzExMDEwMTBmZmZmZmY2YjZiNmJmZmZmZmYwODA4MTBmZmZmDQpmZmZmZmZmZmZmZmZm ZjA4MDgwOGZmZmZmZmZmZmZmZjA4MDgwODI5MjkyOWZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZjAwMDAwMDA4MDgwODEwMTAxMDA4MTAxMDEwMTAxMDI5MjkyOWZmZmZm Zg0KZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmMDgwODA4ZmZmZmZmZmZmZmZmMzEzMTMx MTgxODIxZmZmZmZmZmZmZmZmZmZmZmZmMjkyOTI5MTgyMTIxZmZmZmZmZmZmZmZmZmZmZmZmMDgw ODA4ZmZmZmZmZmZmZmZmZmYNCmZmZmZmZmZmZmZmZmZmZmYzOTM5MzlmZmZmZmY1MjUyNTIwODA4 MDgzMTMxMzFmZmZmZmY0YTRhNGFmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmDQpmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZjEwMTgxODEwMTAxOGZmZmZmZjAwMDAwMDQyNDI0 MjAwMDAwMDA4MDgwODM5MzkzOTIxMjEyMWZmZmZmZmZmZmZmZjEwMTAxMGZmZmZmZg0KMDgwODA4 ZmZmZmZmZmZmZmZmMDgwODA4MDAwMDAwZmZmZmZmZmZmZmZmZmZmZmZmMDAwMDAwZmZmZmZmZmZm ZmZmMTAxMDE4MDAwMDAwZmZmZmZmNWE1YTVhZmZmZmZmMTAxMDEwZmZmZmZmZmZmZmZmZmZmZmZm MDAwMDAwZmYNCmZmZmZmZmZmZmZmZmZmZmYxODE4MThmZmZmZmZmZmZmZmYxODE4MTgxMDEwMTBm ZmZmZmY0MjQyNDIxMDEwMTgxODE4MjEzMTMxMzFmZmZmZmZmZmZmZmYxODE4MTgwODA4MDgwMDAw MDAwODA4MDgxMDEwMTBmZmZmZmZmZmZmDQpmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZjAwMDAwMGZmZmZmZjEwMTAxMGZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZjAwMDAwMDAwMDAwOGZmZmZmZmZmZmZmZg0KMDAwMDAwMTgxODIxMDAw MDAwZmZmZmZmZmZmZmZmMDgxMDEwMTgxODIxMDAwMDAwZmZmZmZmZmZmZmZmMDAwMDAwZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmMDgwODA4ZmZmZmZmZmZmZmZmZmZmZmZmMzEzMTMxZmZmZmZmZmYN CmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYwMDAwMDgwODA4MDgxMDEwMTBm ZmZmZmY3MzczNzMwODEwDQoxMDE4MTgxOGZmZmZmZmZmZmZmZjAwMDAwMGZmZmZmZmZmZmZmZjAw MDAwMGZmZmZmZjA4MDgwOGZmZmZmZmZmZmZmZmZmZmZmZjA4MDgwOGZmZmZmZmZmZmZmZmZmZmZm ZjIxMjEyMWZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZg0KMzEzMTMxZmZmZmZmZmZmZmZmMjEyMTIx ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmMDgwODA4ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmMDAwMDAwZmZmZmZmZmZmZmZmMjkNCjI5MjkxMDEw MTgwMDAwMDBmZmZmZmYzMTMxMzE0YTRhNGEwODEwMTAxMDEwMTBmZmZmZmYxMDEwMTAxMDEwMThm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmDQpmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZjA4MDgwOGZmZmZmZmZmZmZmZmZmZmZmZjE4MTgyMWZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZjE4MjEyMWZmZmZmZg0KZmZmZmZmZmZmZmZmMDgwODA4ZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmMTgxODIxMTAxMDE4MTgxODIxMTAxODE4MTAxMDE4MTAxMDE4MDAwMDAw ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYNCmZmZmZmZmZmZmYwODA4MDgw ODA4MDhmZmZmZmYwODA4MDgyMTIxMjEwODEwMTAwMDAwMDAxODE4MTgxODE4MTgwMDAwMDAwODEw MTAzMTMxMzEwMDAwMDhmZmZmZmY0YTRhNGEzOTM5MzlmZmZmZmYwODA4MDhmZmZmZmYxMDEwDQox MDA4MDgxMDAwMDAwMGZmZmZmZmZmZmZmZmZmZmZmZjAwMDAwMGZmZmZmZjI5MjkyOWZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZg0KZmZmZmZmZmZmZmZmNWE2MzYzZmZmZmZmMDAwMDAwZmZmZmZmZmZmZmZm ZmZmZmZmMDAwMDAwMDgwODA4MDAwMDAwZmZmZmZmZmZmZmZmZmZmZmZmMTAxMDE4MDAwMDAwMDgw ODA4MTAxMDEwNDI0MjQyZmZmZmZmZmZmZmZmMjkNCjI5MjkyOTI5MzFmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmY2YjZiNmIwMDAwMDBm ZmZmZmZmZmZmZmZmZmZmZmYwMDAwMDAxODE4MTgwMDAwMDBmZmZmZmZmZmZmDQpmZmZmZmZmZmZm ZmZmZjAwMDAwOGZmZmZmZmZmZmZmZjAwMDAwMDE4MTgyMTYzNjM2M2ZmZmZmZmZmZmZmZjEwMTAx MDEwMTgxOGZmZmZmZmZmZmZmZmZmZmZmZjAwMDAwMGZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZjAw MDgwOA0KZmZmZmZmMDAwMDAwZmZmZmZmZmZmZmZmZmZmZmZmMTAxMDE4ZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmMDgwODA4ZmZmZmZmZmZmZmZm ZmZmZmZmMjkyOTI5ZmZmZmZmMjkNCjI5MjkxODE4MTgxMDEwMTAyMTIxMjEwODA4MDhmZmZmZmY2 YjZiNmJmZmZmZmYwMDA4MDhmZmZmZmYyMTIxMjE0YTRhNGFmZmZmZmYxODE4MTgwMDAwMDAwODEw MTAwODA4MTBmZmZmZmZmZmZmZmYxODE4MTgwMDAwMDBmZmZmDQpmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZjAwMDAwMGZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZg0KMDgw ODA4ZmZmZmZmZmZmZmZmMTAxMDEwZmZmZmZmMDAwMDAwMDAwMDA4MzEzMTMxZmZmZmZmNTI1MjUy ZmZmZmZmMDAwMDAwMDgwODA4MjEyMTIxZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmYNCmZmZmZmZmZmZmZmZmZmZmZmZmZmZmY0MjQyNDIxMDEwMTgxMDEwMTgxMDEw MTgxMDE4MTgxMDEwMTAxMDE4MThmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYwODA4MDhm ZmZmZmZmZmZmZmZmZmZmZmYxODE4MjE0MjQyDQo0MmZmZmZmZmZmZmZmZjA4MDgxMDE4MTgyMWZm ZmZmZmZmZmZmZmZmZmZmZjE4MTgxOGZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZg0KZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmMTgxODE4MTAxMDEwNGE0YTRhZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmMDAwMDAwMDAwMDAwMTAxMDEwZmZmZmZmZmZmZmZmZmZmZmZmMDAwMDAw MDgNCjA4MDhmZmZmZmYwODEwMTAxMDEwMTBmZmZmZmZmZmZmZmZmZmZmZmYxMDEwMTAwODA4MDgw MDAwMDBmZmZmZmYwMDAwMDAwODA4MDgwMDAwMDAxODE4MThmZmZmZmYwODA4MDhmZmZmZmZmZmZm ZmZmZmZmZmYxODE4MTgyOTI5DQoyOWZmZmZmZjEwMTAxMGZmZmZmZjAwMDAwMGZmZmZmZmZmZmZm ZjE4MTgxODAwMDAwMGZmZmZmZjAwMDAwMGZmZmZmZmZmZmZmZjAwMDgwODAwMDAwMGZmZmZmZjE4 MTgxOGZmZmZmZjAwMDAwMDAwMDAwMDAwMDAwMGZmZmZmZg0KZmZmZmZmZmZmZmZmMjEyMTIxMDgw ODEwMDAwMDAwZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmMzEzMTMxMTAxMDEwZmZmZmZmMDAwMDAwZmYNCmZmZmYw MDAwMDAyOTI5MjkwMDAwMDBmZmZmZmZmZmZmZmZmZmZmZmYwMDAwMDAwODA4MDhmZmZmZmZmZmZm ZmYwMDAwMDAxODE4MjE1MjUyNTJmZmZmZmZmZmZmZmYwODEwMTAxMDE4MTgwMDAwMDBmZmZmZmZm ZmZmZmYwODA4DQowOGZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZjE4MTgxOGZmZmZmZjA4MDgxMA0KZmZmZmZmMDAwMDAwZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmMDgwODEwMTAxMDEwZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmMDAwMDAwZmZmZmZmZmZmZmZmZmZmZmZmMTAxMDEwZmZmZmZmMzENCjMxMzEwODEwMTAzMTMx MzEwMDAwMDhmZmZmZmZmZmZmZmYwMDAwMDBmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYx ODE4MThmZmZmZmZmZmZmZmYwODA4MDhmZmZmZmYwODA4MDhmZmZmZmZmZmZmZmYwMDAwMDhmZmZm DQpmZjAwMDAwMGZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZjA4MDgwOGZmZmZmZmZmZmZm ZjAwMDAwMGZmZmZmZmZmZmZmZjUyNTI1MmZmZmZmZjAwMDAwMDRhNGE0YWZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZg0KZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmMDgNCjA4MDhmZmZmZmZmZmZmZmZmZmZmZmYx ODE4MjE1MjUyNTJmZmZmZmZmZmZmZmYzOTM5MzkxODIxMjFmZmZmZmZmZmZmZmZmZmZmZmYwODA4 MDhmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYzOTM5MzkzMTMxMzFmZmZmZmZmZmZmDQpmZmZmZmZm ZjEwMTAxODQyNGE0YWZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZjAwMDAwMGZm ZmZmZmZmZmZmZmZmZmZmZjA4MDgwODEwMTAxMDYzNjM2M2ZmZmZmZmZmZmZmZjE4MTgxODAwMDAw MGZmZmZmZg0KZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmMDgwODA4ZmZmZmZmMTAxMDEwZmZmZmZm MjEyMTI5ZmZmZmZmMDAwMDAwZmZmZmZmZmZmZmZmMTAxMDEwMDAwMDAwMDAwMDAwNDI0MjQyZmZm ZmZmMTAxMDEwZmZmZmZmMDgwODA4ZmYNCmZmZmYwMDAwMDBmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmY3YjdiN2JmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYwMDAwDQowMDAwMDAwODAwMDAwMGZm ZmZmZjEwMTAxMDA4MDgxMDAwMDAwMGZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZg0K ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmMDgwODA4MDAwMDAwZmZmZmZmMDAwMDAwMTgxODIxNTI1MjUy ZmZmZmZmZmZmZmZmNTINCjUyNTIxMDE4MTgwMDAwMDBmZmZmZmZmZmZmZmYwMDAwMDBmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmYwODA4MDgyOTI5MjkyOTI5MjlmZmZmZmYxMDEwMTg0YTRhNGExMDEw MTBmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmDQpmZmZmZmZmZmZmZmZmZjAwMDAwMGZmZmZm ZjMxMzEzMTAwMDAwMGZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZjEwMTAxMGZmZmZmZmZmZmZmZjIx MjEyMTI5MjkyOWZmZmZmZmZmZmZmZmZmZmZmZjAwMDAwMDEwMTAxMDAwMDAwMA0KMDgwODEwZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmMTgxODE4ZmZmZmZmNjM2MzZiZmZmZmZmZmZmZmZmZmZmZmZm MDAwMDAwZmZmZmZmZmZmZmZmMDAwMDA4ZmZmZmZmMjkyOTI5MDAwMDAwZmZmZmZmNGE0YTRhZmZm ZmZmMDANCjAwMDBmZmZmZmYwMDAwMDAwODA4MDgwMDAwMDBmZmZmZmYwODA4MDhmZmZmZmYxODE4 MThmZmZmZmYwMDAwMDAyMTIxMjEwMDAwMDAwODA4MTAwODA4MDgwODA4MDgxODE4MjFmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmDQpmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZjEwMTAxMA0KZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmMDgwODA4ZmZmZmZmZmZmZmZmZmZmZmZmMTgxODIxZmZmZmZmZmZmZmZmZmZm ZmZmNTI1MjUyMTgyMTIxZmZmZmZmZmZmZmZmZmZmZmZmMDgwODA4ZmZmZmZmZmZmZmZmZmYNCmZm ZmZmZmZmZmZmZmZmZmYwODA4MTAwMDAwMDAxMDE4MTg1YTVhNWFmZmZmZmYxODE4MTg2YjZiNmJm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYwMDAwMDAwODA4MDgwMDAwMDBmZmZmZmYwMDAw MDBmZmZmZmZmZmZmDQpmZmZmZmZmZjAwMDAwMDA4MDgwODAwMDAwMGZmZmZmZjAwMDAwMGZmZmZm ZmZmZmZmZmZmZmZmZjAwMDAwMDEwMTAxMDAwMDAwMDE4MTgxODA4MDgxMGZmZmZmZmZmZmZmZmZm ZmZmZjE4MTgxOGZmZmZmZjAwMDAwMGZmZmZmZg0KMDAwMDAwMjkyOTI5MDAwMDAwMDgxMDEwMDgw ODA4MDgwODEwMTgxODIxMDAwODA4MDgwODA4MDAwMDAwMDAwMDAwMDAwODA4MDgwODA4MDgwODA4 MDgwODA4MjkyOTI5MDgwODA4MDAwMDAwMjkyOTI5MzEzMTMxMTAxMDEwMDgNCjEwMTAwODA4MDgw ODA4MDgzOTM5MzkwODA4MDgwODA4MDhmZmZmZmYwMDAwMDBmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmDQpmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZjQyNDI0MjEwMTgxODEwMTAxMDEwMTAxMDAwMDAwMGZmZmZmZmZmZmZmZmZmZmZmZjAwMDAw MDA4MDgwOGZmZmZmZmZmZmZmZg0KMDAwMDAwMTgxODIxNTI1MjUyZmZmZmZmZmZmZmZmZmZmZmZm MTAxODE4MDAwMDAwZmZmZmZmZmZmZmZmMDAwMDA4ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmMjEyMTIxZmZmZmZmZmYNCmZmZmYzOTM5MzlmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYwODA4MDhmZmZmZmZmZmZmZmYxMDEwMTBm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYxMDEwMTgwODA4MDhmZmZmDQpmZmZm ZmZmZmZmZmZmZjMxMzEzMWZmZmZmZjE4MTgxOGZmZmZmZjAwMDAwMGZmZmZmZmZmZmZmZmZmZmZm ZjAwMDAwMDA4MTAxMDA4MTAxMDEwMTAxODE4MTgxODEwMTAxMDE4MTgyMTIxMjEyMTE4MTgxODEw MTAxMGZmZmZmZg0KZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYNCmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYyMTIxMjExMDEwDQoxMDEwMTAxOGZmZmZm ZjA4MDgxMGZmZmZmZjAwMDAwMGZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZjAwMDAwMGZm ZmZmZmZmZmZmZmZmZmZmZjE4MTgyMWZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZjE4MTgyMWZmZmZm Zg0KZmZmZmZmZmZmZmZmMDgwODA4ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmMTgxODE4 ZmZmZmZmNDI0MjQyMTgxODE4NjM2MzZiNTI1MjUyMTAxMDE4ZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmYNCmZmZmYwMDAwMDAwMDAwMDAwMDAwMDA0YTRhNGEwMDAwMDBmZmZm ZmZmZmZmZmYzMTMxMzFmZmZmZmZmZmZmZmZmZmZmZmY0MjQyNDIyOTI5MjlmZmZmZmYwODA4MDhm ZmZmZmYxMDEwMTBmZmZmZmYwMDAwMDAxMDEwMTAxMDEwDQoxODAwMDAwMDA4MDgwODEwMTAxMDAw MDAwMGZmZmZmZjAwMDAwMDEwMTAxODAwMDAwMDEwMTAxODA4MDgwOGZmZmZmZjA4MDgwOGZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZg0KZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm MTAxMDEwZmYNCmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYyMTIxMjExMDEwMTgxMDEwMTgyMTIxMjkxMDEwMTAwMDAw MDBmZmZmZmZmZmZmZmZmZmZmZmZmZmZmDQpmZmZmZmZmZjAwMDAwMDAwMDAwMGZmZmZmZmZmZmZm ZjAwMDAwMDE4MTgyMTAwMDAwMGZmZmZmZmZmZmZmZjAwMDAwMDEwMTAxODUyNTI1MmZmZmZmZmZm ZmZmZjA4MDgwOGZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZg0KMTAxMDEwMTAxMDE4MDgw ODEwMTAxMDEwMzEzMTM5MjkyOTI5MDgwODA4ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmMDAwMDAwMDAwMDAwZmZmZmZmZmZmZmZmZmZmZmZmZmYN CmZmZmZmZmZmZmYyOTI5MjlmZmZmZmYwMDAwMDAxMDEwMTAwODA4MTAwMDAwMDAxODE4MTgwMDAw MDAwMDAwMDAwMDAwMDgyOTI5MjlmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmYxMDEwMTBmZmZmDQpmZjAwMDAwMDUyNTI1MmZmZmZmZjAwMDAwMGZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZg0KZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmMDgwODA4MTAxMDEwZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYNCmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYyMTIxMjEwODEwMTAxODE4MjFmZmZmZmYxODE4MThm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYwODA4MDhmZmZmZmZmZmZmZmY1YTVhNWExODE4 MjFmZmZmDQpmZmZmZmZmZmZmZmZmZmZmZmZmZjEwMTAxODA4MDgxMGZmZmZmZmZmZmZmZjM5Mzkz OWZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZjA4MDgwOGZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZjAwMDAwMGZmZmZmZg0KZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmMDAwMDAwMDgwODA4MjEyMTIxMDgwODA4MDgwODA4MDgwODEwMDAwMDAw MTgxODE4MzkzOTM5ZmZmZmZmMTAxMDE4MTgxODE4NGE0YTRhZmYNCmZmZmYwMDAwMDBmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYwMDAwMDAwODA4 MTAwMDAwMDBmZmZmZmYxMDEwMTBmZmZmZmYxMDEwMTBmZmZmZmZmZmZmZmZmZmZmZmZmZmZmDQpm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZg0KZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmMTgxODIxMDgwODA4MDgwODA4 ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmMDAwMDAwZmYNCmZmZmYxMDE4MTgwODA4MTBmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmYwMDAwMDAwMDAwMDBmZmZmZmZmZmZmZmYzMTMxMzExMDEwMTgwMDAwMDBm ZmZmZmZmZmZmZmZmZmZmZmYwODA4MTAxMDEwMThmZmZmZmZmZmZmZmZmZmZmDQpmZjAwMDAwMGZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZg0KZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmMDAwMDAwMTgxODE4ZmZmZmZmZmZm ZmZmMDgwODA4ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmYNCmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYxMDEwMTAwODA4MDhm ZmZmZmYwODA4MDgwMDAwMDAyMTIxMjEyMTIxMjlmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmDQpmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZjQyNDI0MmZmZmZmZjA4MDgwODEwMTAxODQyNDI0MmZmZmZmZmZmZmZmZg0KZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmMDgxMDEwZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmMDgNCjA4MDhmZmZmZmZmZmZmZmYwODA4MDgxMDEwMThmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmYxODE4MTgxMDEwMTBmZmZmZmZmZmZmZmYwMDAwMDAyOTI5MjlmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmDQpmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZjAwMDAwMDE4MTgxOA0KMDAwMDAwZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmMTAxMDE4MjEyMTIxMDAwMDAw MTgNCjE4MThmZmZmZmYwMDAwMDAxMDEwMTBmZmZmZmY0YTRhNGFmZmZmZmYwMDAwMDAyOTI5MzFm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYxODE4MTgxMDEwMTBmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmDQpmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZjA4MDgxMDA4MTAxMDAwMDAwMGZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZg0KZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmMjkyOTI5 ZmZmZmZmZmZmZmZmZmZmZmZmMTAxMDE4MDgwODEwZmZmZmZmZmZmZmZmZmZmZmZmZmYNCmZmZmYy MTI5MjkxMDE4MThmZmZmZmZmZmZmZmZmZmZmZmYwODA4MDhmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmDQpmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZjM5MzkzOQ0KZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmMTgxODE4ZmZmZmZmMDAwMDAwZmZm ZmZmMTgxODE4MTAxMDE4MTAxMDE4ZmZmZmZmZmZmZmZmMDAwODA4MDANCjAwMDBmZmZmZmYzMTMx MzFmZmZmZmYwODA4MDhmZmZmZmYwODA4MDhmZmZmZmYxMDEwMTBmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmY0YTRhNGFmZmZmZmZmZmZmZmYwODA4 DQoxMDEwMTgxOGZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZg0KZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmMDgwODA4MDAwMDAwZmZm ZmZmMDAwMDAwMTAxODE4MTAxMDEwZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmMDAwMDAwMTgxODE4 MDAwMDAwZmZmZmZmZmZmZmZmMDAwMDAwMDAwMDAwZmYNCmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmYxODE4MTgwODA4MTBmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmDQpmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZjA4MDgxMDA4MTAxMDE4MTgxODIxMjEyMWZmZmZmZmZmZmZmZjAwMDAwMGZmZmZmZjYzNjM2 M2ZmZmZmZg0KMDAwMDAwMTAxMDEwMTgxODIxMTAxMDEwMDgwODA4MTAxMDEwMDAwMDAwMTgxODE4 MTgyMTIxMTAxMDE4NTI1MjUyMTAxMDEwNTI1MjUyZmZmZmZmMTAxMDE4MDgxMDEwNTI1MjUyMTAx MDE4MjEyMTIxMTAxMDE4MjEyMTIxZmYNCmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmYwMDAwMDAxMDEwMTBmZmZmZmZmZmZmZmYyOTI5MjlmZmZmZmYxMDE4MTgxMDEwMTAz OTM5MzlmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmDQpmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZjEwMTAxMGZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZjA4MTAxMGZmZmZmZmZmZmZmZjIxMjEyMQ0K MTgyMTIxMTgxODE4ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmMTAxODE4ZmZmZmZmZmZm ZmZmZmZmZmZmMTgxODE4ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmMTAxMDE4MTANCjEwMTBmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmDQpmZmZmZmZmZmZmZmZmZmZmZmZmZjAwMDAw ODEwMTAxMDEwMTAxMDEwMTAxMDEwMTgxOGZmZmZmZjAwMDAwMGZmZmZmZmZmZmZmZjEwMTAxMGZm ZmZmZjA4MDgwODI5MjkyOTEwMTgxODAwMDAwMDAwMDAwMDA4MDgwODAwMDAwMA0KMDgwODA4NTI1 MjUyMDgwODEwMTAxMDE4NGE0YTRhMTAxMDEwMTAxMDE4NGE0YTRhMTAxMDE4MTAxMDE4MTAxMDEw ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmMDgNCjA4MDhmZmZmZmYwMDAwMDAxMDEwMTAxODIxMjExMDEwMTBmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmYwODEwDQoxMDE4MTgxOGZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZjAwMDAwMDA4MDgwOGZmZmZmZmZmZmZmZjE4MTgxODEwMTAxOGZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZjEwMTAxMA0KMjEyMTIxZmZmZmZmZmZmZmZm ZmZmZmZmMTAxMDEwZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYNCmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYwMDAw MDAwODEwMTAxODE4DQoxODI5MzEzMTQyNDI0MjEwMTAxODI5MjkyOTEwMTAxMDEwMTAxODI5Mjky OTIxMjEyMTE4MTgyMTAwMDAwMGZmZmZmZjEwMTAxODM5MzkzOTAwMDAwMDEwMTAxMDEwMTAxMDAw MDAwMDAwMDAwMDIxMjEyMTI5MjkyOTI5MjkyOQ0KMDAwMDAwZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmMDAwMDAwMjEyMTIxZmZmZmZmMDgwODA4 ZmZmZmZmZmZmZmZmMTgxODIxMTgxODIxNGE0YTRhZmZmZmZmZmZmZmZmZmYNCmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmYwMDAwMDBmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmDQpmZjI5MjkzMTM5Mzk0MmZmZmZmZjAwMDAwMDEwMTAxMDEwMTAxOGZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZjA4MTAxMDEwMTAxMGZmZmZmZmZmZmZmZmZmZmZmZjA4MDgw OGZmZmZmZmZmZmZmZmZmZmZmZg0KZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYNCmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmYyOTI5MjlmZmZmZmYwODEwMTBmZmZmZmYxODE4MThmZmZmZmY2MzYzNjMxMDEwDQoxMDEw MTgxODAwMDAwMDMxMzEzMTA4MDgxMDEwMTgxODE4MTgxODE4MTgxODIxMjEyMTI5MjkzMTYzNjM2 MzAwMDAwMGZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZg0KNDI0MjQyZmZmZmZmZmZmZmZmMDgwODA4ZmZmZmZmMDgxMDEwZmZmZmZmMjEy MTIxMTAxMDEwMjEyMTIxZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYNCmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYwODA4 MDhmZmZmZmZmZmZmZmZmZmZmZmYxODE4MjEwODA4MTBmZmZmZmZmZmZmDQpmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZjE4MTgyMWZmZmZmZmZmZmZmZmZmZmZmZjA4MDgwOGZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm Zg0KZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmYNCmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYwMDAwMDAxMDEwMTgxMDEwMTgyMTIxMjEwODA4MDgy MTIxMjEyOTI5MjlmZmZmZmYxMDE4MTgyMTIxMjFmZmZmDQpmZjIxMjEyMTE4MTgyMTA4MTAxMDAw MDAwMDI5MjkzMTA4MDgwOGZmZmZmZmZmZmZmZmZmZmZmZjAwMDAwMDAwMDAwOGZmZmZmZmZmZmZm ZjQyNDI0MmZmZmZmZjM5MzkzOWZmZmZmZjIxMjEyMTE4MTgyMTEwMTgxODE4MTgyMQ0KMzkzOTM5 ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmYNCmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYwMDAwMDAwODA4MDhmZmZmZmZm ZmZmZmYxMDEwMTAxODE4MjExMDEwMThmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmYxMDEwMTgxODE4MThmZmZmDQpmZmZmZmZmZjI5MjkyOTAwMDAwMGZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZjE4 MTgxOGZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZg0KZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmMTgxODE4MDgwODA4ZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmMTgN CjE4MThmZmZmZmYwODEwMTAxMDE4MTgzOTM5MzlmZmZmZmYwODA4MDhmZmZmZmYxODE4MThmZmZm ZmYxODE4MThmZmZmZmYxODE4MThmZmZmZmZmZmZmZmZmZmZmZmYyMTIxMjExODE4MjExMDE4MThm ZmZmZmYwMDAwMDAwODA4DQowODAwMDAwMGZmZmZmZjIxMjEyMWZmZmZmZjE4MTgxOGZmZmZmZmZm ZmZmZjA4MTAxMDVhNWE1YTEwMTAxMDE4MTgyMWZmZmZmZjAwMDAwMDE4MTgxODA4MDgwODAwMDgw OGZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZg0KZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmMjkyOTI5ZmZmZmZmZmYNCmZmZmYxODE4 MTgxODE4MThmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYx MDEwMTAwODEwMTBmZmZmZmZmZmZmZmYwMDAwMDAyOTI5MjlmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmDQpmZmZmZmZmZjM5MzkzOWZmZmZmZmZmZmZmZjA4MDgwODE4MTgyMTEwMTgxODAwMDAw MGZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZg0KZmZmZmZmMDgwODA4MTAxODE4MjEyMTIxNGE0YTRhZmZm ZmZmMDAwMDAwMDgwODA4MDAwMDAwZmZmZmZmMDgwODA4MzEzMTMxMDAwMDAwMjkyOTI5MTgxODE4 MTAxMDE4MDgwODA4ZmZmZmZmMzEzMTMxMDgwODA4MDAwMDAwMTANCjE4MTgwODA4MTAwMDAwMDgw MDAwMDAxMDE4MTgyMTIxMjEzMTMxMzFmZmZmZmZmZmZmZmYxMDEwMTgxODE4MTgxMDEwMTgxMDE4 MTgxODE4MTgxODE4MTgxODE4MjExODE4MjEyOTI5MjkxODE4MTgyMTIxMjkxMDEwMTAxODIxDQoy MTEwMTAxODAwMDAwMDIxMjEyMTMxMzEzMWZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZjA4MTAxMDA4MTAxMA0KMTgxODE4ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmMTAxMDEwZmZmZmZmZmZmZmZmZmZmZmZmMTAxODE4MDgxMDEwZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYNCmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYxODE4 MjFmZmZmZmZmZmZmZmZmZmZmZmYwMDA4MDhmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmYwODA4MDgwMDAwMDBmZmZmZmYxMDEwMTgxODE4MjEyMTIxMjFmZmZmDQpmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZjIxMjkyOTEwMTgxODEwMTAxMGZmZmZmZjE4 MTgxOA0KMTAxMDEwMDAwMDAwZmZmZmZmMTgxODIxMTAxMDE4MTAxMDEwMTAxMDE4MDAwMDAwZmZm ZmZmZmZmZmZmMjEyMTIxMzEzMTMxZmZmZmZmMTAxMDE4ZmZmZmZmMTgxODE4MDgwODA4MjEyOTI5 MTAxODE4MDAwMDAwZmZmZmZmZmYNCmZmZmZmZmZmZmYwODA4MDhmZmZmZmYxMDEwMTg0MjQyNDIx MDEwMTAxMDE4MTgxODE4MTgwODA4MDgxODE4MjExMDEwMTg1YTVhNjMwODEwMTAxODE4MjFmZmZm ZmZmZmZmZmYzMTMxMzExODE4MThmZmZmZmZmZmZmZmZmZmZmDQpmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZjAwMDAwMGZmZmZmZjAw MDAwMDA4MDgxMGZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZg0KZmZm ZmZmMDAwMDAwMDgwODA4ZmZmZmZmZmZmZmZmMDAwMDAwMTAxODE4NDI0MjQyZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmMDAwMDAwMTAxODE4NWE1YTVhZmZm ZmZmZmZmZmZmMzkNCjM5MzkwODA4MDhmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYzMTMx MzExMDEwMTgxMDEwMTgyMTIxMjEyMTIxMjEzOTM5MzlmZmZmZmZmZmZmZmYwODA4MDhmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmDQpmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZjAwMDAwMDAwMDAwMDEwMTAxODEwMTAxMDEwMTAx ODEwMTgxODEwMTAxMDEwMTAxODA4MDgwOGZmZmZmZjA4MDgwOGZmZmZmZg0KMDgxMDEwMDgwODEw MTAxMDE4ZmZmZmZmMDgwODA4MDAwMDAwZmZmZmZmMDgxMDEwMTAxMDE4MDAwMDAwMTgxODIxMTAx MDEwMDgwODA4ZmZmZmZmNGE0YTRhMTgxODIxMTAxMDE4MDgwODA4MDAwMDAwZmZmZmZmMTAxMDEw MTgNCjE4MTgwMDAwMDAwMDAwMDAxMDE4MThmZmZmZmYwMDAwMDAwODA4MDgxMDEwMThmZmZmZmZm ZmZmZmZmZmZmZmYwMDAwMDBmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmDQpmZmZmZmZmZjMxMzEzMWZmZmZmZmZmZmZmZjE4MTgxODEwMTAx MGZmZmZmZjQyNDI0MmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZjVhNWE1YTMx MzEzMWZmZmZmZmZmZmZmZjM5MzkzOTE4MTgyMWZmZmZmZg0KZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmMTAxMDEwMTAxMDEwZmZmZmZmZmZmZmZm ZmZmZmZmMDAwMDAwZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYNCmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmYxMDEwMTBmZmZmZmYwODA4MDgwODA4MDhmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmDQpmZmZmZmZmZmZmZmZmZjA4MDgwOGZmZmZmZmZmZmZmZmZmZmZmZjI5MjkyOWZm ZmZmZjEwMTAxMGZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZjE4MTgxOGZmZmZmZjAwMDAw MDA4MDgxMGZmZmZmZmZmZmZmZjE4MjEyMQ0KMDgxMDEwZmZmZmZmMDgwODA4MTAxODE4ZmZmZmZm ZmZmZmZmMTgxODE4MTgxODIxMTAxODE4ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmMDgwODA4ZmZm ZmZmZmZmZmZmZmZmZmZmMDgwODA4ZmZmZmZmZmZmZmZmZmZmZmZmMTANCjEwMTBmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmYxMDEwMTAxMDEwMTgzOTM5MzlmZmZmZmYxMDEwMThmZmZmZmZmZmZmZmYwMDAw DQowMGZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZjA4MDgxMGZmZmZmZmZmZmZm ZmZmZmZmZjEwMTAxMDA4MDgxMGZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZg0KZmZmZmZmNDI0MjQyMTgyMTIxZmZmZmZmZmZmZmZmZmZmZmZmMTAx ODE4ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmMzEzMTMxZmZmZmZm ZmZmZmZmZmZmZmZmMTgxODIxMTAxODE4MzkzOTM5NTINCjUyNTJmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYzMTMxMzlmZmZmZmZmZmZmDQpmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZjQyNDI0MjEwMTAxMDA4MDgwODAwMDAwMDE4MTgxODEwMTAxMGZm ZmZmZmZmZmZmZmZmZmZmZjE4MTgxOGZmZmZmZmZmZmZmZjE4MTgxODE4MTgyMTEwMTAxODEwMTAx ODEwMTAxMA0KMTgyMTIxMTgxODE4MDAwMDAwZmZmZmZmZmZmZmZmZmZmZmZmMzkzOTM5ZmZmZmZm ZmZmZmZmZmZmZmZmMDgwODA4ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYNCmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmYyOTI5MzExODE4MjExODIxMjEyOTI5MjkwMDAwMDAxMDEwMTAwODA4MDhmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYwMDAwMDAwODA4MDhmZmZmDQpmZmZmZmZmZjI5MjkyOTE4 MTgyMTQyNDI0MmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZjEwMTAxMDEwMTAxOGZmZmZmZmZmZmZmZmZmZmZmZjA4MDgwOA0K ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmMDAwMDA4MDAwMDAwMTgxODE4MTAx MDE4MTAxMDEwZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmYNCmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYwMDA4MDgwODEw MTBmZmZmZmYyMTI5MjkwODEwMTAwMDAwMDBmZmZmDQpmZjEwMTAxOGZmZmZmZjAwMDAwMGZmZmZm ZjE4MTgyMTEwMTgxODA4MDgxMGZmZmZmZjAwMDAwODMxMzkzOTE4MTgyMWZmZmZmZjAwMDAwMDEw MTAxMDQyNDI0MmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZg0KZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmMTgxODE4MzEz MTMxMTgNCjE4MTgxMDE4MTgxMDE4MTgxMDEwMTgxMDEwMTBmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmYwODA4MDgyMTIxMjFmZmZmZmZmZmZmZmYwODA4MTAxMDE4MThmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmDQpmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZjE4MTgyMTEwMTgxODAwMDAwMGZmZmZmZmZmZmZmZjAwMDAwMDAwMDAwMGZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZjAwMDAwMDEwMTAxMA0KMTgxODE4MTgxODE4ZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmMDgwODA4ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYNCmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYxMDEwMTBmZmZmZmYwMDAwMDAwMDAwMDAxODE4MTgw ODA4MTAwMDAwMDBmZmZmZmYxMDEwMTgwODA4MDgwMDAwMDBmZmZmZmY3MzczNzMxODE4MTgxMDE4 MThmZmZmZmZmZmZmDQpmZjEwMTAxMDAwMDAwMDIxMjEyMTE4MTgxODE4MTgyMTM5NDI0MmZmZmZm ZjIxMjEyMTA4MDgwODAwMDAwMDQyNDI0MmZmZmZmZmZmZmZmZjAwMDAwMGZmZmZmZjAwMDAwMGZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZg0KZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmMDgwODA4MjEyMTIxZmZmZmZmMDgwODA4 MTAxMDE4ZmZmZmZmMTAxMDEwZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYNCmZmZmZmZmZmZmZm ZmZmZmYwODEwMTBmZmZmZmZmZmZmZmZmZmZmZmYxODIxMjExODE4MjFmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmDQpmZjE4MTgyMTE4MTgxOGZmZmZmZmZmZmZmZjAwMDAwMGZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZjEwMTAxMGZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZjAwMDAwMDEwMTAxODM5MzkzOQ0KZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmMzEzMTMxZmZmZmZmZmZmZmZmMTAxMDEwMDgwODA4MDgNCjA4MDhmZmZmZmZmZmZmZmZmZmZm ZmYxMDEwMThmZmZmZmYxODE4MThmZmZmZmZmZmZmZmZmZmZmZmYyMTIxMjExMDE4MTgxMDEwMTBm ZmZmZmZmZmZmZmZmZmZmZmYwMDAwMDAyOTI5MjkxODE4MjExMDEwMTAxMDE4MTgzMTMxDQozMTAw MDAwMDIxMjEyMTI5MjkyOWZmZmZmZjA4MDgwOGZmZmZmZjI5MjkyOTEwMTAxMDAwMDAwMGZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZg0KZmZmZmZmZmZmZmZmMTAxMDEwMDAwMDAwZmZmZmZmMDgwODA4ZmZmZmZmMzEz MTMxZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmMTAxMDE4ZmZmZmZm ZmZmZmZmZmZmZmZmMTAxMDEwMTAxODE4MDANCjAwMDBmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYwODEw MTAxODE4MThmZmZmZmZmZmZmZmZmZmZmZmYxMDEwMTBmZmZmZmZmZmZmDQpmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZjA4MDgwOGZmZmZmZmZmZmZmZmZmZmZmZjMxMzEzMTEwMTAxODUy NTI1MjIxMjEyMWZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm Zg0KZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmMzEzMTMxMDgwODEw MDgwODEwMjkyOTMxMzEzMTMxMDAwMDAwZmZmZmZmMDAwMDAwMzEzMTMxMTAxMDEwMTAxODE4MDAw MDAwZmZmZmZmZmZmZmZmZmYNCmZmZmYwMDAwMDAxMDEwMTAyMTIxMjFmZmZmZmYzOTM5MzlmZmZm ZmYwMDAwMDBmZmZmZmYwMDAwMDAwODA4MTAwMDAwMDAxMDEwMTgxODE4MTgxMDEwMTgxODIxMjEw ODA4MTAxODE4MTgxMDE4MTgwODA4MDgzMTMxMzExMDEwDQoxMGZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZjI5Mjky OTAwMDAwMGZmZmZmZjIxMjEyMTEwMTAxMDEwMTAxMDMxMzEzMTAwMDAwMDA4MDgwOA0KZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmMDAwMDAwMDgwODEwZmZmZmZmZmZmZmZmMDgw ODA4MTgxODIxMTAxMDEwZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmYNCmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYxMDEwMTAxMDE4MTgz OTM5MzlmZmZmZmZmZmZmZmZmZmZmZmYxMDEwMTBmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmYyMTIxMjFmZmZmDQpmZjEwMTAxMDA4MTAxMDAwMDAwMGZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZg0KZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmMDAwMDAwMDgwODEwMTAxODE4ZmZmZmZmMDgwODEwZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmMjEyMTIxMDgwODA4ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYN CmZmZmZmZmZmZmYwODA4MDhmZmZmZmYxMDEwMTBmZmZmZmYxMDEwMTAwODEwMTAwMDAwMDBmZmZm ZmYwODA4MDhmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmDQpmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZjEwMTgxODA4MTAxMGZm ZmZmZmZmZmZmZjA4MDgwOGZmZmZmZmZmZmZmZjEwMTAxMDAwMDAwMGZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZjA4MDgwODE4MTgxOA0KZmZmZmZmZmZmZmZmMDgxMDEwMTgxODE4 ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmMTAxMDE4MTANCjE4MTgwODA4 MDhmZmZmZmZmZmZmZmYxMDE4MTgwODA4MDhmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYw MDAwMDAxODE4MTgxODE4MjEwODA4MTAwMDAwMDBmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmDQpmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZjIx MjEyMTA4MDgxMDAwMDAwMDEwMTgxOA0KZmZmZmZmMDgwODA4ZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmMDgwODA4MDgwODEwMDAwMDAwZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmMDAwMDAwMzkzOTM5MTgxODE4ZmZmZmZmMTgxODE4MTANCjEwMTBmZmZmZmZmZmZmZmYw MDAwMDBmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYwMDAwMDAwMDAwMDAxODIxMjEwODEwMTAwMDAwDQow MGZmZmZmZmZmZmZmZjA4MDgwODEwMTAxMGZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZjEwMTAxMDA4MDgxMGZmZmZmZmZmZmZmZmZmZmZmZjE4MTgyMTA4MDgxMDAwMDAwMGZmZmZm ZmZmZmZmZmZmZmZmZg0KZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmMTgxODIxMDgwODA4ZmZmZmZmZmZm ZmZmZmZmZmZmMDgwODA4ZmZmZmZmZmZmZmZmZmYNCmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmYwMDAwMDAwMDAwMDBmZmZmZmZmZmZmZmZmZmZmZmYwMDAwMDAzMTMxMzExMDEwMTAwODEwMTBm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmDQpmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZjAwMDAwMDMxMzEzMWZmZmZm ZmZmZmZmZjMxMzEzMWZmZmZmZjUyNTI1MmZmZmZmZmZmZmZmZmZmZmZmZjRhNGE0YTEwMTAxODIx MjEyMQ0KZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmMjkyOTI5ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmYNCmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmYyOTI5MjkxMDEwMThmZmZmZmYxODE4MjEwODEwMTAwMDAwMDBmZmZm ZmYwODA4MTBmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmDQpmZmZmZmZmZmZmZmZmZjA4MDgx MGZmZmZmZmZmZmZmZmZmZmZmZjEwMTAxODEwMTgxODAwMDAwMGZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZg0KZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmMTAxMDEwMTgxODIxZmZmZmZmZmZmZmZmZmZmZmZm MjEyMTIxMzEzMTMxZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmMDgwODA4MDgw ODA4MDAwMDAwZmYNCmZmZmYxMDEwMTgxMDE4MTgxODE4MThmZmZmZmYwMDAwMDAwODA4MDhmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmDQpmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZjEwMTAxODA4MDgwOGZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZg0KZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm MTgNCjIxMjExODE4MTg1YTVhNWEwMDAwMDAxMDEwMTA0YTRhNGExMDEwMTgxMDEwMThmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYyOTI5MjlmZmZmZmZmZmZmZmZmZmZm ZmYxMDEwMTAxODE4MjExMDEwDQoxMGZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZjAwMDAwMDEwMTAxODEwMTAxMA0KZmZmZmZmZmZmZmZmZmZmZmZmMDAw MDA4ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmMTgxODE4MTAxMDEw ZmZmZmZmZmZmZmZmMDgwODA4MDgxMDEwMTgxODE4ZmZmZmZmZmZmZmZmZmZmZmZmZmYNCmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmDQpmZmZmZmZmZmZmZmZmZjA4MDgxMGZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZg0KZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmMTAxMDEwZmZm ZmZmMDgxMDEwMTAxMDEwMzEzMTMxZmZmZmZmMTAxMDEwMDgxMDEwZmYNCmZmZmY3MzczNzNmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmYwMDAwMDAwODA4MDhmZmZmZmZmZmZmZmZmZmZmZmYxMDEwMTAx MDEwMThmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm DQpmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZjM5MzkzOTE4MTgyMTI5MjkyOWZmZmZmZmZmZmZmZmZmZmZmZjA4MDgwOGZm ZmZmZmZmZmZmZmZmZmZmZg0KZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmMTgxODE4MjEyMTIxZmZm ZmZmZmZmZmZmMjEyMTIxMDgxMDEwZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmMDAwMDAwZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYNCmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmYwMDAwMDBmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmDQpmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZg0KZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmMDgwODA4MTAxMDEwMDAwMDAwMTAxMDEw MTAxMDEwZmZmZmZmMzEzMTMxMjEyMTIxMTAxMDEwZmZmZmZmMzkzOTM5ZmZmZmZmZmZmZmZmZmZm ZmZmMDAwMDAwMDgwODEwMDAwMDAwZmYNCmZmZmZmZmZmZmYxMDEwMTgxODE4MjExMDEwMTBmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmDQpmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZjEwMTAxMDEwMTAxODE4MTgxOGZmZmZmZmZmZmZmZmZmZmZmZjEwMTAxMGZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZjIxMjEyMWZmZmZmZjAwMDAwMA0K MDgwODEwMDgwODA4ZmZmZmZmZmZmZmZmZmZmZmZmMjEyMTIxMDgwODA4ZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmYNCmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmDQpmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZjA4MDgxMDA4MTAxMDA4MTAxMA0KZmZmZmZmMjEy MTIxMTAxMDE4MDAwMDAwZmZmZmZmMTgxODE4ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmMTgxODE4 MjkyOTI5ZmZmZmZmZmZmZmZmZmZmZmZmMTgxODIxMTAxODE4ZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmYNCmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmYxODE4MTgxMDEwMTAwMDAwDQowMGZmZmZmZmZmZmZmZjE4MTgxODM5Mzk0MmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZjEwMTAxODEwMTgxODM5MzkzOWZmZmZm ZmZmZmZmZmZmZmZmZjI5MjkyOTA4MTAxMDAwMDAwMGZmZmZmZg0KZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYNCmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmDQpmZmZmZmZmZmZmZmZmZmZmZmZmZjAwMDAwMDA4MDgxMDAwMDAwMGZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZjAwMDAwMGZmZmZmZjIxMjEyMTA4MDgwODEwMTgxOGZm ZmZmZjM5MzkzOWZmZmZmZmZmZmZmZmZmZmZmZg0KZmZmZmZmMjEyMTIxMDgxMDEwZmZmZmZmZmZm ZmZmZmZmZmZmMTAxMDE4MTAxMDEwZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYNCmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmYxODE4MjE0MjQyNDJmZmZmZmZmZmZmZmZmZmZmZmYwMDAwMDAwMDAwMDBmZmZmZmZmZmZmZmZm ZmZmDQpmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZjMxMzEzMTE4MTgxOGZmZmZmZmZmZmZmZmZm ZmZmZjA4MDgxMDAwMDAwMGZmZmZmZmZmZmZmZmZmZmZmZjE4MTgxOGZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZg0KZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYNCmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYwMDA4MDgxODE4MjFmZmZmZmZmZmZmZmZmZmZmDQpmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZjA4MDgwODE4MTgxOGZmZmZmZjEwMTgxODAwMDAwMGZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZjA4MDgwOGZmZmZmZmZmZmZmZmZmZmZmZjEwMTAxMDEw MTAxODA4MDgwOA0KZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYNCmZmZmZmZmZmZmZmZmZmZmYwMDAwMDAyMTIxMjkx ODE4MjFmZmZmZmZmZmZmZmZmZmZmZmYwMDAwMDAwODA4MDgwMDAwMDBmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYxMDEwMTAxODE4MThmZmZmDQpmZmZmZmZmZjAwMDAw MDA4MDgwODE4MTgxOGZmZmZmZmZmZmZmZjQyNDI0MjEwMTgxODE4MTgxOGZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm Zg0KZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmYNCmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmYwMDAwMDBmZmZmZmYxMDEwMTAxODE4MTgxMDE4MThmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYxMDEwDQoxMGZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZjA4MDgwOGZmZmZmZmZmZmZmZmZmZmZmZjMxMzEzMTE4MTgyMTMxMzEzMWZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZg0KZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmMDgxMDEwMTAxODE4 ZmZmZmZmZmYNCmZmZmZmZmZmZmZmZmZmZmYwMDA4MDgwMDAwMDBmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYyMTIxMjEwMDAwMDBmZmZmZmZmZmZmZmZmZmZmZmYwODA4 MTAxODE4MjFmZmZmZmYxMDEwMTBmZmZmDQpmZmZmZmZmZmZmZmZmZjA4MDgwOGZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZg0KZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmMDAwMDAw ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmMDgwODA4MDgN CjA4MTAxMDEwMTgyOTI5MjkxMDEwMTgyMTIxMjFmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYwODA4MDhm ZmZmZmZmZmZmZmZmZmZmDQpmZjAwMDAwMDEwMTAxODEwMTAxMGZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZg0KZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmMDAwMDAwMTAxMDE4MTAxODE4ZmZm ZmZmZmZmZmZmZmZmZmZmMDAwMDAwMDAwMDA4MDAwMDAwZmZmZmZmZmZmZmZmZmYNCmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmY0MjQyNDIwODA4MDgwMDAwMDBmZmZmZmYwMDAwMDAyMTI5Mjkx ODIxMjExMDEwMThmZmZmZmZmZmZmZmZmZmZmZmYxMDE4MTgxMDE4MTgzOTM5MzlmZmZmZmZmZmZm ZmZmZmZmDQpmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZg0KZmZmZmZmZmZmZmZmZmZmZmZmMDgwODA4ZmZmZmZmZmZm ZmZmMDAwMDAwMTgxODE4MDAwMDAwZmZmZmZmZmZmZmZmMDgwODEwMTgxODE4ZmZmZmZmZmZmZmZm ZmZmZmZmMTgxODIxMTAxMDEwMDAwMDAwZmZmZmZmZmZmZmZmZmYNCmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYwODEwMTBmZmZmZmZmZmZmZmZmZmZm ZmYwMDAwMDAxMDEwMTgxMDEwMThmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmDQpm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZg0KZmZmZmZmZmZmZmZmZmZmZmZmMDAwMDAwMTAxMDE4MTAxMDEwZmZmZmZm ZmZmZmZmZmZmZmZmMDAwMDAwMDAwMDAwMDAwMDAwZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmMDAwMDAwMDgNCjA4MDhmZmZmZmYwMDAwMDAxMDEwMTBmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmYxMDEwMThmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmDQpmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZjA4MDgwODEw MTAxOA0KZmZmZmZmZmZmZmZmZmZmZmZmMDgwODEwZmZmZmZmZmZmZmZmZmZmZmZmMDgwODA4ZmZm ZmZmMTAxMDE4MTAxMDEwMDgwODA4ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmMDgNCjA4MDhmZmZmZmZmZmZmZmZmZmZmZmYwMDAwMDAxMDEwMTAx MDEwMThmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmDQpmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZjM5MzkzOTEwMTgxODEwMTAxMGZmZmZmZg0KZmZm ZmZmZmZmZmZmMDAwMDAwMDAwMDAwMDAwMDAwZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmMDAwMDAwMjEyMTIxMTAxMDEwMTAxODE4MTgxODE4ZmZmZmZmZmZmZmZmZmZm ZmZmMTAxMDE4MzkNCjM5MzlmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmY1MjUyNTJmZmZmZmYwMDAwMDBmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmDQpmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZjAwMDAwMDE4MTgxODEwMTAxMDEwMTAxMDQyNDI0MmZmZmZmZjAwMDAwMDEwMTAxMDAwMDAw MGZmZmZmZjAwMDAwMDEwMTAxMDM5MzkzOTEwMTgxODEwMTAxMGZmZmZmZg0KMjEyMTIxMTAxODE4 MTAxMDE4ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmMDgxMDEwZmZmZmZmZmZmZmZmZmZmZmZmMDAwMDAwMTAxMDEwMTgxODIxNGE0YTRhZmZmZmZm ZmYNCmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmDQpmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZjIxMjEyMTEwMTAxODEwMTgxOGZmZmZmZmZmZmZmZmZm ZmZmZjAwMDAwMDAwMDAwMDAwMDAwMGZmZmZmZmZmZmZmZg0KZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmMDgwODEwMTAxMDEwZmZmZmZmZmZmZmZmZmZmZmZmMDAwMDAwMDgwODEw ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmMDAwMDAwMjEyMTIxMTAxMDEwMDgwODA4ZmYNCmZmZmZm ZmZmZmYxODE4MjEwMDAwMDhmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYzMTMx MzFmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYwODA4MDgwODA4MTAxMDEwMThmZmZmZmZmZmZmZmYx MDEwMThmZmZmDQpmZjI5MjkyOTA4MDgxMGZmZmZmZmZmZmZmZjEwMTAxOGZmZmZmZmZmZmZmZmZm ZmZmZjMxMzEzMWZmZmZmZmZmZmZmZmZmZmZmZjEwMTAxODA4MDgwODEwMTAxODYzNjM2M2ZmZmZm ZjE4MTgxOGZmZmZmZmZmZmZmZmZmZmZmZg0KZmZmZmZmZmZmZmZmZmZmZmZmMDgwODEwZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmMDgxMDEwMTgxODIxZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYNCmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm DQpmZmZmZmZmZmZmZmZmZmZmZmZmZjQyNDI0MjEwMTgxODEwMTAxMGZmZmZmZmZmZmZmZmZmZmZm ZjAwMDAwMDA4MDgwODRhNGE0YWZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZjQy NDI0MjAwMDAwMGZmZmZmZg0KMTgxODE4MDAwMDAwMzEzMTMxMjEyMTIxNDI0MjQyZmZmZmZmZmZm ZmZmZmZmZmZmMDgwODA4MTAxODE4MTAxMDEwZmZmZmZmMTgxODE4MDgwODEwMzEzMTMxMTAxODE4 MDAwMDAwZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYNCmZmZmYxMDEwMTgxMDEwMTgwMDAwMDBm ZmZmZmZmZmZmZmYxODE4MTgxMDE4MThmZmZmZmZmZmZmZmZmZmZmZmYzMTMxMzkxMDEwMTBmZmZm ZmZmZmZmZmYxODE4MTgyMTIxMjExMDEwMTgxMDE4MTgxMDEwMTBmZmZmZmZmZmZmDQpmZmZmZmZm ZjAwMDAwMDIxMjEyMTEwMTAxMGZmZmZmZmZmZmZmZjI5MjkyOTEwMTgxOGZmZmZmZjA4MDgwOGZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZjI5MjkyOTA4MTAxMGZmZmZmZmZmZmZmZmZmZmZmZjAwMDAw MDE4MTgxOA0KMTgxODIxMDgwODA4ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYNCmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmY0MjQyNDIxMDEwMTgxMDEwMThmZmZmDQpmZmZmZmZmZmZmZmZmZmZm ZmZmZjA4MDgwODIxMjEyMWZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZjEwMTAxMDM5Mzk0 MjAwMDAwMGZmZmZmZjA4MDgwODEwMTgxODE4MTgxODA4MDgwODAwMDAwMGZmZmZmZmZmZmZmZg0K ZmZmZmZmMDgwODA4MTgxODE4ZmZmZmZmZmZmZmZmMDAwMDAwMTAxMDE4MTAxMDEwZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmMTgxODE4ZmZmZmZmZmZmZmZmZmZmZmZm MTAxMDE4ZmZmZmZmZmYNCmZmZmZmZmZmZmZmZmZmZmY1YTVhNWEyOTI5MzFmZmZmZmZmZmZmZmYw ODA4MTAxMDEwMThmZmZmZmYwMDAwMDAxMDEwMTAwODA4MDhmZmZmZmYwODA4MDgwODA4MDg0YTRh NGFmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmDQpmZjEwMTAxMGZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZjIxMjEyMTA4MTAxMGZmZmZmZmZmZmZmZmZmZmZmZjAwMDAwMDA4MTAxMDE4MTgxODI5 MjkyOWZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZg0KZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmYNCmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmYzOTM5MzkxMDEwMTgxMDE4MThmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYy MTIxMjExMDEwMTBmZmZmZmZmZmZmDQpmZmZmZmZmZmZmZmZmZmZmZmZmZjE4MTgxODA4MDgwODEw MTAxMDIxMjEyMTAwMDAwMGZmZmZmZjAwMDAwMDAwMDAwMDE4MTgxOGZmZmZmZjAwMDAwMDA4MDgw ODEwMTAxMGZmZmZmZmZmZmZmZmZmZmZmZjI5MjkyOTM5MzkzOQ0KZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmNDI0MjQyNDI0MjQyZmZmZmZmZmZmZmZmMjkyOTI5MTAxODE4MTAx MDEwMjEyMTI5MDAwMDAwZmZmZmZmMDAwMDAwZmZmZmZmZmZmZmZmZmZmZmZmMDAwMDAwZmYNCmZm ZmZmZmZmZmZmZmZmZmYxMDE4MTgxMDEwMTgxMDEwMTBmZmZmZmYwMDAwMDBmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYwMDAwMDAwODA4MDgyOTI5 MjlmZmZmZmZmZmZmDQpmZmZmZmZmZjEwMTAxMDEwMTAxODEwMTgxOGZmZmZmZjAwMDAwMGZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZg0KZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYNCmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmYzMTMxMzExMDEwMTAxODE4MThmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmYwODA4MDhmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmDQpmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZjIxMjEyMTAwMDAwODEwMTAxODIxMjEyMWZm ZmZmZmZmZmZmZmZmZmZmZjIxMjEyOTMxMzEzOWZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZjM5MzkzOQ0KZmZmZmZmZmZmZmZmMDgwODA4MjEyMTIxZmZmZmZmMzkzOTM5 MDgxMDEwZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmMDAwMDAwMTAxMDEwMDAw MDA4ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYNCmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYyMTIxMjEwODA4MDg0MjQyNDJmZmZmZmZmZmZmZmZm ZmZmZmYyOTI5MjkxMDEwMTgxMDEwMThmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmDQpmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZg0KZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmMDgwODA4MTAxMDEwMTgxODIxMTgNCjE4MTgwMDAwMDBmZmZmZmZmZmZmZmZmZmZmZmYy MTIxMjExMDEwMTAwMDAwMDBmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmY0YTRhDQo0YTAwMDAwMDEwMTAx MGZmZmZmZjE4MTgxOGZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZjMx MzEzMTM5MzkzOWZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZjI5MjkyOWZmZmZm Zg0KMDAwMDAwZmZmZmZmMTgxODE4MDgwODA4MDgwODA4MzEzMTMxMDAwMDAwZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmMTAxMDEwMTANCjEwMTAwMDAwMDBmZmZmZmZmZmZmZmZmZmZmZmYyMTI5MjkxODE4 MjExMDEwMThmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmDQpmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZg0KZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmMDgwODEwMTgxODIxMDgxMDEwMDgwODA4ZmZmZmZmZmZmZmZmZmZmZmZmMDAwMDAw MDgwODA4NDINCjQyNDJmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYwMDAwMDAyOTI5 MjkwODA4MDgwMDAwMDAxMDE4MThmZmZmDQpmZmZmZmZmZmZmZmZmZjAwMDAwMDA4MDgxMDEwMTAx MGZmZmZmZjAwMDAwMGZmZmZmZjEwMTAxMGZmZmZmZjEwMTAxODEwMTAxODA4MDgwODA4MDgwODQy NDI0MmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZg0KZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmMDAwMDAwMDgwODA4MDgwODA4 ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmMTAxMDE4MTAxODE4MDgxMDEwZmZmZmZmZmYN CmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmDQpmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZg0KZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm MDAwMDAwMTgxODE4MTgxODIxMTAxODE4MjEyMTIxZmZmZmZmZmZmZmZmZmZmZmZmMDAwMDAwMjky OTI5MDgwODA4MjEyMTIxMDAwMDAwZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYNCmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYw MDAwMDBmZmZmZmZmZmZmZmZmZmZmZmY0YTRhNGExMDEwMTAxMDEwMTgxODE4MTgyMTIxMjEzOTM5 Mzk0YTRhDQo0YTMxMzEzMTE4MTgyMTE4MTgxODAwMDAwMGZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZg0KMzEzMTMxMDgwODA4NWE1YTVhZmZmZmZmZmZmZmZmZmZm ZmZmMDAwMDAwMzEzMTMxMTgxODIxMTAxODE4MjkyOTI5ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYNCmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmDQpm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZjEwMTAxMA0KMTAxODE4MTAxMDEwZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm MzEzMTMxMDAwMDAwMTAxMDEwZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYNCmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYwODA4MDgwMDAwMDBmZmZmZmZmZmZmZmZmZmZmZmYw ODA4MTBmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmDQpmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZjE4MTgyMTA4MDgwOGZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZjAwMDAwMDA4MDgxMDE4 MTgyMQ0KMDgwODEwMjEyMTIxZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmYNCmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmDQpmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZjMxMzEzMTEwMTgxODE4MTgyMTI5MjkyOTAwMDAwMGZmZmZmZmZmZmZmZmZmZmZmZg0KZmZm ZmZmZmZmZmZmMDgwODA4MTgxODE4MDAwMDAwZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmYNCmZmZmYxODE4MTgxMDEwMTAzMTMxMzExODE4MTgwODA4MTBmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYwMDAwDQowMGZmZmZmZjEwMTAxMDA4MDgwODE4MTgxOGZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZjEwMTAxODE4MTgxODE4MTgyMTRhNGE0YWZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZg0KZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmYNCmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmDQpmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZjAwMDAwMDA4MDgxMDE4MTgyMTEwMTAxODEwMTAxMGZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZjEwMTAxMDA4MDgwOGZmZmZmZmZmZmZmZg0KZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmMDAwMDAwZmZmZmZmMDAwMDAwZmZmZmZmZmZmZmZmZmZmZmZmZmYNCmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmYzOTM5MzkwMDAwMDgxMDEwMTBmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYw MDAwMDA0YTRhDQo0YTE4MTgxODEwMTgxODE4MTgxOGZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZg0KZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYNCmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm DQpmZmZmZmZmZjEwMTAxODE4MTgyMTEwMTgxODIxMjEyMTAwMDAwMGZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZjIxMjEyMTA4MDgwODA4MDgwODA4MDgwODAwMDAwMGZmZmZmZjAwMDAwMGZm ZmZmZmZmZmZmZmZmZmZmZg0KZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmMDAwMDAwMTgNCjE4MTgxODE4MTgwMDAwMDAxODE4MThm ZmZmZmYwMDAwMDBmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYyOTI5MjkxMDEwMTgxODE4 MjEwODEwMTAzOTM5MzlmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmDQpmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZg0KZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYNCmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmYyOTI5MjkwODEwMTAxODE4MjExMDEwMTAxMDEwMThmZmZmDQpmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZjQyNDI0MjA4MDgwODA4MDgwODMxMzEzMWZmZmZm ZjAwMDAwMGZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZg0K ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmMDAwMDAwZmZmZmZmNDI0 MjQyMTgxODE4MDgwODA4MDAwMDA4MTAxMDEwZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmYNCmZmZmZmZmZmZmYxMDE4MTgxMDE4MTgxMDEwMTBmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmDQpmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZg0KZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmYNCmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmYwMDAwMDA0YTRhNGExMDEwMTgxODE4MTgxODE4MjExMDEwMTAwODA4MDhmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmDQpmZmZmZmZmZjAwMDAwMGZmZmZmZjZiNmI2YjA4MTAxMDA4 MDgwODAwMDAwMDA4MDgwODA4MDgwODEwMTAxMDEwMTAxMDEwMTgxODEwMTAxMDEwMTAxODEwMTAx MDEwMTAxODA4MTAxMDA4MDgxMDA4MDgwODA4MDgxMDA4MDgwOA0KMjEyMTIxZmZmZmZmMDAwMDAw ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmMDAwMDAwZmZmZmZmMTAx MDEwMTAxODE4MTgxODIxMDgxMDEwMTAxMDEwZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYNCmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmDQpmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZg0KZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYNCmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmYwMDAwMDAxMDEwMTAxMDE4MTgxODE4MjExMDE4MTgxMDEwMTAxMDEwMTBmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmDQpmZmZmZmZmZmZmZmZmZjAwMDAwMGZmZmZmZmZmZmZmZmZmZmZmZjAwMDAwMGZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZg0KZmZmZmZmMTAxMDEwMTAxMDE4MTgxODIxMTAxMDEwMTgxODE4 ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYNCmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmDQpmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZg0KZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmMjEyMTIxMDgNCjEwMTAxODE4MTgxODE4MjExODE4MjEwODEwMTAz MTMxMzlmZmZmZmYwMDAwMDBmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmDQpmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZjAwMDAwMGZmZmZmZjIxMjEyMTIxMjEyMTEw MTgxODEwMTgxODE4MjEyMTEwMTAxODEwMTAxMDQyNDI0MjAwMDAwMGZmZmZmZmZmZmZmZmZmZmZm Zg0KZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmYNCmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmDQpmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZg0KZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmMjEyMTIxMzEzMTM5MTAxMDEwMTAxODE4MTgxODIx MTAxODE4MTANCjEwMTgxMDEwMTAxODE4MThmZmZmZmYwMDAwMDBmZmZmZmYwMDAwMDBmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYwMDAwMDBmZmZm ZmY1YTVhNWEyMTIxMjExMDEwMTAxMDEwDQoxODE4MTgyMTEwMTgxODEwMTgxODA4MDgxMDI5Mjky OWZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZg0KZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYN CmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmDQpmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZg0KZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmMDAwMDAwNGE0YTRhNTI1MjUyMDgx MDEwMTgxODE4MTgxODIxMTgyMTIxMTgxODIxMTgxODIxMTgxODE4MTgxODIxMTANCjEwMTgxODE4 MTgxMDEwMTgxODE4MTgxMDE4MTgxODE4MjExMDE4MTgxODE4MjExODE4MjExODIxMjExODE4MjEx ODE4MTgxMDEwMTAxMDEwMTg0MjQyNDIwODA4MDhmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmDQpmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZg0KZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYNCmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmDQpm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZg0KZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm MDAwMDAwZmZmZmZmMzEzMTMxMTgxODE4MTgxODE4MTgxODE4MjEyMTIxMTAxMDE4MTgxODE4MTAx MDE4MTgxODE4MTAxODE4MjEyMTIxMzEzMTMxNTINCjUyNWFmZmZmZmYwMDAwMDBmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmDQpmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZg0KZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmYNCmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmDQpmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZg0KZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmYNCmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmDQpmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZjBjMDAwMDAwNDAwOTI5MDBhYTAwMDAwMDAwMDAwMDAwNzgwMDc4MDAwMDAwMDAw MDA0MDAwMDAwMjcwMWZmZmYwMzAwMDAwMDAwMDB9fX19fVxzZWN0ZCBcbHRyc2VjdA0KXGxpbmV4 MFxzZWN0ZGVmYXVsdGNsXHNmdG5iaiB9fVxzZWN0ZCBcbHRyc2VjdFxsaW5leDBcc2VjdGRlZmF1 bHRjbFxzZnRuYmoge1xydGxjaFxmY3MxIFxhZjMxNTA2XGFmczE4IFxsdHJjaFxmY3MwIFxmczE4 XGNmMVxpbnNyc2lkMTYyMDY1MTlcY2hhcnJzaWQxMDc2MTQ3MiANClxwYXIgXGhpY2hcYWYzMTUw NlxkYmNoXGFmMzE1MDVcbG9jaFxmMzE1MDYgUkJJIHNlYWx9e1xydGxjaFxmY3MxIFxhZjMxNTA2 XGFmczE4IFxsdHJjaFxmY3MwIFxmczE4XGNmMVxpbnNyc2lkMTQ2OTU1NjRcY2hhcnJzaWQxMDc2 MTQ3MiANClxwYXIgfVxwYXJkIFxsdHJwYXJccWwgXGxpMFxyaTBcc2wyODhcc2xtdWx0MFxub3dp ZGN0bHBhclx3cmFwZGVmYXVsdFxmYWF1dG9ccmluMFxsaW4wXGl0YXAwXHBhcmFyc2lkMTM0NTYy MDcge1xydGxjaFxmY3MxIFxhYlxhZjMxNTA2XGFmczE4IFxsdHJjaFxmY3MwIFxiXGZzMThcbGFu ZzEwMzNcbGFuZ2ZlMTYzOTNcbGFuZ25wMTAzM1xpbnNyc2lkMTYyMDY1MTlcY2hhcnJzaWQxMDc2 MTQ3MiANClxoaWNoXGFmMzE1MDZcZGJjaFxhZjMxNTA1XGxvY2hcZjMxNTA2ICAgICAgICAgICAg ICAgICAgICAgICAgICAgICB9e1xydGxjaFxmY3MxIFxhYlxhZjMxNTA2XGFmczE4IFxsdHJjaFxm Y3MwIFxiXGZzMThcbGFuZzEwMzNcbGFuZ2ZlMTYzOTNcbGFuZ25wMTAzM1xpbnNyc2lkMTQ2OTU1 NjRcY2hhcnJzaWQxMDc2MTQ3MiBcaGljaFxhZjMxNTA2XGRiY2hcYWYzMTUwNVxsb2NoXGYzMTUw NiANClJFU0VSVkUgQkFOSyBPRiBJTkRJQSBFTEVDVFJPTklDIFRSQU5TRkVSIERFUFQsfXtccnRs Y2hcZmNzMSBcYWJcYWYzMTUwNlxhZnMxOCBcbHRyY2hcZmNzMCBcYlxmczE4XGxhbmcxMDMzXGxh bmdmZTE2MzkzXGxhbmducDEwMzNcaW5zcnNpZDEzNDU2MjA3XGNoYXJyc2lkMTA3NjE0NzIgDQpc cGFyIH1ccGFyZCBcbHRycGFyXHFsIFxsaTBccmkwXG5vd2lkY3RscGFyXHdyYXBkZWZhdWx0XGZh YXV0b1xyaW4wXGxpbjBcaXRhcDBccGFyYXJzaWQxNjIwNjUxOSB7XHJ0bGNoXGZjczEgXGFiXGFm MzE1MDZcYWZzMTggXGx0cmNoXGZjczAgXGJcZnMxOFxsYW5nMTAzM1xsYW5nZmUxNjM5M1xsYW5n bnAxMDMzXGluc3JzaWQxNjIwNjUxOVxjaGFycnNpZDEwNzYxNDcyIFxoaWNoXGFmMzE1MDZcZGJj aFxhZjMxNTA1XGxvY2hcZjMxNTA2ICAgICAgfXsNClxydGxjaFxmY3MxIFxhYlxhZjMxNTA2XGFm czE4IFxsdHJjaFxmY3MwIFxiXGZzMThcbGFuZzEwMzNcbGFuZ2ZlMTYzOTNcbGFuZ25wMTAzM1xp bnNyc2lkMTA3NjE0NzIgXGhpY2hcYWYzMTUwNlxkYmNoXGFmMzE1MDVcbG9jaFxmMzE1MDYgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICA2LH17XHJ0bGNoXGZjczEgXGFiXGFmMzE1MDZcYWZz MTggXGx0cmNoXGZjczAgDQpcYlxmczE4XGxhbmcxMDMzXGxhbmdmZTE2MzkzXGxhbmducDEwMzNc aW5zcnNpZDEzNzkyNTMzIFxoaWNoXGFmMzE1MDZcZGJjaFxhZjMxNTA1XGxvY2hcZjMxNTA2ICB9 e1xydGxjaFxmY3MxIFxhYlxhZjMxNTA2XGFmczE4IFxsdHJjaFxmY3MwIFxiXGZzMThcbGFuZzEw MzNcbGFuZ2ZlMTYzOTNcbGFuZ25wMTAzM1xpbnNyc2lkMTYyMDY1MTlcY2hhcnJzaWQxMDc2MTQ3 MiBcaGljaFxhZjMxNTA2XGRiY2hcYWYzMTUwNVxsb2NoXGYzMTUwNiANClNhbnNhZCB9e1xydGxj aFxmY3MxIFxhYlxhZjMxNTA2XGFmczE4IFxsdHJjaFxmY3MwIFxiXGZzMThcbGFuZzEwMzNcbGFu Z2ZlMTYzOTNcbGFuZ25wMTAzM1xpbnNyc2lkMTM3OTI1MzNcY2hhcnJzaWQxMDc2MTQ3MiBcaGlj aFxhZjMxNTA2XGRiY2hcYWYzMTUwNVxsb2NoXGYzMTUwNiBNYXJnfXtccnRsY2hcZmNzMSBcYWJc YWYzMTUwNlxhZnMxOCBcbHRyY2hcZmNzMCANClxiXGZzMThcbGFuZzEwMzNcbGFuZ2ZlMTYzOTNc bGFuZ25wMTAzM1xpbnNyc2lkMTM3OTI1MzMgLH17XHJ0bGNoXGZjczEgXGFiXGFmMzE1MDZcYWZz MTggXGx0cmNoXGZjczAgXGJcZnMxOFxsYW5nMTAzM1xsYW5nZmUxNjM5M1xsYW5nbnAxMDMzXGlu c3JzaWQxNjIwNjUxOVxjaGFycnNpZDEwNzYxNDcyIFxoaWNoXGFmMzE1MDZcZGJjaFxhZjMxNTA1 XGxvY2hcZjMxNTA2ICBOZXcgRGVsaGkgLSAxMTAgMDAxLCBJbmRpYS4NClxwYXIgXGhpY2hcYWYz MTUwNlxkYmNoXGFmMzE1MDVcbG9jaFxmMzE1MDYgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICB9e1xmaWVsZFxmbGRkaXJ0eXtcKlxmbGRpbnN0IHtccnRsY2hcZmNzMSBcYWYz MTUwNlxhZnMxOCBcbHRyY2hcZmNzMCBcZnMxOFxsYW5nMTAzM1xsYW5nZmUxNjM5M1xsYW5nbnAx MDMzXGluc3JzaWQxNDY5NTU2NFxjaGFycnNpZDEwNzYxNDcyIA0KXGhpY2hcYWYzMTUwNlxkYmNo XGFmMzE1MDVcbG9jaFxmMzE1MDYgSFlQRVJMSU5LICJodHRwOi8vd3d3Lm5vdGlmaWNzLnJiaS5v cmcuaW4vIiB9e1xydGxjaFxmY3MxIFxhZjMxNTA2XGFmczE4IFxsdHJjaFxmY3MwIFxmczE4XGxh bmcxMDMzXGxhbmdmZTE2MzkzXGxhbmducDEwMzNcaW5zcnNpZDk5NjY0NDVcY2hhcnJzaWQxMDc2 MTQ3MiB7XCpcZGF0YWZpZWxkIA0KMDBkMGM5ZWE3OWY5YmFjZTExOGM4MjAwYWEwMDRiYTkwYjAy MDAwMDAwMDMwMDAwMDBlMGM5ZWE3OWY5YmFjZTExOGM4MjAwYWEwMDRiYTkwYjU4MDAwMDAwNjgw MDc0MDA3NDAwNzAwMDNhMDAyZjAwMmYwMDc3MDA3NzAwNzcwMDJlMDA2ZTAwNmYwMDc0MDA2OTAw NjYwMDY5MDA2MzAwNzMwMDJlMDA3MjAwNjIwMDY5MDAyZTAwNmYwMDcyMDA2NzAwMmUwMDY5MDA2 ZTAwMmYwMDAwMDA3OTU4ODFmNDNiMWQ3ZjQ4YWYyYzgyNWRjNDg1Mjc2MzAwMDANCjAwMDBhNWFi MDAwMDAwNzIwMDZlMDAwMDAwNzQwMDIwMDA0NjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDB9 fX17XGZsZHJzbHQge1xydGxjaFxmY3MxIFxhYlxhZjMxNTA2XGFmczE4IFxsdHJjaFxmY3MwIFxi XGZzMThcdWxcY2YyXGxhbmcxMDMzXGxhbmdmZTE2MzkzXGxhbmducDEwMzNcaW5zcnNpZDE0Njk1 NTY0XGNoYXJyc2lkMTA3NjE0NzIgXGhpY2hcYWYzMTUwNlxkYmNoXGFmMzE1MDVcbG9jaFxmMzE1 MDYgDQp3d3cubm90aWZpY3MucmJpLm9yZy5pbn19fVxzZWN0ZCBcbHRyc2VjdFxsaW5leDBcc2Vj dGRlZmF1bHRjbFxzZnRuYmoge1xydGxjaFxmY3MxIFxhZjMxNTA2XGFmczE4IFxsdHJjaFxmY3Mw IFxmczE4XGNmMThcbGFuZzEwMzNcbGFuZ2ZlMTYzOTNcbGFuZ25wMTAzM1xpbnNyc2lkMTQ2OTU1 NjRcY2hhcnJzaWQxMDc2MTQ3MiANClxwYXIgfVxwYXJkIFxsdHJwYXJccWwgXGxpMFxyaTBcbm93 aWRjdGxwYXJcd3JhcGRlZmF1bHRcZmFhdXRvXHJpbjBcbGluMFxpdGFwMCB7XHJ0bGNoXGZjczEg XGFmMzE1MDZcYWZzMTggXGx0cmNoXGZjczAgXGZzMThcY2YxXGxhbmcxMDMzXGxhbmdmZTE2Mzkz XGxhbmducDEwMzNcaW5zcnNpZDE2MjA2NTE5XGNoYXJyc2lkMTA3NjE0NzIgXGhpY2hcYWYzMTUw NlxkYmNoXGFmMzE1MDVcbG9jaFxmMzE1MDYgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgfXtccnRsY2hcZmNzMSBcYWYzMTUwNlxhZnMxOCBcbHRyY2hcZmNzMCBcZnMxOFxj ZjFcbGFuZzEwMzNcbGFuZ2ZlMTYzOTNcbGFuZ25wMTAzM1xpbnNyc2lkMTM3OTI1MzMgXGhpY2hc YWYzMTUwNlxkYmNoXGFmMzE1MDVcbG9jaFxmMzE1MDYgT3VyIHJlZjogQ2JuL09oZy9PeGQxLzIw MTR9e1xydGxjaFxmY3MxIFxhZjMxNTA2XGFmczE4IFxsdHJjaFxmY3MwIA0KXGZzMThcY2YxXGxh bmcxMDMzXGxhbmdmZTE2MzkzXGxhbmducDEwMzNcaW5zcnNpZDE0Njk1NTY0XGNoYXJyc2lkMTA3 NjE0NzIgDQpccGFyIH17XHJ0bGNoXGZjczEgXGFmMzE1MDZcYWZzMTggXGx0cmNoXGZjczAgXGZz MThcY2YxXGxhbmcxMDMzXGxhbmdmZTE2MzkzXGxhbmducDEwMzNcaW5zcnNpZDE2MjA2NTE5XGNo YXJyc2lkMTA3NjE0NzIgXGhpY2hcYWYzMTUwNlxkYmNoXGFmMzE1MDVcbG9jaFxmMzE1MDYgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9e1xydGxjaFxmY3MxIFxhZjMxNTA2XGFm czE4IFxsdHJjaFxmY3MwIA0KXGZzMThcY2YxXGxhbmcxMDMzXGxhbmdmZTE2MzkzXGxhbmducDEw MzNcaW5zcnNpZDEzNzkyNTMzIFxoaWNoXGFmMzE1MDZcZGJjaFxhZjMxNTA1XGxvY2hcZjMxNTA2 IFBheW1lbnQgZmlsZTogUkJJL2lkMTAzMy8yMDExLzIwMTR9e1xydGxjaFxmY3MxIFxhZjMxNTA2 XGFmczE4IFxsdHJjaFxmY3MwIFxmczE4XGNmMVxsYW5nMTAzM1xsYW5nZmUxNjM5M1xsYW5nbnAx MDMzXGluc3JzaWQxNDY5NTU2NFxjaGFycnNpZDEwNzYxNDcyIA0KXHBhciB9e1xydGxjaFxmY3Mx IFxhZjMxNTA2XGFmczE4IFxsdHJjaFxmY3MwIFxmczE4XGNmMVxsYW5nMTAzM1xsYW5nZmUxNjM5 M1xsYW5nbnAxMDMzXGluc3JzaWQxNjIwNjUxOVxjaGFycnNpZDEwNzYxNDcyIFxoaWNoXGFmMzE1 MDZcZGJjaFxhZjMxNTA1XGxvY2hcZjMxNTA2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgfXtccnRsY2hcZmNzMSBcYWYzMTUwNlxhZnMxOCBcbHRyY2hcZmNzMCANClxmczE4XGNm MVxsYW5nMTAzM1xsYW5nZmUxNjM5M1xsYW5nbnAxMDMzXGluc3JzaWQzNjc4NzA5XGNoYXJyc2lk MTA3NjE0NzIgXGhpY2hcYWYzMTUwNlxkYmNoXGFmMzE1MDVcbG9jaFxmMzE1MDYgXGhpY2hcZjMx NTA2IFBheW1lbnQgQW1vdW50OiBcJ2EzXGxvY2hcZjMxNTA2IDc1MH17XHJ0bGNoXGZjczEgXGFm MzE1MDZcYWZzMTggXGx0cmNoXGZjczAgDQpcZnMxOFxjZjFcbGFuZzEwMzNcbGFuZ2ZlMTYzOTNc bGFuZ25wMTAzM1xpbnNyc2lkMTQ2OTU1NjRcY2hhcnJzaWQxMDc2MTQ3MiBcaGljaFxhZjMxNTA2 XGRiY2hcYWYzMTUwNVxsb2NoXGYzMTUwNiAsMDAwLjAwR0JQLn17XHJ0bGNoXGZjczEgXGFmMzE1 MDZcYWZzMTggXGx0cmNoXGZjczAgXGZzMThcdWxcY2YxOVxsYW5nMTAzM1xsYW5nZmUxNjM5M1xs YW5nbnAxMDMzXGluc3JzaWQxNDY5NTU2NFxjaGFycnNpZDEwNzYxNDcyIA0KXHBhciB9XHBhcmQg XGx0cnBhclxxYyBcbGkwXHJpMFxub3dpZGN0bHBhclx3cmFwZGVmYXVsdFxmYWF1dG9ccmluMFxs aW4wXGl0YXAwIHtccnRsY2hcZmNzMSBcYWJcYWYzMTUwNlxhZnMxOCBcbHRyY2hcZmNzMCBcYlxm czE4XGNmMjBcbGFuZzEwMzNcbGFuZ2ZlMTYzOTNcbGFuZ25wMTAzM1xpbnNyc2lkMTQ2OTU1NjRc Y2hhcnJzaWQxMDc2MTQ3MiBcfn17XHJ0bGNoXGZjczEgXGFiXGFmMzE1MDZcYWZzMTggXGx0cmNo XGZjczAgDQpcYlxmczE4XHVsXGNmMjFcbGFuZzEwMzNcbGFuZ2ZlMTYzOTNcbGFuZ25wMTAzM1xp bnNyc2lkMTQ2OTU1NjRcY2hhcnJzaWQxMDc2MTQ3MiBcaGljaFxhZjMxNTA2XGRiY2hcYWYzMTUw NVxsb2NoXGYzMTUwNiBSRVNFUlZFIEJBTksgT0YgSU5ESUEgT0ZGSUNJQUwgfXtccnRsY2hcZmNz MSBcYWJcYWYzMTUwNlxhZnMxOCBcbHRyY2hcZmNzMCANClxiXGZzMThcdWxcY2YyMVxsYW5nMTAz M1xsYW5nZmUxNjM5M1xsYW5nbnAxMDMzXGluc3JzaWQxNjAzNjI1XGNoYXJyc2lkMTA3NjE0NzIg XGhpY2hcYWYzMTUwNlxkYmNoXGFmMzE1MDVcbG9jaFxmMzE1MDYgQ09NUEVOU0FUSU9OfXtccnRs Y2hcZmNzMSBcYWJcYWYzMTUwNlxhZnMxOCBcbHRyY2hcZmNzMCANClxiXGZzMThcdWxcY2YyMVxs YW5nMTAzM1xsYW5nZmUxNjM5M1xsYW5nbnAxMDMzXGluc3JzaWQxNDY5NTU2NFxjaGFycnNpZDEw NzYxNDcyIFxoaWNoXGFmMzE1MDZcZGJjaFxhZjMxNTA1XGxvY2hcZjMxNTA2ICBOT1RJRklDQVRJ T059e1xydGxjaFxmY3MxIFxhYlxhZjMxNTA2XGFmczE4IFxsdHJjaFxmY3MwIFxiXGZzMThcY2Yy MVxsYW5nMTAzM1xsYW5nZmUxNjM5M1xsYW5nbnAxMDMzXGluc3JzaWQxNDY5NTU2NFxjaGFycnNp ZDEwNzYxNDcyIA0KXGhpY2hcYWYzMTUwNlxkYmNoXGFmMzE1MDVcbG9jaFxmMzE1MDYgICBcflx+ DQpccGFyIH1ccGFyZCBcbHRycGFyXHFsIFxsaTBccmkwXG5vd2lkY3RscGFyXHdyYXBkZWZhdWx0 XGZhYXV0b1xyaW4wXGxpbjBcaXRhcDAge1xydGxjaFxmY3MxIFxhZjMxNTA2XGFmczE4IFxsdHJj aFxmY3MwIFxmczE4XGNmMVxsYW5nMTAzM1xsYW5nZmUxNjM5M1xsYW5nbnAxMDMzXGluc3JzaWQx NjIwNjUxOVxjaGFycnNpZDEwNzYxNDcyIFxoaWNoXGFmMzE1MDZcZGJjaFxhZjMxNTA1XGxvY2hc ZjMxNTA2IA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANClxwYXIgXGhpY2hc YWYzMTUwNlxkYmNoXGFmMzE1MDVcbG9jaFxmMzE1MDYgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgfXtccnRsY2hcZmNzMSBcYWYzMTUwNlxhZnMxOCBcbHRyY2hcZmNzMCBc YlxmczE4XGNmMVxsYW5nMTAzM1xsYW5nZmUxNjM5M1xsYW5nbnAxMDMzXGluc3JzaWQxNDY5NTU2 NFxjaGFycnNpZDEwNzYxNDcyIFxoaWNoXGFmMzE1MDZcZGJjaFxhZjMxNTA1XGxvY2hcZjMxNTA2 IERlYXIgQmVuZWZpY2lhcnl9ew0KXHJ0bGNoXGZjczEgXGFmMzE1MDZcYWZzMTggXGx0cmNoXGZj czAgXGZzMThcY2YxXGxhbmcxMDMzXGxhbmdmZTE2MzkzXGxhbmducDEwMzNcaW5zcnNpZDE0Njk1 NTY0XGNoYXJyc2lkMTA3NjE0NzIgXGhpY2hcYWYzMTUwNlxkYmNoXGFmMzE1MDVcbG9jaFxmMzE1 MDYgOn17XHJ0bGNoXGZjczEgXGFiXGFmMzE1MDZcYWZzMTggXGx0cmNoXGZjczAgDQpcYlxmczE4 XGNmMjBcbGFuZzEwMzNcbGFuZ2ZlMTYzOTNcbGFuZ25wMTAzM1xpbnNyc2lkMTQ2OTU1NjRcY2hh cnJzaWQxMDc2MTQ3MiANClxwYXIgfVxwYXJkIFxsdHJwYXJccWMgXGxpMFxyaTBcc2IxMDBcc2Ex MDBcbm93aWRjdGxwYXJcd3JhcGRlZmF1bHRcZmFhdXRvXHJpbjBcbGluMFxpdGFwMFxwYXJhcnNp ZDE2MjA2NTE5IHtccnRsY2hcZmNzMSBcYWYzMTUwNiBcbHRyY2hcZmNzMCBcY2YxXGxhbmcxMDMz XGxhbmdmZTE2MzkzXGxhbmducDEwMzNcaW5zcnNpZDE0Njk1NTY0XGNoYXJyc2lkMzE2NDA4NSBc aGljaFxhZjMxNTA2XGRiY2hcYWYzMTUwNVxsb2NoXGYzMTUwNiANClRoZSBGb3JlaWduIEV4Y2hh bmdlIFRyYW5zZmVyIERlcGFydG1lbnQgKFJCSSkgaGVyZWJcaGljaFxhZjMxNTA2XGRiY2hcYWYz MTUwNVxsb2NoXGYzMTUwNiANCnkgYnJpbmcgdG8geW91ciBhdHRlbnRpb24gb2YgdGhlIHBheW1l bnQgb2YgeW91ciBkZXBvc2l0ZWQgZnVuZCBoZXJlIGluIHRoZSBSQkksIHlvdSB3ZXJlIGxpc3Rl ZCBhcyBhIGJlbmVmaWNpYXJ5IGluIHRoZSByZWNlbnQgc2NoZWR1bGUgZm9yIHBheW1lbnQgb2Yg dGhlIHBhc3QgZWRpdGlvbiBlbWFpbCBhd2FyZCBpbmN1cnJlZCBieSB0aGUgQlJJVElTSCBHT1ZF Uk5NRU5ULCB3aGljaCBpcyB5ZXQgdW5jbGFpbWVkIHVwLXRpbGwgZGF0ZSBkdQ0KXGhpY2hcYWYz MTUwNlxkYmNoXGFmMzE1MDVcbG9jaFxmMzE1MDYgZVxoaWNoXGFmMzE1MDZcZGJjaFxhZjMxNTA1 XGxvY2hcZjMxNTA2ICB0byBzb21lIGNpcmN1bXN0YW5jZSBhY2NvcmRpbmcgdG8geW91ciBmaWxl IHJlY29yZDsgeW91ciBwYXltZW50IGlzIGNhdGVnb3JpemVkIGFzOn17XHJ0bGNoXGZjczEgXGFi XGFmMzE1MDYgXGx0cmNoXGZjczAgDQpcYlxjZjIxXGxhbmcxMDMzXGxhbmdmZTE2MzkzXGxhbmdu cDEwMzNcaW5zcnNpZDE0Njk1NTY0XGNoYXJyc2lkMzE2NDA4NSBcaGljaFxhZjMxNTA2XGRiY2hc YWYzMTUwNVxsb2NoXGYzMTUwNiAgfXtccnRsY2hcZmNzMSBcYWJcYWYzMTUwNiBcbHRyY2hcZmNz MCBcY2YxOFxsYW5nMTAzM1xsYW5nZmUxNjM5M1xsYW5nbnAxMDMzXGluc3JzaWQxNDY5NTU2NFxj aGFycnNpZDMxNjQwODUgDQpcaGljaFxhZjMxNTA2XGRiY2hcYWYzMTUwNVxsb2NoXGYzMTUwNiBD b250cmFjdCB0eXBlOiBMb3R0ZXJ5L2luaGVyaXRhbmNlLyBVbmRlbGl2ZXJlZCBMb3R0ZXJ5IGZ1 bmR9e1xydGxjaFxmY3MxIFxhYlxhZjMxNTA2IFxsdHJjaFxmY3MwIFxiXGNmMThcbGFuZzEwMzNc bGFuZ2ZlMTYzOTNcbGFuZ25wMTAzM1xpbnNyc2lkMzY3ODcwOVxjaGFycnNpZDMxNjQwODUgLn17 XHJ0bGNoXGZjczEgXGFiXGFmMzE1MDYgXGx0cmNoXGZjczAgDQpcYlxjZjIxXGxhbmcxMDMzXGxh bmdmZTE2MzkzXGxhbmducDEwMzNcaW5zcnNpZDM2Nzg3MDlcY2hhcnJzaWQzMTY0MDg1IFxoaWNo XGFmMzE1MDZcZGJjaFxhZjMxNTA1XGxvY2hcZjMxNTA2ICB9e1xydGxjaFxmY3MxIFxhZjMxNTA2 IFxsdHJjaFxmY3MwIFxsYW5nMTAzM1xsYW5nZmUxNjM5M1xsYW5nbnAxMDMzXGluc3JzaWQxNDY5 NTU2NFxjaGFycnNpZDMxNjQwODUgXGhpY2hcYWYzMTUwNlxkYmNoXGFmMzE1MDVcbG9jaFxmMzE1 MDYgDQpSZWNlbnRseSBvbiB0aGUgfXtccnRsY2hcZmNzMSBcYWYzMTUwNiBcbHRyY2hcZmNzMCBc bGFuZzEwMzNcbGFuZ2ZlMTYzOTNcbGFuZ25wMTAzM1xpbnNyc2lkMzY3ODcwOVxjaGFycnNpZDMx NjQwODUgXGhpY2hcYWYzMTUwNlxkYmNoXGFmMzE1MDVcbG9jaFxmMzE1MDYgMTB9e1xydGxjaFxm Y3MxIFxhZjMxNTA2IFxsdHJjaFxmY3MwIFxsYW5nMTAzM1xsYW5nZmUxNjM5M1xsYW5nbnAxMDMz XGluc3JzaWQ4MTM4NDEzXGNoYXJyc2lkMzE2NDA4NSANClxoaWNoXGFmMzE1MDZcZGJjaFxhZjMx NTA1XGxvY2hcZjMxNTA2IHRofXtccnRsY2hcZmNzMSBcYWYzMTUwNiBcbHRyY2hcZmNzMCBcbGFu ZzEwMzNcbGFuZ2ZlMTYzOTNcbGFuZ25wMTAzM1xpbnNyc2lkMTQ2OTU1NjRcY2hhcnJzaWQzMTY0 MDg1IFxoaWNoXGFmMzE1MDZcZGJjaFxhZjMxNTA1XGxvY2hcZjMxNTA2ICBvZiB9e1xydGxjaFxm Y3MxIFxhZjMxNTA2IFxsdHJjaFxmY3MwIA0KXGxhbmcxMDMzXGxhbmdmZTE2MzkzXGxhbmducDEw MzNcaW5zcnNpZDEzNzkyNTMzXGNoYXJyc2lkMzE2NDA4NSBcaGljaFxhZjMxNTA2XGRiY2hcYWYz MTUwNVxsb2NoXGYzMTUwNiBEZWNlbWJlciAgfXtccnRsY2hcZmNzMSBcYWYzMTUwNiBcbHRyY2hc ZmNzMCBcbGFuZzEwMzNcbGFuZ2ZlMTYzOTNcbGFuZ25wMTAzM1xpbnNyc2lkMTQ2OTU1NjRcY2hh cnJzaWQzMTY0MDg1IFxoaWNoXGFmMzE1MDZcZGJjaFxhZjMxNTA1XGxvY2hcZjMxNTA2IA0KIDIw MTMgVGhlIFJlc2VydmUgQmFuayBvZiBJbmRpYSAoUkJJKSBHb3Zlcm5vciwgfXtccnRsY2hcZmNz MSBcYWYzMTUwNiBcbHRyY2hcZmNzMCBcbGFuZzEwMzNcbGFuZ2ZlMTYzOTNcbGFuZ25wMTAzM1xp bnNyc2lkMTYyMDY1MTlcY2hhcnJzaWQzMTY0MDg1IFxoaWNoXGFmMzE1MDZcZGJjaFxhZjMxNTA1 XGxvY2hcZjMxNTA2IE1yLn17XHJ0bGNoXGZjczEgXGFmMzE1MDYgXGx0cmNoXGZjczAgDQpcbGFu ZzEwMzNcbGFuZ2ZlMTYzOTNcbGFuZ25wMTAzM1xpbnNyc2lkMTA3NjE0NzJcY2hhcnJzaWQzMTY0 MDg1IFxoaWNoXGFmMzE1MDZcZGJjaFxhZjMxNTA1XGxvY2hcZjMxNTA2ICB9e1xydGxjaFxmY3Mx IFxhZjMxNTA2IFxsdHJjaFxmY3MwIFxsYW5nMTAzM1xsYW5nZmUxNjM5M1xsYW5nbnAxMDMzXGlu c3JzaWQxNjIwNjUxOVxjaGFycnNpZDMxNjQwODUgXGhpY2hcYWYzMTUwNlxkYmNoXGFmMzE1MDVc bG9jaFxmMzE1MDYgDQpSYWdodXJhbSBSYWphbiB9e1xydGxjaFxmY3MxIFxhZjMxNTA2IFxsdHJj aFxmY3MwIFxsYW5nMTAzM1xsYW5nZmUxNjM5M1xsYW5nbnAxMDMzXGluc3JzaWQxNDY5NTU2NFxj aGFycnNpZDMxNjQwODUgXGhpY2hcYWYzMTUwNlxkYmNoXGFmMzE1MDVcbG9jaFxmMzE1MDYgDQph bmQgQmFuIEtpbi1tb29uIFNlY3JldGFyeS1HZW5lcmFsIG9mIHRoZSBVbml0ZWQgTmF0aW9ucyBt ZXQgd2l0aCB0aGUgU2VuYXRlIFRheCBDb21taXR0ZWUgb24gRmluYW5jZSBSQkkgTXVtYmFpL0Rl bGhpIGJyYW5jaC4gUmVnYXJkaW5nIHVuY2xhaW1lZCBmdW5kcyB3aGljaCBoYXZlIGJlZW4gZHVl IGZvciBhIGxvbmcgcnVuLCBhdCBlbmQgb2YgdGhlIG1lZXRpbmcgKFJCSSkgR292ZXJub3IsIH17 XHJ0bGNoXGZjczEgXGFmMzE1MDYgDQpcbHRyY2hcZmNzMCBcbGFuZzEwMzNcbGFuZ2ZlMTYzOTNc bGFuZ25wMTAzM1xpbnNyc2lkMTYyMDY1MTlcY2hhcnJzaWQzMTY0MDg1IFxoaWNoXGFmMzE1MDZc ZGJjaFxhZjMxNTA1XGxvY2hcZjMxNTA2IE1yLn17XHJ0bGNoXGZjczEgXGFmMzE1MDYgXGx0cmNo XGZjczAgXGxhbmcxMDMzXGxhbmdmZTE2MzkzXGxhbmducDEwMzNcaW5zcnNpZDEwNzYxNDcyXGNo YXJyc2lkMzE2NDA4NSANClxoaWNoXGFmMzE1MDZcZGJjaFxhZjMxNTA1XGxvY2hcZjMxNTA2ICB9 e1xydGxjaFxmY3MxIFxhZjMxNTA2IFxsdHJjaFxmY3MwIFxsYW5nMTAzM1xsYW5nZmUxNjM5M1xs YW5nbnAxMDMzXGluc3JzaWQxNjIwNjUxOVxjaGFycnNpZDMxNjQwODUgXGhpY2hcYWYzMTUwNlxk YmNoXGFmMzE1MDVcbG9jaFxmMzE1MDYgUmFnaHVyYW0gUmFqYW4gfXtccnRsY2hcZmNzMSBcYWYz MTUwNiBcbHRyY2hcZmNzMCANClxsYW5nMTAzM1xsYW5nZmUxNjM5M1xsYW5nbnAxMDMzXGluc3Jz aWQxNDY5NTU2NFxjaGFycnNpZDMxNjQwODUgXGhpY2hcYWYzMTUwNlxkYmNoXGFmMzE1MDVcbG9j aFxmMzE1MDYgbWFuZGF0ZSBhbFxoaWNoXGFmMzE1MDZcZGJjaFxhZjMxNTA1XGxvY2hcZjMxNTA2 IA0KbCB1bmNsYWltZWQgZnVuZHMgdG8gYmUgcmVsZWFzZWQgYmFjayB0byB0aGUgYmVuZWZpY2lh cnkgc3RhdGluZyB0aGF0IGl0IGlzIGFuIHVuZmFpciBwcmFjdGljZSB0byB3aXRoaG9sZCBmdW5k cyBmb3IgZ292ZXJubWVudCBiYXNrZXQgZm9yIG9uZSByZWFzb24gb3IgdGhlIG90aGVyIGZvciB0 YXggYWNjdW11bGF0aW9ucy4gVGhlcmVmb3JlLCB3ZSBhcmUgd3JpdGluZyB0aGlzIGVtYWlsIHRv IGluZm9ybSB5b3UgdGhhdCB9ew0KXHJ0bGNoXGZjczEgXGFiXGFmMzE1MDYgXGx0cmNoXGZjczAg XGNmMThcbGFuZzEwMzNcbGFuZ2ZlMTYzOTNcbGFuZ25wMTAzM1xpbnNyc2lkMTYwMzYyNVxjaGFy cnNpZDMxNjQwODUgXGxvY2hcYWYzMTUwNlxkYmNoXGFmMzE1MDVcaGljaFxmMzE1MDYgXCdhM1xs b2NoXGYzMTUwNiA3NX17XHJ0bGNoXGZjczEgXGFiXGFmMzE1MDYgXGx0cmNoXGZjczAgDQpcY2Yx OFxsYW5nMTAzM1xsYW5nZmUxNjM5M1xsYW5nbnAxMDMzXGluc3JzaWQxMjQ3Njk5MVxjaGFycnNp ZDMxNjQwODUgXGhpY2hcYWYzMTUwNlxkYmNoXGFmMzE1MDVcbG9jaFxmMzE1MDYgMCwwMDAuMDAg R0JcaGljaFxhZjMxNTA2XGRiY2hcYWYzMTUwNVxsb2NoXGYzMTUwNiBQfXtccnRsY2hcZmNzMSBc YWJcYWYzMTUwNiBcbHRyY2hcZmNzMCANClxiXGNmMThcbGFuZzEwMzNcbGFuZ2ZlMTYzOTNcbGFu Z25wMTAzM1xpbnNyc2lkMTI0NzY5OTFcY2hhcnJzaWQzMTY0MDg1IFxoaWNoXGFmMzE1MDZcZGJj aFxhZjMxNTA1XGxvY2hcZjMxNTA2ICB9e1xydGxjaFxmY3MxIFxhYlxhZjMxNTA2IFxsdHJjaFxm Y3MwIFxjczE2XGNmMThcY2hzaGRuZzBcY2hjZnBhdDBcY2hjYnBhdDhcaW5zcnNpZDEyNDc2OTkx XGNoYXJyc2lkMzE2NDA4NSANClxoaWNoXGFmMzE1MDZcZGJjaFxhZjMxNTA1XGxvY2hcZjMxNTA2 ID0gfXtccnRsY2hcZmNzMSBcYWJcYWYzMTUwNiBcbHRyY2hcZmNzMCBcY2YxOFxjaHNoZG5nMFxj aGNmcGF0MFxjaGNicGF0OFxpbnNyc2lkMTI0NzY5OTFcY2hhcnJzaWQzMTY0MDg1IFxoaWNoXGFm MzE1MDZcZGJjaFxhZjMxNTA1XGxvY2hcZjMxNTA2IDY3LDE2NSw3NzQuMTN9e1xydGxjaFxmY3Mx IFxhYlxhZjMxNTA2IFxsdHJjaFxmY3MwIA0KXGNzMTZcYlxjZjE4XGNoc2hkbmcwXGNoY2ZwYXQw XGNoY2JwYXQ4XGluc3JzaWQxMjQ3Njk5MVxjaGFycnNpZDMxNjQwODUgXH5caGljaFxhZjMxNTA2 XGRiY2hcYWYzMTUwNVxsb2NoXGYzMTUwNiBJTlJ9e1xydGxjaFxmY3MxIFxhYlxhZjMxNTA2IFxs dHJjaFxmY3MwIFxjczE2XGNmMVxjaHNoZG5nMFxjaGNmcGF0MFxjaGNicGF0OFxpbnNyc2lkMTI0 NzY5OTFcY2hhcnJzaWQzMTY0MDg1IFx9DQpcaGljaFxhZjMxNTA2XGRiY2hcYWYzMTUwNVxsb2No XGYzMTUwNiAgKFNpeCBDcm9yZSBTZXZlbiBPbmUgTGFraHMgSW5kaWFuIFJ1cGVlcyl9e1xydGxj aFxmY3MxIFxhZjMxNTA2IFxsdHJjaFxmY3MwIFxjZjZcbGFuZzEwMzNcbGFuZ2ZlMTYzOTNcbGFu Z25wMTAzM1xpbnNyc2lkMTQ2OTU1NjRcY2hhcnJzaWQzMTY0MDg1IFxoaWNoXGFmMzE1MDZcZGJj aFxhZjMxNTA1XGxvY2hcZjMxNTA2ICB9e1xydGxjaFxmY3MxIFxhZjMxNTA2IA0KXGx0cmNoXGZj czAgXGxhbmcxMDMzXGxhbmdmZTE2MzkzXGxhbmducDEwMzNcaW5zcnNpZDE0Njk1NTY0XGNoYXJy c2lkMzE2NDA4NSBcaGljaFxhZjMxNTA2XGRiY2hcYWYzMTUwNVxsb2NoXGYzMTUwNiB3aWxsIGJl IHJlbGVhc2UgdG8geW91IGluIHlvdXIgbmFtZSwgYXMgaXQgd2FzIGNvbW1pdHRlZCBieSAoUkJJ KSBHb3Zlcm5vciB0aGF0IEJlbmVmaWNpYXJ5IHdpbGwgaGF2ZSB0byBwYXkgY3JlZGl0aW5nIGZl ZXMgb25seS4gWW91IGFyZSB9DQp7XHJ0bGNoXGZjczEgXGFmMzE1MDYgXGx0cmNoXGZjczAgXGxh bmcxMDMzXGxhbmdmZTE2MzkzXGxhbmducDEwMzNcaW5zcnNpZDUwNTUyNzZcY2hhcnJzaWQzMTY0 MDg1IFxoaWNoXGFmMzE1MDZcZGJjaFxhZjMxNTA1XGxvY2hcZjMxNTA2IHRoZX17XHJ0bGNoXGZj czEgXGFmMzE1MDYgXGx0cmNoXGZjczAgXGxhbmcxMDMzXGxhbmdmZTE2MzkzXGxhbmducDEwMzNc aW5zcnNpZDExOTUzODQ0XGNoYXJyc2lkMzE2NDA4NSANClxoaWNoXGFmMzE1MDZcZGJjaFxhZjMx NTA1XGxvY2hcZjMxNTA2IHJlZm9yZSByZXF1aXJlZCB0byBwYXkgKH17XHJ0bGNoXGZjczEgXGFm MzE1MDYgXGx0cmNoXGZjczAgXGNmMThcbGFuZzEwMzNcbGFuZ2ZlMTYzOTNcbGFuZ25wMTAzM1xp bnNyc2lkMTE5NTM4NDRcY2hhcnJzaWQzMTY0MDg1IFxoaWNoXGFmMzE1MDZcZGJjaFxhZjMxNTA1 XGxvY2hcZjMxNTA2IFJzIH17XHJ0bGNoXGZjczEgXGFmMzE1MDYgXGx0cmNoXGZjczAgDQpcY2Yx OFxsYW5nMTAzM1xsYW5nZmUxNjM5M1xsYW5nbnAxMDMzXGluc3JzaWQxNTY4OTgwMlxjaGFycnNp ZDMxNjQwODUgXGhpY2hcYWYzMTUwNlxkYmNoXGFmMzE1MDVcbG9jaFxmMzE1MDYgMTJ9e1xydGxj aFxmY3MxIFxhZjMxNTA2IFxsdHJjaFxmY3MwIFxjZjE4XGxhbmcxMDMzXGxhbmdmZTE2MzkzXGxh bmducDEwMzNcaW5zcnNpZDU5ODEwOThcY2hhcnJzaWQzMTY0MDg1IFxoaWNoXGFmMzE1MDZcZGJj aFxhZjMxNTA1XGxvY2hcZjMxNTA2IA0KLDQwMH17XHJ0bGNoXGZjczEgXGFmMzE1MDYgXGx0cmNo XGZjczAgXGxhbmcxMDMzXGxhbmdmZTE2MzkzXGxhbmducDEwMzNcaW5zcnNpZDE0Njk1NTY0XGNo YXJyc2lkMzE2NDA4NSBcaGljaFxhZjMxNTA2XGRiY2hcYWYzMTUwNVxsb2NoXGYzMTUwNiApIG9u bHkgaW5caGljaFxhZjMxNTA2XGRiY2hcYWYzMTUwNVxsb2NoXGYzMTUwNiANCiBjYXNoIGRlcG9z aXQgdG8gY3JlZGl0IHlvdXIgYWNjb3VudCBpbW1lZGlhdGVseSBtYWtpbmcgYSBkZWNsaW5lIGZv ciAyIHdvcmtpbmcgZGF5cyBhZnRlciBkYXRlIG9mIHJlY2VpdmluZyB0aGlzIG1haWwuIEFsc28g cmVjb25maXJtIHlvdXIgZGV0YWlscyBmb3IgY3JlZGl0aW5nIGZpbGxpbmcgdGhlIGZvcm0gYmVs b3cgYW5kIHNlbmQgaXQgdG8gb3VyIH17XHJ0bGNoXGZjczEgXGFmMzE1MDYgXGx0cmNoXGZjczAg DQpcbGFuZzEwMzNcbGFuZ2ZlMTYzOTNcbGFuZ25wMTAzM1xpbnNyc2lkMTQwMjU1MTJcY2hhcnJz aWQzMTY0MDg1IFxoaWNoXGFmMzE1MDZcZGJjaFxhZjMxNTA1XGxvY2hcZjMxNTA2IGVtYWlsIGJl bG93Ln17XHJ0bGNoXGZjczEgXGFmMzE1MDYgXGx0cmNoXGZjczAgXGxhbmcxMDMzXGxhbmdmZTE2 MzkzXGxhbmducDEwMzNcaW5zcnNpZDE0Njk1NTY0XGNoYXJyc2lkMzE2NDA4NSBcaGljaFxhZjMx NTA2XGRiY2hcYWYzMTUwNVxsb2NoXGYzMTUwNiANCiAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICBcaGljaFxhZjMxNTA2XGRiY2hcYWYzMTUwNVxsb2NoXGYzMTUwNiAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH17XHJ0bGNoXGZjczEgXGFmMzE1MDYgXGx0 cmNoXGZjczAgXGxhbmcxMDMzXGxhbmdmZTE2MzkzXGxhbmducDEwMzNcaW5zcnNpZDM2Nzg3MDlc Y2hhcnJzaWQzMTY0MDg1IFxoaWNoXGFmMzE1MDZcZGJjaFxhZjMxNTA1XGxvY2hcZjMxNTA2IA0K ICAgICAgICAgfXtccnRsY2hcZmNzMSBcYWYzMTUwNiBcbHRyY2hcZmNzMCBcbGFuZzEwMzNcbGFu Z2ZlMTYzOTNcbGFuZ25wMTAzM1xpbnNyc2lkMTQ2OTU1NjRcY2hhcnJzaWQzMTY0MDg1IFxoaWNo XGFmMzE1MDZcZGJjaFxhZjMxNTA1XGxvY2hcZjMxNTA2ICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIH17XHJ0bGNoXGZjczEgDQpcYWJcYWYzMTUwNiBcbHRyY2hcZmNzMCBcYlxj ZjJcbGFuZzEwMzNcbGFuZ2ZlMTYzOTNcbGFuZ25wMTAzM1xpbnNyc2lkMTQ2OTU1NjRcY2hhcnJz aWQzMTY0MDg1IFxoaWNoXGFmMzE1MDZcZGJjaFxhZjMxNTA1XGxvY2hcZjMxNTA2IEZpbGwgdGhl IEZvcm0gQmVsb3d9e1xydGxjaFxmY3MxIFxhYlxhZjMxNTA2IFxsdHJjaFxmY3MwIA0KXGJcY2Yy MVxsYW5nMTAzM1xsYW5nZmUxNjM5M1xsYW5nbnAxMDMzXGluc3JzaWQxNDY5NTU2NFxjaGFycnNp ZDMxNjQwODUgDQpccGFyIFxsdHJyb3d9XHRyb3dkIFxpcm93MFxpcm93YmFuZDBcbHRycm93XHRz MTFcdHJnYXBoMTA4XHRycmgyNzBcdHJsZWZ0LTEwOFx0cmJyZHJ0XGJyZHJzXGJyZHJ3MTBcYnJk cmNmMSBcdHJicmRybFxicmRyc1xicmRydzEwXGJyZHJjZjEgXHRyYnJkcmJcYnJkcnNcYnJkcncx MFxicmRyY2YxIFx0cmJyZHJyXGJyZHJzXGJyZHJ3MTBcYnJkcmNmMSANClx0cmZ0c1dpZHRoMVx0 cnBhZGRsMTA4XHRycGFkZHIxMDhcdHJwYWRkZmwzXHRycGFkZGZyM1x0YmxpbmQwXHRibGluZHR5 cGUzIFxjbHZlcnRhbHRcY2xicmRydFxicmRyc1xicmRydzEwXGJyZHJjZjEgXGNsYnJkcmxcYnJk cnNcYnJkcncxMFxicmRyY2YxIFxjbGJyZHJiXGJyZHJzXGJyZHJ3MTBcYnJkcmNmMSBcY2xicmRy clxicmRyc1xicmRydzEwXGJyZHJjZjEgDQpcY2x0eGxydGJcY2xmdHNXaWR0aDNcY2x3V2lkdGgx MTUyNlxjbHNoZHJhd25pbCBcY2VsbHgxMTQxOFxwYXJkIFxsdHJwYXJccWwgXGxpMFxyaTBcbm93 aWRjdGxwYXJcaW50Ymxcd3JhcGRlZmF1bHRcZmFhdXRvXHJpbjBcbGluMCB7XHJ0bGNoXGZjczEg XGFmMzE1MDZcYWZzMTggXGx0cmNoXGZjczAgXGZzMThcbGFuZzEwMzNcbGFuZ2ZlMTYzOTNcbGFu Z25wMTAzM1xpbnNyc2lkMTQ2OTU1NjRcY2hhcnJzaWQxMDc2MTQ3MiANClxoaWNoXGFmMzE1MDZc ZGJjaFxhZjMxNTA1XGxvY2hcZjMxNTA2IDEuIEZ1bGwgTmFtZXM6ICBcY2VsbCB9XHBhcmQgXGx0 cnBhclxxbCBcbGkwXHJpMFxzYTIwMFxzbDI3NlxzbG11bHQxXHdpZGN0bHBhclxpbnRibFx3cmFw ZGVmYXVsdFxhc3BhbHBoYVxhc3BudW1cZmFhdXRvXGFkanVzdHJpZ2h0XHJpbjBcbGluMCB7XHJ0 bGNoXGZjczEgXGFmMzE1MDZcYWZzMTggXGx0cmNoXGZjczAgDQpcZnMxOFxsYW5nMTAzM1xsYW5n ZmUxNjM5M1xsYW5nbnAxMDMzXGluc3JzaWQxNDY5NTU2NFxjaGFycnNpZDEwNzYxNDcyIFx0cm93 ZCBcaXJvdzBcaXJvd2JhbmQwXGx0cnJvd1x0czExXHRyZ2FwaDEwOFx0cnJoMjcwXHRybGVmdC0x MDhcdHJicmRydFxicmRyc1xicmRydzEwXGJyZHJjZjEgXHRyYnJkcmxcYnJkcnNcYnJkcncxMFxi cmRyY2YxIFx0cmJyZHJiXGJyZHJzXGJyZHJ3MTBcYnJkcmNmMSBcdHJicmRycg0KXGJyZHJzXGJy ZHJ3MTBcYnJkcmNmMSBcdHJmdHNXaWR0aDFcdHJwYWRkbDEwOFx0cnBhZGRyMTA4XHRycGFkZGZs M1x0cnBhZGRmcjNcdGJsaW5kMFx0YmxpbmR0eXBlMyBcY2x2ZXJ0YWx0XGNsYnJkcnRcYnJkcnNc YnJkcncxMFxicmRyY2YxIFxjbGJyZHJsXGJyZHJzXGJyZHJ3MTBcYnJkcmNmMSBcY2xicmRyYlxi cmRyc1xicmRydzEwXGJyZHJjZjEgXGNsYnJkcnJcYnJkcnNcYnJkcncxMFxicmRyY2YxIA0KXGNs dHhscnRiXGNsZnRzV2lkdGgzXGNsd1dpZHRoMTE1MjZcY2xzaGRyYXduaWwgXGNlbGx4MTE0MThc cm93IFxsdHJyb3d9XHRyb3dkIFxpcm93MVxpcm93YmFuZDFcbHRycm93XHRzMTFcdHJnYXBoMTA4 XHRycmgyNTNcdHJsZWZ0LTEwOFx0cmJyZHJ0XGJyZHJzXGJyZHJ3MTBcYnJkcmNmMSBcdHJicmRy bFxicmRyc1xicmRydzEwXGJyZHJjZjEgXHRyYnJkcmJcYnJkcnNcYnJkcncxMFxicmRyY2YxIFx0 cmJyZHJyDQpcYnJkcnNcYnJkcncxMFxicmRyY2YxIFx0cmZ0c1dpZHRoMVx0cnBhZGRsMTA4XHRy cGFkZHIxMDhcdHJwYWRkZmwzXHRycGFkZGZyM1x0YmxpbmQwXHRibGluZHR5cGUzIFxjbHZlcnRh bHRcY2xicmRydFxicmRyc1xicmRydzEwXGJyZHJjZjEgXGNsYnJkcmxcYnJkcnNcYnJkcncxMFxi cmRyY2YxIFxjbGJyZHJiXGJyZHJzXGJyZHJ3MTBcYnJkcmNmMSBcY2xicmRyclxicmRyc1xicmRy dzEwXGJyZHJjZjEgDQpcY2x0eGxydGJcY2xmdHNXaWR0aDNcY2x3V2lkdGgxMTUyNlxjbHNoZHJh d25pbCBcY2VsbHgxMTQxOFxwYXJkIFxsdHJwYXJccWwgXGxpMFxyaTBcbm93aWRjdGxwYXJcaW50 Ymxcd3JhcGRlZmF1bHRcZmFhdXRvXHJpbjBcbGluMCB7XHJ0bGNoXGZjczEgXGFmMzE1MDZcYWZz MTggXGx0cmNoXGZjczAgXGZzMThcbGFuZzEwMzNcbGFuZ2ZlMTYzOTNcbGFuZ25wMTAzM1xpbnNy c2lkMTQ2OTU1NjRcY2hhcnJzaWQxMDc2MTQ3MiANClxoaWNoXGFmMzE1MDZcZGJjaFxhZjMxNTA1 XGxvY2hcZjMxNTA2IDIuIFJlc2lkZW50aWFsIEFkZHJlc3M6IFxjZWxsIH1ccGFyZCBcbHRycGFy XHFsIFxsaTBccmkwXHNhMjAwXHNsMjc2XHNsbXVsdDFcd2lkY3RscGFyXGludGJsXHdyYXBkZWZh dWx0XGFzcGFscGhhXGFzcG51bVxmYWF1dG9cYWRqdXN0cmlnaHRccmluMFxsaW4wIHtccnRsY2hc ZmNzMSBcYWYzMTUwNlxhZnMxOCBcbHRyY2hcZmNzMCANClxmczE4XGxhbmcxMDMzXGxhbmdmZTE2 MzkzXGxhbmducDEwMzNcaW5zcnNpZDE0Njk1NTY0XGNoYXJyc2lkMTA3NjE0NzIgXHRyb3dkIFxp cm93MVxpcm93YmFuZDFcbHRycm93XHRzMTFcdHJnYXBoMTA4XHRycmgyNTNcdHJsZWZ0LTEwOFx0 cmJyZHJ0XGJyZHJzXGJyZHJ3MTBcYnJkcmNmMSBcdHJicmRybFxicmRyc1xicmRydzEwXGJyZHJj ZjEgXHRyYnJkcmJcYnJkcnNcYnJkcncxMFxicmRyY2YxIFx0cmJyZHJyDQpcYnJkcnNcYnJkcncx MFxicmRyY2YxIFx0cmZ0c1dpZHRoMVx0cnBhZGRsMTA4XHRycGFkZHIxMDhcdHJwYWRkZmwzXHRy cGFkZGZyM1x0YmxpbmQwXHRibGluZHR5cGUzIFxjbHZlcnRhbHRcY2xicmRydFxicmRyc1xicmRy dzEwXGJyZHJjZjEgXGNsYnJkcmxcYnJkcnNcYnJkcncxMFxicmRyY2YxIFxjbGJyZHJiXGJyZHJz XGJyZHJ3MTBcYnJkcmNmMSBcY2xicmRyclxicmRyc1xicmRydzEwXGJyZHJjZjEgDQpcY2x0eGxy dGJcY2xmdHNXaWR0aDNcY2x3V2lkdGgxMTUyNlxjbHNoZHJhd25pbCBcY2VsbHgxMTQxOFxyb3cg XGx0cnJvd31ccGFyZCBcbHRycGFyXHFsIFxsaTBccmkwXG5vd2lkY3RscGFyXGludGJsXHdyYXBk ZWZhdWx0XGZhYXV0b1xyaW4wXGxpbjAge1xydGxjaFxmY3MxIFxhZjMxNTA2XGFmczE4IFxsdHJj aFxmY3MwIA0KXGZzMThcbGFuZzEwMzNcbGFuZ2ZlMTYzOTNcbGFuZ25wMTAzM1xpbnNyc2lkMTQ2 OTU1NjRcY2hhcnJzaWQxMDc2MTQ3MiBcaGljaFxhZjMxNTA2XGRiY2hcYWYzMTUwNVxsb2NoXGYz MTUwNiAzLiBNb2JpbGUgTnVtYmVyOiBcY2VsbCB9XHBhcmQgXGx0cnBhclxxbCBcbGkwXHJpMFxz YTIwMFxzbDI3NlxzbG11bHQxXHdpZGN0bHBhclxpbnRibFx3cmFwZGVmYXVsdFxhc3BhbHBoYVxh c3BudW1cZmFhdXRvXGFkanVzdHJpZ2h0XHJpbjBcbGluMCB7DQpccnRsY2hcZmNzMSBcYWYzMTUw NlxhZnMxOCBcbHRyY2hcZmNzMCBcZnMxOFxsYW5nMTAzM1xsYW5nZmUxNjM5M1xsYW5nbnAxMDMz XGluc3JzaWQxNDY5NTU2NFxjaGFycnNpZDEwNzYxNDcyIFx0cm93ZCBcaXJvdzJcaXJvd2JhbmQy XGx0cnJvd1x0czExXHRyZ2FwaDEwOFx0cnJoMjUzXHRybGVmdC0xMDhcdHJicmRydFxicmRyc1xi cmRydzEwXGJyZHJjZjEgXHRyYnJkcmxcYnJkcnNcYnJkcncxMFxicmRyY2YxIFx0cmJyZHJiDQpc YnJkcnNcYnJkcncxMFxicmRyY2YxIFx0cmJyZHJyXGJyZHJzXGJyZHJ3MTBcYnJkcmNmMSBcdHJm dHNXaWR0aDFcdHJwYWRkbDEwOFx0cnBhZGRyMTA4XHRycGFkZGZsM1x0cnBhZGRmcjNcdGJsaW5k MFx0YmxpbmR0eXBlMyBcY2x2ZXJ0YWx0XGNsYnJkcnRcYnJkcnNcYnJkcncxMFxicmRyY2YxIFxj bGJyZHJsXGJyZHJzXGJyZHJ3MTBcYnJkcmNmMSBcY2xicmRyYlxicmRyc1xicmRydzEwXGJyZHJj ZjEgXGNsYnJkcnINClxicmRyc1xicmRydzEwXGJyZHJjZjEgXGNsdHhscnRiXGNsZnRzV2lkdGgz XGNsd1dpZHRoMTE1MjZcY2xzaGRyYXduaWwgXGNlbGx4MTE0MThccm93IFxsdHJyb3d9XHBhcmQg XGx0cnBhclxxbCBcbGkwXHJpMFxub3dpZGN0bHBhclxpbnRibFx3cmFwZGVmYXVsdFxmYWF1dG9c cmluMFxsaW4wIHtccnRsY2hcZmNzMSBcYWYzMTUwNlxhZnMxOCBcbHRyY2hcZmNzMCANClxmczE4 XGxhbmcxMDMzXGxhbmdmZTE2MzkzXGxhbmducDEwMzNcaW5zcnNpZDE0Njk1NTY0XGNoYXJyc2lk MTA3NjE0NzIgXGhpY2hcYWYzMTUwNlxkYmNoXGFmMzE1MDVcbG9jaFxmMzE1MDYgNC4gT2NjdXBh dGlvbjogIFxjZWxsIH1ccGFyZCBcbHRycGFyXHFsIFxsaTBccmkwXHNhMjAwXHNsMjc2XHNsbXVs dDFcd2lkY3RscGFyXGludGJsXHdyYXBkZWZhdWx0XGFzcGFscGhhXGFzcG51bVxmYWF1dG9cYWRq dXN0cmlnaHRccmluMFxsaW4wIHsNClxydGxjaFxmY3MxIFxhZjMxNTA2XGFmczE4IFxsdHJjaFxm Y3MwIFxmczE4XGxhbmcxMDMzXGxhbmdmZTE2MzkzXGxhbmducDEwMzNcaW5zcnNpZDE0Njk1NTY0 XGNoYXJyc2lkMTA3NjE0NzIgXHRyb3dkIFxpcm93M1xpcm93YmFuZDNcbHRycm93XHRzMTFcdHJn YXBoMTA4XHRycmgyNTNcdHJsZWZ0LTEwOFx0cmJyZHJ0XGJyZHJzXGJyZHJ3MTBcYnJkcmNmMSBc dHJicmRybFxicmRyc1xicmRydzEwXGJyZHJjZjEgXHRyYnJkcmINClxicmRyc1xicmRydzEwXGJy ZHJjZjEgXHRyYnJkcnJcYnJkcnNcYnJkcncxMFxicmRyY2YxIFx0cmZ0c1dpZHRoMVx0cnBhZGRs MTA4XHRycGFkZHIxMDhcdHJwYWRkZmwzXHRycGFkZGZyM1x0YmxpbmQwXHRibGluZHR5cGUzIFxj bHZlcnRhbHRcY2xicmRydFxicmRyc1xicmRydzEwXGJyZHJjZjEgXGNsYnJkcmxcYnJkcnNcYnJk cncxMFxicmRyY2YxIFxjbGJyZHJiXGJyZHJzXGJyZHJ3MTBcYnJkcmNmMSBcY2xicmRycg0KXGJy ZHJzXGJyZHJ3MTBcYnJkcmNmMSBcY2x0eGxydGJcY2xmdHNXaWR0aDNcY2x3V2lkdGgxMTUyNlxj bHNoZHJhd25pbCBcY2VsbHgxMTQxOFxyb3cgXGx0cnJvd31ccGFyZCBcbHRycGFyXHFsIFxsaTBc cmkwXG5vd2lkY3RscGFyXGludGJsXHdyYXBkZWZhdWx0XGZhYXV0b1xyaW4wXGxpbjAge1xydGxj aFxmY3MxIFxhZjMxNTA2XGFmczE4IFxsdHJjaFxmY3MwIA0KXGZzMThcbGFuZzEwMzNcbGFuZ2Zl MTYzOTNcbGFuZ25wMTAzM1xpbnNyc2lkMTQ2OTU1NjRcY2hhcnJzaWQxMDc2MTQ3MiBcaGljaFxh ZjMxNTA2XGRiY2hcYWYzMTUwNVxsb2NoXGYzMTUwNiA1LiBTZXg6IF9fQWdlOiBcY2VsbCB9XHBh cmQgXGx0cnBhclxxbCBcbGkwXHJpMFxzYTIwMFxzbDI3NlxzbG11bHQxXHdpZGN0bHBhclxpbnRi bFx3cmFwZGVmYXVsdFxhc3BhbHBoYVxhc3BudW1cZmFhdXRvXGFkanVzdHJpZ2h0XHJpbjBcbGlu MCB7DQpccnRsY2hcZmNzMSBcYWYzMTUwNlxhZnMxOCBcbHRyY2hcZmNzMCBcZnMxOFxsYW5nMTAz M1xsYW5nZmUxNjM5M1xsYW5nbnAxMDMzXGluc3JzaWQxNDY5NTU2NFxjaGFycnNpZDEwNzYxNDcy IFx0cm93ZCBcaXJvdzRcaXJvd2JhbmQ0XGx0cnJvd1x0czExXHRyZ2FwaDEwOFx0cnJoMjUzXHRy bGVmdC0xMDhcdHJicmRydFxicmRyc1xicmRydzEwXGJyZHJjZjEgXHRyYnJkcmxcYnJkcnNcYnJk cncxMFxicmRyY2YxIFx0cmJyZHJiDQpcYnJkcnNcYnJkcncxMFxicmRyY2YxIFx0cmJyZHJyXGJy ZHJzXGJyZHJ3MTBcYnJkcmNmMSBcdHJmdHNXaWR0aDFcdHJwYWRkbDEwOFx0cnBhZGRyMTA4XHRy cGFkZGZsM1x0cnBhZGRmcjNcdGJsaW5kMFx0YmxpbmR0eXBlMyBcY2x2ZXJ0YWx0XGNsYnJkcnRc YnJkcnNcYnJkcncxMFxicmRyY2YxIFxjbGJyZHJsXGJyZHJzXGJyZHJ3MTBcYnJkcmNmMSBcY2xi cmRyYlxicmRyc1xicmRydzEwXGJyZHJjZjEgXGNsYnJkcnINClxicmRyc1xicmRydzEwXGJyZHJj ZjEgXGNsdHhscnRiXGNsZnRzV2lkdGgzXGNsd1dpZHRoMTE1MjZcY2xzaGRyYXduaWwgXGNlbGx4 MTE0MThccm93IFxsdHJyb3d9XHBhcmQgXGx0cnBhclxxbCBcbGkwXHJpMFxub3dpZGN0bHBhclxp bnRibFx3cmFwZGVmYXVsdFxmYWF1dG9ccmluMFxsaW4wIHtccnRsY2hcZmNzMSBcYWYzMTUwNlxh ZnMxOCBcbHRyY2hcZmNzMCANClxmczE4XGxhbmcxMDMzXGxhbmdmZTE2MzkzXGxhbmducDEwMzNc aW5zcnNpZDE0Njk1NTY0XGNoYXJyc2lkMTA3NjE0NzIgXGhpY2hcYWYzMTUwNlxkYmNoXGFmMzE1 MDVcbG9jaFxmMzE1MDYgNi4gTmF0aW9uYWxpdHk6IH17XHJ0bGNoXGZjczEgXGFiXGFmMzE1MDZc YWZzMTggXGx0cmNoXGZjczAgXGJcZnMxOFxsYW5nMTAzM1xsYW5nZmUxNjM5M1xsYW5nbnAxMDMz XGluc3JzaWQxNDY5NTU2NFxjaGFycnNpZDEwNzYxNDcyIFxjZWxsIA0KfVxwYXJkIFxsdHJwYXJc cWwgXGxpMFxyaTBcc2EyMDBcc2wyNzZcc2xtdWx0MVx3aWRjdGxwYXJcaW50Ymxcd3JhcGRlZmF1 bHRcYXNwYWxwaGFcYXNwbnVtXGZhYXV0b1xhZGp1c3RyaWdodFxyaW4wXGxpbjAge1xydGxjaFxm Y3MxIFxhYlxhZjMxNTA2XGFmczE4IFxsdHJjaFxmY3MwIFxiXGZzMThcbGFuZzEwMzNcbGFuZ2Zl MTYzOTNcbGFuZ25wMTAzM1xpbnNyc2lkMTQ2OTU1NjRcY2hhcnJzaWQxMDc2MTQ3MiANClx0cm93 ZCBcaXJvdzVcaXJvd2JhbmQ1XGx0cnJvd1x0czExXHRyZ2FwaDEwOFx0cnJoMjUzXHRybGVmdC0x MDhcdHJicmRydFxicmRyc1xicmRydzEwXGJyZHJjZjEgXHRyYnJkcmxcYnJkcnNcYnJkcncxMFxi cmRyY2YxIFx0cmJyZHJiXGJyZHJzXGJyZHJ3MTBcYnJkcmNmMSBcdHJicmRyclxicmRyc1xicmRy dzEwXGJyZHJjZjEgDQpcdHJmdHNXaWR0aDFcdHJwYWRkbDEwOFx0cnBhZGRyMTA4XHRycGFkZGZs M1x0cnBhZGRmcjNcdGJsaW5kMFx0YmxpbmR0eXBlMyBcY2x2ZXJ0YWx0XGNsYnJkcnRcYnJkcnNc YnJkcncxMFxicmRyY2YxIFxjbGJyZHJsXGJyZHJzXGJyZHJ3MTBcYnJkcmNmMSBcY2xicmRyYlxi cmRyc1xicmRydzEwXGJyZHJjZjEgXGNsYnJkcnJcYnJkcnNcYnJkcncxMFxicmRyY2YxIA0KXGNs dHhscnRiXGNsZnRzV2lkdGgzXGNsd1dpZHRoMTE1MjZcY2xzaGRyYXduaWwgXGNlbGx4MTE0MThc cm93IFxsdHJyb3d9XHBhcmQgXGx0cnBhclxxbCBcbGkwXHJpMFxub3dpZGN0bHBhclxpbnRibFx3 cmFwZGVmYXVsdFxmYWF1dG9ccmluMFxsaW4wIHtccnRsY2hcZmNzMSBcYWYzMTUwNlxhZnMxOCBc bHRyY2hcZmNzMCANClxmczE4XGxhbmcxMDMzXGxhbmdmZTE2MzkzXGxhbmducDEwMzNcaW5zcnNp ZDE0Njk1NTY0XGNoYXJyc2lkMTA3NjE0NzIgXGhpY2hcYWYzMTUwNlxkYmNoXGFmMzE1MDVcbG9j aFxmMzE1MDYgNy4gQ291bnRyeTogIFxjZWxsIH1ccGFyZCBcbHRycGFyXHFsIFxsaTBccmkwXHNh MjAwXHNsMjc2XHNsbXVsdDFcd2lkY3RscGFyXGludGJsXHdyYXBkZWZhdWx0XGFzcGFscGhhXGFz cG51bVxmYWF1dG9cYWRqdXN0cmlnaHRccmluMFxsaW4wIHsNClxydGxjaFxmY3MxIFxhZjMxNTA2 XGFmczE4IFxsdHJjaFxmY3MwIFxmczE4XGxhbmcxMDMzXGxhbmdmZTE2MzkzXGxhbmducDEwMzNc aW5zcnNpZDE0Njk1NTY0XGNoYXJyc2lkMTA3NjE0NzIgXHRyb3dkIFxpcm93Nlxpcm93YmFuZDZc bHRycm93XHRzMTFcdHJnYXBoMTA4XHRycmgyNTNcdHJsZWZ0LTEwOFx0cmJyZHJ0XGJyZHJzXGJy ZHJ3MTBcYnJkcmNmMSBcdHJicmRybFxicmRyc1xicmRydzEwXGJyZHJjZjEgXHRyYnJkcmINClxi cmRyc1xicmRydzEwXGJyZHJjZjEgXHRyYnJkcnJcYnJkcnNcYnJkcncxMFxicmRyY2YxIFx0cmZ0 c1dpZHRoMVx0cnBhZGRsMTA4XHRycGFkZHIxMDhcdHJwYWRkZmwzXHRycGFkZGZyM1x0YmxpbmQw XHRibGluZHR5cGUzIFxjbHZlcnRhbHRcY2xicmRydFxicmRyc1xicmRydzEwXGJyZHJjZjEgXGNs YnJkcmxcYnJkcnNcYnJkcncxMFxicmRyY2YxIFxjbGJyZHJiXGJyZHJzXGJyZHJ3MTBcYnJkcmNm MSBcY2xicmRycg0KXGJyZHJzXGJyZHJ3MTBcYnJkcmNmMSBcY2x0eGxydGJcY2xmdHNXaWR0aDNc Y2x3V2lkdGgxMTUyNlxjbHNoZHJhd25pbCBcY2VsbHgxMTQxOFxyb3cgXGx0cnJvd31ccGFyZCBc bHRycGFyXHFsIFxsaTBccmkwXG5vd2lkY3RscGFyXGludGJsXHdyYXBkZWZhdWx0XGZhYXV0b1xy aW4wXGxpbjAge1xydGxjaFxmY3MxIFxhZjMxNTA2XGFmczE4IFxsdHJjaFxmY3MwIA0KXGZzMThc bGFuZzEwMzNcbGFuZ2ZlMTYzOTNcbGFuZ25wMTAzM1xpbnNyc2lkMTQ2OTU1NjRcY2hhcnJzaWQx MDc2MTQ3MiBcaGljaFxhZjMxNTA2XGRiY2hcYWYzMTUwNVxsb2NoXGYzMTUwNiA4LiBNYXJpdGFs IFN0YXR1czogfXtccnRsY2hcZmNzMSBcYWJcYWYzMTUwNlxhZnMxOCBcbHRyY2hcZmNzMCBcYlxm czE4XGxhbmcxMDMzXGxhbmdmZTE2MzkzXGxhbmducDEwMzNcaW5zcnNpZDE0Njk1NTY0XGNoYXJy c2lkMTA3NjE0NzIgXGNlbGwgDQp9XHBhcmQgXGx0cnBhclxxbCBcbGkwXHJpMFxzYTIwMFxzbDI3 NlxzbG11bHQxXHdpZGN0bHBhclxpbnRibFx3cmFwZGVmYXVsdFxhc3BhbHBoYVxhc3BudW1cZmFh dXRvXGFkanVzdHJpZ2h0XHJpbjBcbGluMCB7XHJ0bGNoXGZjczEgXGFiXGFmMzE1MDZcYWZzMTgg XGx0cmNoXGZjczAgXGJcZnMxOFxsYW5nMTAzM1xsYW5nZmUxNjM5M1xsYW5nbnAxMDMzXGluc3Jz aWQxNDY5NTU2NFxjaGFycnNpZDEwNzYxNDcyIA0KXHRyb3dkIFxpcm93N1xpcm93YmFuZDdcbHRy cm93XHRzMTFcdHJnYXBoMTA4XHRycmgyNTNcdHJsZWZ0LTEwOFx0cmJyZHJ0XGJyZHJzXGJyZHJ3 MTBcYnJkcmNmMSBcdHJicmRybFxicmRyc1xicmRydzEwXGJyZHJjZjEgXHRyYnJkcmJcYnJkcnNc YnJkcncxMFxicmRyY2YxIFx0cmJyZHJyXGJyZHJzXGJyZHJ3MTBcYnJkcmNmMSANClx0cmZ0c1dp ZHRoMVx0cnBhZGRsMTA4XHRycGFkZHIxMDhcdHJwYWRkZmwzXHRycGFkZGZyM1x0YmxpbmQwXHRi bGluZHR5cGUzIFxjbHZlcnRhbHRcY2xicmRydFxicmRyc1xicmRydzEwXGJyZHJjZjEgXGNsYnJk cmxcYnJkcnNcYnJkcncxMFxicmRyY2YxIFxjbGJyZHJiXGJyZHJzXGJyZHJ3MTBcYnJkcmNmMSBc Y2xicmRyclxicmRyc1xicmRydzEwXGJyZHJjZjEgDQpcY2x0eGxydGJcY2xmdHNXaWR0aDNcY2x3 V2lkdGgxMTUyNlxjbHNoZHJhd25pbCBcY2VsbHgxMTQxOFxyb3cgXGx0cnJvd31ccGFyZCBcbHRy cGFyXHFsIFxsaTBccmkwXG5vd2lkY3RscGFyXGludGJsXHdyYXBkZWZhdWx0XGZhYXV0b1xyaW4w XGxpbjAge1xydGxjaFxmY3MxIFxhZjMxNTA2XGFmczE4IFxsdHJjaFxmY3MwIA0KXGZzMThcbGFu ZzEwMzNcbGFuZ2ZlMTYzOTNcbGFuZ25wMTAzM1xpbnNyc2lkMTQ2OTU1NjRcY2hhcnJzaWQxMDc2 MTQ3MiBcaGljaFxhZjMxNTA2XGRiY2hcYWYzMTUwNVxsb2NoXGYzMTUwNiA5LiBFLW1haWwgaWQ6 IH17XHJ0bGNoXGZjczEgXGFmMzE1MDZcYWZzMTggXGx0cmNoXGZjczAgXGJcZnMxOFxpbnNyc2lk MTU4MDc2NDdcY2hhcnJzaWQxNTgwNzY0NyBcaGljaFxhZjMxNTA2XGRiY2hcYWYzMTUwNVxsb2No XGYzMTUwNiAoJWVtYWlsJSl9DQp7XHJ0bGNoXGZjczEgXGFmMzE1MDZcYWZzMTggXGx0cmNoXGZj czAgXGZzMThcbGFuZzEwMzNcbGFuZ2ZlMTYzOTNcbGFuZ25wMTAzM1xpbnNyc2lkMTQ2OTU1NjRc Y2hhcnJzaWQxMDc2MTQ3MiBcY2VsbCB9XHBhcmQgXGx0cnBhclxxbCBcbGkwXHJpMFxzYTIwMFxz bDI3NlxzbG11bHQxXHdpZGN0bHBhclxpbnRibFx3cmFwZGVmYXVsdFxhc3BhbHBoYVxhc3BudW1c ZmFhdXRvXGFkanVzdHJpZ2h0XHJpbjBcbGluMCB7XHJ0bGNoXGZjczEgDQpcYWYzMTUwNlxhZnMx OCBcbHRyY2hcZmNzMCBcZnMxOFxsYW5nMTAzM1xsYW5nZmUxNjM5M1xsYW5nbnAxMDMzXGluc3Jz aWQxNDY5NTU2NFxjaGFycnNpZDEwNzYxNDcyIFx0cm93ZCBcaXJvdzhcaXJvd2JhbmQ4XGx0cnJv d1x0czExXHRyZ2FwaDEwOFx0cnJoMjUzXHRybGVmdC0xMDhcdHJicmRydFxicmRyc1xicmRydzEw XGJyZHJjZjEgXHRyYnJkcmxcYnJkcnNcYnJkcncxMFxicmRyY2YxIFx0cmJyZHJiXGJyZHJzXGJy ZHJ3MTBcYnJkcmNmMSANClx0cmJyZHJyXGJyZHJzXGJyZHJ3MTBcYnJkcmNmMSBcdHJmdHNXaWR0 aDFcdHJwYWRkbDEwOFx0cnBhZGRyMTA4XHRycGFkZGZsM1x0cnBhZGRmcjNcdGJsaW5kMFx0Ymxp bmR0eXBlMyBcY2x2ZXJ0YWx0XGNsYnJkcnRcYnJkcnNcYnJkcncxMFxicmRyY2YxIFxjbGJyZHJs XGJyZHJzXGJyZHJ3MTBcYnJkcmNmMSBcY2xicmRyYlxicmRyc1xicmRydzEwXGJyZHJjZjEgXGNs YnJkcnJcYnJkcnNcYnJkcncxMFxicmRyY2YxIA0KXGNsdHhscnRiXGNsZnRzV2lkdGgzXGNsd1dp ZHRoMTE1MjZcY2xzaGRyYXduaWwgXGNlbGx4MTE0MThccm93IFxsdHJyb3d9XHRyb3dkIFxpcm93 OVxpcm93YmFuZDlcbGFzdHJvdyBcbHRycm93XHRzMTFcdHJnYXBoMTA4XHRycmg3M1x0cmxlZnQt MTA4XHRyYnJkcnRcYnJkcnNcYnJkcncxMFxicmRyY2YxIFx0cmJyZHJsXGJyZHJzXGJyZHJ3MTBc YnJkcmNmMSBcdHJicmRyYlxicmRyc1xicmRydzEwXGJyZHJjZjEgXHRyYnJkcnINClxicmRyc1xi cmRydzEwXGJyZHJjZjEgXHRyZnRzV2lkdGgxXHRycGFkZGwxMDhcdHJwYWRkcjEwOFx0cnBhZGRm bDNcdHJwYWRkZnIzXHRibGluZDBcdGJsaW5kdHlwZTMgXGNsdmVydGFsdFxjbGJyZHJ0XGJyZHJz XGJyZHJ3MTBcYnJkcmNmMSBcY2xicmRybFxicmRyc1xicmRydzEwXGJyZHJjZjEgXGNsYnJkcmJc YnJkcnNcYnJkcncxMFxicmRyY2YxIFxjbGJyZHJyXGJyZHJzXGJyZHJ3MTBcYnJkcmNmMSANClxj bHR4bHJ0YlxjbGZ0c1dpZHRoM1xjbHdXaWR0aDExNTI2XGNsc2hkcmF3bmlsIFxjZWxseDExNDE4 XHBhcmQgXGx0cnBhclxxbCBcbGkwXHJpMFxub3dpZGN0bHBhclxpbnRibFx3cmFwZGVmYXVsdFxm YWF1dG9ccmluMFxsaW4wXHBhcmFyc2lkODU5NDc1NiB7XHJ0bGNoXGZjczEgXGFmMzE1MDZcYWZz MTggXGx0cmNoXGZjczAgDQpcZnMxOFxsYW5nMTAzM1xsYW5nZmUxNjM5M1xsYW5nbnAxMDMzXGlu c3JzaWQxNDY5NTU2NFxjaGFycnNpZDEwNzYxNDcyIFxoaWNoXGFmMzE1MDZcZGJjaFxhZjMxNTA1 XGxvY2hcZjMxNTA2IDEwLiBCYW5rIERldGFpbHM6fXtccnRsY2hcZmNzMSBcYWYzMTUwNlxhZnMx OCBcbHRyY2hcZmNzMCBcZnMxOFxsYW5nMTAzM1xsYW5nZmUxNjM5M1xsYW5nbnAxMDMzXGluc3Jz aWQxNDAyNTUxMlxjaGFycnNpZDEwNzYxNDcyIA0KXGhpY2hcYWYzMTUwNlxkYmNoXGFmMzE1MDVc bG9jaFxmMzE1MDYgIEJhbmsgTmFtZTogQWNjb3VudCBOdW1iZXI6IFR9e1xydGxjaFxmY3MxIFxh ZjMxNTA2XGFmczE4IFxsdHJjaFxmY3MwIFxmczE4XGxhbmcxMDMzXGxhbmdmZTE2MzkzXGxhbmdu cDEwMzNcaW5zcnNpZDg1OTQ3NTZcY2hhcnJzaWQxMDc2MTQ3MiBcaGljaFxhZjMxNTA2XGRiY2hc YWYzMTUwNVxsb2NoXGYzMTUwNiB5cGUgT2YgQWNjb3VudCB9e1xydGxjaFxmY3MxIA0KXGFmMzE1 MDZcYWZzMTggXGx0cmNoXGZjczAgXGZzMThcbGFuZzEwMzNcbGFuZ2ZlMTYzOTNcbGFuZ25wMTAz M1xpbnNyc2lkMTQwMjU1MTJcY2hhcnJzaWQxMDc2MTQ3MiBcaGljaFxhZjMxNTA2XGRiY2hcYWYz MTUwNVxsb2NoXGYzMTUwNiA6IElmcyBDb2RlOn17XHJ0bGNoXGZjczEgXGFmMzE1MDZcYWZzMTgg XGx0cmNoXGZjczAgDQpcZnMxOFxsYW5nMTAzM1xsYW5nZmUxNjM5M1xsYW5nbnAxMDMzXGluc3Jz aWQxNDY5NTU2NFxjaGFycnNpZDEwNzYxNDcyIFxjZWxsIH1ccGFyZCBcbHRycGFyXHFsIFxsaTBc cmkwXHNhMjAwXHNsMjc2XHNsbXVsdDFcd2lkY3RscGFyXGludGJsXHdyYXBkZWZhdWx0XGFzcGFs cGhhXGFzcG51bVxmYWF1dG9cYWRqdXN0cmlnaHRccmluMFxsaW4wIHtccnRsY2hcZmNzMSBcYWYz MTUwNlxhZnMxOCBcbHRyY2hcZmNzMCANClxmczE4XGxhbmcxMDMzXGxhbmdmZTE2MzkzXGxhbmdu cDEwMzNcaW5zcnNpZDE0Njk1NTY0XGNoYXJyc2lkMTA3NjE0NzIgXHRyb3dkIFxpcm93OVxpcm93 YmFuZDlcbGFzdHJvdyBcbHRycm93XHRzMTFcdHJnYXBoMTA4XHRycmg3M1x0cmxlZnQtMTA4XHRy YnJkcnRcYnJkcnNcYnJkcncxMFxicmRyY2YxIFx0cmJyZHJsXGJyZHJzXGJyZHJ3MTBcYnJkcmNm MSBcdHJicmRyYlxicmRyc1xicmRydzEwXGJyZHJjZjEgXHRyYnJkcnINClxicmRyc1xicmRydzEw XGJyZHJjZjEgXHRyZnRzV2lkdGgxXHRycGFkZGwxMDhcdHJwYWRkcjEwOFx0cnBhZGRmbDNcdHJw YWRkZnIzXHRibGluZDBcdGJsaW5kdHlwZTMgXGNsdmVydGFsdFxjbGJyZHJ0XGJyZHJzXGJyZHJ3 MTBcYnJkcmNmMSBcY2xicmRybFxicmRyc1xicmRydzEwXGJyZHJjZjEgXGNsYnJkcmJcYnJkcnNc YnJkcncxMFxicmRyY2YxIFxjbGJyZHJyXGJyZHJzXGJyZHJ3MTBcYnJkcmNmMSANClxjbHR4bHJ0 YlxjbGZ0c1dpZHRoM1xjbHdXaWR0aDExNTI2XGNsc2hkcmF3bmlsIFxjZWxseDExNDE4XHJvdyB9 XHBhcmQgXGx0cnBhclxxYyBcbGkwXHJpMFxub3dpZGN0bHBhclx3cmFwZGVmYXVsdFxmYWF1dG9c cmluMFxsaW4wXGl0YXAwXHBhcmFyc2lkMTYyMDY1MTkge1xydGxjaFxmY3MxIFxhYlxhZjMxNTA2 XGFmczE4IFxsdHJjaFxmY3MwIA0KXGJcZnMxOFx1bFxjZjJcbGFuZzEwMzNcbGFuZ2ZlMTYzOTNc bGFuZ25wMTAzM1xpbnNyc2lkMTQ2OTU1NjRcY2hhcnJzaWQxMDc2MTQ3MiBcaGljaFxhZjMxNTA2 XGRiY2hcYWYzMTUwNVxsb2NoXGYzMTUwNiBGb3IgTW9yZSBEZXRhaWxzIENvbnRhY3QgT3VyOn17 XHJ0bGNoXGZjczEgXGFiXGFmMzE1MDZcYWZzMTggXGx0cmNoXGZjczAgDQpcYlxmczE4XHVsXGNm MVxsYW5nMTAzM1xsYW5nZmUxNjM5M1xsYW5nbnAxMDMzXGluc3JzaWQxNDY5NTU2NFxjaGFycnNp ZDEwNzYxNDcyIA0KXHBhciB9e1xydGxjaFxmY3MxIFxhYlxhZjMxNTA2XGFmczE4IFxsdHJjaFxm Y3MwIFxiXGZzMThcY2YxXGxhbmcxMDMzXGxhbmdmZTE2MzkzXGxhbmducDEwMzNcaW5zcnNpZDE0 Njk1NTY0XGNoYXJyc2lkMTA3NjE0NzIgXGhpY2hcYWYzMTUwNlxkYmNoXGFmMzE1MDVcbG9jaFxm MzE1MDYgRm9yZWlnbiBDb21wZW5zYXRpb24gVW5pdH17XHJ0bGNoXGZjczEgXGFmMzE1MDZcYWZz MTggXGx0cmNoXGZjczAgDQpcZnMxOFxjZjIyXGNoc2hkbmcwXGNoY2ZwYXQwXGNoY2JwYXQ4XGlu c3JzaWQxNjAzNjI1XGNoYXJyc2lkMTA3NjE0NzIgDQpccGFyIH17XHJ0bGNoXGZjczEgXGFiXGFm MzE1MDZcYWZzMTggXGx0cmNoXGZjczAgXGJcZnMxOFxjZjFcbGFuZzEwMzNcbGFuZ2ZlMTYzOTNc bGFuZ25wMTAzM1xpbnNyc2lkMTI0NzY5OTFcY2hhcnJzaWQxMDc2MTQ3MiBcaGljaFxhZjMxNTA2 XGRiY2hcYWYzMTUwNVxsb2NoXGYzMTUwNiBSZXNlcnZlIEJhbmsgb317XHJ0bGNoXGZjczEgXGFi XGFmMzE1MDZcYWZzMTggXGx0cmNoXGZjczAgDQpcYlxmczE4XGNmMVxsYW5nMTAzM1xsYW5nZmUx NjM5M1xsYW5nbnAxMDMzXGluc3JzaWQxNDY5NTU2NFxjaGFycnNpZDEwNzYxNDcyIFxoaWNoXGFm MzE1MDZcZGJjaFxhZjMxNTA1XGxvY2hcZjMxNTA2IGYgSW5kaWENClxwYXIgfVxwYXJkIFxsdHJw YXJccWwgXGxpMFxyaTBcbm93aWRjdGxwYXJcd3JhcGRlZmF1bHRcZmFhdXRvXHJpbjBcbGluMFxp dGFwMFxwYXJhcnNpZDEzNzkyNTMzIHtccnRsY2hcZmNzMSBcYWJcYWYzMTUwNlxhZnMxOCBcbHRy Y2hcZmNzMCBcYlxmczE4XGNmMVxsYW5nMTAzM1xsYW5nZmUxNjM5M1xsYW5nbnAxMDMzXGluc3Jz aWQxMzc5MjUzMyBcaGljaFxhZjMxNTA2XGRiY2hcYWYzMTUwNVxsb2NoXGYzMTUwNiAgICAgICAg ICAgICAgICAgIH17DQpccnRsY2hcZmNzMSBcYWJcYWYzMTUwNlxhZnMxOCBcbHRyY2hcZmNzMCBc YlxmczE4XGNmMVxsYW5nMTAzM1xsYW5nZmUxNjM5M1xsYW5nbnAxMDMzXGluc3JzaWQ2MjMwMTA1 IFxoaWNoXGFmMzE1MDZcZGJjaFxhZjMxNTA1XGxvY2hcZjMxNTA2ICAgICAgICAgICAgICAgICAg ICAgIH17XHJ0bGNoXGZjczEgXGFiXGFmMzE1MDZcYWZzMTggXGx0cmNoXGZjczAgDQpcYlxmczE4 XGNmMVxsYW5nMTAzM1xsYW5nZmUxNjM5M1xsYW5nbnAxMDMzXGluc3JzaWQxNDY5NTU2NFxjaGFy cnNpZDEwNzYxNDcyIFxoaWNoXGFmMzE1MDZcZGJjaFxhZjMxNTA1XGxvY2hcZjMxNTA2IEVtYWls OiB9e1xydGxjaFxmY3MxIFxhZjMxNTA2XGFmczE4IFxsdHJjaFxmY3MwIFxiXGZzMThcY2YyM1xj aHNoZG5nMFxjaGNmcGF0MFxjaGNicGF0OFxpbnNyc2lkMTQ5NTEyMzZcY2hhcnJzaWQxNDk1MTIz NiANClxoaWNoXGFmMzE1MDZcZGJjaFxhZjMxNTA1XGxvY2hcZjMxNTA2IHJiaW9ubGluZWJhbkBo b3RtYWlsLmNvbX17XHJ0bGNoXGZjczEgXGFiXGFmMzE1MDZcYWZzMTggXGx0cmNoXGZjczAgXGJc ZnMxOFx1bFxjZjIzXGxhbmcxMDMzXGxhbmdmZTE2MzkzXGxhbmducDEwMzNcaW5zcnNpZDEzNzky NTMzXGNoYXJyc2lkMTIzODkyMzMgDQpccGFyIH1ccGFyZCBcbHRycGFyXHFjIFxsaTBccmkwXG5v d2lkY3RscGFyXHdyYXBkZWZhdWx0XGZhYXV0b1xyaW4wXGxpbjBcaXRhcDBccGFyYXJzaWQxNjIw NjUxOSB7XHJ0bGNoXGZjczEgXGFmMzE1MDZcYWZzMTggXGx0cmNoXGZjczAgXGZzMThcY2YxOVxs YW5nMTAzM1xsYW5nZmUxNjM5M1xsYW5nbnAxMDMzXGluc3JzaWQzNjc4NzA5XGNoYXJyc2lkMTA3 NjE0NzIgXGhpY2hcYWYzMTUwNlxkYmNoXGFmMzE1MDVcbG9jaFxmMzE1MDYgDQpNci4gVG9tIERv bmFsZCB9e1xydGxjaFxmY3MxIFxhZjMxNTA2XGFmczE4IFxsdHJjaFxmY3MwIFxmczE4XGNmMTlc bGFuZzEwMzNcbGFuZ2ZlMTYzOTNcbGFuZ25wMTAzM1xpbnNyc2lkMTQ2OTU1NjRcY2hhcnJzaWQx MDc2MTQ3MiBcaGljaFxhZjMxNTA2XGRiY2hcYWYzMTUwNVxsb2NoXGYzMTUwNiANCmlzIHRoZSBh c3NpZ24gRm9yZWlnbiBBZ2VudCAoZm9yZWlnbmVyKSB0byBtb25pdG9yIHlvdXIgdHJhbnNmZXIg dXBvbiB0aGUgY3JlZGl0aW5nIG9mIHlvdXIgYWNjb3VudC4gRXZlcnkgZG9jdW1lbnQgaW5jbHVk aW5nIGNlcnRpZmljYXRlIG9mIGZ1bmQsIGJyb2NodXJlIG9mIGNvbXBhbnkgd2lsbCBiZSBjb3Vy aWVyIHRvIHlvXGhpY2hcYWYzMTUwNlxkYmNoXGFmMzE1MDVcbG9jaFxmMzE1MDYgDQp1ciBob21l IGFkZHJlc3MgaW1tZWRpYXRlbHkgYWZ0ZXIgeW91ciB0cmFuc2Zlci4gVGhpcyBCYW5rIG1hbmFn ZW1lbnQgd2lsbCBwcm9jZWVkIGZ1cnRoZXIgYWZ0ZXIgeW91ciBzd2lmdCByZXNwb25zZSB0byB0 aGlzIG1haWwgZm9yIHNlY3VyaXR5IHByb3Bvc2VzIGZvciB0aGUgYmVzdCBvfXtccnRsY2hcZmNz MSBcYWYzMTUwNlxhZnMxOCBcbHRyY2hcZmNzMCANClxmczE4XGNmMTlcbGFuZzEwMzNcbGFuZ2Zl MTYzOTNcbGFuZ25wMTAzM1xpbnNyc2lkMTYyMDY1MTlcY2hhcnJzaWQxMDc2MTQ3MiBcaGljaFxh ZjMxNTA2XGRiY2hcYWYzMTUwNVxsb2NoXGYzMTUwNiBmIHlvdXIgaW50ZXJlc3Qgd2l0aG91dCBk ZWxheS59e1xydGxjaFxmY3MxIFxhZjMxNTA2XGFmczE4IFxsdHJjaFxmY3MwIFxmczE4XGNmMTlc bGFuZzEwMzNcbGFuZ2ZlMTYzOTNcbGFuZ25wMTAzM1xpbnNyc2lkMTQ2OTU1NjQgDQpccGFyIH17 XHJ0bGNoXGZjczEgXGFmMzE1MDZcYWZzMjggXGx0cmNoXGZjczAgXGJcZnMyOFxjZjZcbGFuZzEw MzNcbGFuZ2ZlMTYzOTNcbGFuZ25wMTAzM1xpbnNyc2lkMTE3NjI2NTRcY2hhcnJzaWQxMTc2MjY1 NCBcaGljaFxhZjMxNTA2XGRiY2hcYWYzMTUwNVxsb2NoXGYzMTUwNiBQTEVBU0UgQ09OVEFDVCBU SElTIH17XHJ0bGNoXGZjczEgXGFiXGFmMzE1MDZcYWZzMjggXGx0cmNoXGZjczAgDQpcYlxmczI4 XGNmNlxsYW5nMTAzM1xsYW5nZmUxNjM5M1xsYW5nbnAxMDMzXGluc3JzaWQxMTc2MjY1NFxjaGFy cnNpZDExNzYyNjU0IFxoaWNoXGFmMzE1MDZcZGJjaFxhZjMxNTA1XGxvY2hcZjMxNTA2IEVtYWls OiB9e1xydGxjaFxmY3MxIFxhZjMxNTA2XGFmczI4IFxsdHJjaFxmY3MwIFxiXGZzMjhcY2YyNFxj aHNoZG5nMFxjaGNmcGF0MFxjaGNicGF0OFxpbnNyc2lkMTQ5NTEyMzZcY2hhcnJzaWQxNDk1MTIz NiANClxoaWNoXGFmMzE1MDZcZGJjaFxhZjMxNTA1XGxvY2hcZjMxNTA2IHJiaW9ubGluZWJhbkBo b3RtYWlsLmNvbSB9e1xydGxjaFxmY3MxIFxhZjMxNTA2XGFmczI4IFxsdHJjaFxmY3MwIFxiXGZz MjhcY2Y2XGNoc2hkbmcwXGNoY2ZwYXQwXGNoY2JwYXQ4XGluc3JzaWQxMTc2MjY1NFxjaGFycnNp ZDExNzYyNjU0IFxoaWNoXGFmMzE1MDZcZGJjaFxhZjMxNTA1XGxvY2hcZjMxNTA2IFdJVEh9e1xy dGxjaFxmY3MxIFxhZjMxNTA2XGFmczI4IA0KXGx0cmNoXGZjczAgXGJcZnMyOFxjZjZcY2hzaGRu ZzBcY2hjZnBhdDBcY2hjYnBhdDhcaW5zcnNpZDUwNjUyOTQgXGhpY2hcYWYzMTUwNlxkYmNoXGFm MzE1MDVcbG9jaFxmMzE1MDYgIH17XHJ0bGNoXGZjczEgXGFmMzE1MDZcYWZzMjggXGx0cmNoXGZj czAgXGJcZnMyOFxjZjZcY2hzaGRuZzBcY2hjZnBhdDBcY2hjYnBhdDhcaW5zcnNpZDExNzYyNjU0 XGNoYXJyc2lkMTE3NjI2NTQgDQpcaGljaFxhZjMxNTA2XGRiY2hcYWYzMTUwNVxsb2NoXGYzMTUw NiBZT1VSIERFVEFJTFN9e1xydGxjaFxmY3MxIFxhZjMxNTA2XGFmczI4IFxsdHJjaFxmY3MwIFxi XGZzMjhcY2Y2XGxhbmcxMDMzXGxhbmdmZTE2MzkzXGxhbmducDEwMzNcaW5zcnNpZDExNzYyNjU0 XGNoYXJyc2lkMTE3NjI2NTQgDQpccGFyIH1ccGFyZCBcbHRycGFyXHFsIFxsaTBccmkwXHNhMjAw XHNsMjc2XHNsbXVsdDFcd2lkY3RscGFyXHdyYXBkZWZhdWx0XGFzcGFscGhhXGFzcG51bVxmYWF1 dG9cYWRqdXN0cmlnaHRccmluMFxsaW4wXGl0YXAwXHBhcmFyc2lkMjI0MjkxMiB7XHJ0bGNoXGZj czEgXGFmMzE1MDZcYWZzMTggXGx0cmNoXGZjczAgDQpcZnMxOFxjZjE5XGxhbmcxMDI0XGxhbmdm ZTEwMjRcY2hzaGRuZzBcY2hjZnBhdDBcY2hjYnBhdDhcbm9wcm9vZlxpbnNyc2lkOTk2NjQ0NVxj aGFycnNpZDEwNzYxNDcyIHtcKlxzaHBwaWN0e1xwaWN0e1wqXHBpY3Byb3Bcc2hwbGlkMTAyNntc c3B7XHNuIHNoYXBlVHlwZX17XHN2IDc1fX17XHNwe1xzbiBmRmxpcEh9e1xzdiAwfX0NCntcc3B7 XHNuIGZGbGlwVn17XHN2IDB9fXtcc3B7XHNuIHBpYkZsYWdzfXtcc3YgMn19e1xzcHtcc24gZkxp bmV9e1xzdiAwfX17XHNwe1xzbiBmTGF5b3V0SW5DZWxsfXtcc3YgMX19e1xzcHtcc24gZkxheW91 dEluQ2VsbH17XHN2IDF9fX1ccGljc2NhbGV4NTRccGljc2NhbGV5NzFccGljY3JvcGwwXHBpY2Ny b3ByMFxwaWNjcm9wdDBccGljY3JvcGIwDQpccGljdzUyOTJccGljaDMzMzRccGljd2dvYWwzMDAw XHBpY2hnb2FsMTg5MFxqcGVnYmxpcFxibGlwdGFnLTQ4ODgwODg5NHtcKlxibGlwdWlkIGUyZGQ1 ZTQyZjQ5MGI3NTc3MGEyYzZhNTFjNDBmMjJlfWZmZDhmZmUwMDAxMDRhNDY0OTQ2MDAwMTAxMDAw MDAxMDAwMTAwMDBmZmRiMDA4NDAwMDkwNjA3MDgwNzA2MDkwODA3MDgwYTBhMDkwYjBkMTYwZjBk MGMwYzBkMWIxNDE1MTAxNjIwMWQyMjIyMjAxZDFmMWYyNDI4MzQyYzI0DQoyNjMxMjcxZjFmMmQz ZDJkMzEzNTM3M2EzYTNhMjMyYjNmNDQzZjM4NDMzNDM5M2EzNzAxMGEwYTBhMGQwYzBkMWEwZjBm MWEzNzI1MWYyNTM3MzczNzM3MzczNzM3MzczNzM3MzczNzM3MzczNzM3MzczNzM3MzczNzM3Mzcz Nw0KMzczNzM3MzczNzM3MzczNzM3MzczNzM3MzczNzM3MzczNzM3MzczNzM3MzczNzM3MzczN2Zm YzAwMDExMDgwMDdlMDBjODAzMDEyMjAwMDIxMTAxMDMxMTAxZmZjNDAwMWMwMDAwMDEwNTAxMDEw MTAwMDAwMDAwMDAwMDAwMDANCjAwMDAwNTAxMDIwMzA0MDYwNzAwMDhmZmM0MDAzODEwMDAwMTAz MDIwNDA0MDQwMzA2MDUwNTAwMDAwMDAwMDAwMTAwMDIwMzA0MTEwNTEyMjEzMTA2MTM0MTUxMjIz MjYxNzEwNzE0ODEyMzQyNTI5MWExYzExNWIxZDFlMWYxDQozMzQzNjI3MmYwZmZjNDAwMTkwMTAw MDIwMzAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDIwMzAwMDEwNDA1ZmZjNDAwMjExMTAwMDMw MDAyMDIwMjAzMDEwMTAwMDAwMDAwMDAwMDAwMDAwMTAyMDMxMTIxMzEwNDEyMTM0MQ0KNTEzMjE0 ZmZkYTAwMGMwMzAxMDAwMjExMDMxMTAwM2YwMDM1OTlmZDhhNTBmN2Y3MjhhN2NhOGVjOTQ1MjBl YzE2NjE4MGRlNjNmYmFmMTk1ZTNhYTI3ZjI5ZTgxMzVkNGJlOGExMDE4MjY3ZGY3NGUzMmI4MWRk NWMzNGEyZmINCjI0NzUyODJlYjIyOWQ5NGM5NjhlYTlmNzA4YjQ3NTZmYjZjYTlkMjUxODA0MjI5 MWQxZThhZjY0MTFiNTZmNGYxNTZlNGYxNDdlODg3NjNmNWI0NzgwZTFlZmFkYWY3ZTU2MGQxYWQx ZTY3YmJhMzQwZWVhMTQ1ZDdkNzg2MzBiDQplNDcwNmIxYTJlNWM0ZDgwMGIxMzhmN2M0ZGE2YTM3 M2UzYzNmMjU0YmM2OTcxZTUxZjU1ODBlMjZlMmVhZmM2OWVmNmJlNGU0NTI1ZmMxNGVkM2I4ZjUz Zjc4YWNjYmRkMzRhNzJiMmY2ZmQ1MWE5ZmQwNGRiNTZmYzVhZTI0Yw0KYWYzNGYwZDE0N2Q4OThj OWZkZDUwOGJlMmQ3MTQ0NDQxOWE1YTM5NDc1NmJhOWZmMDA3MDU2M2U3OGJiZGIzNzcyMGFhZDIz NTgwMDAwM2FmN2Q3NWZkOTE2OTEwZWFmNDNmMTg2NTMxMzRkNmUxODBiYmVmMTgyNGZkOWRmZDUN CjZhZjA4ZTM5YzFiMWEwZDZkMmQ2MzE5MzExZmU4NGM3MmJjN2E3Zjg1ZjNkYjQxNmI3NmI3ZDU0 MTIxNzAzNzIzYWU4N2E4NTRlNTEwZmE0YjEwYTlkMzc1NWU4ZmM0ZjA0YWU2ZGMyM2M2MTIxYTI4 YTkzMTNjY2U2NDVlMWU3DQo5ZDVjM2I1ZDc0N2EwNzA3MDYzOThlMGU2Mzg1YzM4MWQwODQxNWMx MTIwZDViZWM0MjA1OGNlOGQ3MjM5OWFkMWEwMThjOWYwYjk1NWJkYTE5MWQ5OTU5MzcyYWJjOWFh YjMyMGQ0YTgxZTEyMGQ1ZjQ1NjczNDA1MGM4MGRiNA0KMmFjYjgyOGRjMTMyNzQyOTgzNjc2YmJm MTE1ZTU2NjY2ZTliMmYyNmE0ODRiNmNlYzg5NDU5MzMzN2FhZjY2ZjU0YjIxMjVkMjEyOTAzODI0 NzExZGQ0MjBkM2E5NGMzZTY0ZWI4NDhlZjMwNDcyMDMwOTUxNmUxMTc4YjY0MjYNCjhjNmExMTc4 ODFiMmEwODkzNDAyZTc2MGJlN2ZmODhkYzRlNzg4ZjFjNzMyOWRlZTE0MTQ5NzhlMTZmNDcxYmY4 OWRmNWRiZDg3YWFlYjdmMTFmMTI5MzBhZTBmYWVhODgyZmNjNzg2YzJkM2RiMzkwZGJmZTQ1NzFk ZTExZTE4DQozOGM1NTgyZjkwMzI5ZTNiNjcwMzczZThhNmQ0MmRiMmU2NWQ1NjkxOWEzMDk3M2Vk NzE3MDc1MzdkMDA0YWY3MTYzMGIyMjhlYzdmMTZmN2Y1NWQ2MjFlMDNhMThkZjlkYzRiOWM3NjAz Y2EzZTg5OTI3MGFkM2M2ZjIzMmI3Mg0KMTNhZTlhZmU2OTRmY2E1Zjg2ODVlMmZlYjM5MjQ1NDcz Y2M0ODZiMWVlMjU0ODcwOWE4ZDA3MmM4ZjcyYmFmYzc4NDUzNDBjY2FjOGQ5ZjQwYWI1NDUwNTM4 MzdjODJlNTJkZjk2YzYyZjE2N2Y0ZTU2ZGMxYWEyZTFhNTk3YmYNCmU4YmQ1MTg0NWIzMzQwMDQ4 MTc1ZDA2NjhhMzE3Njg2ZDhmYjIxZDU1MDQ0YzczZWMwNjVjYTQ1ZDU0ZjkyZGIwOWY4YjI5MWNm YTI3ZjI0MDYzN2JhZTk5ZjBjYjEzMzU3ODdjYjQ4ZjI0YmU5NWMwMzZmZjg0ZWEzZjJkNTczDQox YWYxOTY3NzkxYjBkMTZiZmUxNTRhZjZlM2QzYzZkNzc4NWYwNWRjM2JkOGU5ZmNkNmRhZTY3Njcz ZjVhNjc1ZTczYmVjYzIwNThiM2JjMmU0NjlmYTQ2ODE2MmJlNTcxNDg3ZDBjOGVjY2ZiZjc1MGJj Mjk5ZWEyN2EwMzQxMA0KMzgyOGRjMTRhZTUxMzkzMjQ1ZDE1YTUxYTJmMjU5YjY1ZTRmNDY3ZDlk NDQ0ZmVhOTc5ZWExMTBiYmJhZjE4OWRkY2E0ODQ0ZGYzMWU4YmM2YTU1N2U1YmJiYTYzYTM3Mjg1 OTYzZTZiNTQ5ZjM1ZTMwYWIwNjNhZjZiMjVlNTENCjJlMDExNDgyZDA3NjhlYTg1YzIyZDFkNTBi MmNmNTE0NGUwNDc1NDVhMzhkZGQ5NTkwMWJmMTAyOWZmOGE3MGE1NWMyMmU3OTc5NjZiN2UyYzg2 ZjZmZDE2MzdlMWU0ZWQzMGI4Mzc3NzBjY2UwMDZjNTc0ODc1M2YzYTM3NDUyDQowYmIxZTBiNDhm NDJiOWVmMDJkMzQ3NGIwZTIwMDhiN2NiZDQzZTFmNzBkZWE5NTliZjgxZDgzZmIzNjMxYmIzMDIz ZjI0OTNiMmVjZDJjODI1NGYxMTMyOTViNzM0OTI5MDdjYTZjN2ZhMjhlMWUyNzhhYWVjMGIzOTZl MWY3NA0KOWRkNjNkNjk2Y2RkZWM5YjA4ZTRjZmExYjhmNjU1YWFlOTlhZGQ2ZjdmNjRlYWVhYTdj NTRjNmEyMzZmODQwZTllY2IwOThlNzE4YzhlMDYzODFjZThkYzQ1ODkxYjg0MjkzYWUxMDRlOTRh ZGIzNDM1NzQ3YTE3ZTY2YjQ2ZTYNCmU0MjA1ODg0MjdjYjcwNThlMWExMDU2NzI2YWY3NDBkZTZk NWM5NTZmNzQ5NjJkNmI5YTZjNmZlYTlmNDU4YjQ3NTEyODg5OGU3MDIzNzYzYmEyNmZjMmU3OTE0 YjM3YjcwMDBjNzI4ZTRhNmE4ZjEwMzk1ZGIxZWViNDVmMDk2DQozNzNmODgyYTFmNmQxOTRmNjNm NTNmZDkyZjEwYzFmMzc4NjNhNDY4ZDYxZjE2YzkzODRkZjU1ODRkMGNmM2QzMWNiMzU0MTY5YmRi NjY4ZmYyYjRjZTY1ZjFmMjY2YWMyZGU0ZDIzYWZjOWU0NDBiMTRmMmI5MTBjMWFiNWQ4OA0KNjE1 MWNmMjgwMjQxNzZiZWRkYzJhMThhMGQwYWI2ZDM1YjQwNGE2YWI0Y2NmYmM2YWExNzg1NmNiNmY3 NTBiZGE5NDM0YThlMWFhOGRjMTVhNzM3NTUxM2RhOTkyYzFhMjhjZGIyZjI3NGUxNzk2ODQ2NjNh YmU4OWE2ZGQ4MmYNCjVkMzQ5NDkyZDBiNjFkOTM0YjQ3NjVlYmE1YmRkNDJjNmI1YTMzMGQxM2Mz NDY3ZDkzNWJlNjA5ZTNjZTExY2Y0MDUwNGU4ZGEyZTM0NDU2MzYzN2IyMTU0Njc1MDhhYzY3NDUw YjIxYzUxZjI1M2UxZjM0YjRlMWJjZDY4YjgyDQplZjc1OGNhM2EyN2QwN2YxMzk4YjRiZGI1MTM3 Mzg1YmVmMTIzNWIyZGFlMjExOTlhODY3OGM2ZWU2MWIyMDU0ZjIzMjQ2YjYzZmMyYzA0ZmQ1NjRj ZWRhYTM2ZjhlOTM4NmZlY2MxNTU2MWI1ZjhhN2NkY2Q4OWNlZjgyMzIwZg0KY2I0MTA0OTkzMmY2 MmVkMzVmYTJjZDYxNWMzYjU0Y2M0MWFkNmNkOTllZDdkYzkwNWQ2Yjc2ZmVlYmIwNTRkMTQ2ZjY2 YWQwMDc1M2RkNTZhNzgyMDgzYzExMzU5OWNmZTY1MmZlNGE0YjQzZmUyOTZmZDhhZWZhNjc0M2Mz Y2QNCjZjYzQ5NzE2ZWI3NWNkMjZjMThiZWE1ZTMyNjcyNGRjNmJiYWViZDhjZjI5OTg3OTYzYmVl Yjc0ZDU2MTFjZDc0NTI0NzUxYTY0MmViNWMyMDU0ZTVmMDMzZDU1MmU0MWIzNTE1NDU2NzJjY2Q4 Nzk5NjY4ZGExYWQ3YmVjNzI4DQoxYjVhZTk5NDdjMzJlOGU3MzUxNTcxMzE4ZTNhZTU2OTViMmE3 OWEwMzFkYzU4ZTliYTE1ODhkNjVhNGQwZWZhNTk1YmJhMjk2MzkwNDU1NDExYjU4ZThhZDc2Mzgx YmFhZDg3YjVkMTRhNjhhNThhZDFjY2MxY2E3OGVhOWQ1NQ0KMzc4ZWRlOGFkNTIwZTc0NmQ3MWYz NTNmODk4MDZlZTM3ZDkwZWY4MGI0YjY2OWI4NTA2NWMyNWZkY2M4NmZlZTk5ODlmNTU3MzAzODRj MzgzYzc5ODAwZTkwOTdiYWRkYzk1NGYxM2ZiY2I2Y2YxMDhlN2QzNGYyMzAzOTFhMjgNCmRjMTRh NzY1MTM5MDk2Yzg1Y2EzN2VjYTU3MjhkZThhNDE2MGVhOWVhYmM5NmFiYWFmMmQ0YmEzM2IzYTdk ZDM2ZTkwYjkzNmU5MDEwZmJhZjVkMzJlYmQ3NTA4M2RhN2M2MTQ4M2NlMTQzMTliYmMyOWQ5ZTcw OTkzZDAxNDE0DQphNDFhODQ1MjMwODY1MWRhZTExNDYxNTdhMjg3ZGI0NTliYTlhNGY5NWFhN2Jj MTNiZTUwMDZkOTc3MDdmNTVhNWJlOGE4ZDdkMTFhYWQ1YjI3MmY2YmU5YmQ5MjczZTNmNjVjNzY2 OGYxZjJhOGE2OWY0MDRhZmE5MTE1MmI5Yw0KZTM2YjA0MDMwN2E4YTg5ODRmNWVlYjBiZGRiNGUx ZGI1YmJhYmQ4ZjQwZjllOTI1OGRiNzA2YzQxYjIxYjE2MjU0NzRjNTk0Yzc5OTc2YjQwMGQ2MzA5 NTg2NTZkZjI3NDFkNzFjMTA3MTJlMmQ1YWVjMzQzMmNjNzU0NjRjYTQNCjM0Njg0ZmEyYzk2MTRm YWUxMjcyYWFhNjJmOGFmNzJkMjJkZjQ1YWNjNDI1YTYzZjY4ZThlYTFiOTQ3ODQwOGNlYmZhMmNk NjIzODkzMThmZTYzNjhhNmNiZGYyOTA5ODkyZThhNmU5NzIxNmU3OGE3Nzg3NDRlMWNiNzY4ZTZm DQo2MmFhZDUzOGJlNzFhOWQ1MDE4YjEyMTNiZGNjYjQ4Y2I4YjgwZTZkOTFlMmRiM2Q5N2I1ZWMy ZmY5MjBhOGQwNTE5M2Q5MDNhYjQ4NmNkZWM4YjcwZGUxZjU3NWExZjJjNTI0NGQ4MzM2NTM3ZjMz N2Q0Nzc0MGFiZTUwZWE5Mg0KMWJiMDM2MmI1NWMwZDU3NGYwNTA0YmYzMTUxMWM2MjQ5ZjJjNjFl ZTAzMzFiMGRiYmE2ZTI4NTRmNGM0ZTVjOGUxNmQxYWQ3NDZkOGE5ZGIxYjA1OWFkMDAwNDBiMTNm YmM4ZmQ0NjhkZThiM2Y4OTlmMzJkNTZiNDhjNTBmNmMNCjE2NzY1MGJkNGZkMTQyZjA5MjM5OTBi OTQ2ZmQ5NGE0MjhkZTM0NDUyMGIwNzU1NmU5MTdhYWI3NWU1YTRjY2NlOTE5OTM3MzI0MjlhOTIx NmM5MDM5NzhiOTQ2MTc4YWJkMTM2NGIwOWJjOGFkYjNjY2FhNTM3ZmE4YWViNDZhDQo5OTNkMDBj YmY0OGVmMTA0NGQ4ZjQxZTA3NTllMTExNjNkNTk0NWJjZTkwYmJkNTQzOTkyMTcyODQwMzYzMTFm MjZhMDk3MGIzMWZhYjdmNzQwMjI4YzQ1M2JkZWQxNmJhZDhkNWMwY2FiODFkMWJmN2RkYTdiMTU5 NzdjNDY5ZQ0KNzc0MzMwM2NjMDdhZjVmNTU4NzJlM2Y1YWRhM2ExODMyZmI0ZTk4MWIxYmFjYWI4 ZGUxOTFiOWNkNmRiYThiZDk2N2FhNjRhYWFhNzg3MzllZTkwOGQwOWI2ODE2ZTI3N2U1OGI0MmRk MDc1NTllYzU2YmEyYTcxNmQwYmNlZjYNCjRhNDY4ZDgwOWYwMDhjMDkyNDAzNGRhZWEwOWYxMzcz YjMzYzY5Yjg1MDYyZjhhM2E0MTYzZTExYjAxZDkwNTc0ZDI0YzViMTQ0ZDJlNzEzYTAwOWQzOGRk NzYyNmIyMjllOGI2ZDk1ZjM0OGQ2MzVkZTI3YmFkNzNkMDc1MjdkDQo5NDNjNDk4ZDQ3NWUyMmMz ZTg1YWQxNDE0ZGEzNDkxYWNhZWQ4YmJkYjc0MzcxMDlmMjEzNGIxM2YzMTNhNGNmNmVkZmY1MWZi YWE2MTZjYzcwYTUxOGYyNWJhNjc1YmUwMGUyOGZlMjc0MGRjMzZiMjQxZjM5NGVkYjMwOWZmNw0K NTgzZjcxZDUxMmM0OGVmZWViOGRkMmNiMjUzY2NkOWExOTFkMWM4YzM3NmJkYTc1MDU2ZDI4Mzhj YTNhOWE3NjQ1ODkzNWVkOTg2ODY2MDM0NzdiODFiMmFjOTNjNzA1NDNlNGQwNWQ0NmY1MTUzZDVj MTUyY2NmNGYyYjI0NmYNCmZjNGE3MTcyY2RkMGY2YzQ3Mjg5ZmIyN2I5ZGFhOGRlNzQ0NzIwMzA3 NTU2ZWJjYmQ1NGJjYjQwODY2ZmNiZDI2NzFkZDU0MmU3MjZlNjcyNDJjODgzZjU2NWUwZTVlY2Nh YTg3YjkyMTdiOTVmYzkyNGY0NjEwYTM3NWU2NDQ5DQphODM2MWFlZmI3MjVjOGMwNzg0NTM2OWEw MWNiZDhmNjNjMDk1NWU4ZTQxZGQwNjkyNTAyN2QxNWE4ZTcwM2FhMjU0OGFkMzBhODdhNTI1NTA2 Y2UzYmE5ODRlM2JhYmRhMmI5MmM4Mjg0NzExNTI3MzU5MWNmMTliM2Q5ZTEyNA0KNzZlODg4MDk4 NzQyYjMzYzRmYzQwMjBjNDI5ZTgyMzNlMWNmNjk0ZmFhMGM4YjcwYzY2MmUyZDAxNzE1NmQ1YzZj ZDI0MDViZDhhY2M1NTg3NGNmYmI4OTdiZjYwYjZmODliOWJmMmVmMmUxYWI3YjJjZjYwZDg1NTRl MjUzNDkNCjI5NmJhMmE3MDc1OTQ4ZDNlOWRkNjFjNWVkNGY0OTFkMWM5YTk1YjZjY2Q4YzBlN2Fi OTljMWE3NTFlNzI3Y2FjZjc1NTMxZDkyMGMxYTIzNDM0MjZmNTcyMGZiNTlhZGUyNmI3YjBlY2I2 N2M0YjViNGY4MGUxYmY2NGMwMWU2DQplZDg2M2JlYWY3NzU3MWZlNmI5NmM4ZjdjZDJiZTU5NWM1 ZDIzZGM1Y2UyN2E5MmJhNzMxZThiNGZiMzlkNTdlY2Y4ZTg4NWFkYjI3ODZhNzY1YjI3ODA4ODEy Mzk1ZDk1OTYxYmI4ZDgyOTYwMWEyODFlMGJhYTlhZGZjMmRiZg0KZDU1YzY4ZDM0NTExMGIxMDQ5 MjQyZTBmODVlZTYzODc1NjliMjMzNDk4ZmQ0NDYwMzZhNWEyNTZmZTIwNmNlZmU4ODEzNGRiNzRm MDdkNTQ3Mjk5MTM2OGQ4NTM2Mjk0OTU3NjExYzgxYWYzZjcxZGExNTY1ZWIwYzRmZTY4OGQNCjFl MzEzZDNiNDM2NGZiNThmNmIzYjcxZWM1MmRlMmQ3NDFmYmZkMzBiZDUxNWU1MGYzZDk1NTFlNzg1 ZDk4NzUxZDQyZjJiZDgxZDlkMDhjMDlhNjE1Njg5NGMzZGQ3MTc1NDM5NzkxMjQwMjIzZDhhZjcy NDllODU0YjlmNTRlDQo2YmFlYTZhODJmZjQ0ZmUwZGE3NjE4ZTQwNTVjMzMwMDM3NTAzNWRhOTE2 NTE5MzcyNTNiMWFiZDE1ZjJjMzFjZTc5NzNlZmFhNzg5NDg1MDAzNzcyNzFlYzgxZDY0NGM4ZjJj MTMzNmE1YzM3MmE1NmQ1ZjcyYTkxNTA1NGNjMg0KOWU5ZGYyYjgxMjFhMmY2MGFlNmYyZWY0NTdj OThkODdhOWE3MmU2NGIzMGRhMjZkZjVlZmQxNzJiYzYyYTRjZDViM2Q0NjYzNzJlMzY3N2FhZTgx MWQ1YmUxZTBlNjU1Mzg1ZTVhYjZiYTRkMzY2OGQ4MGZjODJlNWJjNDRmN2QNCjNlMThmOTAxYmJk ZTZkN2VkNzVkNTk4NzMwOTUwYjU1YjZkYTNhMWUxZjNmZjE1YzEyOWVhYTM4YzRhZTkxODJlMDkz NjA3YWRlY2EyNzU2NTQ1MTQxMmNhZTljOTZiNDZhYzkzY2I2MWQwMzQ2OGQxZWNhOWZjMzkzNmUx ZjhlDQo5ZGVlNzY0YjNhZjYzZWJmZGQwMGUzNGM2MWQyMDM0OTRmMWYyYTMyNmM2Yzc3NTdlMzRj Mjk2ZDc2MTc5MTU0ZTkyN2QxOWFlMjNjNWE1YzZiMTM3ZDU0OTYwYzFlMDhhMzA2ZjkxYmZmMDBi NTQzODM1MmI0NWQzYWM4YzU4ZA0KYjI4ZTQ5YTI4OGQ5Y2ViYmJmMDg1MmNjY2NmMGJjMDcxMWE3 NDU1ZTA4OTk5NDFjYTJlN2FhODQxNjk0M2E1OTFkMzNkYjk2ZTc0NTczNjRkMDAzNDU4MjViZThh YzgyZGQyZTZiMjZmNDQ4NGQ5YjdlYWExMDcxNzgwYTM3Y2Y5NzYwMTQ2ZTI0YWFkNTBmMmQ2MWVl YWI2NDJlYzE4ODQ5MDQ4MjQ4Y2Q4ZmE3NTVlNDM5YWUzY2IwYmNhOWE0ZmIyZDNkMWZmZmQ5fX17 XG5vbnNocHBpY3QNCntccGljdFxwaWNzY2FsZXg1NFxwaWNzY2FsZXk3MVxwaWNjcm9wbDBccGlj Y3JvcHIwXHBpY2Nyb3B0MFxwaWNjcm9wYjBccGljdzUyOTJccGljaDMzMzRccGljd2dvYWwzMDAw XHBpY2hnb2FsMTg5MFx3bWV0YWZpbGU4XGJsaXB0YWctNDg4ODA4ODk0XGJsaXB1cGktOTZ7XCpc YmxpcHVpZCBlMmRkNWU0MmY0OTBiNzU3NzBhMmM2YTUxYzQwZjIyZX0NCjAxMDAwOTAwMDAwMzM4 ZmYwMDAwMDAwMGM5OTMwMDAwMDAwMDE2MTAwMDAwMjYwNjBmMDAyMjIwNTc0ZDQ2NDMwMTAwMDAw MDAwMDAwMTAwM2ZjNTAwMDAwMDAwMDcwMDAwMDAwMDIwMDAwMDQwYjUwMDAwNDBkNTAwMDAwMTAw DQowMDAwNmMwMDAwMDAwMDAwMDAwMDAwMDAwMDAwYzcwMDAwMDA3ZDAwMDAwMDAwMDAwMDAwMDAw MDAwMDAzZDEwMDAwMDQwMGEwMDAwMjA0NTRkNDYwMDAwMDEwMDQwZDUwMDAwMGMwMDAwMDAwMTAw MDAwMDAwMDAwMDAwMDAwMA0KMDAwMDAwMDAwMDAwNTYwNTAwMDAwMDAzMDAwMDFjMDEwMDAwYTAw MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA2MDU1MDQwMDAwNzEwMjAwNDYwMDAwMDAyYzAw MDAwMDIwMDAwMDAwNDU0ZDQ2MmIwMTQwMDEwMDFjMDANCjAwMDAxMDAwMDAwMDAyMTBjMGRiMDEw MDAwMDA2MDAwMDAwMDYwMDAwMDAwNDYwMDAwMDA4NDBlMDAwMDc4MGUwMDAwNDU0ZDQ2MmIyMjQw MDQwMDBjMDAwMDAwMDAwMDAwMDAxZTQwMDkwMDBjMDAwMDAwMDAwMDAwMDAyNDQwDQowMTAwMGMw MDAwMDAwMDAwMDAwMDMwNDAwMjAwMTAwMDAwMDAwNDAwMDAwMDAwMDA4MDNmMjE0MDA3MDAwYzAw MDAwMDAwMDAwMDAwMDg0MDAwMDVkMDBkMDAwMGM0MGQwMDAwMDIxMGMwZGIwMTAwMDAwMDAwMDAw MDAwMDAwMA0KMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTAwMDAwMGZmZDhmZmUwMDAxMDRhNDY0OTQ2 MDAwMTAxMDAwMDAxMDAwMTAwMDBmZmRiMDA4NDAwMDkwNjA3MDgwNzA2MDkwODA3MDgwYTBhMDkw YjBkMTYwZjBkMGMwYzBkMWIxNDE1MTANCjE2MjAxZDIyMjIyMDFkMWYxZjI0MjgzNDJjMjQyNjMx MjcxZjFmMmQzZDJkMzEzNTM3M2EzYTNhMjMyYjNmNDQzZjM4NDMzNDM5M2EzNzAxMGEwYTBhMGQw YzBkMWEwZjBmMWEzNzI1MWYyNTM3MzczNzM3MzczNzM3MzczNzM3DQozNzM3MzczNzM3MzczNzM3 MzczNzM3MzczNzM3MzczNzM3MzczNzM3MzczNzM3MzczNzM3MzczNzM3MzczNzM3MzczNzM3Mzcz NzM3MzczN2ZmYzAwMDExMDgwMDdlMDBjODAzMDEyMjAwMDIxMTAxMDMxMTAxZmZjNDAwMWMwMA0K MDAwMTA1MDEwMTAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwNTAxMDIwMzA0MDYwNzAwMDhmZmM0MDAz ODEwMDAwMTAzMDIwNDA0MDQwMzA2MDUwNTAwMDAwMDAwMDAwMTAwMDIwMzA0MTEwNTEyMjEzMTA2 MTM0MTUxMjIzMjYxNzENCjA3MTQ4MTIzNDI1MjkxYTFjMTE1YjFkMWUxZjEzMzQzNjI3MmYwZmZj NDAwMTkwMTAwMDIwMzAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDIwMzAwMDEwNDA1ZmZjNDAw MjExMTAwMDMwMDAyMDIwMjAzMDEwMTAwMDAwMDAwDQowMDAwMDAwMDAxMDIwMzExMjEzMTA0MTIx MzQxNTEzMjE0ZmZkYTAwMGMwMzAxMDAwMjExMDMxMTAwM2YwMDM1OTlmZDhhNTBmN2Y3MjhhN2Nh OGVjOTQ1MjBlYzE2NjE4MGRlNjNmYmFmMTk1ZTNhYTI3ZjI5ZTgxMzVkNGJlOA0KYTEwMTgyNjdk Zjc0ZTMyYjgxZGQ1YzM0YTJmYjI0NzUyODJlYjIyOWQ5NGM5NjhlYTlmNzA4YjQ3NTZmYjZjYTlk MjUxODA0MjI5MWQxZThhZjY0MTFiNTZmNGYxNTZlNGYxNDdlODg3NjNmNWI0NzgwZTFlZmFkYWY3 ZTU2MGQNCjFhZDFlNjdiYmEzNDBlZWExNDVkN2Q3ODYzMGJlNDcwNmIxYTJlNWM0ZDgwMGIxMzhm N2M0ZGE2YTM3M2UzYzNmMjU0YmM2OTcxZTUxZjU1ODBlMjZlMmVhZmM2OWVmNmJlNGU0NTI1ZmMx NGVkM2I4ZjUzZjc4YWNjYmRkMzRhDQo3MmIyZjZmZDUxYTlmZDA0ZGI1NmZjNWFlMjRjYWYzNGYw ZDE0N2Q4OThjOWZkZDUwOGJlMmQ3MTQ0NDQxOWE1YTM5NDc1NmJhOWZmMDA3MDU2M2U3OGJiZGIz NzcyMGFhZDIzNTgwMDAwM2FmN2Q3NWZkOTE2OTEwZWFmNDNmMQ0KODY1MzEzNGQ2ZTE4MGJiZWYx ODI0ZmQ5ZGZkNTZhZjA4ZTM5YzFiMWEwZDZkMmQ2MzE5MzExZmU4NGM3MmJjN2E3Zjg1ZjNkYjQx NmI3NmI3ZDU0MTIxNzAzNzIzYWU4N2E4NTRlNTEwZmE0YjEwYTlkMzc1NWU4ZmM0ZjA0YWUNCjZk YzIzYzYxMjFhMjhhOTMxM2NjZTY0NWUxZTc5ZDVjM2I1ZDc0N2EwNzA3MDYzOThlMGU2Mzg1YzM4 MWQwODQxNWMxMTIwZDViZWM0MjA1OGNlOGQ3MjM5OWFkMWEwMThjOWYwYjk1NWJkYTE5MWQ5OTU5 MzcyYWJjOWFhYjMyDQowZDRhODFlMTIwZDVmNDU2NzM0MDUwYzgwZGI0MmFjYjgyOGRjMTMyNzQy OTgzNjc2YmJmMTE1ZTU2NjY2ZTliMmYyNmE0ODRiNmNlYzg5NDU5MzMzN2FhZjY2ZjU0YjIxMjVk MjEyOTAzODI0NzExZGQ0MjBkM2E5NGMzZTY0ZQ0KYjg0OGVmMzA0NzIwMzA5NTE2ZTExNzhiNjQy NjhjNmExMTc4ODFiMmEwODkzNDAyZTc2MGJlN2ZmODhkYzRlNzg4ZjFjNzMyOWRlZTE0MTQ5Nzhl MTZmNDcxYmY4OWRmNWRiZDg3YWFlYjdmMTFmMTI5MzBhZTBmYWVhODgyZmMNCmM3ODZjMmQzZGIz OTBkYmZlNDU3MWRlMTFlMTgzOGM1NTgyZjkwMzI5ZTNiNjcwMzczZThhNmQ0MmRiMmU2NWQ1Njkx OWEzMDk3M2VkNzE3MDc1MzdkMDA0YWY3MTYzMGIyMjhlYzdmMTZmN2Y1NWQ2MjFlMDNhMThkZjlk YzRiDQo5Yzc2MDNjYTNlODk5MjcwYWQzYzZmMjMyYjcyMTNhZTlhZmU2OTRmY2E1Zjg2ODVlMmZl YjM5MjQ1NDczY2M0ODZiMWVlMjU0ODcwOWE4ZDA3MmM4ZjcyYmFmYzc4NDUzNDBjY2FjOGQ5ZjQw YWI1NDUwNTM4MzdjODJlNTJkZg0KOTZjNjJmMTY3ZjRlNTZkYzFhYTJlMWE1OTdiZmU4YmQ1MTg0 NWIzMzQwMDQ4MTc1ZDA2NjhhMzE3Njg2ZDhmYjIxZDU1MDQ0YzczZWMwNjVjYTQ1ZDU0ZjkyZGIw OWY4YjI5MWNmYTI3ZjI0MDYzN2JhZTk5ZjBjYjEzMzU3ODcNCmNiNDhmMjRiZTk1YzAzNmZmODRl YTNmMmQ1NzMxYWYxOTY3NzkxYjBkMTZiZmUxNTRhZjZlM2QzYzZkNzc4NWYwNWRjM2JkOGU5ZmNk NmRhZTY3NjczZjVhNjc1ZTczYmVjYzIwNThiM2JjMmU0NjlmYTQ2ODE2MmJlNTcxNDg3DQpkMGM4 ZWNjZmJmNzUwYmMyOTllYTI3YTAzNDEwMzgyOGRjMTRhZTUxMzkzMjQ1ZDE1YTUxYTJmMjU5YjY1 ZTRmNDY3ZDlkNDQ0ZmVhOTc5ZWExMTBiYmJhZjE4OWRkY2E0ODQ0ZGYzMWU4YmM2YTU1N2U1YmJi YTYzYTM3Mjg1OQ0KNjNlNmI1NDlmMzVlMzBhYjA2M2FmNmIyNWU1MTJlMDExNDgyZDA3NjhlYTg1 YzIyZDFkNTBiMmNmNTE0NGUwNDc1NDVhMzhkZGQ5NTkwMWJmMTAyOWZmOGE3MGE1NWMyMmU3OTc5 NjZiN2UyYzg2ZjZmZDE2MzdlMWU0ZWQzMGINCjgzNzc3MGNjZTAwNmM1NzQ4NzUzZjNhMzc0NTIw YmIxZTBiNDhmNDJiOWVmMDJkMzQ3NGIwZTIwMDhiN2NiZDQzZTFmNzBkZWE5NTliZjgxZDgzZmIz NjMxYmIzMDIzZjI0OTNiMmVjZDJjODI1NGYxMTMyOTViNzM0OTI5MDdjDQphNmM3ZmEyOGUxZTI3 OGFhZWMwYjM5NmUxZjc0OWRkNjNkNjk2Y2RkZWM5YjA4ZTRjZmExYjhmNjU1YWFlOTlhZGQ2Zjdm NjRlYWVhYTdjNTRjNmEyMzZmODQwZTllY2IwOThlNzE4YzhlMDYzODFjZThkYzQ1ODkxYjg0Mjkz YQ0KZTEwNGU5NGFkYjM0MzU3NDdhMTdlNjZiNDZlNmU0MjA1ODg0MjdjYjcwNThlMWExMDU2NzI2 YWY3NDBkZTZkNWM5NTZmNzQ5NjJkNmI5YTZjNmZlYTlmNDU4YjQ3NTEyODg5OGU3MDIzNzYzYmEy NmZjMmU3OTE0YjM3YjcwMDANCmM3MjhlNGE2YThmMTAzOTVkYjFlZWI0NWYwOTYzNzNmODgyYTFm NmQxOTRmNjNmNTNmZDkyZjEwYzFmMzc4NjNhNDY4ZDYxZjE2YzkzODRkZjU1ODRkMGNmM2QzMWNi MzU0MTY5YmRiNjY4ZmYyYjRjZTY1ZjFmMjY2YWMyZGU0DQpkMjNhZmM5ZTQ0MGIxNGYyYjkxMGMx YWI1ZDg4NjE1MWNmMjgwMjQxNzZiZWRkYzJhMThhMGQwYWI2ZDM1YjQwNGE2YWI0Y2NmYmM2YWEx Nzg1NmNiNmY3NTBiZGE5NDM0YThlMWFhOGRjMTVhNzM3NTUxM2RhOTkyYzFhMjhjZA0KYjJmMjc0 ZTE3OTY4NDY2M2FiZTg5YTZkZDgyZjVkMzQ5NDkyZDBiNjFkOTM0YjQ3NjVlYmE1YmRkNDJjNmI1 YTMzMGQxM2MzNDY3ZDkzNWJlNjA5ZTNjZTExY2Y0MDUwNGU4ZGEyZTM0NDU2MzYzN2IyMTU0Njc1 MDhhYzY3NDUNCjBiMjFjNTFmMjUzZTFmMzRiNGUxYmNkNjhiODJlZjc1OGNhM2EyN2QwN2YxMzk4 YjRiZGI1MTM3Mzg1YmVmMTIzNWIyZGFlMjExOTlhODY3OGM2ZWU2MWIyMDU0ZjIzMjQ2YjYzZmMy YzA0ZmQ1NjRjZWRhYTM2ZjhlOTM4NmZlDQpjYzE1NTYxYjVmOGE3Y2RjZDg5Y2VmODIzMjBmY2I0 MTA0OTkzMmY2MmVkMzVmYTJjZDYxNWMzYjU0Y2M0MWFkNmNkOTllZDdkYzkwNWQ2Yjc2ZmVlYmIw NTRkMTQ2ZjY2YWQwMDc1M2RkNTZhNzgyMDgzYzExMzU5OWNmZTY1Mg0KZmU0YTRiNDNmZTI5NmZk OGFlZmE2NzQzYzNjZDZjYzQ5NzE2ZWI3NWNkMjZjMThiZWE1ZTMyNjcyNGRjNmJiYWViZDhjZjI5 OTg3OTYzYmVlYjc0ZDU2MTFjZDc0NTI0NzUxYTY0MmViNWMyMDU0ZTVmMDMzZDU1MmU0MWIzNTEN CjU0NTY3MmNjZDg3OTk2NjhkYTFhZDdiZWM3MjgxYjVhZTk5NDdjMzJlOGU3MzUxNTcxMzE4ZTNh ZTU2OTViMmE3OWEwMzFkYzU4ZTliYTE1ODhkNjVhNGQwZWZhNTk1YmJhMjk2MzkwNDU1NDExYjU4 ZThhZDc2MzgxYmFhZDg3DQpiNWQxNGE2OGE1OGFkMWNjYzFjYTc4ZWE5ZDU1Mzc4ZWRlOGFkNTIw ZTc0NmQ3MWYzNTNmODk4MDZlZTM3ZDkwZWY4MGI0YjY2OWI4NTA2NWMyNWZkY2M4NmZlZTk5ODlm NTU3MzAzODRjMzgzYzc5ODAwZTkwOTdiYWRkYzk1NA0KZjEzZmJjYjZjZjEwOGU3ZDM0ZjIzMDM5 MWEyOGRjMTRhNzY1MTM5MDk2Yzg1Y2EzN2VjYTU3MjhkZThhNDE2MGVhOWVhYmM5NmFiYWFmMmQ0 YmEzM2IzYTdkZDM2ZTkwYjkzNmU5MDEwZmJhZjVkMzJlYmQ3NTA4M2RhN2M2MTQNCjgzY2UxNDMx OWJiYzI5ZDllNzA5OTNkMDE0MTRhNDFhODQ1MjMwODY1MWRhZTExNDYxNTdhMjg3ZGI0NTliYTlh NGY5NWFhN2JjMTNiZTUwMDZkOTc3MDdmNTVhNWJlOGE4ZDdkMTFhYWQ1YjI3MmY2YmU5YmQ5Mjcz ZTNmNjVjDQo3NjY4ZjFmMmE4YTY5ZjQwNGFmYTkxMTUyYjljZTM2YjA0MDMwN2E4YTg5ODRmNWVl YjBiZGRiNGUxZGI1YmJhYmQ4ZjQwZjllOTI1OGRiNzA2YzQxYjIxYjE2MjU0NzRjNTk0Yzc5OTc2 YjQwMGQ2MzA5NTg2NTZkZjI3NDFkNw0KMWMxMDcxMmUyZDVhZWMzNDMyY2M3NTQ2NGNhNDM0Njg0 ZmEyYzk2MTRmYWUxMjcyYWFhNjJmOGFmNzJkMjJkZjQ1YWNjNDI1YTYzZjY4ZThlYTFiOTQ3ODQw OGNlYmZhMmNkNjIzODkzMThmZTYzNjhhNmNiZGYyOTA5ODkyZTgNCmE2ZTk3MjE2ZTc4YTc3ODc0 NGUxY2I3NjhlNmY2MmFhZDUzOGJlNzFhOWQ1MDE4YjEyMTNiZGNjYjQ4Y2I4YjgwZTZkOTFlMmRi M2Q5N2I1ZWMyZmY5MjBhOGQwNTE5M2Q5MDNhYjQ4NmNkZWM4YjcwZGUxZjU3NWExZjJjNTI0DQo0 ZDgzMzY1MzdmMzM3ZDQ3NzQwYWJlNTBlYTkyMWJiMDM2MmI1NWMwZDU3NGYwNTA0YmYzMTUxMWM2 MjQ5ZjJjNjFlZTAzMzFiMGRiYmE2ZTI4NTRmNGM0ZTVjOGUxNmQxYWQ3NDZkOGE5ZGIxYjA1OWFk MDAwNDBiMTNmYmM4Zg0KZDQ2OGRlOGIzZjg5OWYzMmQ1NmI0OGM1MGY2YzE2NzY1MGJkNGZkMTQy ZjA5MjM5OTBiOTQ2ZmQ5NGE0MjhkZTM0NDUyMGIwNzU1NmU5MTdhYWI3NWU1YTRjY2NlOTE5OTM3 MzI0MjlhOTIxNmM5MDM5NzhiOTQ2MTc4YWJkMTMNCjY0YjA5YmM4YWRiM2NjYWE1MzdmYThhZWI0 NmE5OTNkMDBjYmY0OGVmMTA0NGQ4ZjQxZTA3NTllMTExNjNkNTk0NWJjZTkwYmJkNTQzOTkyMTcy ODQwMzYzMTFmMjZhMDk3MGIzMWZhYjdmNzQwMjI4YzQ1M2JkZWQxNmJhZDhkDQo1YzBjYWI4MWQx YmY3ZGRhN2IxNTk3N2M0NjllNzc0MzMwM2NjMDdhZjVmNTU4NzJlM2Y1YWRhM2ExODMyZmI0ZTk4 MWIxYmFjYWI4ZGUxOTFiOWNkNmRiYThiZDk2N2FhNjRhYWFhNzg3MzllZTkwOGQwOWI2ODE2ZTI3 N2U1OA0KYjQyZGQwNzU1OWVjNTZiYTJhNzE2ZDBiY2VmNjRhNDY4ZDgwOWYwMDhjMDkyNDAzNGRh ZWEwOWYxMzczYjMzYzY5Yjg1MDYyZjhhM2E0MTYzZTExYjAxZDkwNTc0ZDI0YzViMTQ0ZDJlNzEz YTAwOWQzOGRkNzYyNmIyMjllOGINCjZkOTVmMzQ4ZDYzNWRlMjdiYWQ3M2QwNzUyN2Q5NDNjNDk4 ZDQ3NWUyMmMzZTg1YWQxNDE0ZGEzNDkxYWNhZWQ4YmJkYjc0MzcxMDlmMjEzNGIxM2YzMTNhNGNm NmVkZmY1MWZiYWE2MTZjYzcwYTUxOGYyNWJhNjc1YmUwMGUyDQo4ZmUyNzQwZGMzNmIyNDFmMzk0 ZWRiMzA5ZmY3NTgzZjcxZDUxMmM0OGVmZWViOGRkMmNiMjUzY2NkOWExOTFkMWM4YzM3NmJkYTc1 MDU2ZDI4MzhjYTNhOWE3NjQ1ODkzNWVkOTg2ODY2MDM0NzdiODFiMmFjOTNjNzA1NDNlNA0KZDA1 ZDQ2ZjUxNTNkNWMxNTJjY2Y0ZjJiMjQ2ZmZjNGE3MTcyY2RkMGY2YzQ3Mjg5ZmIyN2I5ZGFhOGRl NzQ0NzIwMzA3NTU2ZWJjYmQ1NGJjYjQwODY2ZmNiZDI2NzFkZDU0MmU3MjZlNjcyNDJjODgzZjU2 NWUwZTVlY2NhYTgNCjdiOTIxN2I5NWZjOTI0ZjQ2MTBhMzc1ZTY0NDlhODM2MWFlZmI3MjVjOGMw Nzg0NTM2OWEwMWNiZDhmNjNjMDk1NWU4ZTQxZGQwNjkyNTAyN2QxNWE4ZTcwM2FhMjU0OGFkMzBh ODdhNTI1NTA2Y2UzYmE5ODRlM2JhYmRhMmI5DQoyYzgyODQ3MTE1MjczNTkxY2YxOWIzZDllMTI0 NzZlODg4MDk4NzQyYjMzYzRmYzQwMjBjNDI5ZTgyMzNlMWNmNjk0ZmFhMGM4YjcwYzY2MmUyZDAx NzE1NmQ1YzZjZDI0MDViZDhhY2M1NTg3NGNmYmI4OTdiZjYwYjZmODliOQ0KYmYyZWYyZTFhYjdi MmNmNjBkODU1NGUyNTM0OTI5NmJhMmE3MDc1OTQ4ZDNlOWRkNjFjNWVkNGY0OTFkMWM5YTk1YjZj Y2Q4YzBlN2FiOTljMWE3NTFlNzI3Y2FjZjc1NTMxZDkyMGMxYTIzNDM0MjZmNTcyMGZiNTlhZGUy NmINCjdiMGVjYjY3YzRiNWI0ZjgwZTFiZjY0YzAxZTZlZDg2M2JlYWY3NzU3MWZlNmI5NmM4Zjdj ZDJiZTU5NWM1ZDIzZGM1Y2UyN2E5MmJhNzMxZThiNGZiMzlkNTdlY2Y4ZTg4NWFkYjI3ODZhNzY1 YjI3ODA4ODEyMzk1ZDk1OTYxDQpiYjhkODI5NjAxYTI4MWUwYmFhOWFkZmMyZGJmZDU1YzY4ZDM0 NTExMGIxMDQ5MjQyZTBmODVlZTYzODc1NjliMjMzNDk4ZmQ0NDYwMzZhNWEyNTZmZTIwNmNlZmU4 ODEzNGRiNzRmMDdkNTQ3Mjk5MTM2OGQ4NTM2Mjk0OTU3Ng0KMTFjODFhZjNmNzFkYTE1NjVlYjBj NGZlNjg4ZDFlMzEzZDNiNDM2NGZiNThmNmIzYjcxZWM1MmRlMmQ3NDFmYmZkMzBiZDUxNWU1MGYz ZDk1NTFlNzg1ZDk4NzUxZDQyZjJiZDgxZDlkMDhjMDlhNjE1Njg5NGMzZGQ3MTc1NDMNCjk3OTEy NDAyMjNkOGFmNzI0OWU4NTRiOWY1NGU2YmFlYTZhODJmZjQ0ZmUwZGE3NjE4ZTQwNTVjMzMwMDM3 NTAzNWRhOTE2NTE5MzcyNTNiMWFiZDE1ZjJjMzFjZTc5NzNlZmFhNzg5NDg1MDAzNzcyNzFlYzgx ZDY0NGM4ZjJjDQoxMzM2YTVjMzcyYTU2ZDVmNzJhOTE1MDU0Y2MyOWU5ZGYyYjgxMjFhMmY2MGFl NmYyZWY0NTdjOThkODdhOWE3MmU2NGIzMGRhMjZkZjVlZmQxNzJiYzYyYTRjZDViM2Q0NjYzNzJl MzY3N2FhZTgxMWQ1YmUxZTBlNjU1Mzg1ZQ0KNWFiNmJhNGQzNjY4ZDgwZmM4MmU1YmM0NGY3ZDNl MThmOTAxYmJkZTZkN2VkNzVkNTk4NzMwOTUwYjU1YjZkYTNhMWUxZjNmZjE1YzEyOWVhYTM4YzRh ZTkxODJlMDkzNjA3YWRlY2EyNzU2NTQ1MTQxMmNhZTljOTZiNDZhYzkNCjNjYjYxZDAzNDY4ZDFl Y2E5ZmMzOTM2ZTFmOGU5ZGVlNzY0YjNhZjYzZWJmZGQwMGUzNGM2MWQyMDM0OTRmMWYyYTMyNmM2 Yzc3NTdlMzRjMjk2ZDc2MTc5MTU0ZTkyN2QxOWFlMjNjNWE1YzZiMTM3ZDU0OTYwYzFlMDhhMzA2 DQpmOTFiZmYwMGI1NDM4MzUyYjQ1ZDNhYzhjNThkYjI4ZTQ5YTI4OGQ5Y2ViYmJmMDg1MmNjY2Nm MGJjMDcxMWE3NDU1ZTA4OTk5NDFjYTJlN2FhODQxNjk0M2E1OTFkMzNkYjk2ZTc0NTczNjRkMDAz NDU4MjViZThhYzgyZGQyZQ0KNmIyNmY0NDg0ZDliN2VhYTEwNzE3ODBhMzdjZjk3NjAxNDZlMjRh YWQ1MGYyZDYxZWVhYjY0MmVjMTg4NDkwNDgyNDhjZDhmYTc1NWU0MzlhZTNjYjBiY2E5YTRmYjJk M2QxZmZmZDkwMDAwMDg0MDAxMDgyNDAwMDAwMDE4MDANCjAwMDAwMjEwYzBkYjAxMDAwMDAwMDMw MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxYjQwMDAwMDQwMDAwMDAwMzQwMDAwMDAwMTAw MDAwMDAyMDAwMDAwMDAwMDAwYmYwMDAwMDBiZjAwMDA0ODQzMDAwMGZjNDIwMzAwDQowMDAwMDAw MDAwYjMwMDAwMDBiM2ZmZmY0NzQzMDAwMDAwYjMwMDAwMDBiM2ZmZmZmYjQyMjEwMDAwMDAwODAw MDAwMDYyMDAwMDAwMGMwMDAwMDAwMTAwMDAwMDE1MDAwMDAwMGMwMDAwMDAwNDAwMDAwMDE1MDAw MDAwMGMwMA0KMDAwMDA0MDAwMDAwNTEwMDAwMDA1OGM1MDAwMDAwMDAwMDAwMDAwMDAwMDBjNzAw MDAwMDdkMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBjODAwMDAwMDdlMDAw MDAwNTAwMDAwMDAyODAwMDAwMDc4MDANCjAwMDBlMGM0MDAwMDAwMDAwMDAwMjAwMGNjMDBjODAw MDAwMDdlMDAwMDAwMjgwMDAwMDBjODAwMDAwMDdlMDAwMDAwMDEwMDEwMDAwMDAwMDAwMDAwMDAw MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBlZDRlDQplZTRlZWQ0ZWVlNTJjZDRl ZWU0ZWNkNGVlZTUyY2Q0ZWNkNGVjZDRlZWU1MmNkNGVjZDUyY2Q0ZWNkNTJhYzRlY2Q0ZWFjNGVj ZDRlYWM0ZWNkNGVhYzRlY2Q0ZWFjNGVjZDRlYWQ0ZWNkNTJjZDRlY2Q1MmNkNGVlZTUyY2Q0ZQ0K Y2Q1MmFkNGVjZTUyYWU0ZWNmNTJjZjUyZDA1NmFmNTJiMDUyOGY1MmIwNTI5MDUyYjA1MmIwNTJi MDUyOGU0ZWFlNTI4ZTRlYWU1MjhkNGVhZDUyYWQ1MmNkNTJjZDUyY2Q1MmNjNTJjZDUyYWM0ZWNk NTJhZDRlY2Q1MmFkNGUNCmNlNGVhZDRlY2Q0ZWFjNGVjYzRlYWM0ZWNjNTI4YjRlYWQ1MmFkNGVh ZDUyOGU0ZThlNGUwYTQyYzkzNTI3MjEzMDQyYmU3MzlkNmJiNzUyOTY0ZTMzNDI4ZTMxNGMyZDhk MzU4YzM5OGMzOTQ5MmRjNTFjMjEwODIwMDg2MTE4DQpjMzI0ODk0MTJmNTYyZTUyYjQ2MmQ1NWVm NzVlMTE0MmQwMzE0YzIxMmIxZGM4MTRhNjEwODUwY2E1MTQ2NDBjODQxMDg0MTA4NDEwODQxMDg1 MTA4NDEwYTUxNDg0MTA4NTEwODQxMGE1MTQ4NDEwODUxMDg0MTBhNTE0ODUxMA0KYTUxNDg1MTBh NTE0YTUxNGE2MTQ4NDEwNjMwYzQyMDg2MzBjNjMwYzg0MTA2MzBjODQxMDg0MTBhNTE0ODUxNGE2 MTQ4NTE0YTYxNDg1MTBhNTE0ODUxMGE1MTQ4NTEwYTUxNDg1MTBhNjE0ODUxMGE1MTQ4NTEwYTUx NDg1MTANCmE1MTQ4NTEwYTYxNDg1MTBhNTE0ODUxMGE1MTQ4NDEwODUxNDg1MTRhNjE0ODUxNGE1 MTQ4NDEwODQxMDY0MGM4NDEwNjMwYzg0MTA2MzBjODQxMDYzMGM4NDEwNjMwYzYzMGM2MzBjNjMw YzQyMDg0MjA4MjEwNDAwMDAwMTAwDQoyMjA0NDIwODQzMDg0MjA4NDIwODIyMDQ0MjA4ZWU1MmVk NTJlZTUyZWQ1MmVlNTJjZDUyZWU1MmNkNTJlZTUyY2Q1MmVlNTJjZDUyY2Q1MmNkNTJjZDUyY2Q1 MmNkNTJhZDRlY2Q1MmFkNGVjZDUyYWQ0ZWNkNTJjZDUyY2Q1Mg0KYWQ0ZWNkNTJjZDUyY2Q1MmNk NTJlZTUyY2Q1MmVlNTZjZDUyY2U1NmNkNTJjZjU2Y2Y1NmYwNTZjZjU2ZDA1NmFmNTJiMDU2YjA1 MmIwNTZiMDU2YjA1NmFmNTJhZjU2YWU1MmFlNTZhZDUyYWQ1MmFkNTJjZDU2Y2Q1MmNkNTYNCmNj NTJjZDU2Y2M1MmNkNTJhYzUyY2Q1MmNkNTJjZTUyYWQ0ZWNkNTJhYzUyY2M1MmFjNTJjYzUyYWI1 MmFjNTJhYzRlYWQ1MmFkNTJhZTU2YWU1MjZkNGUyYzQyNjgyOWFjMzU3YjZiYmU3MzNhNWZmODU2 NTQ0NjhlMzE2YzJkDQo2YjMxOGMzOThjMzk2YTMxYzYxYzYyMGMwMDA0NjAxNGEyMjBhYjQ1MmY1 NjUxNWFkNDYyMTc2NzE4NjM3NDRhMTIzZWQwMzE0ZDIxMGExOWE3MTA4NjEwODUxMDg1MTA4NDEw ODUxMDg0MTA4NTEwODQxMGE1MTQ4NTEwYTUxNA0KODQxMGE1MTQ4NTEwYTUxNDg0MTBhNTE0ODUx MGE1MTRhNTE0YTUxNGE1MTRjNjE4YTYxNGE1MTQ2MzBjNDIwODQzMDg4NDEwODQxMDg0MTA4NDEw ODUxMDg0MTBhNjE0YTUxNGE2MTRhNTE0YTYxNDg1MTRhNjE0ODUxNGE2MTQNCjg1MTBhNjE0YTUx NGE2MTQ4NTE0YTYxNDg1MTRhNjE0ODUxNGE2MTRhNTE0YTYxNDg1MTRhNjE0ODUxNDg1MTQ4NTEw YTYxNGE2MTRhNjE0ODUxNGE1MTQ4NDEwODQxMDg0MTA4NDEwODQxMDg0MTA2MzBjODQxMDYzMGM2 MzBjDQo2MzBjNjMwYzYzMGM2MzBjNDIwODQyMDgwMDAwMjEwNDIxMDQ0MzA4NDIwODQzMDg0MjA4 NDIwODQyMDhjZDUyZWQ1NmNkNTJlZDU2Y2Q1MmVkNTZjZDUyY2Q1NmNjNTJjZDU2YWM1MmNkNTJh YzUyY2Q1NmFjNTJjZDUyY2M1Mg0KY2Q1MmFjNGVjYzUyYWM0ZWNkNTJhYzRlY2Q1MmNjNTJjZDUy YWM0ZWNkNTJjYzUyY2Q1MmNjNTJjZDU2Y2Q1NmNkNTZhYzU2Y2Q1NmNlNTZjZjVhY2Y1YWNmNWFh ZjU2YWY1NjhmNTZhZjU2OGY1NmFmNTY4ZjU2YWY1NjhlNTYNCmFlNTY4ZDUyYWQ1NjhjNTJhYzU2 YWM1NmFjNTZhYzU2Y2M1NmFiNTJjYzU2YWM1MmNjNTZhYjUyYWM1NmFjNTJhYzU2YWM1MmFjNTZh YjUyYWI1NmFiNTJhYjU2OGE1MmFiNTY4YjUyOGM1NmFkNTZhZTU2OGQ1MjZkNTJjYTM5DQphYjM1 ZDU1NmJkNzM3YjZiM2E2Mzc0NGFjZjM5NGIyZDRhMmQ0YTJkOGIzNTZhMzEwODI1NjMxMDAwMDQy MDEwODIyMGFiNDU1MDU2NzI1YWQ2NjJmNzYyZjk1ZWQ4NTJiODRlNTUzZWYyMzU0YzI1ZTkxODg1 MTA4NTEwNjQxMA0KODQxMDY0MGM4NDEwODQxMDg1MTA4NDEwODUxMDg0MTA4NTEwODQxMDg1MTA4 NDEwODUxMDg0MTA4NTEwODUxMGE1MTQ4NDEwYTUxNDg1MTBhNTE0NjMwYzQyMDgyMjA0NjMwYzYz MGM4NDEwODQxMDg1MTA2NDBjODQxMDg1MTANCmE1MTQ4NTEwYTYxNDg1MTRhNjE0ODUxMGE1MTQ4 NTEwYTYxNDg1MTBhNjE0ODUxNGE2MTQ4NTEwYTUxNDg1MTBhNjE0ODUxMGE2MTQ4NTE0YTYxNDg1 MTBhNTE0ODUxMGE1MTQ4NTEwYTYxNGE1MTRhNjE0ODUxMDg1MTA4NDEwDQo4NDEwNjMwYzg0MTA2 MzBjODQxMDYzMGM2MzBjNjMwYzYzMGM2MzBjNjMwYzYzMGM2MzBjMjEwNDIxMDQyMTA0NDIwODQy MDg0MzA4NDIwODQyMDgyMjA0NDIwOGVkNWFjZDU2ZWQ1YWNjNTZlZDVhY2M1NmNkNWFjYzU2Y2Q1 YQ0KY2M1NmNjNTZhYzU2Y2M1YWFjNTZjYzU2YWM1NmNkNTZjYzUyY2M1NmNjNTJjYzU2Y2M1MmNj NTZjYzUyY2Q1NmNjNTJjZDU2Y2M1MmNkNTZjYzU2Y2Q1NmNjNTZlZDVhY2M1YWNkNWFjZDVhY2U1 ZWNlNWVjZjVlY2Y1YWNmNWUNCmFlNWFhZjVhOGU1YWFmNWE4ZjVhYWY1YThlNWFhZTVhYWQ1YWFk NWE4YzU2YWM1YWFiNTZhYzVhYWI1NmNjNWFhYjU2Y2M1YWFiNTZjYzVhYWI1NmFjNWFhYjU2Y2M1 YWFiNTZhYjVhYWI1NmFiNWFhYjU2YWI1YWFhNTZhYjVhDQphYTU2OGI1NjhiNTZhYzVhOGM1Njhk NWE4ZDU2OGY1MjBkNDI3MTRlN2E2ZjliNmY1YTY3YjY1NjExNDI2YzMxMjkyOTRhMmQ2YjMxNmIz MTI5MjljNjE4MjEwODIwMTA2MTFjY2M0NTUwNTZiNDVlYjU1YWQ3NWE5NjRlZmE1Ng0KZGE1MmI5 NGEzNTNlZDAzMTJiMjFhNzE4NjQxMDg1MTA4NDEwODQxMDg0MTA4NTEwODQxMDg1MTA4NDEwYTUx NDg0MTBhNTE0ODQxMGE1MTQ4NDEwYTUxNDg0MTBhNTE0YTUxNGE1MTQ4NDEwODUxMDY0MGM0MjA4 MDAwMDQzMDgNCjQzMDg2NDBjODQxMGE1MTQ4NDEwODQxMDg0MTA4NTEwODUxMGE1MTQ4NTE0YTYx NGE1MTRhNjE0ODUxMGE2MTRhNTE0YTYxNGE1MTRhNjE0YTUxNGE2MTQ4NTE0YTYxNGE1MTRhNjE0 YTUxNGE2MTRhNTE0YTYxNDg1MTBhNjE0DQo4NTE0YTYxNGE1MTRhNjE0YTUxNGE2MTQ4NTEwYTUx NDg0MTA4NDEwODQxMDg0MTA4NDEwODQxMDYzMGM4NDEwNjMwYzYzMGM2MzBjODQxMDYzMGM0MjA4 MjEwNDQyMDg0MjA4NjMwYzQzMDg2MzBjNDIwODQzMDg0MjA4Y2M1Ng0KY2Q1YWNjNWFjZDVhY2M1 NmNkNWFhYzVhY2Q1YWFjNTZjYzVhYWM1NmFjNWFhYjU2YWM1YWFjNWFhYzVhYWM1NmNjNWFhYzU2 Y2M1YWFjNTZjYzU2YWM1NmNjNWFhYzU2Y2M1YWFjNWFjYzVhYWM1NmNjNWFhYzVhY2M1YWFiNWEN CmNjNWVhYzVhY2Q1ZWFkNWVjZTVlYWU1ZWNlNWVhZTVlYWU1ZThlNWE4ZTVhOGU1YWFlNWU4ZTVh OGU1YThkNWFhZDVlOGM1YThjNWE4YjVhYWI1YThiNWFhYjVlOGE1YWFiNWFhYjVhY2I1YWFiNWFh YjVhYWI1NmFiNWE4YjVhDQphYjVhOGE1YWFiNWE4YTVhYWE1YThhNWFhYTVhOGE1YThhNWE4YTU2 OGI1YThiNTY4YzVhNmM1NjhkNWE4ZTU2OTA1NjRlNGE1ODZiNzk2YjU5NjdmNzVhNTI0YThjMzU0 YTJkNDkyZDZiMzE0YTI5NGEyOWU4MWM2MzEwMDAwYw0KNjExY2NjNDU3MTVhYjQ1ZWQ2NWViNjUy NzU0Njk3NDY5ODQ2OTc0Mjc2NDIxMjNhOGUzMWU4MjA4NDE0NjQxMDg0MTA4NDEwODQxMDY0MGM4 NDEwODQxMDg0MTA4NDEwODUxMDg0MTA4NTEwODQxMDg1MTA4NDEwODUxMDg0MTANCmE1MTQ4NDEw ODUxMDg0MTA4NDEwNDIwODIxMDQyMTA0NDIwODQyMDg0MzA4NDMwODYzMGM2MzBjNjQwYzY0MGM4 NDEwODUxMGE1MTQ4NTEwYTYxNDg1MTBhNTE0ODUxMGE2MTQ4NTE0YTYxNDg1MTRhNjE0ODUxNGE2 MTQ4NTEwDQphNTE0ODUxMGE2MTQ4NTEwYTUxNDg1MTBhNTE0ODUxMGE1MTQ4NTEwYTUxNDg1MTBh NTE0ODUxMGE2MTQ4NDEwODUxMDg0MTA4NDEwNjQwYzg0MTA2NDBjODQxMDYzMGM2NDBjNjMwYzY0 MGM2MzBjNjMwYzQyMDg0MjA4MjEwNA0KNDIwODQyMDg2MzBjNDMwODQzMDg0MjA4NDMwY2NkNWVj YzVhY2Q1ZWNjNWVjZDVlYWM1YWNkNWVhYzVhY2M1ZWFjNWFjYzVlYWI1YWFjNWFhYjVhYWM1ZWFj NWVjYzVlYWM1ZWNjNWVhYzVhYWM1ZWFjNWFjYzVlYWM1ZWNjNWUNCmFjNWVjYzVlYWM1ZWNjNWVh YzVlY2Q1ZWFjNWVjYzVlYWI1ZWNjNjJhYzVlY2Q2MmFkNjJjZTYyYWU1ZWFlNjI4ZTVlYWU1ZThl NWU4ZTVlOGU1ZThlNWU4ZDVlYWQ1ZThjNWVhYzVlOGI1ZWFjNWU4YjVhYWI1ZWFiNWVhYjVlDQph YjVlYWM1ZWFiNWVhYjVlYWI1YWFjNWU4YjVhYWI1ZThiNWFhYjVlOGE1ZWFhNWU4YTVhYWI1ZThh NWE4YTVhOGE1YWFiNWVhYjVlYWM1ZThiNWE4YzVlOGM1YTZkNTZkMTVlNmU0ZTU3NmI3OTZmNTk2 NzM5NjM1MjRhY2UzOQ0KNmIyZDZiMzE2YTMxNGEyOTI5MjkyOTI1YTQxNDIwMTA4MTIwMGU1Mjkz NWUxODZiMTg2M2Y5NWU3NjQ2NTUzZTU1M2E3NzQyNzc0Mjc2NDZmMTNkNGIyZGE2MTg4NDEwODQx MDg1MTA4NDEwODQxMDg0MTA4NTEwODQxMDg1MTANCjg0MTBhNTE0ODQxMDg1MTA4NDEwYTUxNDg0 MTBhNTE0ODUxMGE1MTRhNTE0YTYxNGE1MTQ4NDEwNDIwODIyMDQyMTA0MjEwNDIxMDQyMjA0NDIw ODYzMGM2MzBjNjQxMDY0MGM4NTEwODUxMGE2MTRhNTE0YTYxNGE1MTRhNjE0DQphNTE0YTYxNGE2 MTRhNjE0YTUxNGE2MTRhNTE0YTYxNDg1MTRhNjE0YTUxNGE2MTQ4NTE0YTYxNDg1MTRhNjE0ODUx NGE2MTQ4NTEwYTUxNDg1MTRhNjE0YTYxNGE1MTQ4NTEwYTUxNDg0MTA4NTEwODQxMDg0MTA4NDEw ODQxMA0KNjQwYzg0MTA2MzBjODQxMDYzMGM2MzBjNDIwODQyMDg0MjA4NjMwYzYzMGM2MzBjNDMw ODYzMGM0MzA4YWM1ZWNjNWVhYjVhYWM1ZWFjNWVhYzVlYWI1YWFjNWVhYjVhYWM1ZThiNWFhYjVl OGI1YWFjNWU4YjVhYWI1ZThiNWUNCmFjNjI4YjVlYWM2MmFiNWVhYzYyYWI1ZWFjNjI4YjVlYWM2 MjhiNWVhYzYyYWM1ZWFjNjJhYzVlYWM2MmFiNWVhYzYyYWI1ZWFjNWU4YzVlYWQ1ZThkNWVhZTYy OGU1ZWFlNjI4ZTVlYWU2MjhlNWU4ZTVlOGQ1ZThkNWU4ZDVlDQo4YzYyOGM1ZThjNWU4YjVlYWM2 MjhiNWVhYzVlOGI1ZWFiNWU4YjVlYWI1ZThiNWFhYzVlOGI1YWFiNWU4YjVhOGI1ZThhNWU4YjVl OGE1ZThhNWU4YTVhOGI1ZThhNWU4YjVlOGI1YThjNWU4YjVlOGM1ZThjNWU4ZDVlOGU1YQ0KYjA1 ZThmNTJkMjVhNzg2YjlhNmZkNjVhOTQ1MmFkMzU0YTJkMjkyOThiMzU0YTJkMjkyNTA4MjFlNzIw NDAxNGU1MmNlZDRkZDQ2NmY2NjZmODYyZjg1YWQ4NTY3NzQ2NTY0MjU2M2U1NjQyMzQzZTM0NDZh ZjM5ZTgyMDYzMGMNCjg1MTAyMTA0NjQwYzY0MGM2MzBjYTUxNDg0MTA4NDEwODUxMDg0MTA4NDEw ODQxMDg1MTA4NDEwODUxMDg0MTA4NTEwODQxMDg1MTA4NDEwODUxMDg0MTA4NTEwODQxMDY0MGMy MjA0MDEwMDAwMDAwMDAwMDEwMDIyMDQyMjA0DQo0MzBjNjQwY2E2MTRhNTE0YTUxNDg1MTBhNjE0 YTUxNGE2MTQ4NTE0YTYxNDg1MTRhNjE0ODUxMGE1MTQ4NTEwYTYxNDg1MTBhNTE0ODUxMGE2MTQ4 NTEwYTUxNGE1MTRhNjE0ODUxMGE1MTQ4NTEwYTUxNDg1MTA4NTE0ODUxMA0KYTUxNDg1MTA4NTEw ODQxMDg1MTA2NDEwODQxMDY0MTA4NDEwNjQwYzY0MGM2MzBjNjQwYzQzMDg2MzBjMjEwNDQzMDg2 MzBjNjMwYzQyMDg0MjA4NDIwODY0MGNhYzYyYWM1ZWFjNWVhYzVlYWM1ZWFjNWVhYzVlYWI1ZWFj NWUNCjhiNWVhYzVlOGI1ZWFjNjI4YjVlOGM1ZThiNWU4YzYyOGI1ZThjNjI4YjVlOGM2MjhiNjI4 YzYyOGI1ZThjNjI4YjVlOGM2MjhiNWU4YzYyOGI2MjhjNjI4YjYyYWM2MmFiNWVhYzYyOGI1ZWFj NjI4ZDVlYWU2MmFlNjJhZjY2DQphZTYyYWY2MmFmNjJhZjYyYWY2MmFmNjI4ZTVlOGQ2MjhjNWU4 YzVlOGM1ZThjNWU4YzVlYWM1ZThiNWVhYzYyYWM1ZWFjNWU4YzVlYWM1ZWFjNWVhZDVlOGM1ZWFj NjI4YjVlYWM2MjhiNWVhYzYyOGI1ZWFjNWU4YjVlYWM2Mg0KOGM1ZWFkNWU4YzVlYWQ2MjhkNWVh ZTYyOGQ1ZWFlNWVhZjVhYjA1YWQyNWE1ODZiN2E2ZjE4NjM5NDUyY2YzZDRhMmQ0YTJkNGEyZDRh MmQyOTI5MjkyNTA3MjU4MjFjNjgzZDcxNWViMzY2OTM1ZTcyNTI3NDUyOTY0ZTk3NGENCjM0M2U1 NjQyNzY0Njc2NDYzMzQ2ZjAzZDRhMjljNjE4ODUxMGE1MTRhNTE0YTUxNDY0MGM2MzBjODQxMDg1 MTA4NDEwODUxMDg0MTBhNTE0ODQxMGE1MTQ4NDEwYTUxNDg0MTA4NTEwODQxMGE1MTQ4NDEwODUx MDg0MTBhNTE0DQo4NDEwODQxMDQzMDg0MjA4MjEwNDIyMDQyMTA0MjIwNDIyMDQ2MzBjODQxMGE2 MTQ4NTE0YTYxNGE1MTRhNjE4YTYxNGE2MTRhNTE0YTYxNGE1MTRhNjE0ODUxNGE2MTRhNTE0YTYx NDg1MTRhNjE0YTUxNGE2MTQ4NTE0YTYxNA0KYTUxNGE2MTQ4NTE0YTYxNDg1MTRhNjE0ODUxMGE2 MTRhNTE0YTUxNDg1MTBhNTE0ODUxMDg1MTA4NDEwYTUxNDg1MTA4NTEwNjQwYzg0MTA2NDBjNjQw YzYzMGM2MzBjNjMwYzYzMGM2MzBjNjMwYzQzMDg0MzBjNDIwODhjNWUNCmFjNWU4YzVlYWM1ZThi NWE4YzVlOGI1ZWFjNWU4YjVhOGI1ZThiNWU4YjVlNmI1ZThiNWU2YjVlOGI1ZTRhNWU2YjVlNmI1 ZTZiNjI2YjVlNmI2MjZiNWU2YjYyNmI1ZTZiNWU2YjVlNmI2MjZiNWU2YjYyNmI1ZThiNjI2YjVl DQo4YjVlOGI1ZThjNWU2YjVhOGQ1ZThkNjJhZjY2YWY2MmFmNjJhZjYyZDA2MmFmNjJhZjYyYWY2 MmFmNjI4ZDVlOGQ1ZTZjNWU4YzVlNmM1YThjNWU4YzVlYWM1ZThjNWVhYzVlOGM1ZWFkNWU4YzVl YWQ1ZThkNWVhZDVlOGM1ZQ0KOGM1ZThjNWVhYzVlOGM1ZWFkNWU4YzVlYWQ1ZThkNWVhZTVlOGQ1 ZWFlNjJhZTVlYWY2MmFlNWVjZjYyOGU1ZWFmNWViMDVhZDI1ZTE2NjM3YTZiMzg2M2I1NTZlZjQx OGMzNTI5MmQ0OTJkMjkyOTQ5MmQyOTI5MDcyOTYxMWMNCmNiNDk5MTY2YjM2NjkyNWU3MjU2MzE0 ZTk0NTJmMTM5MTIzYTM0M2U5NzRhNzY0YTc1NGEzMjQ2Y2YzOWM3MTg2MzBjYTUxNGE1MTQ4NDEw ODQxMDIxMDRhNTE0ODQxMDg0MTA4NDEwODQxMDg0MTA4NDEwODQxMDg1MTA4NDEwDQo4NDEwODQx MDg1MTA4NDEwODQxMDg0MTA4NTEwODQxMGE1MTQ4NTEwYTUxNDg0MTA2MzBjNDIwODQyMDgwMDAw MDEwMDAxMDA2MzBjNjQxMGE1MTQ4NTE0YTYxNDg1MTRhNjE0YTUxNGE2MTQ4NTEwYTYxNDg1MTBh NjE0ODUxMA0KYTUxNDg1MTBhNjE0ODUxMGE1MTQ4NTEwYTYxNDg1MTRhNjE0ODUxNGE2MTQ4NTEw YTUxNDg1MTBhNjE0ODUxNGE1MTQ4NTE0YTUxNDg1MTA4NTE0ODUxMGE1MTQ4NDEwODUxMDg0MTA4 NTEwNjQwYzY0MGM2MzBjNjQwYzYzMGMNCjYzMGM0MzA4NjQwYzYzMGM2MzBjNDMwODQyMGNhYzVl OGM1YWFjNWU4YzVlOGM1ZThiNWE4YzVlOGI1ZThjNWU4YjVhOGM1ZThiNWU4YzVlNmI1ZThjNWU2 YjVlNmI1ZTZiNWU2YzYyNmI1ZTZjNjI2YjVlNmM2MjZiNWU2YjYyDQo2YjVlNmM2MjZiNWU2YzYy NmI1ZTZjNjI2YjVlOGI1ZTZiNWE4YzVlNmI1YThjNWU4ZDVlYWY2MmFmNjJkMDY2ZDA2MmQxNjZk MDYyZDE2NmIwNjJkMTY2YjA2MmFmNjI4ZTVlYWU2MjhkNWU4ZDVlOGQ1ZWFlNjI4ZDVlYWU2Mg0K OGQ1ZWFlNjJhZTVlYWU1ZThlNWVhZjYyYWU1ZThkNWU4ZDVlYWU1ZThlNWVhZTYyYWU1ZWFmNjJh ZjVlYWY2MmFmNWVkMDYyY2Y2MmQwNjJkMDYyZDE2MmQwNjJmMDY2ZDA2MmYyNjJkMzVlZjU1ZTU5 Njc1YTY3YjU1MjMyNGENCmFkMzk2YjMxMjkyZDQ5MmQ0YTMxNGEzMTA2MjUwNTJkMGQ1NmIxNjY3 MDYyOTI2NjUwNTZlZTQ1Y2QzZDk1NTY1NDRhMzM0MmYyMzkzNDQyNzU0YTMyNDI4ZDMxNmMyZDg1 MTA2MzBjNjMwYzg1MTA4NDEwNjMwYzg1MTA4NDEwDQo4NDEwODUxMDg0MTA4NTEwODQxMGE1MTQ4 NDEwODUxMDg0MTBhNTE0ODQxMDg1MTA4NDEwYTUxNDg0MTA4NDEwODQxMGE1MTRhNTE0YTYxNDg1 MTA4NTEwNjQwYzIyMDgwMTAwMjEwNDQyMDg4NTEwODUxMGE2MTRhNjE0YTYxNA0KYTUxNGE2MTRh NTE0YTYxNGE1MTRhNjE0YTUxNGE2MTRhNTE0YTYxNGE1MTRhNjE0YTUxNGE2MTRhNTE0YTYxNGE1 MTRhNjE0YTYxNGE2MTRhNTE0YTYxNGE1MTRhNjE0YTUxNGE2MThhNTE0YTYxNGE1MTRhNjE0YTUx NGE1MTQNCjg1MTBhNTE0ODQxMDg1MTA2NDBjODQxMDY0MGM2NDBjNjMwYzY0MGM2NDBjODQxMDY0 MGM4NDEwNjMxMDZiNWE4YzVhNmI1YThjNWE2YjVhOGM1ZTZiNWE2YjVhNmI1YTZiNWU2YjVhNmI1 YTZiNWE2YjVlNmI1YTZiNWU0YjVhDQo2YjVlNGI1ZTZiNWU2YjVlNmM1ZTZiNWU2YzVlNmI1ZTZj NWU0YjVlNmI1ZTZiNWU2YjVlNGI1ZTZiNWU2YjVhNmI1YTZiNWE2YzVhNmM1YThlNWU4ZTVlZDA2 MmQwNjJkMTYyZDE2MmQxNjJkMTYyZDE2MmIwNjJkMDYyYjA2Mg0KYjA2MjhlNWU4ZTVlOGU1YThl NWU4ZTVlYWU1ZThlNWVhZjVlOGU1ZWFmNWVhZjVlYjA1ZThmNWViMDVlOGU1YWFmNWU4ZTVhYWY1 ZWFmNWViMDYyYjA1ZWIwNWViMDVlZDE2MmIwNWVkMTYyZDE2MmYyNjJkMTYyZjI2MjE2MTANCjAw MDAyNjA2MGYwMDIyMjA1NzRkNDY0MzAxMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwNzAwMDAw MDAwMjAwMDAwNDA5NTAwMDA0MGQ1MDAwMGYxNjZmMTY2ZjM2MmY0NWVkNDVhMzk2NzM5NjdkNzVh MzI0YWNlM2Q0YTMxDQo0OTMxMjgyZDRhMzEyODJkZTUyNDY4M2Q2ZjVlOTA2NjZmNjJiMTZhOTE2 NjBkNTJlZTQ5YWQzOTMxNDY1MzQ2NTQ0NjMzM2VmMTM5ZDAzNWYxM2Q3MzRhOGMzMTQzMDg0MzA4 NjQwYzY0MGM4NDEwNjMwYzY0MGM4NDEwNjQwYw0KODQxMDg0MTA4NDEwODQxMDg0MTA4NDEwODQx MDg0MTA4NDEwODQxMDg0MTA4NDEwODQxMDY0MGM4NDEwODQxMDg1MTA4NDEwYTUxNDg1MTBhNTE0 NjQwYzQzMDgwMTA0NDIwODY0MGM4NTEwODUxMGE1MTQ4NTE0YTYxNDg1MTANCmE2MTQ4NTE0YTYx NDg1MTBhNjE0ODUxNGE2MTQ4NTEwYTYxNDg1MTRhNjE0ODUxMGE2MTRhNTE0YTYxNGE1MTRhNjE0 YTUxNGE2MTRhNTE0YTYxNGE2MTRhNjE0YTUxNGE2MTRhNTE0YTYxNGE1MTRhNjE0YTUxNGE2MTQ4 NTEwDQphNTE0ODUxMDg1MTA2NDEwODUxMDY0MGM4NTEwODQxMDg0MTA2MzBjODQxMDg0MTRhNTE4 OGM1YTZjNWE2YzVhNmI1YTZjNWE2YjVhNmM1YTZiNWE2YzVlNmI1YTZjNWE2YjVhNmM1ZTRiNWE2 YzVhNGI1YTZjNWU0YjVhNmM1ZQ0KNGI1YTZjNWU2YjVhNmM1ZTRiNWE2YzVlNGI1YTZjNWU0YjVh NmM1ZTRiNWE2YzVlNGI1YTZjNWE2YjU2NmM1YTZjNTY4ZDVhOGU1ZWIwNjJkMDYyZDE2NmQxNjJk MjY2ZDE2MmYyNjZkMjYyZDI2MmQxNjJkMTYyYjA2MmIwNjINCjhmNWE4ZjVlOGU1YWFmNWU4ZjVl YjA2MmIwNWViMDYyYjA1ZWQxNjJiMTVlZDE2MmIxNWVkMDVlYjA1ZWQwNWViMDVlZDE2MmQxNWVk MjYyZDI1ZWYzNjJkMjYyZjM2MmQzNjJmMzYyZjM2MmYzNjJmMjYyZjI2NmYyNjYxNDY3DQpmNDVl ZjY1ZTM4NjM1YTZiMTk2Mzc0NTJjZTNkNmIzNTI5MzE0OTMxMjgzMTQ4MmRlNTI4Y2I0OTZlNjJi MDZhNmY2NmIwNmFiMDZhOTE2NmIyNjJhYzQxYWMzOWNmMzkzMjQyNzU0YTMzNDI3NTQ2Zjg1YWY4 NWU1MjRhZTcxYw0KNjMwYzY0MGM2MzBjYzYxODQyMDg4NDEwODQxMDg0MTA4NDEwODQxMDg0MTA4 NDEwODQxMDg1MTA4NDEwODUxMDg0MTA4NTEwODQxMDg1MTA4NDEwYTUxNDg0MTA4NDEwNjQwYzg0 MTA4NDEwYTUxNGE1MTRhNjE4NjQwYzQzMDgNCjIyMDg2NDBjNjQwYzg1MTA4NTEwYTYxNGE1MTRh NjE0YTUxNGE2MTRhNjE0YTYxNGE1MTRhNjE0YTYxNGE2MTRhNTE0YTYxNGE2MTRhNjE0YTUxNGE2 MThhNjE0YTYxNGE2MTRjNjE4YTYxNGE2MThhNjE0YzYxOGE2MTRhNjE4DQphNjE0YzYxOGE2MTRh NjE4YTYxNGM3MThhNjE0YzYxOGE2MTRjNjE4YTYxNGE2MTRhNTE0YTYxNGE2MTRhNjE0ODUxMGE1 MTRhNTE0YzYxY2U3MjA2YjU2NmM1YTZiNTY2YzVhNGI1NjZiNTY0YjU2NmM1YTRiNTY2YzVhNGI1 Ng0KNmM1YTRiNWE0YjVhNGI1YTRiNWE0YjU2NmI1YTRiNTY2YzVhNGI1NjZjNWE0YjU2NmM1YTRi NTY2YzVhNGI1NjZjNWE0YjU2NGI1YTRiNTY0YjVhNGI1NjZjNTY0YjU2NmM1YTZkNTY4ZjVlYjA1 ZWQyNjZkMTYyZDI2MmQyNjINCmYyNjJkMjYyZjI2MmQyNjJkMjYyYjE2MmIxNjI5MDVlOTA1ZTZm NWE4ZjVhOGY1YWIwNWViMDVlYjE1ZWIxNWVkMTYyYjE1ZWQyNjJiMjVlZDI2MmQxNWVkMjYyZDE1 ZWQyNjJkMjYyZjM2MmQzNjJmMzYyZjM2MmY0NjJmNDYyDQpmNDYyZjQ1ZTE0NjNmNDYyMTQ2N2Yy NjYxMzZiZjQ2MjE1NjMxNzVmMTg2MzM5NjM3YzZmYjY1YTEwNDY2YTMxNDkzMTI3MmQyODJkMjgz MTQ4MzUyZTU2NmY2NjhmNjY2ZDY2MGI1ZTBiNWEwYjU2MGM1MjE2NmY1MTUyNmIyZA0KOGQzMTc1 NGExYTViZDg1NmQ4NTZiNjU2OTU1MmNlMzljNjE4NDIwODYzMGM4NTEwNjQwYzYzMGM4NDEwNjQw Yzg0MTA2MzBjODQxMDY0MGM4NDEwNjQwYzg0MTA4NDEwODQxMDY0MGM4NDEwODQxMDg0MTA4NDEw ODQxMDY0MGMNCjg0MTA2MzBjODQxMDg0MTA4NTEwYTYxNDg0MTAyMjA4NDIwODQyMDg2NDBjNjQx MGE2MTQ4NTEwYTUxNDg1MTBhNjE0ODUxMGE2MTRhNTE0YTYxNDg1MTRhNjE0YTUxNGE2MTQ4NTE0 YTYxNGE1MTRhNjE0YTUxNGE2MTRhNjE0DQphNjE0YTYxNGE2MTRhNjE0YzYxOGE1MTRhNjE0YTUx NGE2MTRhNTE0YTYxNGE2MTRhNjE0YTYxNGE2MTRhNjE0YTYxOGE2MTRhNjE4YTYxNGM2MThhNjE0 YTYxNGE1MTRhNjE0YTUxNGU3MWMyODI1NGEyZDZkNWE2YzU2NmQ1YQ0KNmM1NjZkNTY0YzU2NmQ1 YTRjNTY2ZDVhNGM1NjZkNWE0YzU2NmM1YTRjNTY2YzVhNGM1NjZkNWE0YzU2NmQ1YTZjNTY2ZDVh NmM1NjZkNWE2YzU2NmQ1YTZjNTY2ZDVhNGM1NjZkNWE0YzU2NmQ1YTRjNTY2YzU2NGM1NjZkNTYN CjZkNTY4ZTVhOGY1YWQxNjJkMjYyZjM2MmQzNjJmNDYyZjM2MmY0NjJmMzYyZjQ2MmYzNjJmMzY2 ZDI2MmQyNjJiMTVlYjE1ZTkwNWFiMTVlYjE1ZWQyNWViMTVlZDI1ZWQyNWVkMzYyZDI1ZWQzNjJk MzVlZjM2MmYzNjJmNDYyDQpmMzYyZjQ2MmY0NjIxNTYzZjQ2MjE1NjdmNTYyMTY2MzE1NjMxNjYz MTU2MzE2NjMxNTYzMTU2NzM1NmIxNjY3MTY2MzM4NjcxNzVmMTk2MzdjNmYxOTY3MzE0NjhjMzU0 OTMxMjgzMTI3MmQ2OTM5ODkzZDkwNjY2ZTY2OGY2YQ0KNmU2YTRkNjYyYzVlMGI1YWE5NDlhYTQ1 ZDQ2MjVhNmZmODVlMTk1ZjE5NWZmODU2OTY0ZTk2NTJkNzU2ZDc1NjJhMjU0MzA4NjQwYzYzMGM2 MzBjODQxMDYzMGM4NDEwODQxMDg0MTA2NDBjODQxMDg0MTA4NDEwODQxMDg1MTANCjg0MTA4NDEw ODQxMDg1MTA4NDEwODQxMDY0MGM4NTEwODQxMDg1MTA4NDEwODUxMDg0MTBhNjE4NjQwYzQzMDgy MjA0NDIwODQzMDg4NTEwYTYxNGE2MTQ4NTE0YTYxNGE1MTRhNjE0YTUxNGE2MThhNjE0YTYxNGE1 MTRhNjE0DQphNjE0YTYxNGE1MTRhNjE0YTYxNGE2MTRhNjE0YzYxOGE2MTRjNjE4YTYxNGM3MThh NjE0YTYxOGE2MTRhNjE4YTYxNGE2MThhNjE0YzcxOGE2MTRhNjE0YTUxNGE2MTRhNjE0YTYxNGE2 MTRjNjE4YTYxNGM2MThhNTE0YTUxNA0KYTUxNGU3MWMyOTI1OGIzMWFjMzU2ZDUyNmQ1NjRkNTI2 ZDU2NGQ1MjZkNTY0ZDUyNmQ1NjRkNTI2ZDUyNGQ1MjRlNTI0ZDUyNmU1MjRkNTI0ZDU2NGQ1NjZl NTY0ZDUyNmQ1NjZkNTY2ZTU2NGQ1NjZlNTY2ZDU2NmU1NjRkNTINCjZkNTY0ZDUyNmQ1NjRkNTI2 ZDU2NGQ1MjZkNTI0YzUyNmU1MjhmNTZiMTVhZDI1YWQzNWVmMzVlZjQ2MmQ0NWVmNDYyZjQ2MmY0 NjJmNDYyZjQ2MmQ0NWVmMzVlYjI1YWIyNWE5MTU2YjI1YWIyNWFkMzVlZDM1ZWQzNWVkMzVlDQpk NDVlZDQ1ZWY0NjJkNDVlZjQ1ZWY0NWUxNTYzZjQ1ZTE1NjNmNTVlMTU2M2Y1NjIxNjYzMTY2MzM2 NjMxNjYzMTY2MzE2NjMzNjY3MTY2MzM2NjcxNjYzMzc2NzE2NjMzNzY3Mzc2NzM4NjczODYzMzk2 NzdiNmJiNTUyZWUzZA0KYWMzOTQ5MzEyNzJkNDczNWViNGQ4ZjY2NmU2NjRjNjI0ZDY2NGQ2NjRk NjJlYTU1YTk0OTI2MzlhYTQxMzA1MmY2NjIzOTY3Mzk2M2Q3NTZiNzUyOTc0ZWI4NGU3NjRhNTQ0 NjA5MWQyMjA0ODQxMDgzMTA2MjBjODMxMDYyMGMNCjYzMGM2MzBjNjQwYzQzMDg4NTEwODQxMDg0 MTA2NDBjODQxMDY0MGM4NDEwNjMwYzY0MGM2NDBjODQxMDY0MGM4NDEwODQxMDg0MTA4NDEwODQx MGE1MTQ4NTEwNDIwODIxMDQyMTA0NjQwYzg0MTA4NTE0ODQxMDg1MTQ4NTEwDQphNTE0YTUxNGE2 MTRhNTE0YTYxNGE1MTRhNjE0YTUxNGE2MTRhNTE0YTYxNDg1MTRhNTE0YTUxNGE2MTRhNTE0YTYx NGE2MTRhNjE0YTYxNGE2MTRhNzE4YTcxODg2MTRhNjE0YTYxNGE3MTRhNjE0YzYxNGE2MTBhNjE0 YzYxNA0KZTgxOGM3MTRhNjE0ODUxMGM2MTRhNDEwYTUxNGM1MTQwODIxNDkyOThiMzE2YjJkNmEy ZDZlNTY2ZTUyNmU1NjZlNTI2ZTU2NGU1MjZlNTI0ZTUyNmU1MjRlNTI2ZTUyNGU1MjZmNTI0ZTUy NmY1MjRlNTI2ZjU2NmU1MjZmNTYNCjRlNTI2ZjU2NmU1MjZmNTY2ZTUyNmY1NjZlNTI2ZjU2NGU1 MjZmNTY0ZTUyNmU1NjRlNTI2ZTU2NGQ1MjZlNTI2ZTUyOTA1NmIxNWFmMzVlZjM1ZTE1NjNmNTVl ZjU2MmY1NjIxNTYzZjU2MmY1NjJmNTYyMTU2M2Y0NWVkMzVhDQpiMjU2YjM1YWIyNTZkMzVhZDM1 YWY1NWVmNDVlZjU1ZWY1NWVmNTYyZjU1ZTE2NjNmNTVlMTY2MzE2NWYxNjYzMTY1ZjM3NjMxNjYz Mzc2MzE2NjMzNzY3Mzc2MzM3NjczNzYzMzg2NzM3NjczODY3Mzc2MzU4NjczODY3Mzg2Nw0KMzc2 NzU4NmIzODY3NTk2NzM5Njc5YzZmZjc1YTUyNDZjZDNkNmEzNTI2MmQ4ODNkMGM1MmIwNmE2ZTZh NmQ2NjRkNjY2ZDY2MmM2MmVhNTU4ODQ5ODg0NTI2Mzk0NzM1Y2M0MWI0NWExODYzZjg2MmI3NTZi ODRlNTY0MmI4NGUNCjk3NGVjZjM1YzcxNDY0MGM2MjBjNjMxMDYyMTA2MjBjNjIwYzg0MTA2NDBj NjQwYzg0MGM4NDEwODQxMDg0MTA2NDBjODQxMDY0MGM4NDEwNjMwYzg0MTA4NDEwODQxMDg0MTA4 NTEwODQxMDg1MTA4NDEwYTUxNDg0MTA2MzBjDQoyMTA0NDIwODYzMGNhNTE0ODQxMGE1MTQ4NTEw YTUxNDg1MTRhNjE0YTYxNGE2MTRhNTE0YTYxOGE1MTRhNjE0YTUxNGE2MThhNTE0YTYxNGE1MTRj NjE4YTYxNGM2MThhNjE0YzcxOGE2MTRjNzE4YTYxNGM4MWNhNzE4YTcxOA0KYTcxOGM3MThhNjE0 YzcxNGE2MTBlODE4YTYxMGE2MTBhNjEwYzcxOGE2MTRjNjE0YTYxNGM2MThlNjE4MjgyNTY5Mjk4 YjMxOGEyZDZhMmQ0OTI1NGU0ZTZlNTI0ZTRlNmU1MjRlNGU0ZTUyNGU0ZTZlNTI0ZDRlNGU1MjRl NGUNCjRlNTI0ZTRlNGU1MjRlNGU0ZjUyNGU1MjZlNTI0ZTUyNmU1MjRlNTI2ZTUyNGU1MjZmNTY0 ZTUyNmU1MjRlNTI2ZTUyNGU1MjRlNTI0ZTUyNGU1MjRkNGU0ZDRlNGQ0ZTZmNTI5MDUyZDI1YWQz NWUxNTYzZjQ1ZWY1NjJmNTVlDQoxNTYzZjU1ZWY1NjJmNTYyMTU2M2Y1NWVmNTVlZDM1YWQzNWFi MjU2ZDM1NmQzNWFmNDVhZjU1ZWY1NWVmNTVlMTY2M2Y1NWUxNjYzMTY2MzE2NjMxNjYzMzc2MzE3 NjMzNzYzMTc2MzM3NjMzNzYzMzc2MzM3Njc1ODY3Mzc2Nw0KNTg2NzM3Njc1ODY3Mzg2NzU4Njcz ODY3NTg2NzM4Njc1ODZiMzg2NzU5NmI1OTY3NWE2NzdiNmIzOTYzYjU1NjMwNDY2OTMxMjczMTg5 NDE0ZTVlNmU2NjZkNmE0YzY2NmQ2YTRjNjY0YzYyZTk1NWE4NTE0NjQxMjUzOWU0MmMNCjQ3MzVh YzQxNzI1MmQ2NWUxOTY3Yjc1MjMzM2U3NTRhOTY0ZTUzNDZhZDMxNjMwODQyMDg2MjA4NjMwYzYy MGM2MzBjNjMwYzg0MTA2MzBjNjQwYzYzMGM4NDEwNjQwYzg0MTA2MzBjODQxMDYzMGM4NDEwNjQw Yzg0MTA2NDBjDQo4NDEwNjQwYzg0MTA4NDEwODQxMDYzMGNhNTE0NjMwYzIxMDQwMDAwNjMwYzg0 MTA4NDEwODQxMDg1MTQ4NTEwYTUxNDg1MTBhNjE0ODUxMGE2MTQ4NTEwYTYxNGE1MTRhNjE0YTUx NGE2MTRhNjE0YTYxNGE2MTRjNjE4YTYxNA0KYzcxOGE2MTRjNzE4YTYxNGM3MThhNjE4YTcxOGE3 MThhNzE4YTYxNGM3MTRhNjE0YzYxNGE2MTBhNjEwYTYxMGM3MThjNjE0YzYxNGE1MTRhNTE0MDcx ZDQ5MjU4YTJkYWMzMTZhMmQ2YTI5MjgyNTQ5Mjk2ZTUyNGU0ZTZmNTINCjRlNGU2ZjUyNGU0ZTZm NTI0ZTRlNGY1MjRlNGU2ZjUyNGU0ZTRmNTI0ZTRlNGY1MjRlNGU2ZjUyNGU1MjZmNTI0ZjUyNmY1 MjRmNTI3MDUyNmY1MjZmNTI0ZjUyNmY1MjRmNTI2ZjUyNGU1MjZmNTI0ZTUyNmU1MjRkNGU2ZTRl DQo2ZjRlOTE1NmIyNWExNTYzMTU1ZjE2NjNmNTVlMTY2MzE2NjMxNjYzMTY2MzE2NjcxNjYzMzY2 MzE1NWZmNTVlZDQ1YWQ0NWFkMzU2ZjU1ZWY1NWExNjYzZjY1ZTE2NjMxNjYzMTc2MzE2NjMzNzY3 MTc2MzM3NjMzNzYzMzg2Nw0KMzc2MzU4NjczNzYzNTg2NzM4Njc1OTY3NTg2NzU5NmI1ODY3NTk2 YjU4Njc3OTZiNTk2Nzc5NmI1OTZiNzk2YjU5NmI1OTZiNTk2YjdhNmI1YTY3N2I2YjdiNmI1YTY3 OTM1MmNjM2Q2ODM1ZWI0OTZlNjI2ZTZhNGM2YTZkNmENCjZjNmE2ZDZlNGM2NjBhNWVjODU1NDU0 NTQ1M2Q0NjNkNDczOTY5MzlhYzQxNzI1NmQ2NjJkNzVhNTQ0YTUzNDYzMjQ2OTU0ZTMyNDIwOTIx NjMwODYzMGM2MzA4ODQxMDg0MTA4NDEwNjMwYzg0MTA2MzBjODQxMDY0MGM4NDEwDQo2NDBjODQx MDYzMGM4NDEwNjQwYzg0MTA2NDBjODQxMDg0MTA4NDEwODQxMDg1MTA4NDEwODQxMDg0MTA4NDEw MjEwNDIxMDQ2MzBjODUxMDYzMGNhNTE0ODUxMGE2MTRhNTE0YTYxNDg1MTRhNjE0ODUxNGE2MTRh NTEwYTYxNA0KYTYxNGE2MThhNjE0YzcxOGE2MTRjNjE4YTYxNGM3MThhNjE0YzcxOGE2MTRjNzE4 YzcxOGE3MThhNzE4YzgxY2M3MThjNzE4YTYxNGM3MTRhNjE0YTYxNGM2MTRlNzFjYzcxOGM2MThh NTE0ZTcxYzA4MjE4YjJkOGIyZGFjMzENCjhiMmQ2YTJkNDkyNTQ5Mjk0OTI5NGU0ZTZmNTI0ZTRl NmY0ZTRmNGU2ZjUyNGU0ZTRmNGU0ZTRlNGY0ZTRmNGU0ZjRlNGY0ZTRmNGU0ZjRlNGY0ZTRmNTI3 MDUyNGY0ZTcwNTI1MDUyNzA1MjUwNTI3MDUyNTA1MjcwNTI0ZjRlDQo3MDUyNGY0ZTcwNTI0ZjRl NmY1MjRlNGU2ZTRlNGU0YTZmNGU5MDUyZDM1YWY0NWExNjYzMTY1ZjE2NjNmNjVlMTY2MzE2NjMx NjYzMTY2MzE2NjMxNjYzMTY2M2Y0NWFkNDVhZDQ1NmQ0NWFkNDVhZjU1ZWY2NWUxNjYzMTY1Zg0K MTc2MzE2NjMzNzYzMTc2MzM4NjczNzYzMzg2MzM4NjM1ODY3Mzg2MzU4NjczODYzNTg2NzU5Njc1 OTY3NTg2NzU5Njc1OTY3Nzk2YjU5Njc3OTZiNTk2Nzc5NmI1OTZiNTk2YjU5NmI1OTZiNTk2NzVh Njc1YTY3OWM2ZjdiNmYNCmY2NjIwZTRhY2I0NTBjNGU4ZjY2NmQ2YTZjNmU2YzZhNmQ2ZTZjNmE0 YjZhMDk1ZWU5NTk4NjQ5NjU0NTI0Mzk0NjNkNjczZGFhNDFhYjQ1ZWQ0NTczNTJmODYyNzM0ZTMx NDY1MjRhNzM0YWVmMzllODE4NjMwODQzMDQ2MzA4DQo4NDEwNDMwODYzMGM2MzEwNjMwYzYzMGM2 NDBjNjMwYzY0MGM2MzBjNjQwYzYzMGM2NDBjNjQwYzg0MTA2MzBjODQxMDY0MGM4NDEwNjQwYzg0 MTA2MzBjYTUxNDYzMGMyMTA0MDAwMDQyMDg2MzBjNjMwYzg1MTBhNTE0ODUxMA0KYTUxNDg1MTBh NTE0ODUxMDg1MTQ4NTEwYTYxNDg1MTBhNjE0YTYxNGM3MTRhNjE0YzcxNGE2MTRjNjE0YTYxNGM2 MTRhNjE0YzcxNGE2MTRjNzE4YTcxNGE3MThhNjE0YzcxOGE3MTRjNzE4YTYxNGE2MTRjNjE0YzYx OGE1MTQNCmE1MTRhNTE4MDgyMTRhMmRhYzM1YWMzMWFjMzE2YTJkNmEyZDQ5Mjk0OTI5NDkyOTRh Mjk5MDUyNmY1MjcwNTI2ZjRlNzA1MjZmNGU3MDUyNmY0ZTcwNTI2ZjRlNzA0ZTUwNGU3MDUyNTA0 ZTcwNGU1MDRlNzE1MjcxNTI3MTUyDQo3MDUyOTE1MjcxNTI3MTUyNzE1MjkxNTI3MTUyNzE1Mjcw NTI3MTUyNzA1MjcxNTI3MDRlOTA1MjZmNGU2ZjRlNzA0ZWIyNTJkMzU2MTU1ZjE2NWYxNzYzMTY1 ZjE3NjMxNjVmMTc2MzE2NjMxNzYzMTY2MzM3NjMxNjVmZjY1ZQ0KZDQ1YWY1NWFmNTVhZjY1ZWY2 NWUxNzYzMTc1ZjE3NjMxNzYzMzg2NzM4NjMzODY3Mzg2MzU5NjczODYzNTk2NzM4NjM1OTY3NTg2 NzU5Njc1ODY3N2E2YjU5Njc3YTZiNTk2NzdhNmI3OTY3N2E2Yjc5NmI3YTZiNzk2Yjc5NmINCjU5 NmI3YTZmNTk2YjdhNmI1YTY3N2E2YjliNmI5YzczNTg2YmIzNWUyZTUyNGU1YThmNjJhZTZlOGQ2 ZThkNzI2YzZlNmM2ZTJhNjYwOTVlYzg1NWE3NTE2NTQ1MjQzZDI1M2Q2NzQxODg0MTg4NDE2ODM5 Y2Q0NWI1NWViNTVhDQo1MjRlMzE0NjMxNDI3NDRhOGQyZGM3MTA0MzAwNDMwODg0MGM2MzBjNDIw ODg0MTA2MzBjNjMxMDYzMGM2NDBjNjMwYzg0MTA2MzBjODQxMDYzMGM4NDEwODQxMDg0MTA2NDBj ODQxMDg0MTA4NDEwODQxMDg0MTA4NDEwODQxMA0KNDIwODIxMDQ0MjA4NjMwYzYzMGNhNTE0ODUx MGE1MTQ4NTEwYTYxNDg1MTRhNjE0ODUxMGE2MTRhNjEwYTYxNGE2MTRjNzE0YTYxNGM3MThjNjE0 YzcxNGE2MTRjNzE0YTYxNGM3MThjNjE0YzcxOGE2MTRjNzE4YTcxOGM3MTgNCmE2MThjNzE4YzYx NGM2MThhNjE0YzYxOGE1MTRjNjE4MDcyMTZhMzFhZDM5Y2QzZGFjMzlhYzM1OGIyZDhiMmQ2YTJk OGIyZDZhMjk0YTI5MjkyNTcwNGU3MDUyNzA0ZTkwNTI3MDRlNzA1MjcwNGU3MDUyNzA0ZTcwNGU3 MDRlDQo3MTRlNTA0ZTcxNGU3MDRlNzE0ZTcxNTI3MjUyNzE1MjkyNTI3MTUyOTI1MjcyNTI5MjU2 NzE1MjkyNTI3MTUyOTI1MjcxNTI3MjUyNzE1MjkxNTI3MDRlNzA0ZTcwNGU3MTRlOTE0ZWQ0NTZm NTVhMTY1ZjE2NWYxNzVmMTc1Zg0KMTc2MzE2NWYxNzYzMTY1ZjE3NjMxNjVmMTY1ZmY1NWFmNTVh ZDQ1NmY1NWFmNjVhMTc1ZjE3NWYzNzYzMTc1ZjM4NjMxODYzMzg2MzM4NjM1OTY3Mzg2MzU5NjM1 OTYzNTk2NzU5NjM1OTY3NTk2Nzc5Njc1OTY3N2E2NzU5NjcNCjdhNmI1OTY3N2E2YjdhNjc3YTZi NTk2NzdhNmI1OTZiN2E2ZjU5NmI3YTZmN2E2YjdiNmI3YTY3N2E2YjdhNmY5YTczMTY2YmIyNjI2 ZjVlOGY2NjhlNmE4ZDZlOGQ2YTZjNmE0YjY2MmE2MmU4NTljODU1ODY0ZDY2NDk0NTQxDQo2NjQx NDYzZDY3NDE2NzQxYTk0NTY4MzljZDQ1MzE1MjczNTYxMDQyMTA0MjMyNDIxMTNhNGMyNTg1MDgy MzAwODUwYzQzMDg0MjBjNjMxMDYzMTA0MjBjNjMwYzYzMGM2MzBjNjMwYzYzMGM2MzBjNjQwYzYz MGM4NDEwNjQwYw0KODQxMDYzMGM4NDEwNjQwYzg0MTA2MzBjODQxMDg0MTA2MzBjMjEwNDIxMDQ0 MjA4ODQxMDY0MTA4NTEwODUxMGE1MTQ4NTEwYTUxNDg1MTBhNjE0YTUxMGE2MTRhNjEwYTcxNGE2 MTBjNzE0YTYxNGM3MTRhNjE0YzcxNGE2MTQNCmM2MTRhNjE0YzYxOGE2MTRjNzE4YTYxOGM3MThh NjE0YzYxOGE2MTRjNjE4YTUxNGM2MThhNTE4MDcyMTQ5MjlhYzM1Y2QzZGVlNDFhYzNkOGIzNThi MzE4YjMxNmIyZDhiMzE2YTJkNmEyZDQ5Mjk0OTI1OTE1MjcxNTI5MTUyDQo5MTUyOTE1MjcxNGU5 MTUyNzE0ZTkxNTI3MTRlOTE1MjcxNGU3MjUyNzE0ZTkyNTI3MTRlOTI1MjkyNTI5MzU2OTI1Mjkz NTY5MjUyOTM1NjkyNTI5MzU2OTI1MjkzNTY5MjUyOTM1MjcyNTI5MzUyOTI1MjkyNTI3MDRlNzE0 ZQ0KNzA0ZTkyNTJkNDU2ZjY1YTE2NWIxNzVmMTc1ZjM3NWYxNzVmMTc2MzE3NWYzNzYzMTc1ZjM3 NjMxNjVmMTY1ZmY1NWFmNTVhZjU1YTE3NWYxNzVmMzg2MzE3NWYzODYzMzg2MzU5NjczOTY3NTk2 NzU5Njc1OTY3NTk2MzdhNjcNCjU5Njc3YTY3NTk2NzdhNmI1OTY3N2E2YjdhNjc3YTZiN2E2Yjdh NmI3YTZiOWI2YjdhNmI3YTZiNzk2YjdhNmY3OTZiN2E2ZjdhNmY5YjZmOWI2YjljNmY1YTY3N2E2 ZjliNzc3OTc3ZjQ2YWIxNjY4ZjY2OGU2YThkNmE4ZTZhDQo2YzY2NGI2MjBhNWUwOTVhZTg1NWE3 NTE2NTQ1NDU0MTQ1NDE4NzQ1ODc0NWE4NDU4OTQ1ODk0MWU1MmNjZDQ1NTE1MjUxNGUzMTQ2MTEz ZTMyNDIzMjNlYzcxMDQ0MDQ4NTBjNjQwYzQyMDg4NDE0NjIwYzYzMGM2MzBjNjQwYw0KNjMwYzY0 MGM2MzBjODQxMDYzMGM4NDEwNjQwYzg0MTA4NDEwODQxMDY0MGM4NDEwODQxMDg0MTA4NDEwODQx MDYzMGM0MjA4MjEwNDQzMDg4NDEwODUxMDg0MTBhNTE0ODUxMGE2MTQ4NTE0YTYxNGE1MTRhNjE0 YTYxMGM3MTQNCmE2MTRjNzE0YTYxNGM3MTRjNjE0YzcxOGM2MTRjNzE4YzYxOGM3MThjNjE4Yzcx OGM2MThjNzE4YzYxOGM3MThhNjE4YzYxOGE1MThjNjFjYzUxODQ5MmQ4YjM1ZWU0MWNkM2RhYzM5 OGIzNWFjM2RhYzM5YWMzNThjMzFhYzMxDQo4YjJkNmIyZDRhMjk2YTJkNDkyOTkxNTJiMjUyOTE1 MjkyNTI5MTUyOTI1MjkxNGU5MjUyNzE0ZTkyNTI3MTRlOTI1MjcyNGU5MjUyNzI0ZTkyNTI5MjUy OTM1MjkyNTI5MzUyOTM1MjkzNTI5MzUyOTM1MjkzNTI5MzUyOTI1Mg0KOTM1MjkzNTI5MzUyOTI1 MjkzNTI5MTUyOTE1MjcxNGU5MjUyOTM1MmQ1NTZmNTU2MTc1YjE2NWIxNzVmMTc1YjE3NWYxNzVm MTc1ZjE3NWYxNzYzMTc1ZjE3NWZmNjVhZjY1YWY1NWExNzVmMTc1YjM3NWYzODVmMzg2MzM4NWYN CjM5NjMzODYzNTk2NzM5NjM1OTY3NWE2NzdhNjc1OTY3N2E2NzVhNjc3YTZiNWE2NzdhNmI3YTZi N2I2YjdhNjc3YjZiN2E2NzdiNmI3YTY3N2E2YjdhNjc3YTZiNzk2YjdhNmI3OTZiN2E2ZjdhNmI3 YTZiNWE2NzliNmY1OTZiDQo1OTZmNzg3NzM1NzM5MDYyOGY2NjhlNjY4ZTZhNmQ2MjRjNjIyYjVl MGE1NmM4NGRhODRkNjY0NTY2NDE0NTNkNjY0MTQ1M2Q0NjNkNjczZGE5NDVjYjQ5NjgzZDA2MzE2 YTM5MzA0YTk0NTIzMjQ2ZDAzNTMzNDJjZjMxZTgxNA0KNDMwNDIxMDA2MzBjNjMxMDYyMGM0MzBj NjMwYzQzMDg2MzBjNjMwYzYzMGM2MzBjNjMwYzYzMGM2NDBjNjMwYzY0MGM2MzBjODQxMDYzMGM4 NDEwNjMwYzg0MTA2MzBjODQxMDQyMDgyMTA0MjEwNDg0MTA2MzBjNjQwYzY0MGMNCjg1MTA4NTEw YTUxNDg1MTBhNjE0YTYxMGE2MTRhNjEwYzcxNGM2MTRjNzE4YTYxNGE2MTRhNjE0YzYxOGM2MThj NzE4YzYxOGM2MThhNTE0YzYxOGE1MTRhNjE4ODQxMDg0MTQ4NDE0ZTcyMDI5Mjk4YzM1YWQzZGNk M2RhYzM5DQphYzNkYWIzOWFjM2RhYjM5YWMzOThiMzE4YzMxNmIyZDhiMmQ2YTI5NmEyZDQ5Mjk0 OTI5YjM1NjkyNTJiMjUyOTI1MmIyNTY5MjUyOTI1MjkyNTI5MzUyOTI1MjkzNTI5MjUyOTM1Mjky NTI5MzUyOTI1MmI0NTY5MzUyOTM1Mg0KOTM1MmI0NTY5MzUyYjQ1NjkzNTJiNDU2OTM1MmI0NTY5 MzUyYjQ1NjkzNTJiNDU2OTM1MjkyNTI5MjUyOTI1MjkyNGViNDUyZDU1NmY2NWExNjViMTc1ZjE3 NWIxNzVmMTc1YjE3NjMxNzVmMzc2MzE3NWYzNzYzMTc1ZjE2NWYNCmY2NWExNzVmMTc1YjM4NWYz NzVmNTk2MzM4NjM1OTY3Mzk2MzVhNjc1OTY3NWE2NzVhNjc3YTZiN2E2NzdhNmI3YTY3N2I2Yjdh Njc3YTZiN2E2NzliNmY3YTZiN2I2YjdhNmI3YjZiN2E2YjdiNmI3YTZiOWI2YjdhNmI3YTZiDQo3 OTZiN2E2ZjdhNmI3YTZmN2E2YjljNmY5YjZmN2E2Zjc5NzM3ODc3ZjM2YTkwNjY4ZjY2OGY2NjZl NjY4ZTY2NGQ1ZTRjNWUwYTU2ZTk1MWE4NDk4ODQ1NjY0MTY3NDE0NjNkNjczZDQ2Mzk0NjM5Njcz ZGE5NDU2ODNkNjgzOQ0KNDgzNThiMzljZTNkMzE0NjUzNDYxMTNlZjAzOTZkMmRhNjEwNDIwODIx MDQ0MjBjNDEwODYzMGM2MzBjNjMwYzYzMGM2NDBjNjMwYzY0MGM2MzBjODQxMDYzMGM4NDEwNjMw Yzg0MTA2NDBjODQxMDY0MGM4NDEwNjMwYzg0MTANCjg0MTA2MzBjMjEwNDQyMDg2MzBjNjQwYzY0 MGM4NDEwODQxMGE1MTQ4NTE0YTYxNGE1MTRjNjE0YTYxMGM3MTRhNjE0YzcxOGM3MTRjNzE4YzYx OGU3MWNjNzE4YzcxOGE2MThjNjE4YzYxOGU2MWNlNjFjODQxNGE1MTgwNzIxDQowODI1NGEyZDZh MzFhYzM5Y2QzZGNkNDFjYzNkY2MzZGFiM2RjYzNkYWIzZGFiM2RhYjM5YWMzNThjMzE4YzMxNmIy ZDZiMmQ0YTI5NGEyOTQ5Mjk5MjUyYjM1MjkyNTJiMzUyOTI1MjkzNTI5MjUyOTM1MjkyNTI5MzUy OTM1Mg0KYjM1NjkzNTI5MzUyOTM1MmIzNTY5MzUyOTM1MjkzNTI5MzUyOTM1MjkzNTI5MzUyYjQ1 NjkzNTI5MzUyOTM1MmI0NTI5MzUyOTM1MjkzNTJiMzUyOTI1MjkyNTI5MjRlOTM1MjkzNTJkNTU2 ZjY1YTE3NWZmNzVhMTc1ZjE3NWINCjE3NWYxNzVmMTc1ZjE3NWYxNzYzMTc1ZjE3NWZmNjVhMTY1 ZmY2NWExNzVmMTc1ZjM4NjMzODYzNTk2NzM5Njc1YTY3NTk2NzVhNmI1YTY3N2E2YjVhNjc3YTZi NWE2YjdhNmI1YTZiN2E2YjdhNmI3YTZiN2E2YjdhNmI3YTZiDQo3YTZiN2E2YjdhNmI3YTZiN2E2 YjdhNjc3YTZiNzk2YjdhNmY3OTZiN2E2ZjdhNmI3YjZmOWI2ZjdhNmI3YTZmOWE3NzE2NmJiMjY2 NmY2MjZlNjI2ZTYyNmU2MjRkNWU0YzVhMGI1MmVhNGRhODQ5YTg0NTg3NDE4NzQxNjczZA0KNjcz ZDQ3Mzk0NjM5MjUzNTI2MzUyNTM1NjczOTY4Mzk0ODM1MDcyOTI5MjlhZDM1MzE0NjExM2UxMjQy Y2YzNTJhMjU2NDEwNDIwODQxMDg0MjBjNDIwODYzMGM0MzA4NjMwYzQzMDg2MzBjNjMwYzYzMGM2 MzBjNjMwYzYzMGMNCjY0MGM2MzBjNjQwYzYzMGM4NDEwNjMwYzYzMGM2MzBjODQxMDYzMGM0MjA4 MjIwNDQzMDg0MzBjNjQwYzY0MGM4NTEwODQxMDg1MTQ4NTEwYTYxNGE2MTBhNjE0YTYxMGM2MTRh NTEwYTYxNGE1MTRhNjE0ODQxMGM1MThjNjE4DQplNzIwYzYxY2M1MThhNDE0YTQxNGU2MWMyODI5 NmEzMWFjMzljYzNkY2QzZGFjM2RjZDQxYWMzZGNjM2RhYzNkY2MzZGFiMzlhYjNkYWIzOWFjMzk4 YjMxOGMzMThiMzE4YjMxNGEyZDRhMmQ0OTI5NGEyOWIzNTY5MjUyYjM1Ng0KOTI1MmIzNTY5MzUy YjM1NjkzNTJiMzU2OTM1MmI0NTY5MzUyYjQ1NjkzNTJiNDU2OTM1MmIzNTI5MzUyYjQ1NjkzNTJi NDU2OTM1MmI0NTZiMzUyYjQ1NjkzNTJiNDU2OTM1MmI0NTY5MzUyYjQ1NjkzNTJiMzU2OTI1Mjkz NTINCjkzNTJiNDU2ZDU1NjE3NWIxNzViMTc1ZjE3NWIxNzVmMTc1ZjE3NWYxNzVmMzc2MzE3NWYz ODYzMTc1ZjE3NWYxNjVmMTc1ZjE3NWYzODYzMzg2MzU5Njc1OTY3NWE2YjVhNjc3YTZiNWE2Yjdi NmI3YTZiN2E2YjdhNmI3YTZiDQo3YTZiN2E2YjdhNmI5YjZmN2E2YjliNmY3YTZiOWI2ZjdhNmI3 YjZmN2E2YjdiNmY3YTZiN2E2YjdhNmI5YTZiN2E2YjlhNmY3YTZiOWE2ZjdhNmI5YjZmNTk2Nzli NzM5YTc3MTU2YjcwNWU2ZjYyNGQ1ZTRkNWUyYzVhMmM1YQ0KZWE1MWNhNGQ4ODQ1ODg0MTY3M2Q4 ODQ1NjczZDY4NDE2NzNkNjgzZDQ3Mzk0NjM5MjUzMTA1MzEyNTMxNDczNTI3MzEyNzJkMDcyNTI5 MjkyYTI5ZjA0MWYwNDExMTQyYWUzNTA4MjE0MzA4NDIwODYzMGM2MzBjNDMwODYzMGMNCjYzMGM2 MzBjNjMwYzY0MGM2MzBjNjQwYzYzMGM2NDBjNjMwYzY0MGM2MzBjODQxMDYzMGM4NDEwNjMwYzg0 MTA4NDEwODQxMDYzMGM0MzA4NDIwODY0MGM2MzBjODQxMDg0MTA4NTE0ODUxMGE2MTRhNTE0YTYx NGE2MTRjNzE0DQpjNjE0YzYxNGE1MTRjNjE4YTUxNGU3MWNhNTE4YTUxNDgzMTBhNDE4YzUxYzI4 Mjk2YTJkYWIzOWFiMzllZDQxZWQ0MWVkNDFhYzNkY2M0MWFiM2RjYzQxYWMzZGNjNDFhYjNkY2Mz ZGFiMzljYjNkYWIzOWFjMzU4YzMxOGMzMQ0KNmIzMTZiMmQ0YTI5NmEyZDQ5Mjk5MzU2YjM1Njky NTJiMzU2OTM1MmIzNTY5MjUyYjM1NjkzNTJiMzU2OTM1MjkzNTY5MzUyYjM1NjkzNTJiMzU2OTM1 MmIzNTI5MzUyYjM1MjkzNTJiMzU2OTM1MmIzNTY5MzUyYjM1NjkzNTINCmIzNTI5MzUyYjM1Njkz NTJiMzUyOTM1MmIzNTI5MjUyYjM1MmI0NTJkNTU2ZjY1YTE3NWYxNzViMTc1ZjE3NWIxNzVmMTc1 ZjE3NWYxNzVmMTc2MzE3NjMzNzYzMTY1ZjE3NWYxNjVmMzc2MzM4NjMzOTY3Mzk2NzU5Njc1OTY3 DQo1OTZiNWE2NzdhNmI1YTZiN2E2YjdhNmI3YTZiN2E2YjdhNmI3YTZiN2E2ZjdhNmI3YTZmN2E2 YjdiNmY3YTZiN2E2ZjdhNmI3YTZmN2E2YjdhNmI3YTZiOWE2Yjc5NmI3YTZiNzk2YjdhNmY3YTZi OWE2YjdhNmI3YTZiOWE2Zg0KNzk3M2IyNWU0ZTVhMmM1YTJjNWEwYjVhMGI1YWM5NTFjOTRkODg0 OTg3NDU2NzQxNjc0MTY3M2Q2NzNkNDczOTQ3M2Q0NzM5NDczZDI2MzUyNjM1ZTQyY2U0MjhjMzI0 ZTUyOGU1MjhlNjI4YTUxY2E1MTgwODI1NmIzMWNmM2QNCjExNDY2YzJkODQxMDIxMDQ0MzA4NDIw ODYzMGM0MjA4NjMwYzQzMDg2MzBjNDMwODYzMGM2MzBjNjMwYzQzMDg2MzBjNjMwYzY0MGM2MzBj NjMwYzg0MTA4NDEwNjMwYzg0MTA4NDEwODQxMDQyMDg0MjA4NDMwYzY0MGM2MzBjDQo4NDEwODQx MGE1MTQ4NTEwYTUxNDg1MTBhNjE0YTYxNGM2MThhNjE0YzYxOGE1MTRjNTE4YTQxNGM1MThhNTE4 ZTYyMDA3MjU2YTMxYWMzOWVlNDVjYzNkZWM0MWNjM2RjYzQxYWIzZGNjNDFhYjNkY2M0MWFiM2Rj YzQxYWIzZA0KYWIzZGFiMzlhYzNkYWIzOWFjMzk4YzM1OGMzNTZiMzE2YjMxNmEyZDZhMmQ0OTI5 NGEyOWIzNWFiMzU2YjM1NmIzNTZiNDU2YjM1NmIzNTY5MzU2YjM1NjkzNTZiNDU2OTM1NmI0NTY5 MzU2YjQ1NjkzNTZiMzU2YjM1MmIzNTYNCmIzNTJiNDU2YjM1NmI0NTZiMzUyYjQ1NmIzNTJiMzU2 YjM1MmI0NTZiMzUyYjM1NjkzNTJiMzU2OTM1NmIzNTY5MzUyYjQ1NmQ1NTZmNzVlMTc1YjE3NWYx NzViMTc1ZjE3NWYzNzYzMTc1ZjM3NjMxNzVmMzg2MzE3NjMxNzYzDQoxNjVmMzc2MzM3NjMzOTY3 Mzk2NzU5NmI1OTY3NWE2YjU5Njc3YTZiN2E2YjdiNmI3YTZiOWI2ZjdhNmI3YjZmN2E2YjliNmY3 YTZmOWI2ZjdhNmY5YjZmN2E2ZjliNmY3YTZiOWI2ZjdhNmI3YTZmN2E2YjliNmI3YTZiOWE2Yg0K N2E2YjlhNmY3YTZiOWE2ZjdhNmI5YjZmOWI2ZjliNzMzNjY3OTE1YTJkNTIyYzVhMGI1YTJiNWEw YjVhZWE1NWM5NTFjYTUxYTk0OWE5NDlhODQ1Njg0MTY3NDE2NzNkMjYzOTQ2MzkyNjM5NDczOTI1 MzUyNjMxZTQyOGMzMjANCmEyMWNhMzIwYTQyMGM1MjBhNTFjYzUyMGE1MWM0YTJkZWYzZDExNDY2 YjJkODUxMDAwMDA2MzBjNDIwODYzMGM0MjA4NjMwYzYzMGM2MzBjNjMwYzYzMGM2MzBjNjMwYzYz MGM2NDBjNjMwYzY0MGM2MzBjODQxMDYzMGM4NDEwDQo4NDEwYTUxNDg0MTA2MzBjNDIwODY0MGM2 MzBjODQxMDY0MTA4NTE0ODUxMGE1MTQ4NTEwYTYxNGE1MTRjNjE4YTUxNGE1MTQ4NDE0YTUxOGE0 MThhNTE4ZTYyMDZhMzFjZDNkMGY0NmVlNDFjZDQxYWIzOWVkNDVlYzQxZWM0MQ0KY2I0MWNjNDFj YjQxY2M0MWFiNDFjYzQxYWM0MWNjNDFhYjNkY2MzZGFiMzljYzM5YWMzOWFjMzk4YzM1OGMzNTZi MzE2YjMxNmEyZDZhMmQ0YTI5YjM1NmIzNTZiMzU2YjM1NjkzNTZiMzU2OTM1NmIzNTY5MzUyYjM1 NjkzNTYNCmI0NTY5MzUyYjM1NjkzNTZiNDU2OTM1MmIzNTY5MzUyYjM1NjkzNTJiMzU2YjM1NmIz NTY5MzUyYjM1NmIzNTJiMzU2OTM1MmIzNTZiMzUyYjM1NjkzNTZiMzU2OTM1MmIzNTJiNDUyZDU1 NmY2NWExNzVmZjY1YTE3NWYxNzVmDQoxNzVmMTY1ZjE3NWYxNjVmMTc2MzE3NjMxNzYzMTY1ZjE3 NjMxNjVmMzc2MzM4NjM1OTY3NTk2NzU5NmI1OTZiN2E2YjU5NmI3YTZiN2E2YjdhNmY3YTZiN2E2 ZjdhNmY3YTZmN2E2ZjdhNmY3YTZmOWI2ZjdhNmY3YTZmN2E2Zg0KN2E2ZjdhNmI3YTZmN2E2Zjdh NmY3YTZiOWE2YjdhNmI5YTZmNzk2YjlhNmY3YTZiOWI2ZjdhNjdiYzczNzk2ZmQ0NWU0ZjUyNGQ1 NjJjNWE0YzVlMmI1ZTJjNjIyYzVlMmM1ZTBiNWEwYjU2Y2E1MWNhNTFhOTQ5YTk0OTY4NDENCjQ2 MzkwNTM1MjUzNTA1MzUyNjM1MDUyZDA1MjljMzIwYTIxYzgyMTg4MzFjYTMxY2M1MjBhNDFjODQx ODg0MTgwODI1YWQzOWVmM2QyYTI1NjMwYzQyMDQ0MjA4NDIwODQzMDg0MjA4NjMwYzQzMDg2MzBj NDIwODYzMGM0MzA4DQo2MzBjNDMwODYzMGM2MzBjNjMwYzYzMGM4NDEwNjMwYzg0MTA4NDEwODQx MDYzMGM2MzBjNDMwODY0MGM2MzBjODQxMDg0MTA4NTEwODUxMGE1MTRhNTE0YzUxNGE1MTRhNTE0 ODQxNGM1MThlNjFjMDgyNThiMzFhYzM5YWMzOQ0KY2QzZGFjM2RjZDQxYWMzZGNjNDFjYjQxZWI0 MWNiNDFjYjQxYWI0MWNiNDFhYTNkYWI0MWFiNDFjYzQxYWIzZGNjM2RhYjM5YWIzOWFiMzVhYzM5 OGMzNThjMzU4YzMxOGMzMTZhMmQ2YTJkNGEyOTRhMjliNDVhYjM1NmI0NWENCmIzNTZiMzU2YjM1 NmIzNWFiMzU2YjM1NmIzNTZiNDU2YjM1NmI0NTZiMzU2YjQ1NmIzNTZiMzU2YjM1MmI0NTZiMzU2 YjQ1NmIzNTZiNDU2YjM1NmIzNTZiMzU2YjQ1NmIzNTZiMzU2YjM1NmI0NTZiMzU2YjQ1NjkzNTZi MzU2DQpiMzUyYjQ1NmQ1NWExNzVmMTc1ZjE3NWYxNzVmMTc1ZjE3NWYxNzYzMTc1ZjM3NjMxNzYz Mzg2MzE3NjMxNzYzMTY1ZjE3NjMxNzYzNTg2NzU5Njc1YTZiNTk2YjdhNmI3YTZiN2E2ZjdhNmI3 YjZmN2E2ZjliNmY3YTZmOWI3Mw0KN2E2ZjliNmY3YTZmOWI3MzdhNmY5YjZmN2E2ZjliNmY3YTZm N2I2ZjdhNmY3YjZmN2E2YjliNmI3YTZiOWI2YjdhNmI5YTZmNzk2ZjlhNmY3YTZmNTk2YmJiNzc1 ODZmNzE1NjRlNTI0ZTVhNmU2MjhlNjY2ZTY2NmQ2NjhlNmENCjZlNjY2ZTY2MmM1YTBiNTZjYTUx MGI1NmViNTFhYTRkNDYzZDA1MzkwNDM1MjUzOTA1MzUyNjMxMDUyOWU0MjRjMzIwYzQyNGEzMjBh MzIwNjIxODgzMThhNDFjYTQxYzQyMTBjNjFjOGMzMWNlMzk0YTI5NDIwODQyMDg0MzBjDQo0MjA4 NjMwYzQzMDg2MzBjNjMwYzYzMGM0MzA4NjMwYzYzMGM2MzBjNjMwYzYzMGM2MzBjODQxMDYzMGM4 NDEwODQxMDg0MTA4NDEwODQxMDYzMGM2MzBjNjMwYzg0MTA4NDEwODUxNDg0MTRhNTE0ODQxNDg0 MTQ4NDE0YTUxOA0KYTUxOGU2MjAyODI5YWMzOWVkNDFlZDQxZWQ0MTBlNDZlZDQxZWQ0NWNjNDFl ZDQ1ZWM0MWNiNDFjYTNkY2I0MWNhNDFjYjQxYWI0MWNjNDVhYjQxY2M0MWFiNDFjYzQxYWIzZGNj M2RhYjM5Y2MzOWFjMzlhYzM1OGMzNThjMzUNCjZiMzE2YjMxNGEyZDZhMmQ0YTI5YjM1NmQzNTZi MzU2YjM1NmIzNTZiMzU2YjM1NmIzNTZiMjU2YjM1NmIyNTJiMzU2YjI1NmIzNTZiMjUyYjM1NmIz NTJiMzU2YjM1MmIzNTZiMzU2YjQ1NmIzNTZiMzU2YjM1NmI0NTZiMzU2DQpiMzU2YjM1NmIzNTY5 MzUyYjM1NmIzNTZiMzU2YjI1MmIzNTZiNDU2ZDU1YWQ2NWFmNzVlZjc1ZTE3NWZmNzVhMTc1ZmY3 NWUxNzVmMTc1ZjE3NjMxNzVmMTg2MzE3NWYxNzYzMTc1ZjM4NjMzODYzNTk2NzU5NmI3YTZiNTk2 Yg0KN2E2YjdhNmI3YjZmN2E2YjdiNmY3YjZmOWI2ZjdhNmY5YjZmN2I2ZjliNmY3YTZmOWI2Zjdi NmY5YjZmN2E2ZjliNmY3YTZmOWI2ZjdhNmY5YjZmN2E2YjlhNmI3YTY3OWE2ZjdhNmY5YTczNzk2 Zjk5NzM5YTdiNzg3N2QzNjYNCjZmNWEyZDU2NmY1ZThmNjI5MDZhNmU2NjhmNmE2ZTY2NmU2NjZk NjI2ZTYyMmM1ZTBjNWEwYzVhMGI1NmE5NGQ4ODQ1NDYzZDI1M2QwNDM5MjUzOTI2MzUyNjMxZTUy Y2U1MmNjNDI0YTMyMDgyMTg4MzFjODMxY2E0MWM4MzE4DQo4NDE4ODMxNGM1MWMyODI1OGMzNTA3 MjUyMTA4MDAwMDYzMTA0MjBjNDIwODYzMGM2MzBjNDMwODYzMGM0MzA4NjMwYzQyMGM2MzBjNDIw YzYzMGM2MzBjNjMwYzQzMDg4NDEwODQxMDg0MTA2MzBjODQxMDg0MTA2MzEwNDIwYw0KODQxNDg0 MTQ4NDE4NjMxNDgzMTg0MTEwODMxOGU1MjQ0ODMxOGEzOWNjNDFjYzQxZWM0NWNiNDFlYzQxY2I0 MWViNDFjYjQxZWI0MWNiNDFjYjQxMTYxMDAwMDAyNjA2MGYwMDIyMjA1NzRkNDY0MzAxMDAwMDAw MDAwMDAxMDANCjAwMDAwMDAwMDAwMDA3MDAwMDAwMDAyMDAwMDA0MDc1MDAwMDQwZDUwMDAwY2I0 MWNiNDFjYTQxY2I0MWFiM2RjYjQxYWIzZGNiNDFhYjNkY2M0MWFiM2RjYzNkYWIzZGNjM2RhYjM5 YWMzOThjMzVhYzM1OGIzMThiMzE2YTJkDQo2YTJkNDkyOTRhMjlkMzVhYjM1NmQzNWFiMzU2ZDM1 YWIzNTZkMzU2YjI1NmQzNTZiMjU2YjM1NmIyNTZkMzU2YjI1NmIzNTZiMzU2YjM1NmIzNTZiNDU2 YjM1NmI0NTZiMzU2YjQ1NmIzNTZkNDU2YjM1NmI0NTZiMzU2YjQ1Ng0KYjM1NmIzNTZiMzU2ZDM1 NmIzNTZiMzU2YjM1NmQ0NWFkNTVhZjY1ZWY2NWUxNzVmZjc1ZTE3NWZmNzVlMTc1ZjE3NWYxODYz MTc1ZjM4NjMxNzYzMzg2MzE3NWYzODYzMzg2MzU5Njc1OTY3N2E2YjdhNmI3YTZiN2E2YjdiNmYN CjdhNmY5YjZmN2E2ZjliNmY5YjZmOWI2ZjdiNmY5YjZmOWI2ZjliNmY3YjZmOWI2ZjliNmY5YjZm N2I2ZjliNmY3YjZmOWI2ZjdhNmI5YjZiOWI2YjliNmY3YTZiOWE3Mzk5NzM5YTc3Nzg3Nzc4Nzdm NDZhOTE2MjRmNWU2ZjVlDQo2ZjYyOTA2NjkwNmE4ZjZhOGY2YThmNmE4ZjY2OGY2YThmNjY2ZTY2 MmM1ZTRkNjIyYzVhMGI1NmE5NGQ4ODQ5NDY0MTI1M2QyNTM5MjYzOTA1MzEwNjMxMDUyZGU1Mjhh MzIwYTMyMGEzMjBhNDIwYTMxY2E0MWM4MzE4ODMxOA0KODMxNGM2MjAwNzI1NDkyZDA3MjU0MjBj MDAwMDYzMGM0MzBjNDIwODYzMGM2NDBjNDMwYzYzMGM2MzBjNjMwYzYzMGM2MzEwNjIwYzg0MTA4 MzBjODQxMDg0MTBhNTEwODQwYzg0MTA4NDBjNjMwYzYzMTBhNDE0ODMxNDYyMTANCjQxMGM4MzE4 YzUyNDQ4MzU0ODM1OGEzZGNiNDFlYzQ5ZWM0OWVjNDVlYjQ1ZWI0NWViNDFlYjQ1Y2E0MWViNDVj YTQxZWI0MWNhNDFlYjQ1Y2I0MWNiNDFjYjQxY2I0MWNiNDFjYjQxY2IzZGNjNDFjYjNkY2M0MWNi M2RjYzNkDQphYjNkYWMzZGFjMzlhYzM5OGMzNWFjMzU4YjMxOGIzMTZhMmQ2YTJkNGEyOWIzNTZk MzU2YjM1NmQzNTZiMjU2YjM1NmIyNTZiMzU2YjI1MmIzNTZiMjU2YjM1NmIyNTJiMzU2YjI1NmIz NTY5MjUyYjM1NmIzNTZiMzU2YjM1Mg0KYjM1NmIzNTZiNDU2YjM1NmIzNTZiMzU2YjM1NmIzNTJi MzU2YjM1MmIzNTZiMzUyYjM1NmIzNTJiMzU2YjM1NmQ1NWFmNjVhZjc1ZWY3NWExNzVmZjc1ZTE3 NWZmNjVhMTc1ZjE3NWYxNzVmMTc1ZjE4NjMxNzVmMzg2MzE3NWYNCjM4NjMzOTY3NWE2YjVhNmI3 YTZiN2E2YjdhNmY3YTZiN2I2ZjdhNmI5YjZmN2I2ZjliNmY3YjZmOWI2ZjdiNmY5YjZmN2I2Zjli NmY3YjZmOWI2ZjdiNmY5YjZmN2E2ZjliNmY3YTZmOWI2ZjdhNmI5YjZmOWI2YjlhNmY3OTZmDQo5 YTc3OTk3Nzc4NzcxNTZiOTE2MjRlNWE2ZjYyOGY2MjZmNjI2ZjYyYjA2YThmNjZhZjZhOGY2YThm NmE4ZjY2OGY2YTZlNjI0ZDYyMmQ1ZTRkNWUyYzVhMGI1NmE5NGQ2NzQ1NDY0MTQ2M2QwNTM1MjUz NTA1MzEwNjMxZTQyYw0KYzMyNGEzMjRjNDI0YTMyMGEzMjBhNDFjYTQxYzgzMTQ4MzE0NjMxNGE0 MTgwODI5NmIzMWM2MWMwMDA0MDAwNDQyMDgyMjA4NjMwYzQzMDg2MzBjNDMwODYzMGM0MzA4NjMw YzQzMGM2MzBjNjMwYzg0MGM2NDBjNjQwYzY0MGMNCjg1MTA4NDEwODUxMDQyMDg0MjBjNDEwYzgz MTRhNDFjMjcyOTZhMzVjYzQxY2M0NWVjNDllYzQ5MGQ0YWVjNDllYzQ5Y2I0NWViNDVjYjQxZWI0 NWNhNDFlYjQ1Y2E0MWViNDFjYTQxZWI0MWNhNDFjYjQxY2I0MWNiNDFhYjNkDQpjYjQxY2IzZGNi NDFhYjNkY2M0MWNiM2RjYzQxYWIzZGFiM2RhYjM5YWMzOThiMzVhYzM1OGIzMThiMzE2YTJkNmEy ZDRhMjk2YTI5ZDM1YWIzNTZkMzVhYjM1NmQzNTZiMzU2ZDM1YWIzNTZiMzU2YjI1NmQzNTZiMjU2 YjM1Ng0KYjI1NmQzNTZiMzU2YjM1NmIzNTZiNDU2YjM1NmI0NTZiMzU2ZDQ1NmIzNTZiNDU2YjM1 NmQ0NTZiMzU2YjQ1NmIzNTZiNDU2YjM1NmIzNTZiMzU2YjM1NmIzNTZkNDVhZDU1YWY2NWVmNzVl MTc1ZmY3NWUxNzVmZjc1ZTE3NWYNCjE3NWYxODYzMTc1ZjM4NjMxNzYzMzg2MzE4NjMzODYzMzg2 MzU5NmI1OTZiN2E2ZjdhNmI3YjZmN2E2ZjliNmY3YjZmOWI2ZjliNmY5YjczOWI2ZjljNzM5YjZm OWI3MzliNmY5YzczOWI2ZjliNzM5YjZmOWI3MzliNmY5YjZmDQo3YjZmOWI2ZjliNmY5YjZiOWI2 YjliNmY3YTZmOWI3M2JhNzc5OTc3MTU2ZmQzNjY3MDVlNmY1ZTkwNjJiMTZhOGY2NjkwNmE4ZjZh OGY2YThmNmFiMDZhOGY2NjhmNjY2ZTYyNGU2MjJjNWEyZDVlMmQ1ZTRlNjIyYzVhZWI1NQ0KYTk0 ZDg4NDk4NzQ1Njc0MTQ2Mzk0NjM5MDUzNTA1MzFlNDJjZTQyOGM0MjRjNDI0YTMyMGM0MjBjNDIw YzUxYzgzMTg4MzE4ODMxNGM1MWNlNjIwNDkyZGM2MWMwMDA0MDAwMDg0MTA2MzBjNjMwYzQzMDg2 NDBjNjMwYzY0MGMNCjYzMGM2NDBjNjMwYzY0MGM2NDBjNjQwYzQzMDg4NDBjYTUxMGM2MTRhNTE0 YzUxOGE1MTRlNjIwNDgyZGNjM2RlZTQ1MGU0YWVkNDVlZDQ5ZWM0OWVkNDllYzQ1ZWM0OWNiNDVl YzQ1ZWI0NWVjNDVjYjQ1ZWI0NWViNDVlYjQ1DQpjYjQxZWI0NWViNDFlYjQ1Y2I0MWVjNDVjYjQx Y2I0MWNiNDFjYzQxY2I0MWNjNDFjYjNkY2M0MWNjM2RjYzNkYWIzZGNjM2RhYzM5YWMzOThjMzVh YzM1OGIzMThiMzE2YTJkNmEyZDRhMjliMzU2ZDM1YWIyNTZiMzVhYjI1Ng0KYjM1YWIyNTZiMzU2 YjI1NmIzNTZiMjU2YjM1NmIyNTZiMzU2YjI1NmIzNTY5MzU2YjM1NjkzNTZiMzU2YjM1NmIzNTZi MzU2YjM1NmIzNTZiMzU2YjM1NmIzNTZiMzU2YjM1NjkyNTZiMzU2YjI1MmIzNTZiMjUyYjM1NmI0 NTYNCmQ1NWFkNjVhZjc1ZWY3NWExNzVmZjY1YWY3NWVmNjVhMTc1ZmY3NWUxNzVmMTc1ZjM4NjMx NzVmMzg2MzE4NjMzOTY3NTk2NzdhNmI3YTZiN2I2ZjdhNmI3YjZmN2E2ZjliNmY3YjZmOWI2Zjli NmY5YjczOWI2ZjliNmY5YjZmDQo5YjczOWI2ZjliNmY5YjZmOWI3MzdiNmY5YjZmOWI2ZjliNmY3 YjZmOWI2ZjliNmI5YjZmN2E2YjlhNmY5Yjc3YmE3YjM2NmZkMzY2NmY1YTkwNWU2ZjYyOGY2Njhm NjZiMDZhOGY2YThmNmE2ZTY2OGY2YThmNmE4ZjZhNmU2Ng0KNmU2NjJkNWUyYzVlMGM1YTJkNWUy ZDVlMmQ1ZTBjNWFlYjU1YTk0ZGE5NGRhOTQ5ODg0NTQ2M2QyNjM5MDUzNTA1MzVjNDJjYzMyOGMz MjRjNDI0YzQyMGM1MjRjNDIwYTQxYzgzMThhNDE4NjIxNDgzMTQwNzI1MjkyOTYzMTANCjAxMDQ0 MjA4NjMwYzQzMDg2MzA4NDMwODYzMGM0MzA4NjQwYzQzMDg2MzBjNjQwYzg0MTA2NDBjNjQwYzg0 MGNhNTE0ODQxMDYzMGM0MjBjMjgyNWVlNDE3MjUyNTA1MjJmNGFlYzQ1ZWM0NWVjNDVlYzQ5Y2I0 NWVjNDVjYjQ1DQplYzQ5ZWM0NTBjNGFlYjQ1ZWI0NWNiNDFlYjQ1Y2I0MWViNDVjYTQxZWI0NWNi NDFlYjQ1Y2I0MWNiNDFjYjQxY2I0MWNiNDFjYzQxY2IzZGNjNDFjYjNkY2M0MWFiM2RjYzNkYWIz OWFjMzk4YzM1YWMzNThiMzE4YjMxNmEyZA0KNmEyZDQ5Mjk0YTI5ZDM1YWIzNTZkMzVhYjM1NmQz NWFiMzU2ZDM1YWIyNTZiMzVhYjI1NmIzNTZiMjU2YjM1YWIyNTZiMzU2YjI1NmIzNTZiMzU2YjM1 NmIzNTZiMzVhYjM1NmIzNWFiMzU2YjQ1YWIzNTZiMzVhYjM1NmIzNWENCmIzNTZiMzU2YjM1NmIz NTZiMzU2YjM1NmIzNTZkNDVhZDU1YWY2NWVmNjVlMTc1ZmY3NWUxNzVmZjc1YTE3NWYxNzVmMTc1 ZjE3NWYzODYzMTg2MzM4NjMxODYzMzk2NzM5Njc1YTZiN2E2YjliNmY3YTZmOWI2ZjdiNmY5Yjcz DQo5YjZmOWM3MzliNmZiYzczOWI2ZjljNzM5YjZmYmM3MzliNmY5YzczOWI2ZmJjNzM5YjZmOWM3 MzliNmY5YzczOWI2ZjliNzM5YjZmYmM2ZjliNmI5YjZmOWE3M2JiNzc1ODczZjQ2YTkxNWU0ZTVh NmU1ZThmNjY2ZTYyOGY2Ng0KOGY2YWIwNmU4ZjZhOGY2YThmNmFiMDZlOGY2YTkwNmE4ZjZhOGY2 YTRlNjI0ZTYyNGQ2MjRlNjIyZDVlMmQ1ZTBiNWFlYjU1Y2E1MWViNTVjOTRkODg0OTQ2NDE0NjNk MjYzOTA1MzFjMzI4ZTUyY2M0MjhlNTI4ZTUyNGU1MjgNCmE0MjBhNDIwYTQxY2E0MWNhNDFjYTQx OGM2MWMyODI1NjMxMDAwMDA0MjA4NjQwYzYzMDg2NDBjNjMwODY0MGM2MzBjNjQwYzYzMGM2NDBj NjMwYzg0MTA4NDEwODUxMDYzMGM2MzBjNjMwY2U3MjBhYzM1NzI1MjkyNTY3MTUyDQowZTRhMGQ0 YTBkNGEwZDRlZWM0OWVkNDllYzQ5ZWQ0OWVjNDkwZDRhZWM0OWVjNDllYjQ1ZWM0NWViNDVlYjQ1 ZWI0NWViNDVlYjQxZWM0NWViNDVlYzQ1Y2I0MWVjNDVjYjQxZWM0MWNiNDFjYzQxY2M0MWNjNDFj YzNkY2M0MQ0KYWIzZGNjM2RhYzM5YWMzOThjMzVhYzM1OGIzMThiMzE2YTJkNmEyZDRhMjliMzU2 YjM1YWIzNTZkMzVhYjI1NmIzNTZiMjU2YjM1NmIyNTZiMzU2YjI1NmIzNTZiMjU2YjM1NmIyNTZi MzU2OTI1NmIzNTZiMzU2YjM1NjkzNTYNCmIzNTZiMzU2YjM1NmIzNTZiMzU2YjM1NmIzNTY5MzU2 YjM1NjkzNTZiMzU2YjI1MmIzNTZiMzUyYjM1NmIzNTZkNTVhZjY1YWY3NWVmNjVhZjc1ZWY2NWFm NzVlZjY1YTE3NWYxNzVmMTc1ZjE3NWYzODYzMTg2MzM4NjMzODYzDQo1OTY3NTk2NzdhNmI3YTZi N2I2ZjdhNmY5YjZmN2I2ZjliNmY5YjZmOWM3MzliNmY5YjczOWI2ZjljNzM5YjZmOWI3MzliNmY5 YzczOWI2ZjliNzM5YjZmOWM3MzliNmY5YjZmOWI2ZjliNmY5YjZmOWI2ZjlhNmZiYjczNTg2Zg0K MTU2N2IxNWU5MDYyNGU1ZTZlNjI0ZTYyNmU2NjZlNjY2ZTZhNmU2NjhmNmE2ZTY2OGY2YWIwNmVi MDZlOGY2YThmNmE2ZjY2NmY2NjRkNjI0ZDYyMGM1YTBjNWUwYzVhMGM1YWViNTVlYTU1Y2E1MWVh NTVjOTUxODg0OTQ2NDENCjQ2M2QwNTM1ZTQzMGMzMmNlNDJjZTQyYzA1MmRjNTI4YzQyNGEzMjBj NDIwYTQyMGM1MjQ4MzE4YTQxODA4MjVlNzIwNDIwODIyMDQ0MzA4NjMwYzQzMDg2NDBjNDMwODY0 MGM2MzA4NjQwYzQzMDg0MzBjNDMwYzg0MTA0MzA4DQo2MzBjYzYxODRhMjk1MjRlOTM1MjcyNTI1 MDUyMGU0YTBkNGFlYzQ1ZWI0NWVjNDllYzQ5ZWM0OWVjNDllYzQ1ZWM0OWVjNDVlYzQ5Y2I0NWVj NDVlYjQ1ZWM0NWNiNDVlYjQ1ZWI0MWViNDVjYjQxZWM0NWNiNDFlYjQ1Y2I0MQ0KY2I0MWNiNDFl YzQxY2IzZGNjNDFjYzNkY2M0MWFiM2RjYzNkYWIzZGFjM2Q4YjM1YWMzNThiMzE4YjMxNmEyZDZh MmQ0YTI5NmEyOWQzNWFiMzU2ZDM1YWIzNTZkMzVhYjM1NmQzNWFiMzU2YjM1NmIyNTZiMzVhYjI1 NmIzNTYNCmIyNTZiMzVhYjI1NmIzNTZiMzU2YjM1YWIzNTZiMzU2YjM1NmI0NWFiMzU2YjM1YWIz NTZiNDVhYjM1NmIzNTZiMzU2YjM1NmIzNTZiMzU2YjM1NmIzNTZiMzU2ZDQ1YWQ1NWFmNjVlZjc1 ZTE3NWZmNzVhMTc1ZmY3NWUxNzVmDQpmNzVlMTc1ZjE3NWYzODYzMTg2MzM4NjMzODYzMzk2NzM5 Njc3YTZiN2E2YjliNmY3YjZmOWI2ZjliNmY5YjczOWI2ZmJjNzM5YjczYmM3MzliNmZiYzczOWI3 M2JjNzM5YjZmYmM3MzliNzNiYzczOWI2ZmJjNzM5YjZmOWM3Mw0KOWI2ZjljNzM5YjZmYmM3Mzlh NmZiYjczOWE3NzU3NmZiMjVlOTA1ZTkwNjJkMTZhNmU2MjRkNjI2ZTY2OGY2YTRkNjI2ZTY2OGY2 YTZlNmE4ZjZhYjA2ZThmNmE4ZjZhNmY2NjhmNmE2ZTY2NGU2MjJjNWUwYzVhZWI1NTBjNWENCjBi NWEwYzVhY2E1NWM5NTFlYTU1MGI1YWM5NTE4ODQ5NDYzZDI2M2QwNTM1ZTQyY2U0MmMwNTMxMDYz MTA2MmRjNDI0YzQyNGM0MjRjNDIwYTMxY2M1MjRjNTFjYzUxYzI5MjkwODI1MDAwMDYzMGM0MzA4 NjQwYzY0MDg2NDBjDQo2MzA4NjQwYzYzMGM4NTEwNjQwYzY0MGM2NDBjNjQwYzg1MTA4YzMxOTM1 MmI0NTY5MzU2OTI1NjUwNGU0ZjRlMmU0ZTJlNGVlYzQ5ZWM0OWVjNDllYzQ5ZWM0OTBkNGFlYzQ5 MGQ0YWVjNDllYzQ5ZWM0NWVjNDllYjQ1ZWM0NQ0KZWI0NWVjNDVlYjQ1ZWM0NWViNDVlYzQ1Y2I0 MWVjNDVjYjQxZWM0NWNjNDFjYzQxY2M0MWVjNDFjYzQxY2M0MWFiM2RjYzNkYWMzOWFjMzk4YzM1 YWMzNThiMzE4YjMxNmEyZDZhMmQ0YTI5YjM1NmIzNWFiMjU2YjM1YWIzNTYNCmIzNWFiMjU2YjM1 YWIyNTZiMzVhYjI1NmIzNTZiMjU2YjM1YWIyNTZiMzU2YjM1NmIzNWFiMzU2YjM1YWIzNTZiMzVh YjM1NmIzNWFiMzU2YjM1YWIzNTZiMzVhYjM1NmIzNWFiMjU2YjM1NmIzNTZiMzU2YjI1MmIzNTZi MzU2DQpkNTVhZDU1YWY2NWVmNjVhZjc1ZWY2NWFmNzVhZjY1YTE3NWZmNzVlMTc1ZjE3NWYxODYz MTc2MzM4NjMzODYzNTk2NzU5NmI3YjZmN2E2ZjliNmY3YTZmOWI2ZjliNmY5YzczOWI2ZjljNzM5 YjczYmM3MzliNmZiYzczOWI3Mw0KYmM3MzliNmZiYzczOWI3M2JjNzM5YjZmOWM3MzliNmY5Yzcz OWI2ZjliNzNiYzczYmM3N2JiN2I3OTczYjI1ZTkxNWU5MDYyNmY2MjhmNjY2ZTY2NGQ2NjZlNjY0 ZDY2NmU2YTRkNjY2ZTY2YjA2ZThmNmE0ZDYyMGI1YWNhNTUNCmNhNTVhODRkODg0ZDY3NDU2NjQ1 NDY0MWE4NGRjYTUxY2E1NWE5NGRhOTRkODg0ZGE4NTFhODRkYTk0ZDg3NDk2NzQxMjUzOTI1Mzkw NDM1ZTMyY2U0MmMyNjM1MDUzMTA1MzFlNDI4YzQyOGU1Mjg4MjFjYzQyMGU2MjQ2MjE0DQplNjIw NmIzMTI5Mjk0MjA4MDEwMGE1MTA0MzA4MjIwNDYzMDg2NDBjNjQwYzg1MTAwMTAwNjQwY2E1MTQy MjA0OGMzMWY2NWViNTU2OTM1NjkyNTI1MDRlNTA1MjJlNGUyZDRhZWM0NWVjNDllYzQ5ZWM0ZGVj NDllYzQ5ZWM0OQ0KZWM0OWVjNDllYzQ5ZWM0NWVjNDllYzQ1ZWM0OWViNDVlYzQ1Y2I0MWViNDVj YjQxZWM0NWNiNDFlYjQ1Y2I0MWVjNDVjYjQxY2M0MWNiM2RjYzQxY2IzZGNjNDFjYzNkY2MzZGFi MzlhYzNkOGMzNWFjMzU4YjMxOGIzMTZhMmQNCjZhMmQ0YTI5NmEyOWQzNWFiMzVhZDM1YWIzNWFk MzVhYjM1YWQzNWFiMzVhZDM1YWIzNTZiMzVhYjM1NmQzNWFiMzU2YjM1YWIzNTZkMzVhYjM1NmIz NWFiMzU2ZDQ1YWIzNWFkNDVhYjM1YWQ0NWFiMzVhZDM1YWIzNTZkMzVhDQpiMzU2YjM1YWIzNTZk MzU2YjM1NmIzNTZiMzUyZDQ1NmQ1NWFmNjVlZjY1YTE3NWZmNjVhZjc1ZWY2NWExNzVmZjc1ZTE3 NWYxNzVmMzg2MzE4NjMzODYzMzg2MzU5Njc1OTY3N2E2YjdhNmI5YjZmOWI2ZjliNmY5YjZmOWM3 Mw0KOWI2ZmJjNzM5YjczYmM3MzljNzNiYzczOWM3M2JjNzM5YzczYmM3MzljNzNiYzczYmM3M2Jj NzM5YzczYmM3MzljNzNiYzczOWI3M2JiNzc5Yjc3OWE3NzM2NmZkMzY2OTE2MmIwNjY4ZjY2OGY2 YTZlNjY2ZDY2NGQ2NjZlNmENCjZlNjY2ZjZhNmU2NjhmNmE2ZTY2NGQ2MmVhNTVhOTRkODc0OTg3 NDk2NzQ1ODg0ZDY2NDU2NjQ1NDY0NTY3NDk2NzQ1ODc0OTg3NDk4ODQ5ODc0OWE4NGRhODRkYTg0 ZDY3NDU2NjQxNDYzZDI1MzllMzMwMDQzMTI1MzUyNTM1DQowNTMxMDUzMWMzMjhjMzI0YTMyNGU1 MjhlNTI4YzUyMGE0MWMyODI5YWMzNTI5MjUyMTA0MjIwNDQzMDhhNTEwNjQwYzQzMDg4NDEwNjQw Yzg1MTA2MzBjNDMwYzZiMmQ3MzRlZDY1YWQ1NWFiNDVhOTI1MjcxNTI1MDUyNGY1Mg0KMGQ0YTBj NGFlYjQ5MGM0ZWVjNDkwYzRlZWM0OTBjNGVlYzQ5MGQ0YWVjNDkwZDRhZWM0OWVjNDllYzQ1ZWM0 OWVjNDVlYzQ1Y2I0NWVjNDVlYjQ1ZWM0NWNiNDFlYzQ1Y2I0MWVjNDFjYjQxY2M0MWNjNDFjYzQx Y2MzZGNjNDENCmNjM2RjYzNkYWMzOWFjMzk4YzM1OGMzNTZiMzE4YjMxNmEyZDZhMmQ0YTI5YjM1 NmQzNWFiMzVhZDM1YWIzNTZkMzVhYjM1YWQzNWFiMjU2YjM1YWIyNTZiMzVhYjI1NmIzNWFiMjU2 YjM1YWIyNTZiMzVhYjM1NmIzNWFiMzU2DQpiMzVhYjM1NmQzNWFiMzU2YjM1YWIzNTZkMzVhYjI1 NmIzNWFiMjU2YjM1YWIzNTZiMzU2YjM1MmIzNTZiMzU2ZDU1YWQ1NWFmNjVlZjY1YWY3NWFmNjVh Zjc1ZWY2NWExNzVmMTc1ZjE3NWYxNzVmMTg2MzE4NjMzOTY3Mzg2Mw0KNTk2NzVhNmI5YjZmN2I2 ZjliNmY5YjZmOWI3MzliNmY5YzczOWI2ZmJjNzM5YjczYmM3MzljNzNiYzczOWI3M2JjNzM5Yzcz YmM3MzljNzNiYzczYmM3M2JjNzM5YzczYmM3MzljNzNiYzc3OWE3MzlhNzczNzZmZjQ2NmIyNjYN CmIxNjY5MDZhYjA2ZTZkNjY2ZDY2NGM2MjRkNjY0ZDYyNmU2NjZlNjY2ZjY2MmQ2MjRkNjIyYzVl ZWE1NTg3NDk4NzQ5ODc0OWE4NGQ4NzQ5ODc0OTY3NDU2NzQ1MjUzZDI1M2QyNTQxNjc0OTY2NDU2 NzQ1Njc0NTg4NDk4NzQ1DQo4ODQ1NjY0MTQ3NDEwNDM5MDQzNTA0MzUyNTM5MDQzNTA1MzUwNDM1 ZTQzMGEyMjRlNDJjYzMyNGU1MjhlNjI4ODMxOGE0MThjZDNkMGY0MmU3MjAwMTAwNDMwODg0MTA4 NTEwMjIwNDg1MTA0MzA4YTUxNDQyMDhlNzFjNzM0ZQ0KMzg2N2I1NWFkNTVlOTM1NjkyNTY3MDUy NzA1MjJlNGUyZDRlZWM0NTBjNGFlYjQ5ZWM0OWViNDllYzRkZWM0OWVjNDllYzQ5MGM0YWVjNDVl YzQ5ZWM0NWVjNDljYjQ1ZWM0NWNiNDVlYzQ1Y2I0MWVjNDVjYjQxZWM0NWNiNDENCmNjNDFjYjQx Y2M0MWNiM2RjYzQxY2MzZGNjNDFhYjNkY2MzZGFiM2RhYzNkOGMzNWFjMzU4YjMxOGIzMTZhMmQ2 YTJkNGEyOTZhMmRkMzVhYjM1YWQ0NWFiMzVhZDM1YWIzNWFkNDVhYjM1YWQzNWFiMzU2ZDM1YWIz NWFkMzVhDQpiMzU2ZDM1YWIzNWFkMzVhYjM1NmQzNWFiMzVhZDM1YWIzNWFkNDVhYjM1YWQzNWFi MzVhZDQ1YWIzNWFkMzVhYjM1YWQzNWFiMzU2ZDM1YWIzNTZkMzU2YjM1NmQ0NTZkNTVhZjY1ZWY2 NWVmNzVlZjY1YWY3NWVmNjVhMTc1Zg0KZjY1YTE3NWYxNzVmMzg2MzE4NjMzOTY3Mzg2NzU5Njc1 OTY3N2I2ZjdiNmY5YjczOWI2ZjljNzM5YjZmYmM3MzljNzNiYzczYmM3M2JjNzdiYzczYmQ3N2Jj NzNiYzc3YmM3M2JkNzdiYzczYmM3N2JjNzNiZDc3YmM3M2JjNzMNCmJjNzNiYzc3YmI3M2JiN2I3 OTc3MTU2YmIxNjJmMjZhZDE2YWIwNmViMDcyOGU2YTRkNjY0ZDY2MmM2MjRlNjY2ZTY2NmY2YTZm NjY2ZjY2NmU2NjRkNjJlYTU1YTg0ZDg3NDk4ODRkODc0OTY3NDU2NzQ1ODg0ZDY3NDk0NjQ1DQoy NTNkNDY0MTQ2NDE2NzQ1NDY0MTY3NDU2NzQ1ODc0NTY3NDU2NzQ1NDY0MTQ3NDEyNTM5MjYzZDI1 M2QyNTM5MjUzOTI1MzllNDMwZTQzMGU0MmNhMzI4YzQyODI3MzFhMzIwODMxODQ5MmQ3MjUyMGY0 MmU3MjAyMjA0MjEwNA0KODUxMDYzMGM2MzBjODQxMDIwMDRjNjE4MzA0NmY3NWVmNzVlZjY1ZWI0 NTZiNDVhOTI1NjcxNTI1MDUyNGY1MjBkNGEwZDRhZWM0OTBjNGVlYzQ5MGM0ZWVjNDkwYzRlZWM0 OTBkNGVlYzQ5ZWM0OWVjNDllZDQ5ZWM0NWVjNDkNCmVjNDVlYzQ5Y2I0NWVjNDVlYjQ1ZWM0NWNi NDFlYzQ1Y2I0MWVjNDVjYzQxY2M0MWNiM2RjYzQxY2M0MWNjNDFhYjNkY2MzZGFjMzlhYzM5OGMz NWFjMzU4YjMxNmIzMTZhMmQ2YTJkNGEyOWIzNWFkMzVhYjM1YWQzNWFiMzVhDQpkMzVhYjM1YWQz NWFiMzVhZDM1YWIzNWFiMzVhYjM1YWQzNWFiMzVhYjM1YWIzNWFkMzVhYjM1YWQzNWFiMzVhZDM1 YWIzNWFkMzVhYjM1YWQzNWFiMzVhZDM1YWIzNWFkMzVhYjM1YWIzNWFiMzU2ZDM1NmIzNTJiMzU2 YjM1Ng0KZDU1YWQ1NWFmNjVlZjY1YWY3NWVmNjVhZjc1YWY2NWExNzVmZjc1ZTE3NWYxNzVmMzg2 MzM4NjMzOTY3Mzk2NzVhNmI3YTZiOWI2ZjliNmY5YzczOWI2ZjljNzM5YjczYmM3MzljNzNiYzcz YmM3M2JjNzdiYzczYmM3M2JjNzMNCmJjNzdiYzczYmM3M2JjNzNiYzczOWM3M2JjNzM5YzczYmM3 MzliNzNiYjc3OWE3Yjc4N2JkMzY2YjE2MmQyNmVkMTcyOGY2YWIwNzI2ZTZhNmQ2YTJiNjIyYzYy NGQ2MjZmNjY2ZjY2NmY2NjkwNmE4ZjZhMmM1ZWVhNTU4ODRkDQo4NzQ5NDU0NTQ1NDEyNTQxNDY0 NTQ2NDU0NjQ1MjU0MTI1NDEwNDNkMjUzZDQ2NDE2NzQxNDYzZDQ3NDE0NzQxNjc0NTY3NDE2NzQ1 ODg0NTY3NDU0NjQxNDY0MTI1M2Q0NTNkMjUzZDA0MzllMzM0YzMyY2EyMjhlNDJjZTUyYw0KZTUy OGE0MjBjNTIwY2QzZGI0NWFjZTNkYzYxODAwMDA2MzBjNDMwODYzMGM0MjBjNjIwY2FjMzUxNzYz ZjY1ZWI0NTZkNTVhYjQ1YTkzNTY5MjU2NzE1MjcwNTIyZjRlMmU0ZWVjNDkwYzRhZWM0OWVjNGRl YjQ5ZWM0ZGVjNDkNCmVjNGRlYzQ5ZWM0OWVjNDllYzQ5ZWM0NWVjNDljYzQ1ZWM0NWNiNDVlYzQ1 Y2I0NWVjNDVjYjQxZWI0NWNiNDFlYzQ1Y2I0MWNjNDFjYjNkY2M0MWNiM2RjYzQxY2MzZGNjM2Rh YjM5YWMzZDhjMzVhYzM1OGIzMThiMzE2YTJkDQo2YTJkNGEyOTZhMjlkNDVlZDM1YWQ0NWVkMzVh ZDQ1ZWQzNWFkNDVlZDM1YWQ0NWViMzVhZDM1YWIzNWFkNDVlYjM1YWQzNWFiMzVhZDQ1ZWIzNWFk NDVlYjM1YWQ0NWVkMzVhZDQ1ZWQzNWFkNDVlZDM1YWQ0NWViMzVhZDQ1ZQ0KZDM1YWQzNWFiMzVh ZDQ1YWQzNTZkNDU2YjM1NmQ0NWFkNTVhZjY1ZWY2NWExNzVmZjY1YWY3NWVmNjVhMTc1ZmY3NWUx NzVmMTc1ZjM4NjMzODYzMzk2NzM4Njc1OTZiNWE2YjdiNmY3YjZmYmM3MzliNzNiYzczOWM3M2Jj NzMNCmJjNzNiYzc3YmM3M2RkNzdiYzczYmQ3N2JjNzNkZDc3YmM3M2JkNzdiYzczYmQ3N2JjNzNi Yzc3YmM3M2JjNzdiYzczYmM3MzliNzdiYTdmNTY3N2YzNmViMTZhZjI2ZWQwNmVhZjZlYWY3Mjhl NmU0YzY2MmI2MjBiNWU0ZTYyDQo2ZjY2OTE2NjcwNjY5MDZhNmU2YTRkNjIwYjVhZWE1OWM5NTFh ODUxNjc0OTg4NDk2NzQ5Njc0OTI1NDEyNTQxMjU0MTQ2NDUyNTQxNjc0MTQ3M2Q2NzQxNDczZDY3 NDE2NzQxNjg0NTg4NDVjYTUxODg0OTg4NDk2NjQ1NDY0NQ0KNDY0NTY2NDUyNDNkZTMzNGMyMmMw NDM1MDUzMWM0MjhlNDI4MDYyZGE0MjA0YTMxNzI1Mjk0NTZjZTNkZTYxYzQzMGM2NDEwODMxMDQx MDg4YjMxYjQ1YTE3NjMxNzYzZDU1YWQ1NWFmNTVlYjQ1YTkyNTY3MTUyNTA1MjUwNTINCjBlNGUw ZDRlZWM0OTBjNGVlYzRkMGM0ZWVjNDkwYzRlZWM0ZDBkNGVlYzQ5MGQ0ZWVjNDllYzQ5ZWM0NWVk NDllYzQ1ZWM0NWNjNDVlYzQ1ZWI0NWVjNDVjYjQxZWM0NWNiNDFlYzQxY2I0MWNjNDFjYzQxY2M0 MWNjM2RjYzQxDQpjYzNkY2MzZGFjMzlhYzM5OGMzNThjMzU2YjMxOGIzMTZhMmQ2YTJkNGEyOWIz NWFkNDVlZDM1YWQ0NWViMzVhZDQ1ZWQzNWFkNDVlYjM1YWQzNWFiMzVhZDM1YWIzNWFkMzVhYjM1 YWQzNWFiMzVhZDM1YWIzNWFkNDVlYjM1YQ0KZDM1YWQzNWFkNDVlYjM1YWQ0NWViMzVhZDQ1ZWIz NWFkMzVhYjM1YWQzNWFiMzU2ZDM1NmIzNTZiNDU2YjM1NmQ1NWFkNTVhZjY1ZWY2NWFmNzVhZjY1 YWY3NWVmNjVhMTc1ZjE3NWYxNzVmMTc2MzM4NjMzODYzNTk2NzM5NjcNCjdhNmI3YTZiOWI2Zjli NmY5YzczOWI3M2JjNzM5YzczYmM3M2JjNzNiZDc3YmM3M2JkNzdiYzczYmQ3N2JjNzNiZDc3YmM3 M2JkNzdiYzczYmM3N2JjNzNiYzc3YmM3M2JjNzNiYzczYmI3Nzc4NzcxNTczZjI2YWYyNmViMDZl DQphZjZlYWY2ZThlNzI0YzY2MmI2MmVhNTkwYjVhMmQ1ZTZmNjY5MTY2OTE2YTZlNjY4ZjZhNmU2 YTZlNmE0ZDYyNGQ2MjBjNWUwYzVlMGI1YTBiNWFjYTUxODg0OTQ2NDE0NjQ1NDY0NTY3NDUyNjM5 NDczZDQ3M2Q0NzNkMjUzOQ0KMjYzOTQ2M2Q4ODQ1Y2E1MWE5NGQ4ODQ5ODc0OTQ2NDU4NzQ5ODc0 OTY2NDVlMzM0ZTMzNDA0MzUwNTM1YzMyY2U1MmMwNjJkZTYyOGU2MjhjZDQxNzM1Mjk0NTZhYzM1 NjMxMDYzMTA2MzEwYzUxYzkzNTIzODY3ZjY1ZWY2NWUNCjE2NjNkNDVhZjY1ZWIzNTY5MjU2NzE1 MjcxNTYyZjRlMmU0ZWVkNDkwZDRlZWM0OWVjNGRlYjQ5MGM0ZWVjNDllYzRkZWM0OTBjNGVlYzQ5 ZWM0OWVjNDVlYzQ5Y2M0NWVjNDVjYzQ1ZWM0NWNiNDFlYzQ1Y2I0MWVjNDVjYjQxDQpjYzQxY2I0 MWNjNDFjYjNkY2M0MWNjM2RjYzQxYWIzZGNjM2RhYjNkYWMzZDhjMzVhYzM1OGIzMThiMzE2YTJk NmEyZDRhMjk2YTJkZDQ1ZWQzNWFkNDVlZDM1YWQ0NWVkMzVhZDQ1ZWQzNWFkNDVlYjM1YWQ0NWVk MzVhZDQ1ZQ0KYjM1YWQ0NWVkMzVhZDQ1ZWIzNWFkNDVlZDM1YWQ0NWVkMzVhZDQ1ZWQzNWFkNDVl ZDM1YWQ0NWVkMzVhZDQ1ZWQzNWFkNDVlZDM1YWQ0NWFiMzU2ZDQ1YWIzNTZkNDVhZDQ1YWY2NWVm NjVlZjc1ZWY2NWFmNzVlZjY1YTE3NWYNCmY2NWExNzVmMTc1ZjM4NjMzODYzNTk2NzM5Njc1OTZi NWE2YjliNmY5YjZmYmM3MzljNzNiYzczYmM3M2JjNzdiYzczZGQ3N2JjNzdkZDc3YmQ3N2RkNzdi ZDc3ZGQ3N2JjNzNkZDc3ZGM3N2RkNzdiYzc3ZGQ3N2JjNzdkZDc3DQpiYzczZGQ3N2JiNzc3ODdi ZjM2ZWYzNzJmMjcyYjA2ZWFmNmVkMDcyOGU2ZTRjNjYwYTVlZWE1OWVhNTUyZDVlNmY2MmIxNmFi MTZhYjE2ZWIxNzJmMjc2YjE3MjkwNmU2ZTY2NGU2NjJkNjI2ZjZhNmU2NjRlNjJjYTU1ODg0OQ0K Njc0NTY3NDU2NzQxNDczZDQ3Mzk2ODNkMjYzOTA1MzUwNDM1MjYzOTQ2NDFlYjU1YTk1MWE5NTE4 NzRkODc0OTg4NGRjOTUxNjc0OTQ2NDUyNTNkMDQzNWUzMzQyNjM5MDUzNTA1MzEwNjJkZTUyNDI4 MzEzMDRhOTM1NmVmNDENCjgzMTA4MzEwMDAwMGNkMzlkNTVhNTk2YjE2NjMxNjYzMTY2M2Y2NWVk NDVhYjQ1YTkyNTY3MjU2NTA1MjUwNTIwZTRlMGQ0ZWVjNDkwZDRlZWM0ZDBjNGVlYzRkMGM0ZWVj NDkwZDRlZWM0OWVjNDllYzQ5ZWQ0OWVjNDllYzQ5DQpjYzQ1ZWM0OWNjNDVlYzQ1ZWI0NWVjNDVj YjQ1ZWM0NWNiNDFlYzQ1Y2M0MWNjNDFjYjQxY2M0MWNjNDFjYzQxYWIzZGNjM2RhYzM5YWMzOThj MzVhYzM1OGIzMTZiMzE2YTJkNmEyZDRhMjlkMzVhZDQ1ZWQzNWFkNDVlZDM1YQ0KZDQ1ZWIzNWFk NDVlZDM1YWQ0NWViMzVhZDQ1ZWQzNWFkNDVlYjM1YWQ0NWVkMzVhZDQ1ZWIzNWFkNDVlZDM1YWQ0 NWViMzVhZDQ1ZWQzNWFkNDVlYjM1YWQ0NWVkMzVhZDQ1ZWIzNWFkNDVlYjM1YWQzNWFiMzU2ZDQ1 YWI0NWENCmQ1NWFkNTVhZjc1ZWY2NWFmNzVlZjY1YWY2NWFmNjVhZjY1ZWY2NWUxNzYzMTc2MzM4 NjczODY3NTk2NzU5Njc3YTZmN2E2ZjliNzM5YjczYmM3MzliNzNiYzc3YmM3M2JkNzdiYzczYmQ3 N2JkNzdiZTc3YmQ3M2RkNzdkYzczDQpkYzczYmI3M2RjNzNkYzc3YmM3N2JjNzdkZDdiYmI3N2Jj NzdiYzczOWE3NzM2NzdmMjZlZDA2YWQxNmVkMDZlZDE3MjhlNmE0ZDY2MGI1ZTBiNWVhODRkNjY0 NTY3NDVhOTQ5Y2I1MTJlNWU0ZTYyNmY2YTRmNmE0ZTY2MGM1ZQ0KZWI1ZGM5NTVjOTU1ODg0ZGE5 NTFhOTRkYTk0ZDg4NDk0NzQxMDUzNWU0MzBlNDI4MjUyZGU0MjhjMjI0YTIyNGU0MzAwNDM1MDUz OWE5NGRlYjU1ODg0ZDg4NGQ4NzRkODc0ZDg3NGRhODUxODc0OTI1M2RlMzM0MDMzNTA0MzkNCjA0 MzllMzM0MjUzNWEyMjRlNTJjNDgzNTUwNTJhYjM5ZTYxYzI4MjU1MTQ2MTc2MzE4NjMxNzVmMTc2 M2Y2NWVmNjVlZDU1YWQ0NWFiNDVhYjM1YTcxNTI3MDUyNGY1MjJlNTIwZDRlZWM0OWVjNDkwYzRl ZWM0OTBjNGVlYzQ5DQowZDRlZWM0OWVjNDllYzQ5ZWM0OWVjNDVlYzQ5ZWI0NWVjNDVjYjQ1ZWI0 NWNiNDVlYjQ1Y2E0MWNiNDVjYjQxY2I0NWNiNDFjYjQxY2I0MWNjNDFjYjQxY2M0MWFiM2RjYzQx YWIzZGFjM2Q4YzM1YWMzNThiMzE4YjMxNmEyZA0KNmEyZDQ5Mjk0YTI5ZjQ1ZWQ0NWVkNDVlZDQ1 ZWQ0NWVkNDVlZDQ1ZWQzNWFkNDVlZDM1YWQ0NWVkMzVhZDQ1ZWQzNWFkNDVlZDM1YWQ0NWVkMzVh ZDQ1ZWQzNWFkNDVlZDM1YWQ0NWVkMzVhZDQ1ZWQzNWFkNDVlZDM1YWQ0NWUNCmQzNWFkNDVlZDM1 YWQzNWFkMzVhZDQ1YWI0NWFkNTVhZDU1YWY2NWVmNjVlZjc1ZWY2NWVmNzVlZjY1YWY2NWVmNjVh MTc1ZjE3NWYzODY3Mzg2MzU5Njc1OTY3N2E2YjdhNmI5YjZmOWI2ZmJjNzc5YzczYmM3N2JjNzNi ZDc3DQpiYzc3YmQ3N2JkNzdiZTdiYmU3N2RlNzdkZDczZmQ3N2RjNzNkYzczZGI3M2RjNzdiYjcz YmI3YmJiN2JkYzdiYmM3YmRkN2I5YTc3NTU3N2YxNmVkMTZlZDA2ZWQwNmVhZjZhNmU2NjJiNWEw YjVlMGI1YWE5NGQ0NjQxNjY0MQ0KNDY0MTY3NDU4ODQ5YWE1MTg5NTFhOTUxODg0ZDg4NGQ2NjQ5 MjU0NWUzM2NlMzNjZTMzOGUzMzhlMzM0ZTMzMGEyMmNhMTI4ODEyMDYwMTg4MTE4ODExYzYwMWNh MjI0ZTQyYzI1MzkwNTM5YWE0ZGViNTVhOTUxODg0ZGE5NTENCjg3NGRhODUxYTg1MWE5NGQ0NTNk MDQzOTAzMzkwNDNkZTMzNDAzMzkwNDM5NDYzOTA0MmQyNjMxNzE1NmY1NjI5MzU2YjQ1MmY2NWEz ODY3MTg2MzM4NjMxNzYzMTc2M2Y2NWVmNjVlZDU1YWQ0NWE5MzU2OTI1NjUwNTI1MDU2DQoyZTUy MGQ0ZWVjNDkwZDRlZWM0ZDBkNGVlYzRkMGQ0ZWVjNGQwZDRlZWM0OTBkNGFlYzQ5ZWM0OWVjNDVl YzQ5ZWM0NWVjNDVjYjQ1ZWI0NWNiNDVlYjQ1Y2I0NWViNDVjYjQ1Y2M0NWNiNDFjYzQ1Y2I0MWNj NDFjYjQxY2M0MQ0KYWI0MWFjNDFhYzNkYWMzOThjMzU4YzMxNmIyZDZiMzE2YTJkNmEyZDQ5Mjlk MzVhZDQ1ZWQ0NWVkNDVlZDM1YWQ0NWVkMzVhZDQ1ZWQzNWFkNDVlZDM1YWQ0NWVkMzVhZDQ1ZWQz NWFkNDVlZDM1YWQ0NWVkMzVhZDQ1ZWQzNWENCmQ0NWVkMzVhZDQ1ZWQzNWFkNDVlZDM1YWQ0NWVk MzVhZDQ1ZWQzNWFkNDVlYjM1YWQzNWFiMzVhZDQ1YWI0NWFkNTVhZDU1YWY2NWVmNjVhZjY1ZWY2 NWFmNjVlZjY1YWY2NWExNjVmMzc2MzE4NjMzODY3Mzg2NzU5NmI1OTZiDQo3YTZmN2I2ZjljNzM5 YjczYmM3MzljNzNiYzc3OWM3M2JjNzdiYzc3YmQ3NzlkNzdiZTdiYmQ3N2RkNzdkYzczZGQ3M2Rj NzNkYzczYmI3M2JiNzc5Yjc3YmI3YmJiN2JkYzdmYmI3YmJhN2YxMzczZDE2ZWQwNmVkMDZlOGY2 YQ0KOGU2YTRjNWVlYTU1MmM1ZTZlNjYyYzVlMGM1YTBjNWEwYzVhMGM1NjBkNWEyZDVlMGQ1ZWVj NTkwYzVlMGM1ZTBjNjJjYTU1ODg1MTQ2NDU0NTQxMDQzOWU0MzRjMjJjYzIyY2EyMjhhMjI4ODEx Y2EyMjBhMjIwYzIyNGMzMjgNCjI1MzUyNjM5MjUzZDg4NDllYjU1YTk1MWE4NTE4ODRkODc0ZGE4 NTFhOTUxODg0ZDY3NDUyNDNkMDQzZGUzMzhlMzM0ZTMzNDI1MzkwNDM1ZTQyY2U0Mjg3MTU2ZjY2 MjE3NjdmNzVlMzg2MzE3NjMxODYzMTc2MzE3NjNmNjVlDQpmNjVlZDU1YWQ1NWFiNDU2YjM1YTcx NTY3MDU2NGY1MjJlNTIwZDRlZWM0ZGVjNDllZDRkZWM0OTBkNGVlYzQ5ZWQ0ZGVjNDkwZDRlZWM0 NWVjNDllYzQ1ZWM0OWNiNDVlYzQ1Y2I0NWVjNDVjYTQxY2I0NWNiNDVjYjQ1Y2I0MQ0KY2I0NWNi NDFjYjQ1YWI0MWNiNDFjYjQxY2M0MWFiM2RhYjQxYWIzZGFjM2Q4YjM1OGMzNThiMzE4YjMxNmEy ZDZhMmQ0OTI5NGEyOWY0NWVkNDVlZjQ1ZWQ0NWVmNDVlZDQ1ZWY0NWVkNDVlZDQ1ZWQzNWFkNDVl ZDQ1ZWQ0NWUNCmQzNWFkNDVlZDQ1ZWQ0NWVkMzVhZDQ1ZWQ0NWVkNDVlZDM1YWQ0NWVkNDVlZDQ1 ZWQzNWFkNDVlZDQ1ZWQ0NWVkMzVhZDQ1ZWQ0NWVkNDVhZDM1YWQ0NWVkNDVhZDQ1YWQ0NWFmNjVl ZjY1ZWY3NWVmNjVlMTc1ZmY2NWFmNjVhDQpmNjVhMTc1ZjE3NWYzODY3Mzg2NzU5NmI1OTZiN2E2 YjdhNmI5YjczOWI3M2JjNzc5YzczYmM3N2JjNzdiZDc3YmM3N2RkNzdiZDc3YmU3YmJkN2JkZTdi ZGQ3N2RlNzdkZDczZmQ3M2RjNzNkYzc3ZGM3YmJiN2I5YTdiOWE3Yg0KNzk3Nzc4Nzc3Nzc3ZjI3 MmQwNmVmMTcyZDA3MmFmNmU2ZDY2MmM2MmM4NTE0ZDYyNmU2NjhmNmE2ZjY2YjE2YWIyNmVkMjZl ZDI2ZTkwNmE2ZjY2NGY2NjRlNjI2ZjZhNmY2YTRlNjZlYjU5ZWI1OWNhNTFhOTRkNjc0MTQ2M2QN CjI1MzkyNjM5MjYzNTQ3Mzk0NjMxMjYzNTI1MzE0NjM5NDczZDY3NDEyNTNkNjc0OWNhNTFhOTUx ODg0ZDg4NTE2NjQ5YTg1MWE4NTFhOTUxNjc0OTQ2NDUyNDNkMDMzOWUyMzQwNDM5MjUzOTI1MzUw NTMxNDczNTcxNTZkNTVlDQpmNjVlZjc1ZTE3NjMxODYzMTc2MzE4NjMxNzVmZjc1ZWQ2NWFmNjVl ZDQ1YWQ0NWU5MzU2OTI1NjcwNTI1MDU2MmU1MjJlNTJlYzQ5MGQ0ZWVjNDkwZDRlZWQ0ZDBkNGVl YzQ5MGQ0ZWVjNDllYzQ5ZWM0OWVjNDllYzQ1ZWM0OQ0KY2I0NWVjNDVjYjQ1ZWI0NWNiNDVlYjQ1 Y2I0NWNiNDVjYjQxY2M0NWNiNDFjYzQxY2I0MWNjNDFjYjQxY2M0MWFiM2RhYzQxYWMzZGFjMzk4 YzM1OGMzNTZiMzE2YjJkNGEyZDZhMmQ0YTI5ZDQ1ZWY0NWVkNDVlZDQ1ZWQ0NWUNCmQ0NWVkMzVh ZDQ1ZWQzNWFkNDVlZDM1YWQ0NWVkMzVhZDQ1ZWQzNWFkNDVlZDM1YWQ0NWVkMzVhZDQ1ZWQzNWFk NDVlZDM1YWQ0NWVkMzVhZDQ1ZWQzNWFkNDVlZDM1YWQ0NWVkMzVhZDQ1ZWQzNWFkNDVlZDM1YWQ0 NWFkNDVhDQpkNTVlZDU1YWY2NWVmNjVlZjc1ZWY2NWFmNjVhZjY1YWY2NWUxNjVmMzc2MzE4NjMz ODY3Mzg2NzU5NmI1OTZiN2E2ZjdhNmY5YjczOWM3M2JjNzc5YzczYmM3N2JjNzNiZDc3YmM3N2Jk NzdiYzdiYmQ3YmJkNzdkZDc3ZGQ3Mw0KZGU3M2RkNmZkZDczYmM3M2RkN2I5YTc3NTg3NzM2NzNm NDZlYjI2NmYzNmVmMTcyZjA3MmQwNzJkMDcyOGU2YTZkNjZlYTU5ODc0ZDJiNWU2ZTY2NmY2NjZm NjI3MDY2YjI2YTkxNmFiMjZhYjI2ZWIyNmU3MDZhNmY2NjRlNjINCjZmNjYyZTYyMmQ2MjBjNWEw YzVhY2E1MWFhNGQ4OTQ1YTk0NTg5NDVhYTQ1NjgzOTY3MzkyNTM1MjUzNTI2Mzk2NzQxMjYzZDI1 M2Q0NjQ1Y2E1NTg4NGQ4ODUxODc0ZDY2NDk4NzRkYTg1MWE4NGQ4ODRkNDU0NTI0NDEwMzM5DQow MzM5MDMzNTI1MzkyNjM5MjYzNTA1MmQzMDRlZDU1ZTM4NjdmNzVlZjc1ZTE3NWYxNzYzZjc1ZTE3 NjNmNjVlZjY1ZWQ1NWFkNTVhYjQ1YWIzNWE3MTU2NzA1NjRmNTIyZjUyMGQ0ZWVjNDllYzQ5MGQ0 ZWVjNDkwZDRlZWM0OQ0KMGQ0ZWVjNDllYzQ5ZWM0NWVjNDljYjQ1ZWM0OWNiNDVlYzQ1Y2I0MWNi NDVjYTQxY2I0NWNhNDFjYjQ1Y2I0MWNiNDVhYjQxY2I0MWFiNDFjYjQxYWIzZGNiNDFhYjNkY2M0 MWFiM2RhYzNkOGMzNWFjMzU4YjMxOGIzMTZhMmQNCjZhMmQ0OTI5NGEyOWY1NjJmNDVlZjQ1ZWQ0 NWVmNTYyZDQ1ZWY0NWVkNDVlZjQ1ZWQ0NWVkNDVlZDQ1ZWY0NWVkNDVlZDQ1ZWQ0NWVmNDVlZDQ1 ZWQ0NWVkNDVlZjQ1ZWQ0NWVkNDVlZDQ1ZWY0NWVkNDVlZDQ1ZWQ0NWVmNDVlDQpkNDVlZDQ1ZWQ0 NWVmNDVlZDQ1YWQ0NWVkNDVhZDU1ZWQ1NWFmNjVlZjY1ZWY3NWVmNjVlZjc1ZWY2NWFmNjVlZjY1 YTE3NWYxNzVmMzg2NzM4Njc1OTY3NTk2NzdhNmI3YTZmOWI3MzliNzNiYzc3YmM3M2JjNzdiYzcz ZGQ3Nw0KYmM3N2RkNzdiYzc3YmQ3ZmJkN2JkZTdiZGQ3N2ZlNzdkZTczZGU3M2RkNzMxNjEwMDAw MDI2MDYwZjAwMjIyMDU3NGQ0NjQzMDEwMDAwMDAwMDAwMDEwMDAwMDAwMDAwMDAwMDA3MDAwMDAw MDAyMDAwMDA0MDU1MDAwMDQwZDUNCjAwMDBkZDc3ZGQ3ZjlhN2IzNjczMzU3N2IyNmE4ZjY2YjA2 YTEyN2JmMDc2ZjE3NmFmNzI4ZTZhNGM2MmU5NTU0NDQ1MmM1ZThmNmFiMDZlNmY2NjkwNjY5MTY2 YjE2YTkxNjY5MTZhNzA2NjZmNjIwYzVhZWI1NWNhNTFlYjUxDQpjYjUxNGU1ZTBkNWEwYzU2Y2I0 ZGNiNGRhYTQ5Y2I0OWNhNDk4ODQxNjczOTQ2MzkyNTM5NDYzZDQ2M2Q0NjQxMjQzZDg4NGRjOTU1 YTg1MTg3NGRhODUxNjY0OWE4NTFhODUxYTk1MTg4NGQ2NjQ5MjQ0MTI0M2QwMzM5MjQzOQ0KMjUz OTI1MzUwNTMxMDUyZDJmNGVkNTVlMTc2MzE3NjNmNjVlMTg2NzE3NjMxODYzMTc2MzE3NjNmNjVl ZjY1ZWQ1NWFkNTVlOTM1YTkyNTY3MDUyNzA1NjJlNTIyZTUyZWM0OTBkNGVlYzRkMGQ0ZWVjNGQw ZDRlZWM0ZDBkNGUNCmVjNDllYzQ5ZWM0OWVjNDljYjQ1ZWM0OWNiNDVlYzQ1Y2I0NWViNDVjYjQ1 Y2I0NWNhNDFjYjQ1Y2I0MWNiNDVjYjQxY2M0MWNiNDFjYzQxYWI0MWNjNDFhYjNkYWIzZGFiMzlh YzM5OGMzNThjMzE2YjJkNmIzMTZhMmQ2YTJkDQo0OTI5ZDQ1ZWY0NWVkNDVlZjQ1ZWQ0NWVmNDVl ZDQ1ZWY0NWVkMzVhZDQ1ZWQzNWFkNDVlZDM1YWQ0NWVkMzVhZDQ1ZWQzNWFkNDVlZDM1YWQ0NWVk MzVhZDQ1ZWQzNWFkNDVlZDM1YWQ0NWVkMzVhZDQ1ZWQzNWFkNDVlZDM1YQ0KZDQ1ZWQzNWFkNDVl ZDQ1YWQ0NWViNDVhZDU1YWQ1NWFmNjVlZjY1YWY2NWVmNjVhZjY1ZWY2NWFmNjVhMTY1ZjM3NjMx NzYzMzg2NzM4Njc1OTZiNTk2NzdhNmI3YTZmOWI3MzliNzNiYzc3YmM3M2JjNzdiYzczYmQ3N2Jj NzcNCmRkN2JiYzdiYmQ3ZmJkN2JkZTc3ZGQ3M2RlNzNkZTczZGU3N2JjNzdkZDdmNzk3YjM2Nzcz NTdiZjI3NjhmNmFkMDcyZjE3NmYwNzZkMDc2Y2Y3MjZkNmE0ZDY2ZTk1NTQ1NDVhNzRkNGQ2Mjhm NmE2ZjY2NmY2MjkwNjY3MDYyDQo5MTY2NGY2MjcwNjY0ZjYyMmQ1YWNhNGRjYTRkY2E1MWViNTVl YzU1ZWI1MWFhNGRhOTQ5Njg0MTY4NDE2ODQxODk0MTg4NDE4ODQxNjczZDY3NDE2NzQxNjc0NTQ1 NDEyNTQxNjc0OWNhNTU4NzRkODc0ZDY3NGQ2NjRkODc1MQ0KYTg1MTg3NGQ4NzRkNDY0NTQ1NDEw NDM5MjQzZDA0MzkyNTM5MDUzNTI2MzU0NzM1NzI1YWI0NWVmNjYyZjY1ZTE4NjMxNzYzMTc2MzE3 NjMxNzYzZjY1ZWY2NWVkNTVlZDU1ZWI0NWFiMzVhNzE1NjcxNTY0ZjUyMmU1MjBkNGUNCjBkNGVl YzQ5ZWQ0ZGVjNDkwZDRlZWM0OWVkNGRlYzQ5MGQ0ZWNiNDVlYzQ5Y2I0NWVjNDljYjQ1Y2I0NWNi NDVjYjQ1Y2E0MWNiNDVjYTQxY2I0NWFhNDFjYjQxYWI0MWNiNDVhYjNkY2I0MWFiM2RjYzQxYWIz ZGFiM2RhYjNkDQphYzNkOGIzNThjMzU4YjMxOGIzMTZhMmQ2YTJkNDkyOTRhMjlmNTYyZjQ1ZWY1 NjJmNDVlZjU2MmQ0NWVmNTYyZDQ1ZWQ0NWVkNDVlZjQ1ZWQ0NWVkNDVlZDQ1ZWY0NWVkNDVlZDQ1 ZWQ0NWVmNDVlZDQ1ZWQ0NWVkNDVlZjQ1ZQ0KZDQ1ZWQ0NWVkNDVlZjQ1ZWQ0NWVkNDVlZDQ1ZWY0 NWVkNDVlZjQ1ZWQ0NWFmNTVlZDQ1YWQ1NWFkNDVhZjY1ZWY2NWVmNzVlZjY1ZTE3NWZmNjVhZjY1 YWY2NWExNzVmMTc1ZjM4NjMzODYzNTk2NzU5Njc1YTZiN2E2YjliNmYNCjliNmZiYzc3YmM3M2Jk NzdiYzc3ZGQ3N2JjNzdkZDdiYmM3N2JkN2ZiYzdmZGQ3YmRkNzdkZTc3ZGU3M2ZlNzdkZDc3YmM3 N2JjN2Y1ODdiZjU3MjU2N2YxMzdmYjA3NmQwNzZmMTdhZDA3NmQwNzZhZjcyYWY3MjZkNmEwYjYy DQo2NTQ5NjY0OTBjNWViMDZlOTA2YTkxNmE5MTY2OTE2NjkxNjYyZTVlNGU1ZTRmNjIwYzU2Y2E1 MWE5NGRlYjUxZWI1MWViNTFhYTQ5YTk0OTg4NDE2ODQxNjg0MWE5NDVhOTQ1ODg0NTY3NDE4ODQ1 ODg0NTg4NDk2NzQ5Njc0OQ0KNDU0NTg4NGRhOTU1ODc0ZDY2NDk4NzRkNjY0OWE4NTE4NzUxYTg1 MTg3NDk2NjQ5MjQ0MTI1NDEyNDNkMjUzZDA0MzkyNTM1MDUzMTQ3MzU3MTVhZjY2NmY2NjJmNjYy ZjY2MjE3NjNmNjYyMTc2N2Y2NjJmNzYyZDU1ZWY2NWUNCmQ1NWVkNDVlOTM1YTkyNWE3MDU2NTA1 NjJlNTIyZTRlZWM0OTBkNGVlYzQ5MGQ0ZWVkNGQwZDRlZWM0OTBkNGVlYzQ5ZWM0OWVjNDVlYzQ5 ZWM0NWVjNDVjYjQ1ZWM0NWNiNDVjYjQ1Y2E0MWNiNDVjYjQ1Y2I0NWNiNDFjYzQ1DQpjYjQxY2I0 MWFiNDFjYzQxY2I0MWNjNDFhYjNkYWM0MWFiM2RhYzM5OGMzNThjMzU2YjMxNmIyZDRhMmQ2YTJk NGEyOWQ0NWVmNDVlZDQ1ZWY0NWVkNDVlZjQ1ZWQ0NWVmNDVlZDQ1ZWQ0NWVkMzVhZDQ1ZWQ0NWVk NDVlZDM1YQ0KZDQ1ZWQ0NWVkNDVlZDM1YWQ0NWVkNDVlZDQ1ZWQzNWFkNDVlZDQ1ZWQ0NWVkMzVh ZDQ1ZWQ0NWVkNDVlZDM1YWQ0NWVkMzVhZjQ1ZWQ0NWFkNDVhZDQ1YWQ1NWVkNTVhZjY1ZWY2NWVm NzVlZjY1YWY2NWFmNjVhZjY1YWY2NWENCjE3NWYxNzYzMzg2NzM4Njc1OTZiNTk2YjdhNmY3YTZm OWI3MzliNzNiYzczOWI3M2JjNzdiYzczZGM3N2JjNzdkZDdiYmM3YmJkN2ZiYzc3ZGQ3N2RkNzNk ZTczYmQ3M2RkNzc3YTczZmU3ZjE2NzczNjdiZjM3YWYyN2VkMDdhDQphZjc2ZDA3YWYxN2FkMDc2 ZDA3YWFmNzY4ZTZlMGI2MmM5NTUyNDQxYzk1NTZmNmFkMjcyOTA2YTkwNjY3MDYyNmY2MjRlNjI0 ZTYyMmQ1YTJkNWFjYTRkODg0NTY4NDFhYTRkODk0NTY4NDEyNjNkNjc0MTY3NDE4ODQ1ODg0NQ0K YWE0OWM5NGQ4ODQ5ODc0NWM5NTFhOTUxODc0ZDQ2NDU4NzRkYTg1MWE5NTU4ODUxODc1MTY2NDk2 NjRkODY0ZGE4NTFhODUxODc0ZDQ1NDU0NTQxMjQzZDI1M2QwNDM5MjUzOWU0MzAyNjM1ODkzZDUw NTZiMzYyZDU2NmQ1NjINCmY2NjZmNjYyMTc2N2Y2NjIxNzYzMTc2M2Y2NjJiNDVhZDU1ZWI0NWFi MzVhNzE1NjcxNTY0ZjUyNGY1MjBkNGUwZDRlZWM0OWVkNGRlYzQ5ZWQ0ZGVjNDllZDRkZWM0OWVj NDllYzQ1ZWM0OWNiNDVlYzQ1Y2I0NWViNDVjYjQxDQpjYjQ1Y2I0NWNiNDVjYTQxY2I0NWNhNDFj YjQxYWI0MWNiNDFhYjQxY2I0MWFiM2RjYjQxYWIzZGFiNDE4YjNkYWMzZDhjMzVhYzM1OGIzMThi MzE2YTJkNmEyZDRhMjk2YTI5ZjU2MmY0NWVmNTYyZDQ1ZWY1NjJmNDVlZjU2Mg0KZDQ1ZWY0NWVk NDVlZjQ1ZWQ0NWVmNDVlZDQ1ZWY0NWVkNDVlZjQ1ZWQ0NWVmNDVlZDQ1ZWY0NWVkNDVlZjQ1ZWQ0 NWVmNDVlZDQ1ZWY0NWVkNDVlZjQ1ZWQ0NWVmNDVlZDQ1ZWY0NWVkNDVlZjQ1ZWQ0NWFkNTVlZDU1 YWY2NWUNCmY2NWUxNzVmZjY1ZWY3NWVmNjVhZjY1YWY2NWExNzVmMTY1ZjM4NjczODY3NTk2NzU5 Njc3YTZiN2E2YjliNmY5YjZmYmM3N2JiNzNiYzc3YmM3M2RjNzdiYzc3ZGQ3N2JjNzdiZDdmYmM3 YmRkN2JkZDc3ZGU3N2RkNzNkZDc3DQpiYzc3ZGQ3ZmJiN2ZmNTcyMTU3ZmYzN2FiMDc2YWY3YWNm N2FmMTdhZjE3YWYxN2FkMDdhZjE3YWFmNzI0ZDZhZWE1ZDY2NDk4NzQ5MGI1ZTkwNmFkMjZlYjE2 YWIxNmE5MDY2OTA2YTRlNjIyZDVlMGM1NmViNTVhOTQ5NDc0MQ0KMjUzOTI2M2QyNTM5MjYzZDI1 Mzk0NzQxODg0NWFhNGRhOTRkY2E1MWM5NTFlYTU1ZWE1NWNhNTU4NzRkODc0ZDg3NTFjOTU1YTg1 NWE4NTU2NjRkNjY0ZDY2NDk4NzUxODc1MWE4NTU4NzRkNjY0OTI0NDE0NTQxMjQzZDI1M2QNCjA1 Mzk0NzNkMDUzNTY4M2Q1MDVhMzc3MzE3NzNmNTZhZDU2MjE2NjcxNzY3MTc2N2Y2NjIxNzY3ZjY1 ZWQ1NWVkNTVlZDQ1ZWIzNWE5MjU2NzA1NjcwNTYyZjUyMmU0ZWVjNDkwZDRlZWM0OTBkNGVlYzQ5 MGQ0ZWVjNDkwZDRlDQplYzQ5ZWM0OWVjNDllYzQ5Y2I0NWVjNDljYjQ1ZWI0NWNiNDVlYjQ1Y2I0 NWNiNDVjYTQxY2I0NWNiNDFjYjQ1YWI0MWNjNDFjYjQxY2M0MWFiNDFjYzQxYWIzZGFiM2RhYjM5 YWMzOThjMzU4YzM1NmIzMThiMzE2YTJkNmEyZA0KNGEyOWQ0NWVmNDVlZDQ1ZWY0NWVkNDVlZjQ1 ZWQ0NWVmNDVlZDQ1ZWQ0NWVkNDVlZjQ1ZWQ0NWVkNDVlZDQ1ZWY0NWVkNDVlZDQ1ZWQ0NWVmNDVl ZDQ1ZWQ0NWVkNDVlZjQ1ZWQ0NWVkNDVlZDQ1ZWY0NWVkNDVlZDQ1ZWQ0NWUNCmY0NWVkMzVhZjQ1 ZWQ0NWFkNDVlZDQ1YWQ1NWFkNTVhZjY1ZWY2NWVmNzVlZjY1YWY2NWFkNTVhZjY1YWY2NWExNzVm MTc2MzM4NjczODY3NTk2YjU4Njc3OTZiN2E2ZjliNzM5YjczYmI3MzliNzNiYzc3YmI3M2JjNzdi Yzc3DQpkZDc3YmM3N2JkN2JiYzc3ZGQ3N2JjNzNkZDc3YmM3N2JjN2JkYzdmNTc3YmIyNmU1Njdm ZjI3YWFmNzI4ZTcyZjA3YWQwNzZmMTdhZjE3YWYxN2FkMTdhZDA3NjZlNmEyYzY2YTg1MTQ1NDU2 NjQ5NGQ2MmQxNzJkMTZlOTA2Ng0KNmY2MjJkNWU0ZTYyNGQ2MjJkNWVlYjU1YTk0ZDA1MzlhMTI4 ZTMzNDI1MzkwNTM5MDQzOTA1Mzk2ODQ1YTk0ZGE5NGRjOTUxZWI1OTBiNWVlYjU5ODg1MTg3NGQ4 NzUxYTk1NWE4NTVhODU1ODc1MTg3NTE0NTQ5NjU0ZDY2NGQNCmE3NTE4NzUxODc0ZDY2NDU0NTQ1 MjQzZDI1M2QyNTNkMjUzZDI1M2QwNTM1Njg0MTJlNWE3MTVlNzA1ZTcxNjJmNjZlZjU2NjE3Njdm NTYyZjY2MmY2NjJmNjYyZDQ1YWQ1NWViMzVhYjM1YTcxNTY3MTU2NGY1MjJmNTIwZDRlDQowZDRh ZWM0OWVjNGRlYzQ5MGQ0ZWVjNDllYzRkZWM0OWVjNDljYjQ1ZWM0OWNiNDVlYzQ5Y2I0NWNiNDVj YjQxY2I0NWNhNDFjYjQ1Y2E0MWNiNDVhYTQxY2I0MWFiNDFjYjQxYWIzZGNiNDFhYjNkY2M0MWFi M2RhYjNkYWIzZA0KYWMzZDhjMzVhYzM1OGIzMThiMzE2YTJkNmEyZDRhMjk2YTJkZjU2MmY0NWVm NTYyZjQ1ZWY1NjJmNDVlZjU2MmY0NWVmNDVlZDQ1ZWY0NWVkNDVlZjQ1ZWQ0NWVmNDVlZDQ1ZWY0 NWVkNDVlZjQ1ZWQ0NWVmNDVlZDQ1ZWY0NWUNCmQ0NWVmNDVlZDQ1ZWY0NWVkNDVlZjQ1ZWQ0NWVm NDVlZDQ1ZWY0NWVkNDVlZjU1ZWQ0NWFkNTVlZDU1YWY2NWVmNjVlZjc1ZWY2NWUxNzVmZjY1YWY2 NWFmNjVhMTc1ZjE3NWYzODY3Mzc2MzU5NmI1ODY3NTk2Yjc5NmI5YTZmDQo5YTZmYmI3MzliNzNi Yzc3YmI3M2JjNzdiYzc3ZGM3N2JjNzdiZDdiYmM3N2RkN2JkYzc3ZGQ3N2JjNzdkYzdiYmI3YmJi N2ZmNDZlZDI3MjM1N2YxMzdmYjA3NmQwN2FkMDdhZjE3YWYxN2ExMjdmZjI3YWYyN2VkMTc2YWY3 Mg0KNGQ2YTBiNjI0NTQ1NDU0NTBiNWFiMTcyZDE3MjZmNjZlYjU1ODc0OTBiNWU4ZjZlNGU2NjBj NWE4ODQ5MjUzOTgwMjhlMzMwYzMzMGU0MzRjMzMwZTQzODI2NDE4OTRkYTk1MWVhNTkwYjVlMGM2 MmM5NTU4NzRkNjc0ZGE5NTUNCmM5NTljOTVkYTg1OWE4NTU4NjUxNjY0ZDY1NGQ4NzUxODc1MWE4 NTE4NzRkNjY0OTQ1NDU0NTQxMjQzZDQ1NDEyNTNkMjUzZDA1Mzk0NjQxNjc0MTY3NDE0NzQxMGQ1 NmIyNjZmNTZhMTc2NzE2NjdmNTYyMTc2N2Y2NjJkNTVlDQpkNDVlZDQ1ZWIzNWE5MjVhNzA1NjUw NTYyZTRlMmU0ZWVkNDkwZDRlZWM0OTBkNGVlYzRkMGQ0ZWVjNDkwZDRlZWM0OWVjNDllYzQ1ZWM0 OWVjNDVlYzQ1Y2I0NWVjNDVjYjQ1ZWI0NWNiNDVlYjQ1Y2I0NWNiNDVjYTQxY2I0NQ0KYWI0MWNi NDFhYjQxY2M0MWNiNDFjYzQxYWIzZGFjNDFhYjNkYWMzOThjMzVhYzM1OGIzMTZiMzE2YTJkNmEy ZDRhMjlkNDVlZjU2MmQ0NWVmNDVlZDQ1ZWY1NjJkNDVlZjQ1ZWQ0NWVmNDVlZDQ1ZWY0NWVkNDVl ZjQ1ZWQ0NWUNCmY0NWVkNDVlZjQ1ZWQ0NWVmNDVlZDQ1ZWY0NWVkNDVlZjQ1ZWQ0NWVmNDVlZDQ1 ZWY0NWVkNDVlZjQ1ZWQ0NWVmNDVlZDQ1YWY0NWVkNDVhZDQ1ZWQ0NWFkNTVlZDU1YWY2NWVmNjVl Zjc1ZWY2NWFmNjVhZjY1YWY2NWFmNjVhDQoxNzVmMTc2MzM4NjczODY3NTg2NzU4Njc3OTZiNzk2 YjlhNmY5YjczYmI3MzliNzNiYjczYmI3M2JjNzdiYzc3YmM3N2JjNzdiZDc3YmM3M2RjNzdiYjc3 ZGI3YmJhN2JiYTdmNzc3ZmQyNmViMTZlZDI3NmIwNzJkMTc2ZDE3Ng0KZDE3NmYxNzYxMzdiZjI3 YWYyN2VmMjdhZjE3YThmNzI2ZTZlNGM2NmE4NTU0NTQ1Yzk1NTZlNjZkMTc2OGY2YTBiNWE2NjQ5 MmM2MmIwNmU2ZTZhZWI1OWNhNTEyNTQxYzIzMDYwMjg2MDI0NDAyNGExMzBjMjM0MDQ0MTY3NDkN CmViNWRlYTU5MGI1ZWM5NTk4NzUxNjY0ZGE4NTVjOTU5ZTk1ZGM5NTljOTU5ODc1NTg2NTE2NTRk NjY0ZDY1NGQ4NjRkODc0ZDg3NGQ2NjQ1NDU0NTI0NDEyNTQxMjUzZDQ2NDE0NjQ1MjUzZGMyMzBj MjMwMDQzOTY4NDlhOTRkDQpjYjRkZDM2MjE3NmIxNjY3MTY2M2Y2NjJmNjYyYjQ1YWQ0NWViNDVh YjM1YTcxNTY3MTU2NGY1MjRmNTIwZDRlMGQ0YWVjNDllZDRkZWM0OWVkNGRlYzQ5ZWQ0ZGVjNDll YzQ5ZWM0NWVjNDljYjQ1ZWM0NWNiNDVlYjQ1Y2I0MQ0KY2I0NWNiNDVjYjQ1Y2E0MWNiNDVjYTQx Y2I0MWFiNDFjYjQxYWI0MWNiNDFhYjNkY2I0MWFiM2RhYjQxOGIzZGFjM2Q4YzM1YWMzNThiMzE4 YjMxNmEyZDZhMmQ0YTI5NmEyOWY1NjJmNDVlZjU2MmY0NWVmNTYyZjQ1ZWY1NjINCmY0NWVmNTYy ZDQ1ZWY0NWVkNDVlZjU2MmQ0NWVmNDVlZDQ1ZWY1NjJkNDVlZjQ1ZWQ0NWVmNTYyZDQ1ZWY0NWVk NDVlZjU2MmQ0NWVmNDVlZDQ1ZWY1NjJkNDVlZjQ1ZWQ0NWVmNDVlZjQ1ZWY1NWVkNDVhZjU1ZWQ1 NWVmNjVlDQpmNjVlMTc1ZmY2NWVmNzVlZjY1YWY2NWFmNjVhMTc1ZjE2NWYzODY3Mzc2MzU4Njc1 ODY3NTk2Yjc5NmI5YTZmOWE2ZmJiNzM5YjczYmI3M2JiNzNiYzc3YmM3N2RjNzdiYzc3ZGQ3N2Jk NzdkZDc3YmM3N2RjN2JiYjdiYmE3Zg0KOTk3ZjU2N2JkMjcyZDI3MjJkNjY2ZTZhYjA3MmYyN2Fk MTc2MTM3YjEzN2IxNDdmMTM3YjEzN2ZmMTdhZDA3NjhlNmU4ZTcyMGI2MmM4NTVhNzUxMmI2MmQx NzYxMzdiOGY2ZTZlNmVkMTc2ZjI3YThmNmU2ZTY2MmQ2MmNhNTUNCjI1M2RhMjMwNjAyODgwMmNl MzM4MjU0MTI1NDU2NzRkY2E1OTBiNWVlYTU5YTg1NTY2NTFhODU1Yzk1ZDBiNjJlYTYxZWE1ZGM4 NTlhODU1NjY1MTY2NGQ2NTRkNjY0ZDY2NGRhNzUxODc0ZDY2NDk0NTQxNDU0MTI0NDE0NTQxDQo0 NTQxNjc0OTI1NDEwNDNkMDQzZDg4NGRlYjU5ZWE1OTY4NDViMjVlZjU2NjE3NmJmNjY2MTY2N2Y1 NjJkNDVlYjQ1YWQ0NWViMzVhOTI1YTcwNTY3MDU2MmY1MjJlNGVlYzQ5MGQ0ZWVjNDkwZDRlZWM0 OTBkNGVlYzQ5MGQ0ZQ0KZWM0OWVjNDllYzQ5ZWM0OWNiNDVlYzQ5Y2I0NWViNDVjYjQ1ZWI0NWNi NDVjYjQ1Y2E0MWNiNDVjYjQxY2I0NWFiNDFjYzQxY2I0MWNjNDFhYjQxY2M0MWFiM2RhYjNkYWIz OWFjMzk4YzM1OGMzNTZiMzE4YjMxNmEyZDZhMmQNCjRhMjlkNDVlZjU2MmY0NWVmNTYyZDQ1ZWY1 NjJmNDVlZjU2MmQ0NWVmNDVlZDQ1ZWY0NWVkNDVlZjQ1ZWQ0NWVmNDVlZDQ1ZWY0NWVkNDVlZjQ1 ZWQ0NWVmNDVlZDQ1ZWY0NWVkNDVlZjQ1ZWQ0NWVmNDVlZDQ1ZWY0NWVkNDVlDQpmNDVlZDQ1YWY0 NWVkNDVlZDU1ZWQ0NWFkNTVlZjY1ZTE3NWZmNjVlZjc1ZWY2NWFmNjVhZDU1YWY2NWFmNjVhMTc1 ZjE3NjMzODY3Mzg2NzU4Njc1ODY3Nzk2YjdhNmY5YTZmOWE2ZjliNzM5YjczYmI3MzliNzNiYzc3 YmM3Nw0KZGM3N2JjNzNkZDczYmM3M2RjNzdiYjc3YmE3Yjk5N2ZiOTdmZjM3MmQyNzJiMTcyMGM1 ZTZlNjZkMTc2ZjE3MmYyNzZmMzc2MTQ3ZjE0N2YxMzdmZjI3YWYyN2FiMDc2YWY3MjZlNmU2ZDZl MmI2NmVhNTllYTU5YWY3MjEzN2YNCjEyN2YxMjdmMzQ3ZjEzN2ZkMTc2OGY2ZThmNmEwYzVlODg0 ZDI1M2QwNTNkMjU0MTg4NTE4ODUxODc1MTY3NTE4ODU1YTg1NWE4NTU4NzUxYTg1OWM5NWQwYjY2 MGI2NjBiNjZjOTVkYzk1ZGE3NTU4NzUxNjU0ZDY2NGQ2NTRkDQo4NjRkODY0OTg3NDk2NjQ1NDU0 NTI0M2QyNDQxMjU0MTQ2NDUyNDNkNDY0NTQ2NDk4ODRkYTk1NWVhNWRlYTU5Y2E1NTJlNTJkNDVl MTY2NzE2NjdmNTYyZjU2MmQ0NWVkNDVlYjM1YWIzNWE3MTU2NzE1NjRmNTIyZjUyMGQ0ZQ0KMGQ0 YWVjNDllYzRkZWM0OTBkNGVlYzQ5ZWM0ZGVjNDllYzQ5Y2I0NWVjNDljYjQ1ZWM0OWNiNDVjYjQ1 Y2I0MWNiNDVjYTQxY2I0NWNhNDFjYjQ1YWE0MWNiNDFhYjQxY2I0MWFiM2RjYjQxYWIzZGNjNDFh YjNkYWIzZGFiM2QNCmFjM2Q4YzM1YWMzNThiMzE4YjMxNmEyZDZhMmQ0YTI5NmEyZGY1NjJmNDVl ZjU2MmY0NWVmNTYyZjQ1ZWY1NjJmNDVlZjU2MmQ0NWVmNTYyZjQ1ZWY1NjJkNDVlZjU2MmY0NWVm NTYyZDQ1ZWY1NjJmNDVlZjU2MmQ0NWVmNTYyDQpmNDVlZjU2MmQ0NWVmNTYyZjQ1ZWY1NjJkNDVl ZjU2MmY0NWVmNDVlZjQ1ZWY1NWVkNDVlZDU1ZWQ1NWFmNjVlZjY1ZWY3NWVmNjVlMTc1ZmY2NWFm NjVhZjY1YTE3NWYxNjVmMzc2MzM3NjM1ODY3NTg2NzU5NmI1OTZiOWE2Zg0KOWE2ZmJiNzM5Yjcz YmM3N2JiNzNiYzc3YmI3M2RjNzdiYzc3ZGQ3N2JkNzNkZDc3ZGM3N2RiN2JiYTdiYjk3Zjk4N2Zi MTZlYjA2ZWQyNzYyYzYyYjA3MmYyNzZmMjc2MTM3YjE0N2IxNDdiMzU3ZjE0N2YxMzdmZjI3YWYy N2ENCmIwNzY4ZjcyOGY3MmFmNzI0YzY2MGI2MjZkNmFmMjdlMTM3ZjEyN2YzNDdmNTU3ZmYyN2Fi MDcyNmU2YTJjNjJhOTUxNjc0OTg4NGRjYTU5ZWI1ZDBjNjJjYTVkYTg1NTQ2NGQ4ODUxODc0ZGE4 NTVjOTVkMmM2NjJjNjYyYzY2DQowYjYyMGI2NmU5NWRjOTU5ODc1MTg3NTE4NjRkODc1MTg2NGQ4 NzRkODY0OTY2NDk0NTQ1MjQ0MTI0M2Q0NTQxNDU0NTQ1NDUyNTQxNDY0OTg3NGRhODU1YTg1NWVh NWQwYjVlZWM0ZDkyNWExNjZiZjU2NjE2NjdmNTVlZDU1ZQ0KZDQ1ZWQ0NWViMjVhOTI1YTcwNTY1 MDU2MmU1MjJlNGVlZDQ5MGQ0ZWVjNDkwZDRlZWM0ZDBkNGVlYzQ5MGQ0ZWVjNDllYzQ5ZWM0NWVj NDllYzQ1ZWM0NWNiNDVlYzQ1Y2I0NWViNDVjYjQ1ZWI0NWNiNDVjYjQ1Y2E0MWNiNDUNCmFiNDFj YjQxYWI0MWNjNDFjYjQxY2M0MWFiM2RhYzQxYWIzZGFjMzk4YzM1YWMzNThiMzE2YjMxNmEyZDZi MmQ0YTI5ZjQ1ZWY1NWVmNDVlZjU1ZWY0NWVmNTVlZjQ1ZWY1NWVmNDVlZjU1ZWQ0NWVmNDVlZDQ1 ZWY0NWVkNDVlDQpmNDVlZDQ1ZWY0NWVkNDVlZjQ1ZWQ0NWVmNDVlZDQ1ZWY0NWVkNDVlZjQ1ZWQ0 NWVmNDVlZDQ1ZWY1NjJkNDVlZjU2MmQ0NWVmNDVlZDQ1ZWY0NWVkNDVhZjU1ZWY1NWVmNjVlZjY1 ZTE3NWZmNjVhZjY1YWY2NWFmNjVhZjY1YQ0KMTc1ZjE3NjMzNzY3MTc2MzU4NjczODY3Nzk2Yjc5 NmY5YTZmOWE3MzliNzM5YTczYmI3N2JiNzdiYzc3YmI3N2JjNzdiYzc3ZGQ3N2RkNzdiYzc3OWE3 N2RhN2ZiOTdmNTY3YjZmNjJmMjc2OGY2ZTRkNjZiMDcyMTM3ZmYxNzYNCjEzNzcxMzc3MzQ3YjE0 N2IzNTdmMTQ3ZjEzN2ZkMTdhZDE3YWIwNzZiMDc2OGY2ZTZlNmU0ZDY2OGY2ZWIwNzIxMzdmMTM3 ZjM0N2YxMzdmZjI3YWIwNzZiMDcyMmM2NmVhNTlhODUxYzk1OTBiNjI0ZTZhMGM2MmE5NTU2NzRk DQphODU1YTg1MWNhNTllYjU5MGM2MjJjNjI0ZDY2MmM2MjBjNjIwYjYyZWE1ZGM5NTlhODU1ODc1 MTY2NGQ2NjQ5ODc1MTY2NGQ4NjRkNDU0OTQ0NDUyMzQxNDQ0MTI0NDEyNDQxNjY0NTQ1NDU2NTQ1 ODY0ZGE3NTFlOTU5Yzg1NQ0KMGI1ZWNhNGQ2ZjVlZjQ2YWY1NjZmNTYyMTY2M2I0NTZmNTVlZDM1 YWIzNWE3MTU2NzA1NjRmNTI0ZjUyMGQ0ZTBkNGFlYzQ5ZWM0ZGVjNDllYzRkZWM0OWVjNGRlYzQ5 ZWM0OWNiNDVlYzQ5Y2I0NWVjNDVjYjQ1ZWM0NWNiNDENCmNiNDVjYjQ1Y2I0NWNhNDFjYjQ1Y2E0 MWNiNDFhYjQxY2I0MWFiNDFjYjQxYWIzZGNiNDFhYjNkYWIzZDhiM2RhYjNkOGIzOWFjMzU2YjMx OGIzMTZiMmQ2YjMxNGEyOTRhMjkxNTVmZjU1ZTE1NWZmNDVlMTU2M2Y1NWVmNTYyDQpmNDVlZjU2 MmY0NWVmNTYyZjQ1ZWY1NjJmNDVlZjU2MmQ0NWVmNTYyZjQ1ZWY1NjJkNDVlZjU2MmY0NWVmNTYy ZDQ1ZWY1NjJmNDVlZjU2MmY0NWVmNTYyZjQ1ZWY1NjJmNDVlZjQ1ZWY0NWVmNTVlZDQ1ZWY1NWVm NTVlZjY1ZQ0KZjY1ZTE3NjNmNjVlMTc1ZmY2NWExNjVmZjY1YTE2NWYxNjVmMzc2MzE3NjMzODY3 Mzg2NzU5NmI1OTZiN2E2ZjdhNmY5YjczOWI3M2JiNzc5YjczYmM3N2JiNzdiYzc3YmM3N2JkN2Ji ZDc3ZGQ3YmJiNzdiYjdiZGE3ZmI5N2YNCjM0NzM4ZjY2ZjI3NmIwNzI0ZDZhZjE3NjEzN2YxMjdi MTM3NzM0N2IxNDdiMzQ3YjE0N2IzNDdmMTM3ZmYzN2VkMTdhZDE3YWIxN2FkMTdhYjA3MmQxNzZi MDcyZjE3NmYyNzY1NTdmNTU3ZjU1N2YxMzdiZjI3YWQwNzY2ZTZlDQowYTYyZTk1ZGU5NWQyYjYy MmM2NjBiNjI4ODUxODg1MWE5NTVlYjVkMGM1ZTJkNjIyYzYyNGU2NjRlNjY0ZTZhMmQ2NjJjNjIw YjVlZWE1ZGM5NTlhODU1NjY0ZDg3NTE4NzUxODc1MTg2NGQ2NjRkNDQ0NTQ0NDU0NDQxNDU0NQ0K MjQ0MTY2NDk0NTQ1ODY0ZDg2NGRlOTU5MmI2MmM5NTk4NjRkYzk1MTRlNWUxNDZmZjU2NjE2Njcx NjYzZDU1YWY1NWFkNDVlYjM1YTkxNWE3MDU2NzA1NjRlNTIyZTRlZWM0OTBkNGVlYzQ5MGQ0ZWVj NDkwZDRlZWM0OWVjNDkNCmVjNDllYzQ5ZWM0NWVjNDljYjQ1ZWM0OWNiNDVlYzQ1Y2I0NWViNDVj YjQ1Y2I0NWNhNDFjYjQ1Y2I0MWNiNDVhYjQxY2M0MWNiNDFjYzQxYWIzZGNjNDFhYjNkYWIzZGFi M2RhYzM5YWIzNThiMzU2YjMxOGIzMTZiMmQ0YjJkDQo0YTI5ZjQ1ZWY1NWVmNDVlMTU1ZmY0NWVm NTVlZjQ1ZWY1NjJkNDVlZjU1ZWY0NWVmNTVlZDQ1ZWY0NWVkNDVlZjQ1ZWQ0NWVmNDVlZDQ1ZWY0 NWVkNDVlZjQ1ZWQ0NWVmNDVlZDQ1ZWY0NWVkNDVlZjU2MmQ0NWVmNTYyZjQ1ZQ0KZjU2MmQ0NWFm NDVlZDQ1ZWY1NWVkNDVhZjU1ZWY1NWUxNjVmZjY1ZWY3NWVmNjVhZjY1ZWY1NWFmNjVhZjY1YTE3 NjMxNjYzMzc2NzM3Njc1ODZiMzg2NzU5NmI3OTZmOWE3MzlhNzM5YjczOWI3M2JiNzc5YjczYmM3 N2JiNzcNCmJjNzdiYzc3YmM3N2JjNzdiYzdiYmE3N2RhN2Y3NzdiZjM3MjZmNjZmMjdhZDE3Njhm NzJkMTc2MTM3ZjEyNzczMzdiMTM3YjE0N2JmMzc2MTM3YmYzN2FmMzdlZDI3YWYyN2ViMTdhZDE3 YWQwNzZkMTdhZDE3NmYxNzZkMDcyDQpkMDcyMzQ3ZjU1N2YzNDdmMzQ3ZmYyN2FmMTdhNmU2ZTJi NjZlOTVkZTk1ZGU5NWQwYTVlYTg1NTg3NTE4NzUxZWE1OTJjNjI0ZDY2NGQ2NjRlNmE0ZDY2NmU2 YTZlNmE2ZTZhMGM2MjBiNjJlYTVkZWE1ZGE4NTU4NzUxODc1MQ0KYTc1MTg2NGQ4NjUxNjU0ZDQ1 NDkyNDQxNDU0NTQ0NDE0NTQ1NDU0NTQ1NDU2NjQ5NjY0OWM5NTk2ZDZhYzg1OTQ0NDU2NjQ1MmM1 NmYzNmExNTZiZjU2MjE2NjNkNDVhZjU1ZWIzNWFiMzVhNzE1NjcwNTY0ZjUyNGY1NjBkNGUNCjBk NGVlYzQ5ZWM0OWVjNDllZDRkZWM0OWVjNDllYzQ5ZWM0OWNiNDVlYzQ5Y2I0NWVjNDljYjQ1ZWI0 NWNiNDVlYjQ1Y2E0MWNiNDVjYTQxY2I0NWFhNDFjYjQxYWI0MWNiNDFhYjQxY2I0MWFiM2RjYjQx YWIzZGFiM2RhYjNkDQphYzNkOGIzNWFjMzU4YjMxOGIzMTZhMmQ2YjJkNGEyOTRhMmQxNTVmZjU1 ZTE1NjNmNTVlMTU2M2Y1NWUxNTYzZjU1ZWY1NjJmNDVlZjU2MmY0NWVmNTYyZjQ1ZWY1NjJmNDVl ZjU2MmY0NWVmNTYyZjQ1ZWY1NjJmNDVlZjU2Mg0KZjQ1ZWY1NjJmNDVlZjU2MmY0NWVmNTYyZjQ1 ZWY1NjJmNDVlZjQ1ZWY0NWVmNTVlZDQ1ZWY1NWVkNTVlZjY1ZWY2NWUxNzVmZjY1ZTE3NWZmNjVh ZjY1YWY2NWExNzVmMTc1ZjM3NjMxNzYzMzg2NzM4Njc1OTZiNTk2YjlhNzMNCjlhNzM5YjczOWI3 M2JiNzdiYjc3YmM3N2JiNzdkYzdiYmM3N2RkN2JiYzc3ZGM3N2JiN2JkYjdmYmE3Zjc3N2JiMTZh OTA2ZWYyN2FmMzdlZDA3NmYyN2ExMjdiMzM3YjMzN2IxMzdiMTM3YjEzN2JmMjdhZjI3YWQxNzZm MjdhDQpkMTdhZDE3YWIwNzZkMTdhYjA3NmQxNzZkMDc2ZDA3NmIwNzIzNDdmMzQ3ZjU1N2YzNDdm MzQ3ZmYxN2FhZjcyMmI2NmU5NWRjODU5Yzk1OWE4NTVhNzU1NjY0ZGE4NTllYjVkNGQ2NjRkNmE2 ZjZlNmU2YTZmNmU2ZjZlOGY3Mg0KNmU2ZTRkNmEyYjY2MmI2MmVhNWRjOTU5YTc1NWE4NTVhNzU1 YTc1NTg2NTE4NzUxNDU0OTQ1NDk0NTQ1NjY0OTQ1NDU2NjQ5NDU0NTg3NGQ2NTQ5Yzg1NTJjNjZl OTVkNjY0ZDQ2NDFjYTRkZDM2YWY0NmFmNTYyZjY2MmY1NWUNCmQ1NWFkNDVlYjI1YTkxNWE3MDU2 NGY1NjJlNTIyZTUyZWQ0ZGVkNGRlYzQ5MGQ0ZWVjNDkwZDRlZWM0OWVjNDllYzQ5ZWM0OWVjNDVl YzQ5ZWM0NWVjNDVjYjQ1ZWM0NWNiNDVlYjQ1Y2I0NWViNDVjYjQ1Y2I0NWNhNDFjYjQ1DQphYjQx Y2M0MWNiNDFjYzQxYWI0MWNjNDFhYjNkYWM0MWFiM2RhYzM5OGIzNThjMzU2YjMxOGIzMTZiMmQ2 YjJkNGEyOWY1NWUxNTVmZjQ1ZTE1NWZmNTVlMTU2M2Y0NWVmNTYyZjQ1ZWY1NjJmNDVlZjU1ZWY0 NWVmNTYyZDQ1ZQ0KZjQ1ZWQ0NWVmNTYyZDQ1ZWY0NWVkNDVlZjU2MmQ0NWVmNDVlZjQ1ZWY1NjJk NDVlZjU2MmY0NWVmNTYyZDQ1ZWY0NjJkNDVlZjQ1ZWQ0NWVmNDVlZDQ1YWY1NWVmNTVlMTY1ZmY2 NWUxNzVmZjY1YWY2NWFmNTVhZjY1YWY2NWENCjE3NWYxNjYzMzc2NzM3Njc1ODZiNTg2Yjc5NmY3 OTZmOWE3MzlhNzNiYjc3OWI3M2JiNzdiYjc3YmM3N2JiNzdiYzc3ZGM3N2JjNzdiYjc3YmI3YmJh N2ZiYTdmMzU3NzZmNjY5MDZlZjM3ZWYzN2VmMjdlZjE3NjEyN2IxMjc3DQozMzdiZjI3NjEzN2Ix MzdiMTM3YmQxNzZiMDc2YjA3MmIwNzY4ZjcyYjA3NmIwNzZkMTdhZDA3NmQwNzZiMDc2ZDA3NjEz N2I1NTdmNTU3ZjU1N2YzNDdmMTI3ZjhmNzI0YzZhYzg1OWM4NTlhNzU1YTc1NTg2NTE4NzUxYTg1 OQ0KMGI2MjJjNjY2ZTZhNmU2YThlNmU4ZjZlOGY3MjhlNmU2ZTZlNGQ2YTRjNmEwYjYyZWE1ZGM4 NTljODU5YTg1OWM4NTk4NzUxYTc1NTY2NGQ2NTRkNDU0NTY2NDk0NTQ1NDU0NTQ1NDU2NjQ5ODc0 ZDg3NTE4NzUxYzg1OTg3NTENCmM5NTk0NTQ1YTk0ZDkxNjJmNDZhZDQ2MjE2NjNkNTVhZDU1ZWIz NWFiMzVhNzA1NjcwNTY0ZjU2NGY1NjBkNGVlZDRkZWM0OWVjNGRlYzQ5ZWM0ZGVjNDllYzRkZWM0 OWVjNDljYjQ1ZWM0OWNiNDVlYzQ1Y2I0NWVjNDVjYjQxDQpjYjQ1Y2I0NWNiNDVjYTQxY2I0NWNh NDFjYjQxYWI0MWNiNDFhYjQxY2I0MWFiM2RjYjQxYWIzZGFiM2Q4YjNkYWIzZDhiMzlhYzM1NmIz MThiMzE2YjJkNmIzMTRhMjk0YTI5MTU2M2Y1NWUxNTYzZjU1ZTE1NjNmNTVlMTU2Mw0KZjU1ZTE1 NjNmNTVlZjU2MmY0NWVmNTYyZjQ1ZWY1NjJmNDVlZjU2MmY0NWVmNTYyZjQ1ZWY1NjJmNDVlZjU2 MmY0NWUxNTYzZjU2MmY1NjJmNDVlZjU2MmY0NWVmNTYyZjQ1ZWY0NWVmNDVlZjU1ZWQ0NWVmNTVl ZjU1ZWY2NWUNCmY2NWUxNzYzZjY1ZTE3NWZmNjVhMTY1ZmY2NWExNjVmMTY1ZjM3NjczNzY3Mzg2 NzM4Njc1OTZiNTk2YjlhNzM5YTczYmI3NzliNzNiYjc3YmI3N2RjN2JiYzc3ZGM3YmJjNzdkZDdi YmI3M2RjNzdiYjdiZGI3ZmI5N2YzNTdiDQo0ZTY2YjA3NmQyN2UxNDdmZjI3ZWYyN2ExMjc3MzI3 NzEyNzNmMjc2ZjI3YTEzN2ZmMjdhZDE3NjhmNzI4ZjcyOGY2ZTZlNmU4ZjZlZDE3NmQxN2FmMjdl ZDE3YWYxN2FkMDc2ZjM3YTM0N2Y1NTdmMzQ3ZjM0N2ZmMTdhOGY3Mg0KMmM2NmVhNjFjODU5Yzg1 OWE3NTVhNzU1ODc1NWM5NWQwYjYyNGM2NjRkNmE2ZTZlNmU2ZThmNzI4ZjcyOGY3MjZlNmU2ZTZl NGQ2YTJjNjZlYTVkZTk1ZGU5NWRlOTVkYzg1OWE4NTVhNzU1ODc1NTY2NGQ2NjRkNjY0OTY2NDkN CjQ1NDU2NjQ5NjY0OWVhNTljOTU5ODc1MTQ1NDk2NTRkZWE1ZGE5NTE4ODQ5NzA2MmY1NmUxNjZi ZjY2MmY1NWVkNDVhZDQ1ZWIzNWE5MTVhNzA1NjUwNWEyZjU2MGU1MmVkNGRlZDRkZWM0OTBkNGVl YzQ5MGQ0ZWVjNDllYzQ5DQplYzQ5ZWM0OWVjNDVlYzQ5Y2I0NWVjNDljYjQ1ZWM0NWNiNDVlYjQ1 Y2I0NWNiNDVjYTQxY2I0NWNiNDFjYjQ1YWI0MWNjNDFjYjQxY2M0MWFiM2RjYzQxYWIzZGFiM2Rh YjNkYWMzOWFiMzU4YjM1NmIzMThiMzE2YjJkNGIyZA0KNGEyOWY0NWUxNTVmZjU1ZTE1NWZmNDVl ZjU2MmY1NWUxNTYzZjQ1ZWY1NjJmNDVlZjU2MmY0NWVmNTYyZjQ1ZWY1NjJkNDVlZjU2MmY0NWVm NTYyZDQ1ZWY1NjJmNDVlZjU2MmY0NWVmNTYyZjQ1ZWY1NjJmNDVlZjU2MmY0NWUNCmY1NjJkNDVh ZjQ1ZWQ0NWVmNTVlZDQ1YWY1NWVmNTVlMTY1ZmY2NWVmNzVlZjY1YWY2NWVmNTVhZjY1YWY2NWEx NzYzMTY2MzM3NjczNzY3NTg2YjU4NmI3OTZmNzk2ZjlhNzM5YTczOWI3MzliNzNiYzc3YmI3N2Jj NzdiYjc3DQpkYzc3ZGM3N2RjNzdiYjc3ZGI3YmJhN2ZiOTdmMTQ3NzRmNjY4ZjcyZDE3YWYzN2Ux MzdmZjE3NjEyNzcxMjczZjE3MmQwNzJkMTc2YjA3NmIwNzY4ZjZlOGY2ZTRlNmE0ZDY2MGM2MjJj NjY0ZDZhOGY3MmFmNzJkMTc2ZDA3Ng0KZDE3NmIwNzIxMzdiMzQ3ZjM0N2ZmMjdhYjA3NjRkNmEw YjYyYzk1ZGM5NWRhNzU5YTc1NTg2NTFhNzU1Yzk1OTJiNjYwYjYyNGQ2YTRkNmE2ZTZhNGQ2YTZl NmU2ZTZlNmU2ZTZkNmU2ZDZlMmI2NjBhNjJlOTVkMGE2MmU5NWQNCmU5NWQ4NzU1YTg1NTg3NTE4 NzUxNjY0OTY2NGQ2NjQ5NjY0OTQ1NDU2NzRkZWE1ZGVhNWQ2NjRkMjM0NTQ0NDkwYjYyYzk1NTY3 NDUyZDU2ZjU2ZWY1NjZmNjYyZDU1ZWQ1NWViNDVlYjM1ZTcxNWE3MDVhMmY1NjJmNTYwZDRlDQpl ZDRkZWM0OWVjNDllYzQ5ZWQ0ZGVjNDllYzQ5ZWM0OWVjNDljYjQ1ZWM0OWNiNDVlYzQ5Y2I0NWVi NDVjYjQ1ZWI0NWNhNDFjYjQ1Y2E0MWNiNDVhYTQxY2I0MWFiNDFjYjQxYWI0MWNiNDFhYjNkY2I0 MWFiM2RhYjNkYWIzZA0KYWMzZDhiMzVhYzM1OGIzMThiMzE2YTJkNmIyZDRhMjk0YTJkMTU2M2Y1 NWUxNTYzZjU1ZTE1NjNmNTVlMTU2M2Y1NWVmNTYyZjU1ZTE1NjNmNTVlZjU2MmY0NWVmNTYyZjQ1 ZWY1NjJmNDVlZjU2MmY0NWVmNTYyZjQ1ZWY1NjINCmY0NWUxNTYzZjU2MjE1NjNmNTYyZjU2MmY0 NWVmNTYyZjQ1ZWY0NWVmNDVlZjU1ZWQ0NWVmNTVlZDU1ZWY2NWVmNjVlMTc1ZmY2NWUxNzVmZjY1 YWY2NWFmNjVhMTc1ZjE3NWYzNzY3Mzc2NzU4NmI1ODZiNTk2YjU5NmI5YTczDQo5YTczYmI3Nzli NzNiYzc3YmI3N2JjNzdiYzc3ZGM3YmJjNzdkYzc3YmI3N2RjN2JkYjdiYmE3Zjk5N2YzNTdiNGU2 NmIwNzZiMTdhMTM3ZjEzN2ZmMjdhZjE3MjMyNzNmMDZlZDA3MjhmNmU4ZjZlNmU2YThmNmU2ZTZh NGQ2Ng0KMGM1ZTBiNWVlYTU5MGI1YTBiNWU2ZTZhOGY3MmQwNzZiMDcyZDE3MjEzN2I1NjdmMzQ3 ZmYyN2FhZjcyNmQ2YTBiNjJlOTVkYTg1OWE4NTk4NzUxODc1NWE4NTUwYjYyMmM2NjJjNjYyYzY2 NGQ2NjJjNjY0ZDZhNGQ2YTZlNmUNCjRkNmE2ZTZlNmQ2ZTRkNmEyYjY2MmI2NjBiNjIwYjYyZTk1 ZGE4NTlhODU1YTg1NTg3NTE2NzRkNjY0ZDY3NGQ0NjQ5NjY0OTY3NGQwYjVlYzk1NTQ1NDkwMzQ1 NjY0ZDJiNjJlYTU5MjUzZGVjNTFkMzZhMTY2YmY1NjJkNTYyDQpkNTVlZDQ1ZTkzNWE5MjVlNzA1 YTUwNWEyZjU2MGU1MmVkNGRlZDRkZWM0OTBkNGVlYzQ5MGQ0ZWVjNDllYzQ5ZWM0OWVjNDllYzQ1 ZWM0OWVjNDVlYzQ1Y2I0NWVjNDVjYjQ1ZWI0NWNiNDVlYjQ1Y2I0NWNiNDVjYTQxY2I0NQ0KYWI0 MWNjNDFjYjQxY2M0MWFiNDFjYzQxYWIzZGFjNDFhYjNkYWMzOThiMzU4YzM1NmIzMThiMzE2YjJk NmIyZDRhMjlmNTVlMTU1ZmY0NWUxNTVmZjU1ZTE1NjNmNDVlZjU2MmY0NWVmNTYyZjQ1ZWY1NWVm NDVlZjU2MmQ0NWUNCmY1NjJmNDVlZjU2MmY0NWVmNTYyZjQ1ZWY1NjJmNDVlZjU2MmY0NWVmNTYy ZjQ1ZWY1NjJmNDVlZjU2MmQ0NWVmNDYyZjQ1ZWY0NWVkNDVlZjU1ZWQ0NWVmNTVlZjU1ZTE2NWZm NjVlMTc1ZmY2NWFmNjVhZjY1YTE2NWYxNjVmDQoxNzVmMTc2MzM4NjczNzY3NTg2YjU4NmI3OTZm N2E2ZjliNzM5YjczYmI3NzliNzNiYzc3YmI3N2RjN2JiYzc3ZGM3YmRjNzdkYzc3ZGM3YmJhN2Ji YTdmYjk3ZmYzNzI2ZjZhNmY2ZWYyN2VmMjdlMTM3ZmYyN2FkMDZlZDA2YQ0KYWY2NjRkNjZiMDcy OGY2ZTRkNjYyYzYyNGQ2MjBjNWEwYzVhY2E1MWM5NTE2NzQ5ODc0OWE4NTEyYzYyNGQ2YThmNmU5 MDZlMTM3YjM0N2YzNDdmZjI3YWIwNzY0YzY2ZWE1ZGE4NTVjODU5ODc1MTg2NTE2NjRkYTg1NWM5 NTkNCjBiNWUwYjVlMmM2NjBiNWUwYjVlMmM2MjRkNjYyYzY2NGQ2YTRkNmE2ZTZlNGQ2YTJjNjYw YjYyMmI2MjBhNjJlYTVkYzg1OWE4NTlhODU1YTg1NTY3NGQ4NzRkNjc0ZDY2NDkyNTQxZWE1OWVi NWQ4NzRkZTMzYzAzNDE2NjUxDQoyYzY2ODc0ZDY3NDVjYjRkYjM2NmY2NmFmNTYyZDQ1ZWY1NjJi NDVlYjM1ZTcxNWE3MDVhMmY1NjJmNTYwZTRlMGU0ZWVjNDllYzRkZWM0OWVjNGRlYzQ5ZWM0ZGVj NDllYzQ5ZWM0NWVjNDljYjQ1ZWM0OWNiNDVlYzQ1Y2I0NQ0KZWI0NWNhNDFjYjQ1Y2E0MWNiNDVh YTQxY2I0MWFhNDFhYjQxYWIzZGNiNDFhYjNkYWI0MWFiM2RhYjNkOGIzZGFiM2Q4YjM1YWIzNTZi MzE2YjMxNmEyZDZiMmQ0YTI5NGEyOTE1NjMxNTVmMTU2M2Y1NWUxNTYzZjU2MjE1NjMNCmY1NWUx NTYzZjU2MjE1NjNmNTVlMTU2M2Y1NjJmNTYyZjU2MmY1NjJmNTYyZjU2MmY0NWVmNTYyZjU2MmY1 NjJmNDVlZjU2MmY1NjJmNTYyZjQ1ZWY1NjJmNDVlZjU2MmY0NWVmNTVlZjQ1ZWY1NWVkNDVlZjU1 ZWY1NWVmNjVlDQpmNjVlMTc2M2Y2NWVmNzVlZjY1YTE2NWZmNjVhMTY1ZjE2NWYzNzY3Mzc2NzU4 NmIzODY3NTk2Yjc5NmY5YTczOWE3M2JiNzc5YjczYmM3N2JiNzdkYzdiYmM3N2RjN2JiYzc3ZGQ3 YmJiNzdmYzdmYmE3YmRiN2ZiYTdmMTQ3Nw0KOTA2YWQyN2FkMjdhOGY3MjkwNzIxMzdiZjE3MmFm NjYwYjU2MGI1ZWVhNWQyYzYyNmU2NmIxNmViMTZlNmY2MjBjNTYwYzVhODg0NTQ2NDE2NjQxODg0 OTg4NGQwYjVhNmU2YTZlNmFkMTcyMzQ3ZjMzN2YxMjdmYjA3MjZkNmENCmVhNWRlYTVkYTg1NTg3 NTE2NjQ5ODc0ZDg3NGRhOTU1YTk1MWE5NTE4ODRkODg0ZDg3NGRjOTU1ZWE1OTBiNWVlYjVkMmM2 MjJjNjI0ZDY2MmM2MjJjNjYyYzYyMmI2MmVhNWRlYTVkYzg1OWM5NTlhODUxODc0ZDg3NGQ4ODRk DQo2NjQ5NjY0OWE4NTE4ODUxMDMzZGUyM2MwMzQxYTc1MTBhNWU4NzRkNjc0NWVjNTViMjY2MTY2 ZmQ1NjJkNTYyZDU1ZWQ0NWViMzVlOTI1ZTUwNWE1MDVhMmY1MjBmNTJlZDRkZWQ0ZGVjNDkwZDRl ZWM0OTBkNGVlYzQ5ZWM0OQ0KZWM0OTE2MTAwMDAwMjYwNjBmMDAyMjIwNTc0ZDQ2NDMwMTAwMDAw MDAwMDAwMTAwMDAwMDAwMDAwMDAwMDcwMDAwMDAwMDIwMDAwMDQwMzUwMDAwNDBkNTAwMDBlYzQ5 ZWM0OWVjNDllYzQ1ZWM0OWViNDVlYzQ1Y2I0NWNiNDUNCmNiNDVjYjQ1Y2E0MWNiNDVjYTQxY2I0 MWFiNDFjYjQxYWI0MWNjNDFhYjNkY2M0MWFiM2RhYjNkYWIzOWFjMzk4YjM1OGIzNTZiMzE4YjMx NmIyZDRiMmQ0YTI5ZjU1ZTE1NjNmNTVlMTU2M2Y1NWUxNTYzZjU1ZTE1NjNmNTVlDQpmNTYyZjU1 ZWY1NjJmNDVlZjU2MmY0NWVmNTYyZjQ1ZWY1NjJmNDVlZjU2MmY0NWVmNTYyZjQ1ZWY1NjJkNDVl ZjU2MmY0NWVmNTYyZDQ1ZWY0NWVkNDVlZjQ1ZWQ0NWFmNDVlZDQ1ZWY1NWVkNDVhZjU1ZWY1NWUx NjVmZjY1ZQ0KZjY1ZWY2NWFmNjVhZjU1YWY2NWFmNjVhMTc1ZjE2NjMzNzY3Mzc2NzU4NmI1ODZi Nzk2Zjc5NmY5YTczOWI3M2JiNzc5YjczYmM3N2JiNzdiYzc3YmM3N2RjN2JiYzc3YmM3N2RjN2Jk YjdiYmE3ZmI5N2ZkMjZhNGU2MmQyNzYNCmIxNzJlYjVkNGQ2NmYyNzZmMjc2NmU1ZWVhNTE2NjQ1 NjY0OTBiNWE4ZjZhNGU2MjRlNWUyZTVhMmQ1NmNiNDljYTQ5ODg0MTY3NDE0NjQxYTk0ZGViNTky ZDYyMGI1YThmNmVmMjdhMzQ3ZmYyN2FkMDc2NGQ2NjBiNjJjOTU1DQo4NzRkNDU0NTI1NDE0NTQx Njc0NTQ2NDE0NjQxNDY0MTI1M2QyNDNkNDU0MTAzMzkwNDNkMjQzZDI0M2Q0NTQ1ODc0OWE4NTFl YTU1ZWE1OTBiNWVlYjU5ZWE1OWM5NTljOTU5YTk1NWE4NTE2NjQ5Njc0ZDg3NGQ2NzQ5NjY0OQ0K NjY0OWUzMzhhMDMwYzEzNDQ1NDlhODU1ZWE1ZDQ2NDk2NzQ5ZWM1NWIzNjZmNTY2ZjU2NmQ1NWVk NTVlYjM1YWIzNWU3MTVhNzE1YTJmNTYyZjUyMGU0ZTBlNGVjYzQ5ZWM0OWVjNDllYzRkZWM0OWVj NDllYzQ5ZWM0OWNiNDUNCmVjNDljYjQ1ZWM0OWNiNDVlYzQ1Y2I0NWVjNDVjYTQxY2I0NWNhNDFj YjQ1YWE0MWNiNDFhYjQxY2I0MWFiM2RjYjQxYWIzZGNiNDFhYjNkYWIzZDhiM2RhYjNkOGIzNThi MzU2YjMxOGIzMTZhMmQ2YjJkNGEyOTRhMmQxNjYzDQoxNTVmMTY2MzE1NjMxNjYzMTU2MzE2NjMx NTYzMTU2M2Y1NWUxNTYzZjU1ZWY1NjJmNDVlZjU2MmY0NWVmNTYyZjU2MjE1NjNmNTYyZjU2MmY1 NjIxNTYzZjU2MmY1NjJmNDVlZjU2MmY0NWVmNTYyZjQ1ZWY1NjJmNDVlZjQ1ZQ0KZjQ1ZWY1NWVk NDVlZjU1ZWQ1NWVmNjVlZjY1ZTE3NjNmNjVlZjc1ZWY2NWFmNjVhZjY1YTE3NWYxNjVmMzc2NzM3 Njc1ODZiNTg2YjU5NmI1OTZiOWE3MzlhNzNiYjc3OWI3M2JjNzdiYjc3ZGM3YmJjNzdkYzdiZGM3 YmRkN2YNCmJiNzdmZDdmYmI3YmRhN2Y3ODc3YjE2MjBjNTJiMTZlNmY2NmNhNTUwYzVlZjM3NmQy NzJiMDY2NmU1ZTg4NDk4MDJjODAyODI1M2QwYzU2OTE2MjZmNWE2ODM5ZTQyYzA1MmQwNTMxZTQy YzA0MzEyNTM5Njc0NTg4NDllYTU1DQo0ZDY2ZjI3YTEzN2YxMzdmYjA3MjZlNmEwYjVlYTg1MTQ2 NDUyNTNkMDQzOTI2NDEyNjNkMjYzZDA1MzkyNTM5MDQzOTY3NDU4ODQ5NDY0MTI1M2Q0NjQxNDUz ZGMyMzRlMjM0MjUzZDQ2NDVhODRkYzk1MWViNTllYTU5ZWE1ZA0KYzk1NWM5NTlhODUxODc0ZDY3 NDlhODUxODc0OTY2NDUyNDQxYzEzNDgwMzAyNDQxYTg1MWVhNTljOTU5NDU0OTY2NDkwZDVhYjI2 NmY1NmFmNTYyZjY2MmQ0NWVkNDVlYjM1YTkyNWE3MDU2NTA1NjJmNTIyZjUyMGU0ZWVkNGQNCmVj NDkwZDRlZWM0OWVkNGRlYzQ5ZWM0OWVjNDllYzQ5ZWM0NWVjNDllYzQ1ZWM0NWNiNDVlYzQ1Y2I0 NWNiNDVjYTQxY2I0NWNhNDFjYjQ1YWE0MWNiNDVhYjQxY2I0MWFiNDFjYzQxYWIzZGNjNDFhYjNk YWIzZGFiMzlhYzM5DQo4YjM1OGIzNTZiMzE2YjMxNmEyZDZiMmQ0YTI5MTU1ZjE1NjNmNTVlMTU2 M2Y1NjIxNTYzZjU1ZTE1NjNmNTVlMTU2M2Y1NWVmNTYyZjU2MmY1NjJmNDVlZjU2MmY1NjJmNTYy ZjQ1ZWY1NjJmNTYyZjU2MmY0NWVmNTYyZjQ1ZQ0KZjU2MmY0NWVmNTYyZjQ1ZWY1NjJkNDVlZjQ1 ZWQ0NWVmNDVlZDQ1ZWY1NWVkNDVhZjU1ZWY1NWUxNjVmZjY1ZTE3NWZmNjVhZjY1YWY2NWExNjVm ZjY1YTE3NWYxNzYzMzc2NzM3Njc1ODZiNTg2Yjc5NmY3OTZmOWE3MzliNzMNCmJiNzc5YjczYmM3 N2JiNzdkYzdiYmM3N2RjN2JiYzdiYmM3YmRjN2JkYzdmZGI3Yjk5NzdiMTVlNGU1NjkwNjIwYzVh Njc0NTBjNWFkMjcyZDI3MmIxNmFkMTZlNmY2NjA0MzkyMDFjYTEyOGNiNDkxNTZmYjI2MjY4Mzlh MjFjDQo0MDE0NDAxNDA1MmRlNDJjODEyNGMyMmM4ODQ5ODg0ZDJjNjJiMDcyMTI3ZmYyN2FkMTc2 NGQ2NjBiNWU2NjQ1MjU0MWU0MzgwNTM5MjYzOTI3MzkyNjM1MjczOTQ3M2Q4ODQ1YWE0OWViNTFj YTQ5YTk0OTY3NDE0NjQxMDQzNQ0KMDQzNWUzMzAwNDM5NDYzZDg4NDljYTRkZWI1NWM5NTVhODU1 YTg1MWE4NTE2NzQ5YTg0ZDg4NGQ2NzQ5MjQzZDI1NDFlMjM0MDMzOTg3NGQwYjVlYzk1NWE3NTE0 NTQ1Njc0OWViNTViMjY2ZjU2NjE2NjdmNTYyZDQ1ZWI0NWENCmIzNWE3MTU2NzE1YTUwNTYyZjUy MGU0ZTBlNGVlYzQ5ZWM0OWVjNDllYzQ5ZWM0OWVjNDljYjQ1ZWM0OWNiNDVlYzQ5Y2I0NWVjNDVj YjQ1ZWM0NWNiNDFjYjQ1Y2E0MWNiNDVjYTQxY2I0NWFhNDFjYjQxYWE0MWFiNDFhYjNkDQpjYjQx YWIzZGFiNDFhYjNkYWIzZDhiM2RhYjNkOGIzNWFiMzU2YjMxNmIzMTZhMmQ2YjJkNGEyOTRhMjkx NjYzMTU1ZjE1NjMxNTVmMTY2MzE1NjMxNTYzZjU2MjE2NjMxNTYzMTY2M2Y1NjIxNjY3ZjU2MjE1 NjNmNTYyMTU2Mw0KZjU2MmY1NjJmNTYyMTU2M2Y1NjJmNTYyZjU2MmY1NjJmNDVlZjU2MmY0NWVm NTYyZjQ1ZWY1NjJkNDVlZjQ1ZWY0NWVmNTVlZDQ1ZWY1NWVkNTVlZjY1ZWY2NWUxNzYzZjY1ZWY2 NWVmNjVhMTY1ZmY2NWExNjVmMTY1ZjM3NjcNCjM3NjczODY3Mzg2NzU5NmI1OTZiOWE3MzlhNzNi Yjc3OWI3M2JiNzdiYjc3YmM3N2JjNzdkYzdiYmM3YmJkN2I5Yjc3ZGQ3ZmRjN2ZmYzdmZGE3ZjU2 NmZmMzZhZjI2YWE4NDUwNDM5MGM1YTE0NzdmMzcyZDI2ZWIxNmFiMDZhDQplYjU1NDc0MWMyMjhh MjI0MDUyZDI3MzFhMzFjYzQyMDYwMTQ2MTE4YzQyNGU0Mjg4MTIwZTQzMGE5NDk4ODRkMGI1ZWFm NzJkMTdhZjI3YWIwNzI2ZTY2ZWE1OTQ2NDEwNDM5ZTQzNGU0MzAwNjM1MDUzMTA2MzEyNjM1ODk0 MQ0KY2E0OWNiNDlhOTQ1ZWI0ZGNiNDk4ODQxNDYzOTg4NDEyNjM5MDQzNWUzMzAwNTM5NDYzZDg4 NDVhOTRkYTg1MTg3NGRhODUxYTg0ZGE4NGRhODRkODg0ZDI1NDEwNDM5MjU0MTQ1NDU2NjQ1ZWE1 NTBiNWVhODU1NDU0NTY2NDkNCjY2NDVlYjUxYjE2NjE1NmJmNjY2ZjY2MmQ0NWFkNDVlYjM1YTky NWE3MTU2NzA1NjJmNTIyZjRlMGU0YWVkNDllYzQ5ZWM0ZGVjNDllZDRkZWM0OWVjNDllYzQ5ZWM0 OWVjNDVlYzQ5Y2I0NWVjNDVjYjQ1ZWM0NWNiNDVjYjQ1DQpjYjQ1Y2I0NWNhNDFjYjQ1Y2E0MWNi NDFhYjQxY2I0MWFiNDFjYzQxYWIzZGNjNDFhYjNkYWIzZGFiMzlhYzM5OGIzNThiMzU2YjMxOGIz MTZiMmQ0YjJkNGEyOWY1NWUxNTVmZjU1ZTE1NjNmNTVlMTU2M2Y1NWUxNTYzZjU1ZQ0KZjU2MmY1 NWVmNTYyZjQ1ZWY1NjJmNDVlZjU2MmQ0NWVmNTYyZjQ1ZWY1NjJkNDVlZjU2MmY0NWVmNTYyZDQ1 ZWY0NWVkNDVlZjQ1ZWQ0NWVkNDVlZDQ1ZWY0NWVkMzVhZDQ1ZWQ0NWFkNDVlZDQ1YWQ1NWFkNTVh ZjY1ZWY2NWENCmY2NWVkNTVhZjY1YWQ1NTZmNjVhZjU1YTE2NWYxNjVmMTc2MzE3NjMzODY3Mzg2 NzU5NmI3OTZmOWE3MzdhNmY5YTczOWE3MzliNzM5YTczYmI3NzliNzNiYzc3OWM3YjdiNzdiYjdi YmI3YmJhN2JkYjdmOTg3Nzk4N2IxMzZmDQo2NjM5YTEyODJkNWVmMzc2ZDM3MmIyNmU5MDY2ZjM3 MmIyNmUyZTVhYTk0NTA1MmRlNDI0ODIxODYxMTA2MTEwNjExMDYxMTA0MDEwNDAxNDgyMjBlNTMw NDczZGE4NTEyYjYyOGY2ZWQxN2FkMTc2YjA3MjJkNjJlYTU1MjUzZA0KZTMzNGEyMjhjMzJjYzMy OGM0MjhhNDI0ZTUyODQ3MzkwZDUyY2I0OTQ3Mzk0NzNkODk0MTY4M2RhYTQ1NDYzOTA0MzFhMTI0 YTEyNGEyMjhlMzMwMjUzNTY3NDE2NjQ1NjU0NTY2NDlhODRkODc0ZGE4NGQ0NjQ1ZTMzNGMxMzAN CjI1M2Q0NTQxODc0OWM5NTVlYTU5ODc0ZDQ1NDU2NjQ5NDU0MWNhNGRiMjY2ZjU2YWY2NjZmNTVl ZjU1ZWIzNWFiMzVhNzE1NjcxNTY1MDUyMmY1MjBlNGEwZTRlY2M0OWVjNDllYzQ5ZWM0OWNjNDll YzQ5Y2I0NWVjNDljYjQ1DQplYzQ1Y2I0NWVjNDVjYjQ1Y2I0NWNiNDFjYjQ1Y2E0MWNiNDVjYTQx Y2I0NWFhNDFjYjQxYWI0MWNiNDFhYjNkY2I0MWFiM2RjYjQxYWIzZGFiM2Q4YjNkYWIzZDhiMzU4 YjM1NmIzMThiMzE2YTJkNmIyZDRhMjk0YTJkMTU2Mw0KZjU1ZTE1NjNmNTVlMTU2M2Y1NWUxNTYz ZjU2MmY1NjJmNDVlZjU2MmY0NWVmNTYyZDQ1ZWY1NjJkNDVlZjQ1ZWQ0NWVmNTYyZDQ1ZWY0NWVk NDVlZjU2MmQ0NWVmNDVlZDQ1ZWY0NWVkNDVlZDQ1ZWQzNWFkNDVlZDQ1ZWQ0NWUNCmQzNWFkNDVl ZDQ1YWQ0NWFkNDVhZjU1ZWQ1NWVmNjVlZDU1YWY2NWFkNTVhZDU1YWQ1NWFmNjVlZjY1ZTE2NjMx NjYzMzc2NzM3Njc1ODZiNTg2Yjc5NmY3YTZmOWE3MzdhNmY5YTczOWE3MzliNzc5YTczYmI3Nzli NzdiZDdmDQo3Yjc3YmI3YjlhNzM5YTczYmE3N2I5NzdkYTdiNTY3MzI1MzFjMjI4NGU1ZTE0Nzdi MTZlZDI3MjkwNjY2ZjY2NmY2MjkwNjI2ZjVlNGY1NmNiNDU4OTM5NjkzNWU1MjBhMzFjYzMyMGMz MjBjMzI4ZTQyYzY3M2RjOTRkMGI1ZQ0KNGQ2NmQwNzZmMTdhZjI3YWIwNzI0ZDY2Yzk1MTQ2NDVl MzM0YTIyOGEyMjhjMzI4YTMyMGEzMjBhMzIwYWI0MWIzNjI1MDVhZTUyYzgxMWM0MDE0NjAxODA1 MmQwNTJkYTIyMDYwMWM0MDFjODEyMGEyMjgwNDMxMjUzOTY2NDUNCjQ0NDE2NjQ5ODc0ZGE4NGQ4 ODQ5NDY0MWMxMmNhMTJjMDQzNTQ2NDE2NjQ1Yzk1MWM5NTU4NzRkMjQ0MTg3NGQ0NTQxY2E0ZGIx NjIxNjZmZjU2NmY1NjJmNTVlZDQ1ZWIzNWE5MjVhNzE1NjUwNTYyZjUyMmY0ZTBkNGVlYzQ5DQpl YzQ5ZWM0ZGVjNDllYzQ5ZWM0OWVjNDllYzQ5ZWM0OWNiNDVlYzQ5Y2I0NWVjNDVjYjQ1ZWM0NWNi NDVjYjQ1Y2E0NWNiNDVjYTQxY2I0NWFhNDFjYjQ1YWI0MWNiNDFhYjQxY2M0MWFiM2RjYzQxYWIz ZGFiM2RhYjM5YWMzOQ0KOGIzNThiMzU2YjMxNmIzMTZhMmQ2YjJkNGEyOWQ0NWFmNDVlZDQ1YWY0 NWVkNDVlZjQ1ZWQ0NWVmNDVlZDQ1ZWY0NWVkNDVlZjQ1ZWQ0NWVmNDVlZDQ1ZWQ0NWVkMzVhZDQ1 ZWIzNWFkNDVlZDM1YWQ0NWViMzVhZDQ1ZWQzNWENCmQ0NWViMzVhZDM1ZWIzNWFkMzVhYjM1YWIz NWFiMzVhZDM1YWIyNWFiMzVhYjM1YWI0NWFiMzVhZDQ1ZWI0NWFkNDVhYjQ1NmI0NTZiMzU2YjQ1 NmI0NTZkNTVhZDU1YWY2NWVmNTVlMTY2MzE3NjMzODY3Mzg2YjU5NmY1OTZmDQo3YTZmNTk2Zjdh NzM3YTZmOWE3MzdhNzM5YTczNzk3MzliNzc3YTczOWE3MzliNzNiYjczOWE3M2JiN2JiMzVlZTQy NGU0Mjg3MDVlYjE2YWQyNzJkMjcyNGQ1ZTRkNWU4ZjYyOGY2MjZmNWUwYzUyZWI0OWFhNDVjYjQ1 ODgzZA0KODg0MTY3M2Q2NzNkNjY0MWE4NDljODRkMGE1NjJiNjI4ZTZlOGU2ZWYxN2FkMDc2OGU2 ZTBiNjJhODUxMjQ0MTAzMzVhMTI4ODEyMDgxMWM4MjFjODExODgyMThlNTI4YWI0MWFiM2Q0ODMx ZTYyODgzMWM0MDEwYTMxYzgzMWMNCjYxMTgwMDBjMDAxMDQwMThjMjI4ZTQzNDI1M2QyNDQxNDQ0 NTI0NDE2NjQ1YTg0OWNhNDkwNTMxNjAxYzYwMWMyNTM1NDYzZDY3NDUyNDQxODg1MTQ1NDkyNDQ1 NjY0NTQ1M2RlYjRkZjM2YWY0NmFmNDY2ZjQ2MmIzNWFiMzVhDQpiMzVhOTI1NjcxNTY0ZjUyMmY1 MjBkNGVlZDRkY2M0OWVjNDljYjQ1ZWM0OWViNDllYzQ5Y2I0OWVjNDljYjQ1Y2I0NWNiNDVjYjQ1 Y2E0NWNiNDVhYTQxY2E0NWFhNDFjYTQ1YWE0MWFhNDFhYTQxYWE0MWFhM2RhYTQxYWEzZA0KYWIz ZDhhM2RhYjNkOGEzOWFiM2Q4YTM5OGIzOThhMzE4YjMxNmEzMThiMzE2YTJkNmEyZDRhMjk0YTJk ZjQ1ZWQ0NWVmNDVlZDQ1ZWY0NWVkNDVlZjQ1ZWQ0NWVmNDVlZDQ1ZWY0NWVkNDVlZjQ1ZWQ0NWVk NDVlZDM1YWQ0NWUNCmQzNWVkNDVlZDM1YWQ0NWVkMzVlZDQ1ZWQzNWFkNDVlYjM1YWQzNWViMzVh ZDM1ZWIzNWFiMzVhYjM1YWIzNWFiMjVhYjM1YTkyNTZiMzVhYjM1YWI0NWFiMzVhZDQ1YWI0NWFi NDVhYjM1NmI0NWFiNDU2ZDU1YWQ1NWFmNjVlDQpmNTVlZjY2MmY2NjIxNzY3MTc2NzM4NmIzODZi Nzk2ZjU5NmY3OTZmNTk2ZjdhNzM3YTZmN2E3MzdhNzM5YTczOWE3MzlhNzM3YTZmYmM3NzliNmY5 YjczYmM3N2Q0NWVhMzFjZTQyODkwNWVmMzcyZDI3MmYyNzY2ZTY2ZWE1MQ0KZWE0ZGVhNTFjOTQ5 YTg0NTQ2Mzk0NjM5MjYzOTY4NDE2NzQxODc0NTg4NDllOTUxZTk1NTJiNWUyYTVlNmQ2NmFlNmVh ZjcyY2Y3MmQwNzY0ZDZhMGI1ZTg3NGQyNDNkMDMzOWUzMzBjMjI4YTIyNDgxMWNhMjFjODIxOGEz MWMNCjA2MjllNTI0NjIxNDYyMTgyMDBjMDAwYzYxMTQ2MjE4NDAxNDQwMTg0MDE4ODIyNGMzMmMy NjM5MjUzZDI0NDEyNDQxNDU0NTY2NDFhOTQ1ODg0MTA0MmQ0MDE0NjAxOGU0MjgyNjM1Njc0MTQ2 NDE0NjQ5MjQ0NTAzNDE2NzQ1DQo0NjNkMmQ1NmYzNmExNTZiZjQ2NmY1NjZiMzVhZDQ1ZWIzNWE5 MjVhNzE1NjcwNTYyZTUyMGU1MmVjNGRlYzRkZWI0OWVjNDljYjQ5ZWM0OWVjNDllYzQ5Y2I0OWVj NDljYjQ1Y2I0OWNiNDVjYjQ1Y2E0NWNiNDVhYTQxY2I0NQ0KYWE0NWNhNDVhYTQxYWE0MWFhNDFh YTQxYWE0MWFiNDFhYTNkYWIzZDhhM2RhYjNkOGEzOWFiM2Q4YTM5YWIzNThiMzE4YjMxNmEyZDZi MzE2YTJkNmEyZDQ5MjliMzVhZDQ1ZWQzNWFkNDVlZDM1YWQ0NWVkMzVhZDQ1ZWIzNWENCmQ0NWVk MzVhZDQ1ZWIzNWFkMzVhYjM1YWQzNWFiMzVhZDM1YWIzNWFkMzVlYjM1YWQzNWFiMzVhZDM1ZWIy NWFiMzVhYjI1YWIzNWE5MjU2YjM1YTkyNTZiMzVhOTI1NjkyNTY5MjU2OTI1NjkyNTY5MjU2OTI1 NmIzNWFiMzU2DQpiNDVhYjM1NmIzNTY5MzUyYjQ1NmI0NTZkNTVhZDQ1YWQ1NWVkNTVlZjY2MmY2 NWUxNjYzMTc2NzM4NmIzODZiNTg2YjU4NmI1OTZmNTg2Yjc5NmY1OTZmNzk2ZjU5NmY3OTZmNzk2 ZjlhNzM3YTZmN2E2ZjdhNmZiYzc3OTI1Ng0KYTMxY2MzMjA5MTVlZjM3MmQyNzJkMTcyYjA2ZTRj NWU0YzVhMmI1NjBiNTZjYTRkY2E0OWE5NDVhOTQ1NjczZDg4NDVhODQ5ZWE1MTBiNWE0YzYyNGM2 MjRjNjI2ZDY2YWY3MjhlNmVhZjcyNmU2ZTJjNjZlYTVkYTc1MTI0NDENCjQ1NDEyNTNkMjUzNWMz MjhjMjI0YTIyMGMzMjBhMzFjMDYyOWU1MjRlNTI0MDYyOWU1MjQ4MjE4ODIxYzYxMTQ4MjFjYTMy NGM0MjhjMzJjZTQzMDI1Mzk0NjQxMjQ0MTQ0NDU0NTQ1Njc0NTg4NDE2NzM5YzMyNDQwMTQyMDEw DQphMjIwZTQyYzY4NDE0NjQxNDU0MWUyMzgyNDQxMDQzOTg4NDE0ZjVhMTQ2YmY0NjZmNDYyZjU2 MmQ0NWViMzVhYjM1YTkyNTY3MTU2NGY1MjJlNTJlZDRkZWQ0ZGNiNDllYjQ5Y2I0NWVjNDljYjQ1 ZWM0OWNiNDllYjQ5Y2I0NQ0KY2I0NWNiNDVjYjQ1YWE0MWNhNDVhYTQxY2E0NWFhNDFhYTQ1YWE0 MWFhNDFhYTQxYWE0MWFhM2RhYTQxOGEzZGFhM2Q4YTNkYWIzZDhhMzk4YTNkOGEzOThiMzk4YTMx OGIzMTZhMmQ4YjMxNmEyZDZhMmQ0OTI5NGEyZGQzNWENCmIzNWFkMzVhYjM1YWQzNWFiMzVhZDQ1 ZWIzNWFkNDVlYjM1YWQ0NWVkMzVhZDM1YWIzNWFkMzVhYjM1YWIzNWFiMzVhYjM1YWIzNWFiMzVh YjM1YWIzNWFiMzVhYjM1YTkyNTZiMzVhOTI1NmIyNWE5MjU2YjI1YTkyNTY5MjU2DQo5MTU2OTI1 NjkyNTY5MjU2OTI1NmIzNTY5MzU2YjM1YTkzNTZiNDU2OTM1NjkzNTY5MzUyYjQ1NmI0NTZkNTVh ZDQ1YWY1NWVkNTVlZjY2MmY2NjIzNzY3Mzc2NzU4NmIzODZiNTk2YjU4NmI1OTZmNTk2Yjc5NmY1 OTZmN2E3Mw0KNTg2Yjc5NmY3YTZmN2E2ZjU5NmI5YjczOWI3MzMwNGFjNDFjMDUyOTcwNWFmMzcy ZDI3MmYyNzZkMTcyOGY2YTZkNjI0ZDYyNGQ1YTRlNWUyZDVhMmQ1YTBjNTIwYzU2MGM1NjJkNWU0 ZDYyNmU2NjZkNjY2ZDY2NmQ2NmFmNmUNCmFmNzJhZjZlOGU2ZThlNmUyYzY2MmM2NmM5NTljOTU1 YTk1MWE5NGQ2NzQxMjUzOTA0MmQwNDJkZTQyODA1MjkyNzMxNDgzNTY5MzlhYjQxNjkzOTI3MmRl NTI0ZTUyYzA1MmQyNzM1MjYzNTI1MzUwNTM1MjYzZDQ2NDE2NjQ1DQo2NTQ1ODc0OTg3NDU4ODQx MjUzMWMzMjA0MDEwNDAxMDYwMTRhMzI0NDczOWE5NDk0NjQxZTIzNDA0MzkyNTM1YWE0MWIxNjIx NTZiZjQ2NmY0NjIxNjY3ZDQ1ZWQ0NWViMzVhOTI1YTcxNTY1MDU2MmU1MjBlNTJlYzRkZWM0OQ0K Y2I0OWVjNDljYjQ5ZWM0OWNiNDllYzQ5Y2I0NWNiNDljYjQ1Y2I0OWNhNDVjYjQ1YWE0MWNiNDVh YTQxYWE0NWFhNDFhYTQ1YWE0MWFhNDFhYTQxYWE0MWFhNDFhYjQxOGEzZGFiM2Q4YTNkYWIzZDhh MzlhYjNkOGEzOThiMzUNCjhiMzE4YjMxNmEyZDZiMmQ0YTJkNmEyZDRhMjk5MjU2YjM1YTkyNTZi MzVhYjI1NmIzNWFiMjU2YjM1YWIyNTZiMzVhYjI1NmIzNWFiMjU2YjM1YWIyNTZiMzVhOTI1NmIy NWE5MjU2YjI1NjkyNTZiMjVhOTI1NmIyNTY5MjU2DQpiMjU2OTI1NjkyNTY5MjU2OTI1NjkxNTI5 MjU2OTE1NjkyNTY3MTUyOTI1NjkyNTI5MjU2OTI1MjkzNTY5MjUyYjM1NjkzNTI5MzU2OTI1Mjkz NTI5MzUyYjM1NjkzNTZiNDVhYjQ1YWQ1NWVkNTVlMTY2MzE2NjMzNzY3Mzg2Nw0KNTg2YjM4NmI1 ODZiNTg2YjU5NmY1ODZiNTk2Zjc5NmY1ODZiNTg2YjdhNmY1OTZiN2E2ZjdhNmY3YTZmYWIzOTA2 MjkyNzMxMmU1NmIxNjZmMjcyZjI3NmYyNzYxMjc3ZjI3NmQxNzJmMjcyZjM3NjE0NzdkMzZlZDI2 ZWIxNmENCmQyNmVkMTZlZDE2ZWFmNmVhZjZlOGU2YWFmNmVhZjcyZjE3NjhlNmVhZjZlNmU2YTZk NmE0YzZhMmI2MjJjNjIyYzYyMGI1YWM5NTE4NzQ1NjYzZDA0MzFlMzJjZTQyYzA1MmRjMzI0MDUy OTI2MzE2ODM1NDczNTQ3MzU0NzM1DQo0NzM5MjYzNTI2MzUwNTM1MjUzOTI1M2Q0NjQxNDU0NTY2 NDk2NzQ1ODc0NTQ2MzVlNDI4NjAxNDQwMGM0MDBjNDAxMDQwMTAwNTJkY2I0OTY4NDVjMzMwMDQz NTY4M2QyZTUyZDM2MjE2NmJmNDYyZjU2MmY1NWVkNTVlYjM1YQ0KYjM1YTcxNTY3MTU2NGY1MjJl NTJlZDRkZWM0ZGNiNDllYzQ5Y2I0NWNiNDljYjQ1ZWI0OWNiNDVjYjQ1Y2E0NWNiNDVhYTQ1Y2I0 NWFhNDFhYTQ1YWE0MWFhNDFhYTQxYWE0NThhNDFhYTQxOGEzZGFhNDE4YTNkYWE0MThhM2QNCmFh M2Q4YTM5OGEzZDhhMzk4YTM5OGEzOThhMzk4YTMxOGIzMTZhMmQ2YTJkNmEyZDZhMmQ0OTI5NGEy OWIzNWE5MjU2YjM1YTkyNTZiMzVhYjI1NmIzNWFiMjU2YjM1YWIyNTZiMzVhOTI1NmIzNWE5MjU2 YjI1NjkyNTZiMzVhDQo5MjU2YjI1YTkyNTZiMzVhOTI1NmIyNWE5MjU2YjM1YTkyNTZiMjU2OTI1 NmIyNTY5MjU2OTI1NjkxNTY5MjU2OTI1NjkyNTY5MjU2YjM1NjkyNTZiMzU2OTI1NmIzNTY5MzU2 YjM1NjkyNTI5MzU2OTM1MjkzNTY5MzUyYjQ1Ng0KYjM1NmQ0NWFkNDVhZjY2MmY2NjIzNzY3Mzc2 NzU4NmIzODZiNTg2YjU4NmI1OTZmNTk2Zjc5NmY1OTZmN2E3MzU4NmI3OTZmNzk2ZjU5NmI3YTZm OWI3M2Y2NjIyODI5MjcyOTY5MzllYzRkOTA2MmQyNmVmMjdhZDE3NmYyNzYNCmYxNzJmMjc2ZjI3 NjE0N2IxNDdiMTQ3N2YzNzIxNDdiMTQ3YjM0N2JmMjc2ZDE3NmIwNmVkMDcyZDA3NmYxNzZmMTc2 ZDA3MmFmNzJhZjcyNmQ2YThmNzI0ZDZhOGU2ZTZlNmE2ZTZhMmM1ZTBiNWFhOTRkNDY0MWUyMmNl NDJjDQphMjI0YTEyMGEyMjBlNDI4MDUzMTQ3MzU0NzM5NDczOTI2MzkyNjM5MDUzNTI1MzkyNTNk NDY0MTY2NDE4NzQ5NjY0OWE4NDk4ODQ1MjYzNWEyMjA2MTE0NDAwYzYyMTA0MDBjMjAwY2E0MjAw ZTRlZWM0ZDg5NDU4ODQxMmU1Mg0KYjM1ZTE2NmIxNjY3MTY2M2Y1NWVmNTVlZDQ1YWQ0NWFiMzVh OTI1YTcwNTY1MDU2MmU1MjBkNTJlYzRkZWM0OWNiNDljYjQ5Y2I0NWVjNDljYjQ1Y2I0OWNhNDVj YjQ1Y2I0NWNiNDVhYTQ1Y2I0NWFhNDFhYTQ1YWE0MWFhNDUNCmFhNDFhYTQxOGE0MWFhNDE4YTQx YWE0MThhM2RhYjQxOGEzZGFiM2Q4YTM5YWIzZDhhMzk4YTM5OGEzNThiMzU4YjMxOGIzMTZhMmQ2 YjJkNGEyZDZhMmQ0OTI5OTI1NmIyNTY5MjU2YjM1YTkyNTZiMzVhYjI1NmIzNWE5MjU2DQpiMzVh YjI1NmIzNWE5MjU2YjI1NjkyNTZiMjU2OTI1NmIyNWE5MjU2YjM1YTkyNTZiMjVhOTI1NmIzNWE5 MjU2YjI1NjkyNTZiMjU2OTI1NjkyNTY5MTU2OTI1NjkxNTI5MjU2OTI1NmIyNTY5MjU2OTI1Njky NTJiMzU2OTI1Mg0KOTM1NjkzNTI5MzU2NzI0ZTkzNTI5MzUyOTM1NjkzNTZiNDVhYjQ1YWQ1NWVk NTVlZjY2MjE2NjMzODY3Mzc2NzM4NmIzODZiNTg2YjM4NmI1OTZmNTk2YjU5NmY1OTZmNTg2Yjc5 NmY3YTZmMzg2NzliNzM1OTZiOTM1MmM0MWMNCjA2Mjk0NzM1Y2E0NTRlNWFkMTZlZDE3MmQxNzZk MTcyZDE3NmQyNzZmMzdhZjI3NmYzN2FmMzc2MTQ3NzEzNzcxNDdiMTQ3YjEzN2JkMTcyZDA3MmQw NzJkMTc2ZDA3MmYyNzZiMDcyZDA3MjhmNzI4ZjcyYWY3NjhmNzI4ZTcyDQphZjcyOGU2ZTZkNmE0 YzYyMmM2MmM5NTE4NzQ1MjQzNWUzMmNjMjI4MDQzMWU0MzAwNDMxMDUzNTI1MzUyNTM1NDYzOTQ1 Mzk0NjNkNDUzZDQ2NDE0NjQxNjc0NTY2NDU4NzQ5ODg0OTg4NDUwNTJkODIxODQwMGM2MjEwNDEw Yw0KNDEwYzIwMDg4MzE4MGU0ZTcxNWE0ZjU2NTA1YWIzNWVmNjY2MTY2NzE2NjNmNTVlZjU1ZWQ1 NWFkNTVlYjM1NmIzNWE3MTU2NzE1NjJmNTIyZTUyZWQ0ZGVjNGRjYjQ5Y2I0OWNiNDVjYjQ5Y2I0 NWNiNDVjYTQ1Y2I0NWFhNDENCmNiNDVhYTQxY2E0NWFhNDFhYTQxYWE0MWFhNDE4YTQxYWE0MTg5 NDFhYTQxODkzZDhhNDE4YTNkYWE0MThhM2Q4YTNkOGEzOThhM2Q2YTM5OGEzOTZhMzU4YjM5NmEz MThiMzE2YTJkNmEyZDRhMjk0YTJkNDkyOTRhMjliMzVhDQpiMjU2YjM1YWIzNWFiMzVhYjM1YWQz NWFiMzVhZDM1YWIzNWFkMzVhYjM1YWQzNWFiMzVhZDM1YWIzNWFiMzVhYjI1YWIzNWFiMzVhYjM1 YWIyNWFiMzVhYjM1YWIzNWE5MjU2YjM1YTkyNTZiMjU2OTI1NmIyNTY5MjU2OTI1Ng0KOTE1NmIy NTY5MjU2YjM1NjkyNTZiMzU2OTI1NjkzNTY5MjUyYjM1NjkzNTI5MzUyOTI1MjkzNTI5MzUyYjQ1 YWI0NWFkNTVlZDU1ZWY2NjJmNjYyMTc2NzE3NjczODZiMzg2YjU4NmI1ODZiNTk2ZjU4NmI3OTZm NTk2Zjc5NmYNCjU4NmI5Yjc3N2E2ZjU5NmI5YjczNTk2YjBmNDZhNDE4ZTUyMDI3MzE4OTQxNGU1 ZWIxNmFkMTcyZDE3MmQxNzZkMTc2ZjI3YWYyNzZmMjc2ZDI3NmYzN2ExMzdiMTQ3YjE0N2IxNDdm MTM3YmYzN2FkMjc2ZDE3YWQwNzZiMDcyDQpkMTc2YjA3MmIwNzJkMDc2YWY3MmYxN2FiMDc2ZDA3 NmIwNzZiMDc2NmU2ZThlNmU4ZTZlOGU2ZTRjNjI0ZDVlYzk0OWE4NDU4ODQ1ODc0MTY2M2Q2NzQx NDUzOTQ1M2Q0NjNkODg0OTg4NDk4ODQ5NjY0NTY3NDU2NjQxODc0OQ0KNjc0NTg5NDk2ODNkMDUy ZDQwMTA0MTBjNjIwYzQyMGM0MjBjMjEwODQxMGMyZjRhYjM1ZWQ0NjZmNDY2ZjY2NjE2NjcxNjY3 ZDU1ZWY2NjJmNTVlZjU1ZWQ1NWVkNDVhYjM1NjkyNWE3MTU2NTA1NjBlNTIwZDUyZWM0ZGVjNDkN CmNiNDVlYjQ5Y2I0NWNiNDljYjQ1Y2I0OWNhNDVjYjQ1YWE0NWNiNDVhYTQ1YWE0NWFhNDFhYTQ1 YWE0MWFhNDU4YTQxYWE0MThhNDFhYTQxODkzZGFhNDE4YTNkYWIzZDhhM2RhYjNkOGEzOThhMzk4 YTM5OGIzOThhMzU4YjM1DQo4YjMxOGIzMTZhMmQ2YTJkNGEyOTZhMmQ0OTI5YjI1NmIzNWE5MjU2 YjM1YWIyNTZiMzVhYjI1NmIzNWFiMzVhYjM1YWIyNTZiMzVhYjM1YWIzNWFiMjU2YjM1YWIzNWFi MzVhYjI1YWIzNWFiMzVhYjM1YWIyNWFiMzVhYjI1YQ0KYjM1YTkyNTZiMzVhOTI1NmIzNWE5MjU2 YjM1YTkyNTZiMjU2OTI1NjkyNTY5MjUyYjI1NjkyNTJiMzU2OTI1MmIzNTY5MjUyOTM1MjcyNGU5 MzUyOTM1MmI0NTZiNDU2ZDQ1YWQ0NWFmNTVlZjU1ZTE2NjMxNjYzMzc2NzM4NmINCjU4NmIzODZi NTk2ZjU5NmI3OTZmNTk2YjU5NmY3OTZmNTg2YjlhNzM3YTZmN2E2ZjdhNmYzODY3YWMzNWM0MWNl NTI0MDYyZDg5M2QwYzU2YjE2YWQxNzJkMTc2YjA3MmQxNzZkMTc2ZDI3NmQxNzZmMjdhZjI3NjEz N2JmMzc2DQoxMzdiZjM3YTEzN2JmMjdhZjI3YWQxNzZkMTc2YjA3MmIwNzJhZjZlYjA3MmFmNzJk MDc2YjA3NmQwN2FhZjc2YjA3NjhmNzJhZjcyOGU2ZThlNmU2YzZhNmQ2YTRkNjI2ZTYyNGQ2MjRk NjI0ZDVlNGM1ZWVhNTFhODRkYTg0OQ0KZWE1MWVhNTFjOTUxODc0OTg3NDU2NjQ1Njc0NTY2NDE4 ODQ1NjczZDA1MzE4MjFjNDExMDIxMGM2MzBjNDIwODQyMDgyMTA0MDAwNDZhMzE5MzVhZDQ2MmQ0 NjJkNTVlZjY2MmY2NWVmNjYyZjY1ZWY2NWVkNDVhZDQ1YWI0NWENCmIzNWE3MTU2NzE1NjRmNTYy ZjU2ZWQ0ZGVjNGRjYjQ1Y2I0OWNhNDVjYjQ1YWE0NWNiNDVhYTQxY2I0NWFhNDFjYTQ1YWE0MWFh NDFhOTQxYWE0MTg5M2RhYTQxODk0MThhNDE4OTNkODkzZDg5M2Q4YTNkODkzOThhM2Q4YTM5DQo4 YTNkNmEzOThhMzk2YTM5OGEzOTZhMzU4YTM1NmEzMThiMzE2YTJkNmEyZDRhMmQ2YTJkNDkyOTQ5 MjlkMzVhYjM1YWQzNWFiMzVhZDM1YWIzNWFkMzVhYjM1YWQzNWFiMzVhZDM1YWIzNWFkMzVhYjM1 YWQzNWFiMzVhZDM1YQ0KYjM1YWIzNWFiMzVhZDM1YWIzNWFiMzVhYjM1YWQzNWFiMzVhYjM1YWIz NWFiMzVhYjM1YWIzNWFiMjVhYjM1YWIyNTZiMjU2OTI1NmIzNTY5MjU2YjM1NmIzNTZiMzU2YjM1 NmIzNTY5MzUyOTM1MjkzNTJiNDU2YjQ1NmQ1NWENCmQ1NWFmNTVlZjU1ZTE2NjMxNjYzMzc2NzM4 Njc1OTZmNTg2YjU5NmY1OTZmN2E2Zjc5NmY3YTczNzk2ZjlhNzM1ODZmOWI3NzU5NmI5YjczOWI2 ZjE3NjM0ODI5YzQxYzA2MjU2ODM1YTk0MTJkNTY4ZjY2ZDE3MmIwNzJkMTc2DQpkMTc2ZDE3YWQx NzZmMjdhZjI3YTEzN2JmMzdhMTM3YjEzN2IxNDdmMTM3YjEzN2ZmMjdhZjI3YWQxNzZiMDcyYjA2 ZWIwNzJhZjZlYjA3MmIwNzJiMDc2YjA3NmYxN2FkMDdhZDA3YWFmNzZhZTcyNmQ2ZTZjNmU0YzY2 OGU2YQ0KOGY2YThmNmE4ZTY2OGY2YTZlNjY2ZDYyMGI1ZTBiNWEwYjVhMGI1YWM5NTFhODRkODc0 NTg3NDk4NzQ1Njc0NTQ3M2QyNjM1YzMyNDgyMTg0MTBjNDIwYzQyMDg0MzA4NDIwNDQyMDgwMDAw NmEzMTcyNTJmNTYyZDU2MmY2NjINCmY2NWUxNjYzZjY1ZTE2NjNmNTVlZjU1ZWQ0NWFkNDVlYjM1 YTkyNWE3MDU2NTA1NjJmNTIwZDUyZWM0OWVjNDljYjQ1Y2I0OWNhNDVjYjQ1YWE0NWNiNDVhYTQ1 Y2I0NWFhNDFjYTQ1YWE0MWFhNDVhYTQxYWE0MTg5NDFhYTQxDQo4OTQxOGE0MTg5M2Q4YTQxODkz ZDhhM2Q4YTNkOGIzZDhhMzk4YTNkOGEzOThiMzk2YTM5OGEzOTZhMzU4YjMxNmEyZDhiMzE2YTJk NmIyZDRhMjk0YTJkNDkyOWIzNWFkMzVhYjM1YWQ0NWViMzVhZDQ1ZWQzNWFkNDVlYjM1YQ0KZDM1 YWIzNWFkNDVlYjM1YWQzNWFiMzVhZDQ1ZWIzNWFiMzVhYjM1YWQzNWFiMzVhYjM1YWIzNWFkMzVh YjM1YWQzNWFiMzVhZDM1ZWIzNWFiMzVhYjM1YWIzNWFiMjU2YjM1YWIyNTZiMzU2OTI1NmIzNTZi MzU2YjM1YWIzNTYNCmI0NTZiMzU2YjM1NjkzNTJiMzUyYjQ1NmQ0NWFkNTVhZjU1ZWY1NWUxNjYz ZjY2MjE3NjczNzY3NTg2YjU4NmI1OTZmNTk2ZjdhNzM3OTZmN2E3MzdhNmY3YTczN2E3MzlhNzM5 YjczNzk2ZjliNzM5YjczOTM1MjA3MjFhMzE4DQoyNzJkYWEzZGViNDkwYzU2OTA2YWQxNzJkMTc2 ZDE3NmQxNzZiMDc2ZDE3YWYyNzYxMzdiZjI3YWYzN2FmMjdhMTM3YjEzN2IxMzdiZjI3YWYyN2Fk MTc2ZDE3NjhmNmVhZjZlOGY2ZWIwNzI4ZjZlYjA3MmIwNzJiMDc2ZDE3YQ0KZDE3YWIwNzZhZjc2 OGU2ZTZkNmU0YzZhNGM2YTJiNWU0YzYyNGM2MjRjNjIyYjYyNGM2MjJiNWUwYTVlMGE1YTBhNWFj OTU1YTg0ZDY2NDU2NjQ1NjY0NTY3NDU0NjNkMjUzNWMzMjQ4MjFjNDExMDQxMGMyMTA4NDIwODIx MDQNCjIyMDQyMTA0MDAwMDA3MjU1MTRlZDQ1ZWQ1NjJkNTVlZjY1ZWY2NWVmNjYyZjU1ZWY1NWVk NDVhZDQ1ZWIzNWFiMzVhNzE1NjcxNTY0ZjUyMmY1MmVkNGRlYzQ5Y2I0NWNiNDVjYjQ1Y2I0NWFh NDFjYTQ1YWE0MWNiNDVhYTQxDQphYTQ1YWE0MWFhNDE4OTQxYWE0MTg5NDFhYTQxODkzZDhhNDE4 OTNkOGEzZDY5M2Q4YTNkOGEzOThhM2Q2YTM5OGEzZDZhMzk4YTM5NmEzNThhMzk2YTM1OGIzNTZh MzE4YjMxNmEyZDZhMmQ0YTI5NGEyZDQ5Mjk0OTI5ZDQ1ZQ0KZDM1YWQ0NWVkNDVlZDQ1ZWQ0NWVm NDVlZDQ1ZWQ0NWVkNDVlZjQ1ZWQ0NWVkNDVlZDQ1ZWY0NWVkNDVlZDQ1ZWQzNWVkNDVlZDQ1ZWQ0 NWVkMzVlZDQ1ZWQ0NWVkNDVlZDQ1ZWQ0NWVkNDVlZDQ1ZWQzNWVkNDVlZDM1YWQ0NWUNCmQzNWFk NDVhYjM1YWQ0NWFiMzVhZDQ1YWQ0NWFkNDVhZDQ1NmQ0NWFiNDU2YjQ1NmI0NTZkNTVhZDU1YWY2 NjJmNjYyMTc2NzE3NjczNzY3Mzg2NzU5NmY1OTZmN2E3Mzc5NmY5YTczN2E3MzliNzc5YTczOWI3 NzlhNzNiYjc3DQo5Yjc3YmM3YjlhNzNiYzc3NTk2YjBmNDIwNzIxYzUxYzQ4MmRjYjQ1ZWM0ZDRl NWFiMTZhMTM3YmYyNzZmMjdhZDE3NmQxN2FkMTc2MTI3YjEzN2IxMzdiZjI3NjEzN2JmMjdhMTM3 YmYzN2FmMzdhZDE3NmQxNzZiMDcyYWY2ZQ0KOGY2ZWIwNzJiMDZlYjA3MmIwNzJkMTc2ZDE3NmQx NzZiMDc2YjA3NjhmNzI4ZTcyNmQ2ZTZkNmU2YzZhNGM2NjRjNjI0YzY2MmI1ZTBhNWVlOTU5MGE1 ZWU5NTllOTU5Yzg1NWE4NTE2NjQ1NjY0NTY2NDU2NzQ1Njc0MTQ2MzkNCmU0MmNhMzIwNDExNDQx MTA0MTBjNDMwYzQzMDgyMjA0MjIwNDQzMDgwMDAwZTYxYzMwNGFkNTVlZDQ1ZWY2NjJmNTVlMTY2 M2Y2NjJmNjYyZjU1ZWY1NWVkNDVlZDM1ZTkyNWE5MjVhNzA1NjUwNTYyZTUyMGU1MmVjNDllYzQ5 DQpjYjQ1Y2I0OWNhNDVjYjQ1YWE0NWNiNDVhYTQ1Y2E0NWFhNDFjYTQ1YWE0MWFhNDE4OTQxYWE0 MThhNDFhYTQxODkzZDhhNDE4OTNkOGEzZDg5M2Q4YTNkOGEzZDhhM2Q4YTM5OGEzZDhhMzk4YTM5 NmEzOThiMzk2YTM1OGIzMQ0KNmEyZDhiMzE2YTJkNmEyZDRhMjk2YTJkNDkyOWQzNWFkNDVlZDM1 YWQ0NWVkNDVlZjQ1ZWQ0NWVkNDVlZDQ1ZWY0NWVkNDVlZjQ1ZWQ0NWVmNDVlZDQ1ZWY0NWVkNDVl ZjQ2MmQ0NWVmNDVlZDQ1ZWY0NjJkNDVlZjQ1ZWQ0NWUNCmY1NjJkNDVlZjQ1ZWQ0NWVmNDVlZDQ1 ZWY0NWVkNDVlZjQ1ZWQzNWFkNDVlZDQ1YWQ0NWVkNDVhZjU1YWQ0NWFmNTVhZDQ1YWQ0NWFiNDU2 ZDU1YWQ1NTZmNTVlZjY2MjE3NjMxNjYzMzc2NzM3Njc1ODZiNTk2YjdhNmY3YTczDQo5YTczN2E3 MzliNzc5Yjc3YmI3NzliNzdiYjc3OWI3N2JiN2JiYjc3YmM3N2JjNzdmNjVlNDkyOTQ5MjllNTIw NDgyZDg5M2RlYjQ5NGU1YWQxNmVmMjc2ZjI3NmQxN2FkMTdhZDA3NmYxN2FmMjdhMTM3ZmYyNzZm Mjc2ZjI3Ng0KMTM3YmYyNzZmMjc2ZDI3NmQyNzZiMTZlYjA3MjhmNmVhZjcyOGY2ZWIwNzJiMDZl YjA3MjkwNmViMDcyOGY2ZThmNzI2ZTZlNmU2ZTZkNmE2ZDZlNGM2YTZjNmE0YzY2NGM2NjBhNjIw YTVlZTg1OWM4NTlhNzU1Yzg1OWE4NTUNCmE4NTU4NjRkNjY0OTY2NDU4NzQ5NDY0NTQ2M2RlNDJj YzQyODgyMWM2MTE0MjEwYzQyMGMyMjA4NDMwODIyMDQ0MzA4MjIwNDAwMDBhNDE0MzA0YWQ0NWFk NDYyZDU1ZWY2NjJmNTYyZjY2MmY1NWVmNTYyZDM1ZWQ0NWViMzVhDQpiMjVhNzE1NjcwNTY0ZjUy MmY1MmVkNGRlYzQ5Y2I0NWNiNDVhYTQ1Y2I0NWFhNDFjYTQ1YWE0MWFhNDVhYTQxYWE0NWE5NDFh YTQxODk0MWFhNDE4OTNkOGE0MTg5M2Q4YTQxODkzZDg5M2Q2OTNkOGEzZDY5Mzk4YTNkNmEzOQ0K OGEzZDZhMzk4YTM5NmEzNThhMzk2YTM1NmEzNTZhMzE4YjMxNmEyZDZhMmQ0YTJkNmEyZDQ5Mjk0 OTI5ZjU2MmQ0NWVmNDVlZDQ1ZWY1NjJmNDVlZjU2MmY0NWVmNTYyZjQ1ZWY1NjJmNDVlZjU2MmY0 NWVmNTYyZjQ1ZWY1NjINCmY1NjJmNTYyZjU2MmY1NjJmNTYyZjU2MmY1NjIxNTYzZjU2MmY1NjJm NTYyZjU2MmY1NjJmNTYyZjQ1ZWY1NjJmNDVlZjU1ZWQ0NWVmNTVlZjU1ZWY1NWVmNTVlZjY1ZWY1 NWVmNTVlZDU1YWY1NWFkNTVhZjY1ZWY2NWUxNzY3DQoxNzY3Mzg2YjM4Njc1OTZmNTk2ZjdhNzM3 YTczOWI3NzliNzdiYjc3OWI3N2JjN2JiYzc3YmM3YmJiNzdiYjdiYmI3YmJjN2JkYzdiZGQ3Yjkz NTJjNTE4NDkyOTQ4MmQ0ODJkODkzOWViNDk5MDYyZDI2ZWYyNzZkMTc2ZjI3YQ0KZDE3YWYyN2Fm MTdhMTM3ZjEyN2IxMjdiZjE3NjEzN2IxMjdiMTM3YmYyNzZmMzdhZDI3MmQyNzJiMDcyYjA3MmFm NzJiMDcyOGY2ZWIwNzI4ZjZlOGY2ZTZmNmE5MDZlNmY2ZTZmNmU0ZDZhNmQ2YTRjNjY0YzY2MmI2 NjJiNjYNCjBhNWVlOTVkYzg1OWM4NTlhNzU1YTc1NWE3NTVjODU5YTc1NWE3NTE2NzQ5ODc0ZDY3 NDU0NjQxMjUzOWMzMjhhMzIwODIxODQxMTA0MjBjMjIwODQzMDgyMjA4NDMwODQzMDg0MzA4MjAw NGE0MTQyZjRhZDQ1ZWQ0NWVmNjYyDQpmNTYyZjY2NmY1NjJmNTYyZDQ2MmQ0NWVkMzVlZDM1ZTky NWE5MTVhNzA1NjcwNTYyZjUyMGU0ZWVjNDllYzQ5Y2I0NWNiNDVhYTQ1Y2I0NWFhNDVjYjQ1YWE0 MWNhNDVhYTQxYWE0NWFhNDFhYTQxODk0MWFhNDE4OTNkYWE0MQ0KOGEzZDhhNDE4OTNkOGEzZDg5 M2Q4YTNkOGEzOThhM2Q4YTM5OGEzOTZhMzk4YjM5NmEzOThhMzk2YTM1OGIzMTZhMmQ4YjMxNmEy ZDZiMmQ0YTI5NGEyZDQ5MjlkNDVlZjU2MmY0NWVmNTYyZjQ1ZWY1NjJmNDVlZjU2MmY0NWUNCmY1 NjJmNTYyZjU2MmY0NWVmNTYyZjU2MmY1NjJmNTYyZjU2MmY1NjJmNTYyZjU2MmY1NjJmNTYyZjU2 MmY1NjIxNTYzZjU2MjE1NjNmNTYyZjU2MmY1NjIxNTYzZjQ1ZWY1NjJmNDVlZjU1ZWY0NWVmNTVl ZjU1ZTE2NWZmNTVlDQpmNjVlZjU1ZWY1NWVkNTVhZjY1ZWY2NWUxNzYzMTc2MzM3NjczNzY3NTg2 YjM4NmI1OTZmNzk2ZjlhNzM5YTczOWI3NzliNzdiYzdiYmI3N2JjN2JiYzc3YmM3YjE2MTAwMDAw MjYwNjBmMDAyMjIwNTc0ZDQ2NDMwMTAwMDAwMA0KMDAwMDAxMDAwMDAwMDAwMDAwMDAwNzAwMDAw MDAwMjAwMDAwNDAxNTAwMDA0MGQ1MDAwMDliNzdkZDdmYmI3N2RkN2JkZDdiOTM1MjYyMGMwNzI1 NDgyZDI3MmQ0ODM1MGQ0ZTkwNjZkMjcyZjI3NmYyN2FkMTc2ZjE3YWYxN2ENCjEyN2JmMjdhMTI3 YmYxNzZmMjc2ZjI3NjEyNzdmMjc2MTI3N2QyNzJkMjcyYjE2ZWIxNzI4ZjZlYWY3MjhmNmViMDcy OGY2YThmNmU2ZTZhNmY2YTZmNmE2ZjZhNGU2NjRkNjYyYzYyMmM2NjJiNjIyYjY2MmI2MjBhNjJl ODU5DQplOTVkYzg1OWM4NTlhNzU5Yzg1OTg2NTFhNzU1ODc1MTg3NGQ2NjQ5Njc0NTI1M2QwNTM1 YTIyNGEzMjA2MTE0NjExMDIxMGM0MjBjMjIwODQzMDgyMjA0NDMwODQyMDgyMTA4NjIxMDJmNGFk NDVlZDM1ZWQ0NWVmNTYyZjU2Mg0KZjU2MmQ0NjJmNDYyZDM1ZWQzNWViMjVhYjI1YTcxNTY3MTU2 NTA1MjJmNTIwZTRhZWQ0OWNiNDVjYjQ1YWE0NWNiNDVhYTQxYWE0NWFhNDFhYTQ1YWE0MWFhNDFh OTQxYWE0MTg5M2RhOTQxODkzZGFhNDE4OTNkOGE0MTg5M2QNCjg5M2Q2OTM5ODkzZDY5Mzk4YTNk NmEzOThhMzk2YTM5OGEzOTZhMzU2YTM5NmEzNTZhMzU2YTMxOGIzMTZhMmQ2YTJkNGEyOTRhMmQ0 OTI5NDkyOTE1NjNmNTYyMTU2M2Y1NjIxNTYzZjU2MjE2NjdmNTYyMTU2M2Y1NjIxNTYzDQpmNTYy MTU2M2Y1NjIxNTYzZjU2MjE1NjNmNTYyMTU2N2Y1NjIxNTYzZjU2MjE1NjdmNTYyMTY2N2Y1NjIx NjY3MTU2MzE2NjdmNTYyMTY2N2Y1NjIxNTYzZjU2MjE1NjNmNTVlMTU2M2Y1NWUxNjYzMTY1ZjE2 NjNmNjVlMTY2Mw0KZjY1ZWY2NWVmNjVhMTc2MzE3NjMzNzY3Mzc2NzU4NmI1ODZiNTk2ZjU5NmY5 YTczOWE3M2JiNzc5Yjc3YmM3YmJjNzdkYzdiYmM3YmRjN2JiYzdiZGM3YmZlN2ZkZDdiZGM3YmZl N2ZkNTU2NjIwOGM1MTgyODI5ZTUyNDQ3MzUNCjBjNGViMTZhZDI2ZWYyNzYxMzdiZjI3YWYyN2Ex MzdmZjI3YTEzN2JmMjdhMTI3YmYyNzZmMjc2ZjE3MjEyNzdmMjc2ZjI3NmQxNzJkMTcyYjA2ZWFm NzJhZjZlYjA3MmFmNmViMDZlOGY2ZWIwNmU4ZjZhNmY2YTZlNjY2ZTZhDQo0YzY2NGM2NjJiNjI0 YzY2MmI2MjJiNjJjODU5Yzg1OWM3NTljODVkYTc1OWE3NTlhNzU1YTc1NTg3NTFhODU1ODc0ZDg4 NGQ2NzQ1NDY0MTA1MzVlNDI4YTMxYzgyMTg0MTEwNjIxMDQyMGM0MzBjMjIwNDQzMDg0MzA4NDIw OA0KMjEwNDgyMTAyZjRhZjQ1ZWQzNWFmNTYyZjU2MjE1NjdmNTYyZjU2MmQ0NWVkNDYyZDM1ZWIz NWU5MjVhOTE1YTcwNTY3MDU2MmY1MjBlNGVlYzQ5Y2I0OWNiNDVjYjQ1YWE0NWNiNDVhYTQxY2I0 NWFhNDFhYTQ1YWE0MWFhNDUNCmFhNDFhYTQxODk0MWFhNDE4OTNkOGE0MTg5M2Q4YTQxODkzZDhh M2Q2OTM5OGEzZDhhMzk4YTNkNmEzOThhMzk2YTM5OGEzOTZhMzU4YjM5NmEzNThiMzE2YTJkOGIz MTZhMmQ2YTJkNGEyOTZhMmQ0OTI5ZjU2MjE1NjNmNTYyDQoxNTYzZjU2MjE1NjNmNTYyMTU2M2Y1 NjIxNTYzZjU2MjE1NjNmNTYyMTU2M2Y1NjIxNTYzZjU2MjE2NjdmNTYyMTU2MzE1NjMxNjY3ZjU2 MjE2NjcxNTYzMTY2N2Y1NjIxNTYzZjU2MjE1NjNmNTYyZjU2MmY1NWUxNTYzZjU1ZQ0KMTU1ZmY1 NWUxNjYzZjU1ZTE2NWYxNjVmMTc2MzE2NWYxNzVmZjY1ZWY3NWVmNjVhMTc2MzE3NjczODZiMzg2 YjU5NmY1OTZmN2E3MzdhNzM5Yjc3YmI3N2JjN2JiYjc3ZGM3YmRjN2JkZDdmZGM3YmRkN2Y5Yjc3 ZmY3ZmJjNzcNCmZlN2ZkZDdiZjY1ZTQxMDhlNjFjMDYyMWU1MjRlNTI4YWE0MTZmNjJkMjcyZDE3 MjEzN2ZmMjdhMTM3YmYyN2ExMzdiZjI3YTEzN2IxMzdiMzM3ZmYyNzZmMTc2ZDA3MmYxNzJkMDZl ZDA2ZThmNmE4ZjZhOGU2YThlNmE4ZTZhDQo4ZTZhOGU2YThlNmE4ZTZhOGU2YTZjNjY2ZDY2NGM2 NjRjNjYyYTVlMmE1ZTA5NWUyYTYyMDk1ZWU5NWRhNzU5YTc1OWE2NTVhNzU5YTY1NWE3NTlhNzU1 ODc1MTg2NGQ4NzRkNjY0OTY3NDk0NjQxMjUzOWMzMjRhMzE4NDExMA0KNjIxMDYzMTA0MzBjMjIw NDIyMDQyMjA0NjQwYzQyMDgyMTA0ODMxMDUwNGFiMjU2ZjQ1ZWY0NWVmNDYyZjQ1ZWY1NjJmNDVl ZjQ1ZWQzNWFkMzVhYjI1YWIyNWE3MTU2NzE1NjRmNTIyZjUyZWM0OWNjNDlhYjQ1Y2I0NWFhNDUN CmFiNDVhYTQxYWE0NWFhNDFhYTQxYWE0MWFhNDU4YTQxYWE0MTg5NDFhYTQxODkzZDhhNDE4OTNk OGE0MTY5M2Q4OTNkNjkzZDhhM2Q2OTM5OGEzOTY5Mzk4YTM5NjkzNThhMzk2YTM1NmEzNTY5MzE2 YTM1NmEyZDhiMmQ2YTJkDQo2YTJkNGEyOTZhMjk0OTI5NDkyOTE2NjcxNTYzMTY2NzE1NjMxNjY3 MTU2MzE2NjcxNTYzMTY2NzE1NjMxNjY3MTU2MzE2NjcxNTYzMTY2NzE1NjMxNjY3MTU2MzE2Njcx NTYzMTY2NzE2NjcxNjY3MTY2NzM2NjcxNjY3MTY2Nw0KMTU2MzE2NjcxNTYzMTY2NzE1NjMxNjYz MTU2MzE2NjNmNTVlMTY2MzE2NWYxNjYzZjY1ZTE3NjMxNjYzMTc2M2Y2NWUxNzVmZjY1ZTE3NWYx NzVmMzg2NzM3Njc1ODZiNTg2Yjc5NmY3OTZmOWE3MzlhNzNiYzdiYmI3N2RjN2INCmJjN2JkZDdm ZGM3YmRkN2ZkYzdiZGM3ZmZlN2ZiZDdiZGU3ZmZlN2JkNTVhNDEwOGM1MTgwNjIxMDYyNTI3MmQ4 OTQxNmY1ZWYyNzIxMzdiZjM3YTEzN2IxMzdiMzQ3ZjEzN2IxMzdiZjI3NmYyN2FmMjc2MTM3YmYx NzJkMDcyDQphZjZlYWY2ZThmNmFhZjZlYWY2ZWNmNmVhZTZlYWY2ZThlNmFhZTZlOGQ2YThkNmE2 ZDZhNmQ2YTZjNjY2YzZhNGI2NjRiNjYyYTVlMmE2MjJhNjJlOTVkYzc1OWM3NTlhNjU1YTc1OWE2 NTVhNzU1YTY1NWU5NWRhNzUxODc1MQ0KODc0ZDY3NDk2NzQ5Njc0OTI2M2RlNDI4YTMxODYyMTQ2 MjEwNjMxMDQzMGM0MzA4MjIwNDQzMGM2MzBjNjMwYzQxMDhhNDE0NTA0YWQ0NWFkMzVhZjQ2MmY0 NWUxNTYzZjQ2MjE1NjNmNDVlZDQ1ZWIzNWFkMzVhYjI1YTkyNTYNCjcwNTY3MDU2MmU1MjBkNGVj YjQ1Y2I0OWNiNDVjYjQ1YWE0NWNiNDVhYTQxYWI0NWFhNDFhYjQ1YWE0MWFhNDU4YTQxYWE0MThh NDFhYTQxODk0MThhNDE4OTNkOGEzZDg5M2Q4YTNkODkzZDhhM2Q4OTM5OGEzOThhMzk4YTM5DQo2 YTM1OGEzOTZhMzU2YTM1NmEzMThiMzE2YTJkOGIyZDZhMmQ2YTJkNGEyOTRhMjk0OTI5MTU2MzE2 NjcxNTYzMTY2NzE1NjMxNjY3MTU2MzE2NjcxNTYzMTY2NzE1NjMxNjY3MTU2MzE2NjcxNTYzMTY2 NzE1NjMxNjY3MTU2Mw0KMTY2NzE1NjMxNjY3MTY2NzE2NjcxNjY3MzY2NzE2NjczNjY3MTU2MzE2 NjcxNTYzMTY2N2Y1NjIxNTYzMTU1ZjE2NjNmNTVlMTY2MzE2NWYxNjYzMTY1ZjE3NjMxNzVmMTc1 ZmY2NWFmNjVlZjY1ZTE3NjMxNzY3Mzg2YjM4NmINCjU5NmY1ODZiNzk2ZjdhNzM5Yjc3OWI3N2Ji NzdiYjc3ZGM3YmJjN2JkYzdiZGM3YmRkN2ZkZDdmYmM3YmJjN2JmZTdmZGQ3YmY2NWU2MjA4YzUx OGM0MTgwNjI1MDYyOTQ3MzVlYjRkYjE2NmYyNzIxNDdiZjI3NjEzN2JmMjdhDQpmMjdhZDE3MmQx NzZkMTc2MTI3YmQwNzJkMDcyYWY2ZWIwNzI4ZTZhOGU2YTZlNmE4ZjZlOGY2ZWFmNmU4ZTZlYWY2 ZThlNmE4ZTZhNmQ2YTZkNmE0YzY2NmM2YTRjNjY0YzZhMmE2MjJhNjIwYTYyMmE2MmM4NTljODU5 YTc1OQ0KYzc1OWE3NTVhNzU5YTc1NWE3NTVjOTU5YTg1NTg3NTE4NzRkNDY0NTg3NDk2NzQ5Njc0 MWM0MjRhMzFjNjExMDYyMTA0MjBjNDMwYzIyMDgyMjA4NDMwODQzMDg0MjA4NjIwOGEzMTQ0ZjRh ZDM1YWQzNWFkMzVlZjQ1ZWY0NWUNCjE1NjNmNDVlZjQ1ZWQzNWFkNDVhYjI1YWIyNWE3MTU2NzA1 NjRmNTIyZTUyZWM0OWVjNDlhYTQ1Y2I0NWFhNDVjYjQ1YWE0MWFhNDVhYTQxYWE0NWFhNDFhYTQx OGE0MWFhNDE4OTQxOGE0MTg5M2Q4YTQxODkzZDg5M2Q4OTNkDQo4YTNkNjkzOThhM2Q2OTM5OGEz ZDY5MzU4YTM5NmEzNThhMzk2YTM1NmEzNTY5MzU2YTM1NmEyZDZhMmQ2YTJkNmEyZDRhMjk0YTI5 NDkyOTQ5MjkxNjY3MTU2MzE2NjcxNjY3MTY2NzE1NjMxNjY3MTY2NzE2NjcxNTYzMTY2Nw0KMTY2 NzE2NjcxNTYzMTY2NzE2NjczNjY3MTY2NzM2NjcxNjY3MzY2NzE2NjczNzZiMTY2NzM3NmIxNjY3 Mzc2YjE2NjczNjY3MTY2NzM2NjcxNjYzMTY2NzE1NjMxNjYzMTY2MzE2NjMxNjYzMTc2MzE2NjMx NzYzMTY2MzE3NjMNCjE2NWYxNzVmZjY1ZTE3NWYxNzVmMzc2NzM3Njc1ODZiNTg2Yjc5NmY3OTZm OWE3MzlhNzNiYjc3OWI3N2JjN2JiYzdiZGM3YmJjN2JkZDdmZGM3YmZlN2ZiYzdiZmU3ZmZkN2Zm ZTdiNTk2NzA3MWRhNDE0YzUxOGU2MjBlNTI0DQpjNDI0NDczNWNiNDk5MDYyZjM3MjkwNmE4ZjZh YjA3MmQxNzJkMTc2ZDE3MmQxNzJkMDcyYWY2ZTZlNmE2ZTZhNGQ2NjRkNjYyYzYyNmQ2NjZlNmE2 ZTZhNmQ2YThlNmU2ZTZhOGU2ZTZkNmE2ZDZhNmQ2YTZkNmE0YzZhNmQ2YQ0KNGM2NjRiNjYyYTYy MmI2NjBhNjJlOTVkZTk1ZGU5NWRjODVkZTg1ZGM3NTljODU5YTc1NWU5NWRhODU1YTg1MTY2NDk0 NjQ1Njc0OTg4NGQ0NzNkZTUyOGEzMTg4MjE0NDEwYzQyMGM0MjA4NDMwODIyMDg2NDBjNDIwODg0 MTANCjQxMDhhNDE4MGU0NmY0NWVkMzVhZjQ1ZWY0NWUxNTYzZjQ2MjE1NjNmNDVlZjQ1ZWQzNWFk MzVhOTI1NjkyNTY3MDU2NTA1NjJlNGUwZDRlZWM0OWNiNDVhYjQ1Y2I0NWFiNDVjYjQ1YWE0MWFi NDVhYTQxYWI0NWFhNDFhYTQ1DQphYTQxYWE0MTg5NDFhYTQxODk0MThhNDE4OTNkOGE0MTg5M2Q4 YTNkODkzOThhM2Q4YTM5OGEzOTY5Mzk4YTM5NmEzNThhMzU2YTM1OGEzNTZhMzE4YjMxNmEyZDhi MzE2YTJkNmEyZDQ5Mjk2YTI5NDkyOTE1NjMxNjY3MTU2Mw0KMTY2NzE1NjMxNjY3MTU2MzE2Njcx NTYzMTY2NzE1NjMxNjY3MTU2MzE2NjcxNTYzMTY2NzE2NjczNjY3MTY2NzM2NjcxNjY3MzY2NzE2 NjczNjY3MTY2NzM2NjcxNjY3MTY2NzE1NjMxNjY3MTU2MzE2NjMxNTYzMTY2MzE1NWYNCjE2NjMx NjYzMTY2MzE2NWYxNjYzMTY1ZjE3NjMxNjVmMTc1ZmY2NWVmNzVlZjY1YTE3NjMxNzY3Mzg2YjM3 Njc1ODZiNTg2Yjc5NmY3OTZmOWI3NzliNzdiYjc3OWI3N2JjN2JiYzdiZGM3YmJjN2JkYzdmZGQ3 ZmRkN2ZkZDdmDQpkZDdiZGQ3YmJjNzdhYzM1YTQxNGM1MThlNTFjYTQxOGEzMThhMzIwMDUyZGFh NDU5MDYyZWE1MWViNTUwYjVhNGQ2MjZmNjY4ZjZhNGU2MjRkNjI2ZTY2MmM2MmVhNTljOTU1Yzk1 MWVhNTkwYjVlNGQ2NjJjNjIyYzY2MmM2Ng0KNGQ2YTRkNjY0ZDZhMmM2NjRkNjY0YzY2NGQ2YTJj NjYyYzY2MmI2NjJiNjYwYTYyMGE2MmM5NTllOTVkYzg1OWM4NTljODU5Yzg1OTg3NTE4NzUxYTg1 NWE4NTU4NzRkNjY0OTQ2NDU4ODQ5Njg0OTQ3M2RjNDI0YTQxYzYyMTANCjQxMGMyMTA4NDMwYzQy MDg0MjA4NDMwODQyMDg2MjBjNDEwOGE0MTgwZTQyZDM1YWQ0NWVkMzVlZjQ1ZWY0NWVmNTYyZjQ1 ZWY0NWVkMzVhZDQ1YWIzNWFiMjVhNzE1NjcwNTY0ZjUyMmU1MmVjNDllYzQ5YWI0NWNiNDVhYTQ1 DQphYjQ1YWE0MWFhNDVhYTQxYWE0MWFhNDFhYTQ1OGE0MWFhNDE4OTQxYWE0MTg5M2Q4YTQxODkz ZDhhNDE4OTNkODkzZDY5Mzk4YTNkNjkzOThhMzk2OTM5OGEzOTY5MzU4YTM5NmEzNTZhMzU2OTMx NmEzNTZhMmQ4YjJkNmEyZA0KNmEyZDRhMjk2YTI5NDkyOTQ5MjkxNjY3MTY2NzE2NjcxNTYzMTY2 NzE2NjcxNjY3MTU2MzE2NjcxNjY3MTY2NzE1NjMxNjY3MTY2NzE2NjcxNTYzMzY2NzE2NjczNjY3 MTY2NzM3NmIzNjY3Mzc2YjE2NjczNjY3MTY2NzM2NjcNCjE2NjczNjY3MTY2NzE2NjcxNTYzMTY2 NzE1NjMxNjYzMTY2MzE2NjMxNjYzMTc2MzE2NjMxNzYzMTY2MzE3NjNmNjVlMTc1ZmY2NWUxNzVm MTc1ZjM3NjczNzY3NTg2YjU4NmI3OTZmNzk2ZjlhNzM5YTczYmI3N2JiNzdiYzdiDQpiYzdiZGM3 YmRjN2JkZDdmZGM3YmRjN2ZkZDdmZGQ3ZmJjN2JkZDdiZGQ3YmI0NTZlNjFjYzUxOGM1MThjNTFj YTQxOGE0MWM4MjFjMDYyZGFhNDFjYTQ5ODg0NTQ2NDE0NjNkODg0NWM5NGRlYjU1ZWI1NWViNTVj OTUxYzk1MQ0KYzk1MWNhNTVjOTUxY2E1NWM5NTUwYzVlMGI1ZTJkNjIyZDY2NGU2YTRkNjY0ZDY2 MmM2MjRkNjYyYzYyMGM2MjBiNWUwYjYyZWE1ZGViNWRlYTVkZWE1OWM5NTljOTU5Yzg1NWM5NTlh ODU1YTc1NTg3NTFhODUxODc0ZDg3NGQNCjY2NDU2NzQ1ODg0OTg4NDkyNjM5YzQyMGE0MTg4MzE0 NDEwODQyMGM0MjA4NDMwYzQyMDg2MzBjNDIwODYzMGMyMDA0MjcyNTJmNDZkNDVhZjQ1ZWY0NWVm NDVlMTU2M2Y0NWUxNTYzZjQ1ZWY0NWVkMzVhZDQ1ZWIyNWE5MTU2DQo3MDUyNTA1NjJlNGUwZDRl ZWM0OWNiNDljYjQ1Y2I0NWFhNDVjYjQ1YWE0MWFiNDVhYTQxYWI0NWFhNDFhYTQ1OGE0MWFhNDE4 YTQxYWE0MTg5NDE4YTQxODkzZDhhM2Q4OTNkOGEzZDg5M2Q4YTNkODkzOThhMzk4YTM5OGEzOQ0K NmEzNThhMzk2YTM1NmEzNTZhMzE4YjMxNmEyZDhiMmQ2YTJkNmEyZDRhMjk0YTI5NDkyOTE1NjMx NjY3MTY2NzE2NjcxNTYzMTY2NzE2NjcxNjY3MTU2MzE2NjcxNjY3MTY2NzE1NjMxNjY3MTY2NzE2 NjcxNjY3MTY2NzE2NjcNCjM2NjcxNjY3MzY2NzE2NjczNjY3MTY2NzE2NjcxNjY3MTY2NzE1NjMx NjY3MTU2MzE2NjNmNTYyMTU2MzE1NWYxNjYzZjU1ZTE2NjMxNjVmMTY2MzE2NWYxNzYzMTc1ZjE3 NWZmNjVhZjY1ZWY2NWUxNzYzMTc2MzM3NjczNzY3DQo1ODZiNTg2Yjc5NmY3YTczOWI3NzliNzdi Yjc3YmI3N2JjN2JiYzdiZGM3YmJjN2JkYzdmYmI3YmZkN2ZiYjdiZGQ3ZmJjNzdkYzc3N2E2Yjhi MzE4MzEwYzUxOGM1MThjNTE4YTQxOGE0MWNhNDIwMDYyZDQ3MzkyNjM1YzMyOA0KYzIyNGEyMjgw NTM1NDczZGE5NDU0NzNkNDc0MTY3NDFhOTQ5YWE0ZDg5NDk0NzQxNDY0MTg4NDlhOTUxY2E1MWVi NTllYjU5MGM1ZTBjNWEwYzVlZWI1OWVhNTljOTU1Yzk1NWE5NTFjOTU1YTk1MWE5NTVhODUxYTg1 MWE4NTENCmE5NTFhODUxYTg1MTg3NGQ4NzRkNDY0OTY2NDk0NjQ1NDY0MTI1M2Q2ODQ1NDg0MTA2 MzVhMzFjYTQxODYyMTA0MjBjMjEwODQzMGM0MzA4NDMwODQyMDg2MzBjNDIwODIwMDQ4YTMxOTI1 MmQzNWFmNDVlZDM1YWY0NWVmNDVlDQoxNTYzZjQ1ZWY0NWVkNDVhZDQ1ZWIzNWFiMjVhNzE1Njcw NTYyZjUyMmU1MmVjNDllYzQ5YWE0NWNiNDVhYTQ1Y2I0NWFhNDFhYTQ1YWE0MWFhNDVhYTQxYWE0 MThhNDFhYTQxODk0MThhNDE4OTNkOGE0MTg5M2Q4OTNkODkzZA0KOGEzZDY5Mzk4YTNkNjkzOThh M2Q2OTM1OGEzOTZhMzU4YTM5NmEzNTZhMzU2OTM1NmEzNTZhMmQ2YTJkNmEyZDZhMmQ0YTI5NGEy OTQ5Mjk0OTI5MzY2NzE2NjczNzZiMTY2NzM2NjcxNjY3Mzc2YjE2NjczNjY3MTY2NzM3NmINCjE2 NjczNjY3MTY2NzM3NmIxNjY3MzY2NzE2NjczNjY3MTY2NzM2NjcxNjY3Mzc2YjE2NjczNjY3MTY2 NzM2NjcxNjY3MzY2NzE2NjcxNjY3MTY2MzE2NjMxNTYzMTY2MzE2NjMxNjYzMTY2MzE3NjMxNjYz MTc2MzE2NjMxNzYzDQoxNjVmMTc1ZmY2NWUxNzVmMTc1ZjM3NjczNzY3NTg2YjU4NmI1OTZmNTk2 ZjlhNzM5YTczYmI3N2JiNzdiYzdiYmM3YmRjN2JkYzdiZGQ3ZmRjN2ZkYzdmZmQ3ZmJiN2JmZDdm ZGQ3YmJiNzNmZTdmMGY0MjgzMGNhNTE0YzUxOA0KYTQxNGM1MWNlNjIwZTYyMGM1MjBjNDIwYzMy MGU1MjhlNDI0ZTQyOGU0MjhlNTJjZTUyYzQ3MzkwNTMxZTUzMGU1MzAyNzM5MjYzOTI3MzkwNjM1 MDUzOTI1Mzk2NzQxODg0NWFhNGRhYTRkY2E1MWFhNGRjYTUxYTk0ZDg4NGQNCjY3NDk4ODQ5ODg0 OTg4NDk4NzQ5ODg0OTg3NDk4ODQ5ODc0OTg4NGQ4NzQ5ODg0ZDY3NDk0NjQxMjU0MTQ2NDEwNTNk MDUzOTQ3M2Q0ODQxZTUzMGE0MWNhMzE0ODMxMDQxMDg0MjA4NDIwODYzMGM0MjA4NjMwYzYzMGM2 MjBjDQoyMDA0ZWU0MWQ0NWFmNDVlZDQ1ZWY0NWVmMzVlMTU2M2Y0NjIxNTYzZjQ1ZWY0NWVkNDVh ZDQ1ZWIyNWE5MjU2NzA1MjRmNTIyZTRlMGQ0ZWVjNDljYjQ1YWI0NWNiNDVhYjQ1Y2I0NWFhNDFh YjQ1YWE0MWFiNDVhYTQxYWE0NQ0KYWE0MWFhNDE4OTQxYWE0MTg5NDE4YTQxODkzZDhhNDE4OTNk OGEzZDg5Mzk4YTNkOGEzOThhMzk2OTM5OGEzOTZhMzU4YTM1NmEzNThhMzU2YTMxOGIzMTZhMmQ4 YjMxNmEyZDZhMmQ0OTI5NGEyZDQ5MjkxNjY3MTY2NzE1NjMNCjE2NjcxNjY3MTY2NzE1NjMxNjY3 MTU2MzE2NjcxNTYzMTY2NzE2NjczNjY3MTY2NzE2NjcxNjY3MzY2NzE2NjcxNjY3MTY2NzM2Njcx NjY3MTY2NzE2NjczNjY3MTY2NzE2NjcxNjY3MTY2NzE1NjMxNjY3MTU2MzE2NjNmNTVlDQoxNjYz MTY1ZjE2NjMxNjVmMTc2MzE2NWYxNjYzZjY1ZWY2NWVmNjVlMTc1ZmY2NWExNzVmMTc2MzM3Njcz NzY3NTg2YjU4NmI3OTZmNzk2ZjliNzc5Yjc3YmI3NzliNzdiYzdiYmM3YmRjN2JiYzdiZGM3ZmRi N2JkYzdmZGI3Yg0KZmM3ZmRkN2JmZDdiYmM3M2JjNzMyODI1YTQxMGE0MTBjNjE4YTUxNGM2MWNh NTE4YzUxY2M1MjBjNTFjYTMxOGE0MThjNTIwMDYyNWM1MjBhNDFjYTMxY2M1MjRjNDI0YTQyMGEz MjBjNTI0YTQyNGEzMjRhMzI0YzMyOGMzMjgNCmU0MmMwNDMxMjYzOTQ3M2Q2ODQxNDczZDY3M2Q0 NjM5NDczZDI1MzkyNjM5MjUzOTQ2M2Q0NzNkNDc0MTI2M2Q0NjNkMjUzZDQ2NDE0NjQxNjc0NTI1 M2Q0NjNkMDUzNWU0MzBlNDMwMjYzOTA2MzVlNjJjNjIxNDYzMTA0MjBjDQo2MjBjNDIwODQyMDg0 MzA4ODQxMDYzMGM2MzBjMDAwMGEzMTAwZjQ2OTI1MmY0NWVkMzVhZDM1ZWY0NWVmNDVlMTU2M2Y0 NWVmNDVlZDQ1YWQ0NWViMzVhYjI1YTcxNTY3MDU2NGY1MjJlNTJlYzQ5ZWM0OWFiNDVjYjQ1YWE0 NQ0KYWI0NWFhNDFhYTQ1YWE0MWFhNDVhYTQxYWE0NThhNDFhYTQxODk0MWFhNDE4OTNkOGE0MTg5 M2Q4YTQxODkzZDg5M2Q4OTM5OGEzZDY5Mzk4YTM5NmEzOThhMzk2YTM1OGEzOTZhMzU4YTM1NmEz NTZhMzU2YTJkNmEzMTZhMmQNCjZhMmQ0YTJkNmEyZDQ5Mjk0OTI5MzY2NzE2NjczNjY3MTY2NzM2 NjcxNjY3MzY2NzE2NjczNjY3MTY2NzM2NjcxNjY3MzY2NzE2NjczNjY3MTY2NzM2NjcxNjY3MzY2 NzE2NjczNjY3MTY2NzM2NjcxNjY3MzY2NzE2NjczNjY3DQoxNjY3MzY2NzE2NjcxNjY3MTY2MzE2 NjcxNTYzMTY2MzE1NjMxNjYzMTY2MzE3NjMxNjYzMTc2MzE2NWYxNzVmZjY1ZTE3NWZmNjVlMTc1 ZmY2NWUzNzY3Mzc2NzM4NmIzODZiNzk2Zjc5NmY5YTczOWE3M2JiNzdiYjc3YmM3Yg0KYmM3YmRj N2JkYzdiZGQ3ZmRjN2JkYzdmZGI3ZmRjN2ZkYzdiZmQ3ZmRkN2JkYzdiYmM3MzUxNDY4MzBjYzUx ODgzMGNlNjFjYzUxOGM2MWNjNjE4MjgyNWU3MWNjNjFjYTUxOGM2MWNlNjIwMDcyNTA3MjVlNzI0 YzUyMGE1MWMNCjg0MWNhNDFjODQxYzg0MWM4MzE4YTMyMGEyMWNhMzIwYTIyMGM0MjRlNDI0MDUy ZDA1MmQyNjMxMDUyZDI2MzEwNTJkMDUzMTA1MmQyNjMxMjYzMTI2MzUyNjM1MjYzOTA1MzUwNTM1 MDQzNTI2MzkyNjM5NDczZDI2MzkyNjM1DQplNDJjMDUzMTA2MzEwNjMxYzUyNDgzMTQ2MzBjNjMw YzYzMGM2MzBjNDIwODYzMGM4MzBjNjIwODYzMGMwMDAwYTQxNDcxNGViMjU2ZDM1YWQzNWVmNDVl ZjQ1ZTE1NjNmNTYyMTU2M2Y0NWVmNDVlZDQ1ZWQ0NWViMjVhOTI1YQ0KNzA1NjcwNTYyZTUyMGQ0 ZWVjNDljYjQ5Y2I0NWNiNDVhYTQ1Y2I0NWFhNDFhYjQ1YWE0MWFiNDVhYTQxYWE0NThhNDFhYTQx OGE0MWFhNDE4OTNkOGE0MTg5M2Q4YTNkODkzZDhhM2Q4OTNkOGEzZDg5Mzk4YTM5OGEzOThhMzkN CjZhMzU4YjM5NmEzNThhMzU2YTMxNmEzMTZhMmQ2YjMxNmEyZDZhMmQ0YTJkNGEyZDQ5MjkxNTYz MTY2NzE2NjcxNjY3MTU2MzE2NjcxNjY3MTY2NzE2NjcxNjY3MTY2NzM2NjcxNjY3MzY2NzE2Njcz NjY3MTY2NzM2NjcxNjY3DQozNjY3MTY2NzM2NjcxNjY3MzY2NzE2NjczNjY3MTY2NzM2NjcxNTYz MTY2NzE2NjcxNjY3MTU2MzE2NjMxNTYzMTY2M2Y1NWUxNjYzMTY1ZjE3NjMxNjVmMTY2M2Y2NWUx NjVmZjY1YWY3NWVmNjVlMTc1ZjE2NjMzNzY3Mzc2Nw0KNTg2YjU4NmI3OTZmN2E3MzliNzc5Yjc3 YmI3N2JiNzdiYzdiYmM3YmRjN2JiYzdiZGM3YmRiN2JkYjdmZGI3YmRjN2ZkYzdiZmQ3YmRjNzdk Yzc3Mzg2MzhiMmQ2MjBjZTYxODg0MTBlODIwYTUxNGM3MWNlNzFjZTcxOGM2MTQNCmM2MThhNTE0 YTUxNGM2MTgyOTI1ZTcxY2E1MTg2MzEwYTQxOGE0MTg4NDE0NjMxNGE0MTg2MjE0ODIxNDgyMTQ4 MzE4ODIxOGEzMTg4MzE4YTMxY2EzMWNhMzIwYTMxY2MzMjBhMzFjYzMyMGMzMjBlNDI0YzMyMGU0 MjhlNDI4DQplNDI4YTIyMGEzMjRjMzI4MDUyZDA2MzEyNjM1ZTUyY2U1MjhjNDI0ZTYyOGM1MjRh NDIwNjMxMDYzMTA2MzBjODQxMDYzMDg2MzA4NjMwODg0MGM0MjA0ODMxMDIwMDQyODI1OTI1MmQ0 NWE5MTUyZjQ1ZWQzNWVmNDVlZjQ2Mg0KMTU2M2Y0NWVmNDVlZDQ1ZWY0NWViMzVhYjI1YTkxNTY3 MDU2NGY1MjJlNTIwZDRlZWM0OWFiNDVjYjQ1YWE0NWFiNDVhYTQxYWE0NWFhNDFhYTQ1OGE0MWFh NDE4YTQxYWE0MTg5NDE4YTQxODkzZDhhNDE4OTNkODkzZDg5M2QNCjhhM2Q2OTM5ODkzZDY5Mzk4 YTM5NjkzOThhMzk2YTM1OGEzOTZhMzU2YTM1NmEzNThhMzU2YTJkNmEzMTZhMmQ2YTJkNGEyZDRh MmQ0OTI5NDkyOTM2NjcxNjY3MzY2NzE2NjczNjY3MTY2NzM2NjcxNjY3MzY2NzE2NjczNzZiDQox NjY3Mzc2YjE2NjczNzZiMzY2NzM2NjcxNjY3Mzc2YjE2NjczNjY3MTY2NzM3NmIxNjY3MzY2NzE2 NjczNzZiMTY2NzM2NjcxNjY3MzY2NzE2NjcxNjY3MTU2MzE2NjMxNjYzMTY2MzE2NjMxNzYzMTY2 MzE3NjMxNjVmMTc2Mw0KZjY1ZTE3NWZmNjVlMTc1ZjE2NWYzNzY3MTc2NzU4NmI1ODZiNTk2Zjc5 NmY5YTczOWE3M2JiNzc5Yjc3YmM3YmJjN2JkYzdiYmM3YmRkN2ZkYzdiZGM3ZmRiN2JmYzdmZGM3 YmZjN2ZkYzdiZmQ3ZmZkN2JkYzc3ZjY1ZWU2MWMNCmU2MWNhNTE0ZTcxY2M3MWNjNjE4YzYxOGE1 MTBjNjE0ZTcxOGM3MTg4NTEwYTYxNGM3MThlNzFjYTYxNGE1MTRjNjE4YzYxOGE1MTRhNTE0ODQx NDg0MTQ4MzE0YTQxNDgzMTRhNDE4ODMxNGE0MTg4MzE0YTMxODgzMThhMzE4DQo4MzE4ODMxODgy MTQ4MzE4ODIxOGEzMTg4MjE4YTMxY2EyMWM4MjFjODIxY2EzMjBhMzIwZTUyOGU1MjhlNTI4YzQy MGM0MjBjNDIwYTQxYzgzMTQ4MzEwNjMwYzg0MTA4NDEwODQwYzYzMDg4NDBjODMwYzgzMTA2MjBj ODMxMA0KY2QzOWIzNTZkNDVlYjI1NmQzNWVmNDVlZjQ1ZTE1NjMxNTYzMTU2M2Y0NWVmNTVlZDQ1 ZWQ0NWViMjVhYjI1YTcwNTY3MDU2MmU1MjBkNGVlYzQ5Y2I0OWFiNDVjYjQ1YWE0NWFiNDVhYTQx YWI0NWFhNDFhYTQ1YWE0MWFhNDUNCjhhNDFhYTQxODk0MWFhNDE4OTQxOGE0MTg5M2Q4YTNkODkz ZDhhM2Q2OTM5OGEzZDg5Mzk4YTM5NjkzOThhMzk2YTM1OGEzNTZhMzU4YTM1NmEzNTZhMzE2YTJk NmIzMTZhMmQ2YTJkNDkyOTRhMmQ0OTI5MTY2NzE2NjcxNTYzDQoxNjY3MTY2NzE2NjcxNTYzMTY2 NzE2NjczNjY3MTY2NzM2NjcxNjY3MzY2NzE2NjczNjY3MTY2NzM2NjcxNjY3MzY2NzE2NjczNjY3 MTY2NzM2NjcxNjY3MzY2NzE2NjczNjY3MTY2NzM2NjcxNjY3MTY2NzE1NjMxNjYzMTU1Zg0KMTY2 MzE2NWYxNjYzZjY1ZTE2NjMxNjVmMTY2M2Y2NWVmNjVlZjY1ZTE3NWZmNjVhMTc1ZjE3NjMzNzY3 Mzc2NzU4NmI1ODZiNzk2Zjc5NmY5Yjc3OWI3N2JiNzc5Yjc3YmM3YmJjN2JkYzdiYmM3YmRjN2Jk YjdiZGM3ZmRiN2INCmRjN2JkYjdiZmM3YmRjN2JmZDdmZmQ3ZmJiNzc1MTRhNjIwY2M2MWNhNTE0 YTUxOGM2MThhNjE0YTYxNGE1MTBlNzE4YzcxOGE1MTA4NDBjYzYxNGM2MTgwODIxMDgyMTA3MWRj NjE4YzYxODg0MTA2MzBjODMxMDg0MTA2MzEwDQo4NDEwODQxMGE0MTQ4NDE0ODQxNDg0MTRhNDE4 ODQxNGE0MTQ4MzE0ODMxNDYyMTA4MzE0NjIxMDgyMTA2MjEwODIxNDgyMTQ4MzE4ODIxODgyMThh MzFjYzQyMGEzMWNhNDFjYTQxOGE0MTg4MzE0NjMxMDYyMGM2MzBjNjMwYw0KODQxMDg0MGM4NDBj NjMwY2E0MTA4MzEwNjIwODA2MWQ3MTRlNzE1MmQ0NWViMzVhYjM1YWY0NWUxNDYzZjU2MjE1NjNm NTVlZjU2MmQ0NWVmNDVlZDM1ZWIzNWE5MTU2NzE1NjRmNTI0ZjUyMGQ0ZWVjNDlhYjQ1Y2I0NWFh NDUNCmFiNDVhYTQxYWE0NWFhNDFhYTQ1OGE0MWFhNDE4OTQxYWE0MTg5NDE4YTQxODkzZDg5NDE4 OTNkODkzZDY5M2Q4OTNkNjkzOTg5M2Q2OTM5ODkzOTY5Mzk4YTM5NjkzNTZhMzU2YTM1NmEzNTY5 MzE2YTM1NmEyZDZhMzE0YTJkDQo2YTJkNGEyZDRhMmQyOTI5NDkyOTM2NjcxNjY3MzY2NzE2Njcz NjY3MTY2NzM2NjcxNjY3MzY2NzE2NjczNjY3MTY2NzM3NmIxNjY3Mzc2YjE2NjczNzZiMzY2NzM3 NmIxNjY3Mzc2YjM2NjczNzZiMTY2NzM3NmIzNjY3Mzc2Yg0KMTY2NzM3NmIxNjY3MzY2NzE2Njcz NjY3MTY2MzE2NjMxNTYzMTY2MzE2NjMxNjYzMTY1ZjE3NjMxNjVmMTc1ZmY2NWUxNzVmZjY1ZTE3 NWZmNjVlMzc2NzM3NjczODZiMzg2Yjc5NmY3OTZmOWE3MzlhNzNiYjc3YmI3N2JjN2INCmJjN2Jk YzdiZGM3YmRkN2ZkYzdiZGM3ZmRiN2JmYzdmZGI3YmZjN2JkYjdiZmM3YmZjN2JmZTdmYmM3Nzli NzNjNTE4YTQxNGM2MWM2MzBjZTcxY2U3MWNhNjE0YTUxNGE1MTRjNjE4YTUxMGE1MTRhNTE0YzYx NDA3MWQyOTI1DQowNzFkMDcxZGU3MWNjNjE4ODMxMDg0MTA2MzBjNjQwYzYzMGM4NDEwODQxMDg0 MTA2MzBjODQxMDg0MTA4NDE0ODMxMDg0MTQ2MzEwODMxMDYzMTA4MzEwNjIwYzYyMGM2MjEwYTMx NDgzMTQ4MzE0NjIxNGE0MTg4MzE0YTQxOA0KODMxNGE0MTQ4NDE0ODMxMDYzMGM2MzBjNDMwODg0 MGM4NDEwYTUxNDg0MTBhNDEwYTQxMDgzMTA2MjBjYWIzMTkyNTI5MTUyZDM1YWY0NWViMzVhZjU2 MmY0NjIxNTY3MTU2MzE2NjNmNTVlZjU2MmY0NWVmNDVlYjM1YWIyNWENCjcwNTY3MDU2NGY1MjBk NGVlYzQ5Y2I0OWNiNDVjYjQ1YWE0NWNiNDVhYTQxYWI0NWFhNDFhYTQ1YWE0MWFhNDE4OTQxYWE0 MTg5NDE4YTQxODkzZDhhNDE4OTNkOGEzZDY5M2Q4YTNkNjkzOThhMzk2OTM5OGEzOTY5Mzk4YTM5 DQo2YTM1OGEzNTZhMzU2YTM1NmEzMTZhMzE2YTJkNmEzMTRhMmQ2YTJkNDkyZDRhMmQyOTI5MTU2 MzE2NjcxNjY3MTY2NzE1NjMxNjY3MTY2NzE2NjcxNTYzMTY2NzE2NjczNjY3MTY2NzE2NjcxNjY3 MzY2NzE2NjczNjY3MTY2Nw0KMzc2YjE2NjczNjY3MTY2NzM3NmIxNjY3MzY2NzE2NjczNjY3MTY2 NzM2NjcxNjY3MzY2NzE1NjMxNjYzMTY2MzE2NjNmNTVlMTY2M2Y2NWUxNjYzMTY1ZjE2NjNmNjVl MTY1ZmY2NWFmNzVlZjY1ZTE3NWYxNjYzMzc2NzM3NjcNCjU4NmI1ODZiNzk2ZjdhNzM5Yjc3OWI3 N2JiNzdiYjc3YmM3YmJjN2JkYzdiYmM3YmRjN2JiYjc3ZGI3YmRiN2JmYzdmZGI3N2RiN2JkYjdi ZmM3YmRjN2JkYzdiZGQ3YjkzNTZhNDE0MDcyNTYzMTBjNjFjYTYxOGE2MTg4NTE0DQo4NTE0ODQx MDg0MTA4NDEwYTUxNDgzMTBhNTE0YzUxOGU2MWNlNjFjMDcyMWU2MWNlNjE4ODQxMDg0MTA2MzBj NjQxMDY0MGM4NTEwNjQwYzY0MGM0MjA4NjMwYzYzMGM2MzEwNjMwYzYzMGM0MzBjNjMxMDYyMDg2 MzBjNjIwYw0KODMxMDYyMGM4MzEwNjIxMDYyMTA2MjEwODIxMDYyMTA4MzEwNjIwYzYyMGM0MjA4 NDIwODIxMDQ0MjA4NjMwOGE1MTBhNTEwYTUxMGE0MTBjNTE0NjIwODA2MWQyZjQ2OTI0ZTkyNTJi MzVhYjM1YWY0NWVmNDVlMTU2MzE1NjMNCjE2NjdmNTYyZjU2MmY0NWVmNTVlZDM1ZWQzNWU5MjU2 OTE1YTUwNTY0ZjUyMGQ0ZWVjNDlhYjQ1Y2I0NWFhNDVhYjQ1YWE0MWFhNDVhYTQxYWE0NThhNDFh YTQxODk0MWFhNDE4OTNkODk0MTg5M2Q4OTQxNjkzZDg5M2Q2OTNkDQo4OTNkNjkzOTg5Mzk2OTM5 OGEzOTY5MzU4YTM5NjkzNThhMzk2OTM1NmEzNTY5MzE2YTM1NDkyZDZhMmQ0YTJkNmEyZDQ5Mjk0 YTJkMjkyOTQ5MjkzNjY3MTY2NzM2NjcxNjY3MzY2NzE2NjczNjY3MTY2NzE2NjcxNjY3MzY2Nw0K MTY2NzM2NjcxNjY3MzY2NzE2NjczNzZiMzY2NzM3NmIzNjY3Mzc2YjM2NjczNzZiMzY2NzM3NmIx NjY3Mzc2YjM2NjczNjY3MTY2NzM3NmIxNjY3MzY2NzE2NjMzNjY3MTY2MzE2NjNmNjYyMTY2MzE2 NjMxNzYzZjY1ZTE3NjMNCmY2NWVmNzVlZjY1ZTE3NjNmNjVlMzc2NzM3Njc1ODZiNTg2YjU5NmY3 OTZmOWE3MzlhNzNiYjc3YmI3N2JjN2JiYjdiZGM3YmRjN2JkZDdmZGM3YmRiN2JkYjdiZmM3ZmRj N2JkYzdiZGI3N2RjN2JkYzdiZGM3YmJjNzdmZTdmDQpkZDdiYWMzOTgzMTQ0OTJkODMxMGM1MThj NjE4YzYxY2E1MTRhNTE0ODQxNGE1MThhNDE0YzUxODgzMTBhNDEwYzUxODA3MWRlNjE4ZTYxY2U2 MWNjNjE4YTUxNGE1MTQ4NTEwYTUxNDg1MTA4NTEwNjQwYzY0MGM2MzBjODQxMA0KNjQxMDg0MTA2 MzBjNjMxMDYzMGM2MzBjNjMwODg0MTA4MzBjODMwYzYyMGM2MjBjNjIwYzYyMTA0MjBjNjIwYzQy MGM2MjBjMjEwNDQxMDQyMTA0MjEwNDIyMDQ2NDBjYTUxMGM2MTRhNTE0YzUxNGM1MTQ4MzEwOGEz MWI0NTYNCjUwNGFkNDVlYjM1NjkyNTZmNTYyMTU2M2Y1NjIzNjY3MTY2MzE2NjNmNTVlZjU2MmY0 NWVmNDVlYjM1YWIyNWE5MTU2NzA1NjRmNTIyZTRlZWM0OWNiNDVhYjQ1Y2I0NWFhNDVhYjQ1YWE0 NWFiNDVhYTQ1YWE0NThhNDFhYTQ1DQo4YTQxYWE0MTg5M2Q4YTQxODkzZDg5M2Q4OTNkODkzZDg5 Mzk4OTNkNjkzOThhM2Q2OTM5OGEzOTY5Mzk4YTM5NmEzNThhMzk2OTM1NmEzNTZhMzU2YTMxNmEy ZDZhMzE0OTJkNmEyZDQ5Mjk0OTJkMjkyOTE1NjcxNjY3MTU2Nw0KMTY2NzE1NjcxNjY3MTU2NzE2 NjcxNTY3MTY2NzE1NjcxNjY3MTY2NzM2NjcxNjY3MTY2NzE2NjczNjZiMTY2NzM2NjcxNjY3MzY2 YjE2NjczNjY3MTY2NzM2NmIxNjY3MTY2NzE2NjcxNjY3MTU2MzE2NjdmNTYyMTY2N2Y1NjINCmY1 NjJmNTYyZjY2MmY1NWVmNjYyZjY2MjE2NjNmNTVlZjY1ZWQ1NWFmNjVlZjY1ZTE3NjMxNjYzMzc2 YjM3NjczNzZiMzc2YjU4NmY1ODZmNzk3MzlhNzM5YTc3OWE3N2JiNzc5Yjc3YmI3YjliNzdiYjc3 YmI3N2RjN2JiYjc3DQpkYzdiYmI3YmRjN2JiYjdiZGM3YmZlN2ZiYzdiOWI3N2RkN2YxNzYzNDky ZDYyMTAwNzI1YTUxNGM2MThjNzFjZTcxYzg0MTA2MzBjNjMwY2E1MTRhNTE0YTUxNDg0MTBhNDE0 YTUxNGU2MThlNjFjMDcyMWM2MThjNjE4YTUxNA0KYTUxNDg0MTA4NDEwNjMwYzgzMTA4NDEwNjMw YzQyMDg0MjA4NDEwODQyMDg0MjA4NjMwYzYyMDg2MzBjNjIwODYzMGM0MjA4NjIwYzQxMDg0MTA4 NDIwYzQyMDg0MTA0NDEwODIxMDQyMTA0MDAwMDIwMDQyMTA0MjEwNDAwMDANCjYzMGMwNzIxMDcy MWE0MTRjNTE4NDkyOTJmNDZiMzU2YjM1NjkyNTJkMzVhZDM1YWQzNWFmNTVlMTU2MzE1NjMxNjYz MTY2MzE2NjNmNTVlZjU1ZWQ1NWVkNDVlOTI1YTkyNTY1MDU2NGY1MjBkNGFlYzQ5Y2I0NWNiNDVh YTQxDQphYTQ1YWE0MWFhNDU4YTQxOGE0NTg5NDE4YTQ1ODk0MThhNDE4OTQxODk0MTY5M2Q4OTNk ODkzZDg5M2Q2ODM5ODkzOTY4Mzk4OTM5NjgzOTY5Mzk2OTM1NjkzOTY5MzU2OTM1NjkzNTY5MzU0 OTM1NjkzNTY5MzE2YTMxNDkyZA0KNmEzMTQ5MmQ0OTJkMjgyOTQ5MjkxNjY3MTU2NzE2NjcxNTYz MTY2NzE1NjcxNjY3MTU2MzM2NjcxNjY3MTY2NzE2NjczNjZiMTY2NzM2NmIxNjY3MzY2YjE2Njcz NjZiMTY2NzM2NmIxNjY3MzY2YjE2NjczNjY3MTY2NzE2NjcNCjE1NjcxNjY3MTU2NzE2NjdmNTYy MTY2N2Y1NjJmNTYyZjU2MmY1NjJmNTYyZjY2MmY1NjIxNjYzZjY2MmY2NjJkNTVlZjY1ZWY2NWVm NzYyZjY2MjE3NjcxNjY3Mzc2YjM3NmI1ODZmNTg2Zjc5NmY3OTZmOWE3NzlhNzM5YTc3DQo5YTc3 YmI3YmJiNzdiYjdiOWE3N2JjN2JiYjc3YmM3YmJiNzdiYzdiYmI3N2JjN2JiYjc3OWI3N2JjN2Jk ZDdmZGM3YmJiNzdiMzU2NmEzMTgzMTAwODIxZTcxY2E2MTQ4NDEwZTcxYzA4MjFlNzFjNjMwY2E0 MTQ4NDEwYTUxNA0KYTQxNGM1MThjNTE0YzUxOGM1MThhNTE0YTQxMDg0MTA4MzBjODMxMDYzMGM4 MzEwNjMwYzYzMGM2MjA4NjMwYzYzMGM4MzEwNDIwODQxMDgyMTA0NjMwYzYzMGM2MzBjNjMwYzYz MGM2MzBjNjMwYzQyMDg0MjA4NDEwNDQyMDgNCjQxMDg0MTA4MjAwMDIwMDAwMDAwMDAwMDAwMDA0 MjA4ODMxMGM2MThjNTE4ZTYxYzI4MjUyZjQ2OTI1MmQ0NWE5MjU2YjI1NmQzNWFmNDYyZjQ1ZTE1 NjMxNjYzMTY2MzE2NjMzNzY3MTY2MzE2NjNmNTVlZjY2MmQ0NWViMzVhDQo5MTU2NzE1NjRmNTIw ZTRlZWM0OWNjNDljYjQ1YWI0NWFhNDVhYjQ1YWE0NWFhNDU4YTQ1YWE0NThhNDU4YTQ1ODk0MThh NDE4OTNkODk0MTg5M2Q4OTNkODgzOTg5M2Q2ODM5ODkzZDY4Mzk4OTM5NjkzOTg5Mzk2OTM5OGEz OQ0KNjkzNTZhMzk2OTM1NjkzNTY5MzU2YTM1NjkzMTZhMzE0OTJkNDkzMTQ4MmQ0OTJkMjgyOWY1 NjJmNTYyZjU2MjE1NjNmNTYyZjU2MmY1NjIxNTYzZjU2MjE1NjdmNTYyMTY2N2Y1NjIxNjY3MTU2 MzE2NjdmNTYyMTY2NzE1NjMNCjE2NjdmNTYyMTY2NzE1NjMxNjY3ZjU2MjE1NjNmNTYyMTU2M2Y0 NjJmNTYyZjQ2MmY1NjJkNDVlZjU2MmQ0NWVmNDYyZDQ1ZWY1NWVkNDVlZjU2MmY1NWVmNjYyZDU1 ZWY1NWVkNTVhZjU1ZWQ2NWVmNjVlZjU2MjE2NjcxNjY3DQozNzZiMzc2NzU4NmI1ODZmNzk3Mzc5 NmY3OTczNzk3MzlhNzc5YTczOWE3NzlhNzc5YTc3OWE3MzliNzc5YTczOWI3NzlhNzM5Yjc3OWI3 N2JiNzc3YTczYmM3YmJjN2I5YTczOWE3M2JiNzdiMzU2NDkyOWE0MTRjNTE4YzYxOA0KZTcxY2U3 MWNlNzFjYzUxODg0MTA4NDEwODQxMDg0MTA4NDEwODQxMDg0MTA4NDEwODQxMGE1MTRjNTE4YTUx NGE1MTQ4NDEwYTQxNDg0MTBhNDE0NjIwYzYzMGM2MjBjNjMwYzQxMDgyMTA0MjEwNDQyMDgyMTA0 NDIwODQyMDgNCjQzMDg0MjA4NDIwODQyMDg0MjA4MjEwNDIxMDQyMTA0NDEwODIwMDAwMDAwMDAw MDIwMDQwMDAwMDAwMDIxMDQ4NDEwYTQxMDA3MjE4YjMxMGY0MjkyNTJiMzU2OTI1MjkxNTI3MTUy YjI1NmQzNWFmNTYyZjU1ZTE2NjMxNjYzDQozNzY3MTY2MzE2NjNmNjVlZjY2MmQ1NWVkNDVlYjM1 YTkyNWE1MDUyNGY1MjBkNGFlYzQ5YjYwYTAwMDAyNjA2MGYwMDYyMTU1NzRkNDY0MzAxMDAwMDAw MDAwMDAxMDAwMDAwMDAwMDAwMDAwNzAwMDAwMDQwMTUwMDAwMDAwMA0KMDAwMDQwZDUwMDAwY2I0 NWNiNDVhYTQ1YWE0NThhNDFhYTQ1OGE0NThhNDU4OTQxOGE0NTg5NDE4YTQxNjkzZDg5M2Q2OTNk ODkzZDY4Mzk4OTNkNjgzOTg5Mzk2ODM5NjkzOTY5Mzk2OTM5NjkzNTY5Mzk2OTM1NjkzNTQ5MzUN CjY5MzU0OTM1NjkzNTQ5MmQ2OTMxNDkyZDQ5MmQyODI5NDkyZDI4MjkyODI5ZjU2MmY0NjJmNTYy ZjU2MmY1NjJmNDYyZjU2MmY1NjJmNTYyZjQ2MmY1NjJmNTYyZjU2MmY1NjIxNTYzZjU2MmY1NjJm NDYyZjU2MmY1NjJmNTYyDQpmNDYyZjU2MmY1NjJmNTYyZjQ2MmY1NjJmNDYyZjU2MmQ0NWVmNTYy ZDQ1ZWY0NjJkNDVlZjQ2MmQ0NWVkNDVlZDQ1ZWY0NWVkNDVlZjU2MmQ1NWVmNTVlZDU1YWQ1NWVk NTVhZjU1ZWQ1NWVmNjYyZjU2MjE2NjcxNjY3Mzc2Yg0KMzc2YjU4NmY1ODZmNzk2ZjU4NmY3OTcz Nzk3MzlhNzM3OTczOWE3NzdhNzM5YTczN2E3MzliNzc5YTczOWE3MzlhNzM5Yjc3OWE3M2JjN2I5 YTczOWI3Nzc5NmY3OTZmOWI3NzlhNzNkNDVhNmIyZGU2MWNjNTE4ZTYxYzA3MjENCmE0MTRhNTE0 YzYxOGM2MThhNTE0YTQxNDYzMGM2MzBjNjMwYzg0MTA4NDEwYTUxNDg0MTBhNTE0ODQxMDg0MTA2 MzBjNjMwYzQyMDg4NDEwODMxMDg0MTA2MzBjNjMwYzIxMDQ2MzBjNjMwYzIyMDQyMTA0NDIwODQy MDg0MzA4DQo0MjA4NDIwODQyMDg0MjA4MjEwNDIxMDQwMDAwMjAwNDAwMDAyMTA0MjEwNDIxMDQw MDAwNjMwY2M1MTgwODIxYWMzNTcyNGU5MzUyOTI1MjcxNGU5MjUyOTE1MmIyNTZiMjU2ZDM1YWY0 NWUxNjYzMTY2MzM3NjczNzYzMzc2Nw0KMTY2MzE3NjNmNjYyZjY2MmQ0NWViMzVhOTI1NjcxNTY0 ZjUyMmU0ZWVjNDljYzQ1YWI0NWFiNDVhYTQ1YWE0NWFhNDVhYTQ1OGE0NThhNDU4OTQxOGE0NTg5 NDE4YTQxODkzZDg5NDE4OTNkODkzZDY5Mzk4OTNkNjkzOTg5MzkNCjY5Mzk4OTM5NjkzOTZhMzk2 OTM1NmEzOTY5MzU2YTM1NjkzNTZhMzU2OTM1NmEzMTQ5MmQ2YTMxNDkyZDQ5MmQyODI5NDkyZDI4 MjlkNDVlZjQ2MmQ0NWVmNDYyZDQ1ZWY0NjJkNDVlZjQ2MmQ0NWVmNDVlZDQ1ZWY0NWVkNDVlDQpm NDYyZDQ1ZWY0NjJkNDVlZjQ2MmQ0NWVmNDVlZDQ1ZWY0NjJkNDVlZjQ1ZWQ0NWVmNDYyZDQ1ZWY0 NWVkNDVlZDQ1ZWQzNWVkNDVlZDM1ZWQzNWVkMzVhZDM1ZWQzNWFkNDVlYjM1YWQ0NWVkNDVhZDQ1 ZWI0NWFkNDVhYjQ1Ng0KZDQ1YWI0NTZkNDVhZDQ1ZWY1NWVmNTVlZjY2MmY2NjIxNzY3MTc2NzM4 NmIzODZiNTg2ZjU4NmI1OTZmNTg2Zjc5NzM1OTZmNzk3Mzc5NmY3YTczNzk2ZjdhNzM3OTZmN2E3 Mzc5NmY3YTczN2E3MzU4NmI3OTZmOWI3NzU5NmYNCjc5NmY3YTczN2E2ZjM4NjdlZTNkYTQxNDg0 MTBjNTE4ZTYxOGE1MTRjNjE4YzYxOGM2MTg4NDEwODQxMDYzMGM2NDBjNjMwYzg0MTA2MzBjODQx MDY0MGM4NDEwNjMwYzYzMGMyMjA0MjEwNDYzMGM4NDEwODUxMGE1MTQ4NDEwDQo2MzBjNDIwODQz MDg0MjA4NDMwODQyMDg2MzBjNDMwODYzMGM0MjA4NDIwODQyMDgyMTA0MDAwMDIwMDQyMTA0MjEw NDAwMDAyMTA0MDAwMDQyMDhlNzFjYWMzMWNkMzkzMDQ2NzI0ZTcxNGU1MTRhNzE0ZTcxNGViMzU2 YjI1Ng0KYjM1NmIzNWFmNTVlZjU1ZTE2NjMxNjYzMzc2NzE3NjMxNzYzZjY2MjE2NjNmNTVlZDU1 ZWIzNWE5MjVhNzE1NjUwNTIwZDRhZWM0OWNiNDVjYjQ1OGE0MWFhNDU4YTQxYWE0NTg5NDE4YTQ1 ODk0MThhNDU4OTQxODk0MTY5M2QNCjg5M2Q2ODNkODkzZDY4Mzk4OTNkNjgzOTY5Mzk2OTM5Njkz OTY5MzU2OTM5NjkzNTY5Mzk2OTM1NmEzNTQ5MzU2YTM1NDkzMTZhMzU0OTJkNmEzMTQ5MmQ0OTJk NDkyOTQ5MjkyODI1MjgyOWQ0NWVkNDVlZDQ1ZWQzNWVkNDVlDQpkNDVlZDQ1ZWQzNWVmNDVlZDQ1 ZWQ0NWVkNDVlZjQ2MmQ0NWVmNDYyZDQ1ZWY0NjJkNDVlZjQ1ZWQ0NWVmNDYyZDQ1ZWY0NWVkNDVl ZjQ1ZWQ0NWVkNDVlZDM1ZWQ0NWVkMzVlZDQ1ZWQzNWFkMzVlZDM1YWQzNWFiMjVhZDM1YQ0KYjI1 YWQzNWFiMzVhZDQ1YWIzNWFkNDVhYjM1NmI0NWFiMzU2YjQ1NmIzNTZkNDVlZDQ1YWQ1NWVkNTVl ZjY2MmY2NjIzNzY3Mzc2NzM4NmIzNzZiNTg2YjM4NmI1OTZmNTg2ZjU5NmY1ODZmNzk2ZjU5NmY3 OTZmNTk2Zjc5NmYNCjc5NmY3OTZmNTk2Zjc5NmY1ODZiNzk2ZjdhNzM3OTZmNTk2Zjc5NmY1ODZi OWE3MzE2NWYzMDQ2NDkyOWU2MWNjNTE4YzUxOGM1MThjNTE4YTUxNGM2MThhNTE0YTYxNDg0MTA4 NDEwNjMwYzg1MTA4NDEwYTUxNDg1MTBhNTE0DQo4NDEwODQxMDYzMGM2MzBjNDMwODY0MGM2NDBj NjQwYzQyMDg0MjA4NDIwODQzMDg0MjA4NDMwYzQzMDg2MzBjNDMwODYzMGM0MjA4NDIwODIxMDQy MTA0NDEwODYzMGM0MjA4MjEwNDAwMDAyMDAwYTQxNGVlMzk3MzRlOTM1Mg0KNzI0ZTcyNGUzMDQ2 NzI0ZTcxNGU5MjUyOTI1NmIzNTZiMjU2ZDQ1ZWY1NWUxNjYzMTY2MzM3NjcxNzYzMzg2NzE3NjMx NzY3MTY2M2Y2NjJkNDVlYjM1YTkyNTY5MTU2NGY1MjJlNGVlYzQ5Y2I0NWFiNDVhYjQ1OGE0MWFh NDUNCmFhNDVhYTQ1ODk0MThhNDU4OTQxOGE0NTg5NDE4YTQxODkzZDg5M2Q2OTNkODkzZDY5Mzk4 OTNkNjkzOThhMzk2OTM5NmEzOTY5Mzk2YTM5NjkzNTZhMzU2OTM1NmEzNTRhMzU2YTM1NDkzMTZh MzE2YTJkNmEyZDQ5MmQ0YTJkDQo0OTI5NDkyOTI4MjViMjVhYjM1YWIzNWFiMzVhYjI1YWIzNWFi MzVhYjM1YWIzNWFiMzVhYjM1YWQzNWFiMzVhZDM1YWIzNWFkMzVlYjM1YWQzNWViMzVhZDM1ZWIz NWFkMzVlYjM1YWQzNWViMzVhZDM1ZWIzNWFkMzVhYjI1YQ0KYjM1YWIyNWFiMzVhYjI1NmIyNWE5 MTU2YjI1YTkxNTZiMjU2OTI1NmIyNWFiMjU2YjM1NjkyNTZiMzU2OTI1MjkyNTY5MjUyOTM1Njky NTZiMzVhYjM1YWQ0NWVkNDVlZjU2MmY2NjIxNzY3MTY2NzM3NjczNzY3Mzg2YjM3NmINCjU4NmIz NzZiNTg2YjM4NmI1ODZiMzg2YjU5NmYzODZiNTk2ZjU4NmI1OTZmNTg2Yjc5NmYzODZiMzc2NzM4 NmI1OTZmMzg2YjU4NmJmNTVlNzk2Zjc5NmZkNDVhY2MzOTI4MjVlNjFjZTYxY2E1MTRjNjE4YzYx OGU3MWNjNjE4DQphNjE0ODUxMDg0MTA2NDBjODQxMDYzMGM2MzBjNDMwODYzMGM0MjA4NjMwYzQy MDg0MjA4MjEwNDIyMDQyMTA0MjEwNDIxMDQ0MzA4MjEwNDIyMDQyMjA0NDMwODQyMDg0MzA4NDIw ODQzMDgyMTA0NDIwODIxMDQ0MjA4MjEwNA0KMjEwNDIwMDQyMTA0NDIwODhiMmQ3MjRlZDU1YWI0 NTI5MzRlNTE0YTcxNGU1MTRhNzE0ZTkyNGU5MjUyOTE1MmIzNTZkMzVhZjU1ZWY2NWUxNzYzMTc2 MzM4NjcxNzYzMzc2NzE3NjMxNzYzZjU1ZWQ1NWViMzVhOTI1YTcwNTYNCjRmNTIwZDRlMGQ0YWFh NDFjYjQ1OGE0MWFhNDU4YTQxYWE0NTg5NDE4YTQ1Njk0MThhNDE4OTQxODk0MTY5M2Q4OTNkNjgz ZDg5M2Q2ODM5NjkzOTY5Mzk2OTM5NjkzNTY5Mzk2OTM1NjkzOTQ5MzU2YTM1NjkzNTZhMzU0OTMx DQo2YTM1NDkzMTZhMzU0OTJkNGEyZDQ5MmQ0OTJkMjkyOTQ5MjkyODI1MjkyOWIzNWFiMjU2YjM1 YWIyNWFiMzVhYjI1NmIzNWFiMjVhYjI1YTkyNTZiMzVhYjI1NmIzNWE5MjU2YjM1YWIyNWFiMzVh YjI1YWIzNWFiMjVhYjM1YQ0KYjI1YWIzNWFiMjVhZDM1YWIzNWFkMzVhYjM1YWIzNWFiMjU2YjM1 YWIyNTZiMjVhOTE1NmIxNTY5MTU2OTE1NjkxNTZiMjU2OTE1NmIzNTY5MjU2YjM1NjkyNTY5MzU2 OTI1MjkzNTY5MjUyYjM1NjkzNTZkNDVhYjQ1YWQ1NWUNCmQ1NWUxNjYzMTY2NzM3NjcxNjY3Mzc2 YjM3NmIzODZiMzc2YjU4NmIzNzZiNTg2YjM4NmI1ODZiMzg2YjU4NmIzODZiNTg2YjM4NmIzODZi NTk2ZjM4NmIzNzY3Nzk2ZjM4NmIzNzY3NTk2Yjc5NmY1NzY3NTg2YjU5NmIzODY3DQo3MTRlOGIz MWM1MTgwNzFkZTYxY2U3MWNlNzFjZTcxY2M2MThjNzE4YTYxNGE2MTQ4NDEwODQxMDQzMDg0MjA4 NDIwODYzMGM0MzA4NDIwODIyMDQ0MzA4NjMwYzYzMGM0MjA4NDIwODIyMDQyMjA0MjIwNDQzMDg0 MjA4NjMwYw0KNjMwYzY0MGM2MzBjNjMwYzQyMDg0MjA4MjEwNDAwMDAwMDAwNDEwODYyMGNhYzM1 NzI0ZWQ2NWE5MzUyOTM1MjUxNGE3MTRhOTI0ZTcxNGU3MjRlYjM1NjkyNTJkMzVhZDQ1ZWY1NWVk NDVhMTY2MzE2NjMzODY3Mzg2NzM4NjcNCjE3NjMzODY3MTc2M2Y2NjJkNDVlZDQ1ZTkyNWE5MTU2 NGY1MjJlNGVlYzQ5Y2I0NWFhNDFhYjQ1YWE0MWFhNDU4YTQxYWE0NTg5NDE4YTQ1ODk0MThhNDU4 OTQxODk0MTY5M2Q4OTNkODkzZDg5M2Q2OTM5OGEzZDY5Mzk2YTM5DQo2OTM5NmEzOTY5Mzk2YTM5 NjkzNTZhMzk2YTM1NmEzNTQ5MzU2YTM1NGEzMTQ5MmQ0OTJkNGEyZDQ5Mjk0OTI5MjgyNTI5Mjky ODI1OTE1NjkyNTY5MTU2OTI1NjkxNTY5MjU2OTE1NjkyNTY3MTUyOTI1NjcxNTI5MjU2OTE1Mg0K OTI1NjkxNTI5MjU2OTE1NjkyNTY5MTUyOTI1NjkxNTY5MjU2OTE1MjkyNTY5MTU2OTI1NjkxNTI5 MjU2NzE1MjkxNTY3MTUyOTE1MjcwNTI5MDUyNzA1MjcwNTI3MDUyOTE1MjcwNTI5MTUyOTI1Mjky NTY3MTUyOTI1MjcxNTINCjkyNTI3MTRlOTI1MjkyNTI5MzU2OTM1NmI0NWFiNDVhZDU1ZWQ1NWVm NjYyMTY2MzE3NjcxNjY3Mzc2NzE3NjczODZiMTc2NzM3NmIzNzY3Mzg2YjM3NjczODZiMzg2YjU4 NmIzODZiNTg2YjM4NmI1ODZiMzg2YjU4NmIzODZiDQo1ODZiMzg2YjU4NmIxNjYzNTg2YjU3Njc1 ODY3NTg2YjU5NmJiNDU2MGY0MjA3MjFjNTE4ODMxMGE1MTRjNjE4YzYxOGE1MTQ4NTEwYTUxNGE1 MTRhNTE0YTYxNGE1MTRhNTE0NjMwYzQzMDg0MjA4NDMwODQyMDg0MjA4NDIwOA0KNDIwODIxMDQy MTA0NDIwODQyMDg0MjA4NjMwYzYzMGM4NDEwNjMwYzYzMGM2MjBjMjEwNDAwMDAwMDAwNDEwOGU2 MWNhZDM1NzM0ZWQ1NWFkNjVhYjQ1NmI0NTI5MzUyOTI0ZTUxNGE1MTRhNzE0ZTkyNGU5MjRlYjI1 MmIyNTYNCmQ0NWFkNDVhZjU1ZWY2NWUxNzYzMTc2MzM4NjcxODY3Mzg2N2Y3NjIxNzYzZjY2MmY1 NjJiMzVhOTI1YTcxNTY1MDUyMGQ0ZWVkNDljYjQ1Y2I0NThhNDFhYTQ1OGE0MWFhNDU4OTQxOGE0 NTY5NDE4OTQxNjk0MTg5NDE2OTNkDQo4OTNkNjgzZDg5M2Q2OTM5ODkzOTY5Mzk2OTM5NjkzNTY5 Mzk0OTM1NjkzNTQ5MzU2OTM1NDkzMTRhMzU0OTMxNGEzNTI5MzE0OTMxNDkyZDQ5MmQyODI5NDgy OTI4MjUyODI1MDcyMTA4MjU5MTU2NzE1MjkxNTY3MTUyOTE1Ng0KNzE1MjkxNTY3MTUyOTE1Njcx NTI5MTU2NzE1MjkyNTY5MTUyOTI1NjcxNTI5MjU2OTI1NjkyNTY5MTU2OTI1NjkyNTY5MjU2OTE1 NmIyNTY5MjU2OTI1NjkxNTY5MjU2OTE1MjkxNTY3MTUyOTE1NjcwNTI5MDUyNzA1MjkxNTYNCjcx NTI5MTU2OTE1MmIyNTY5MjUyOTI1NjkxNTI5MjUyOTI1MjkyNTI3MjUyOTM1NjkzNTZiMzVhYjM1 YWQ0NWVkNDVlZjY2MmY2NjIxNzY3MTY2NzE3NjcxNzY3Mzc2YjM3NjczODZiMzc2NzU4NmIzODZi NTg2YjM4NmI1ODZiDQozODZiNTg2YjM4NmI1ODZiNTg2YjU4NmIzODZiNTk2ZjU4NmI1OTZmNTg2 YjU3NmI1NzZiNTg2YjM3Njc1OTZiNzk2ZjU5NmJmNjVlNzI0ZWVlM2Q0YTI5ZTYxY2M2MThhNTE0 YzYxOGM2MThjNjE4YTUxNGE1MTQ4NDEwYTUxNA0KODQxMDY0MGM0MjA4ODUxMDYzMGM2MzBjNDIw ODIyMDQyMTA0MjEwNDIxMDQ0MjA4NDIwODYzMGM2MzBjODQxMDg0MTA4NDEwODMxMDIxMDQ2MzBj ZTYxYzZhMmQzMDQ2YjQ1NmY2NWVmNjVhZjY1ZWY1NWFmNTVhYjQ1NmI0NTYNCjkyNGU5MjRlNzE0 YTcyNGU3MjRlOTI1MjkyNTJiMzU2ZDM1NmY1NWVmNTVlMTc2MzE3NjMzODY3Mzg2NzM5NjcxODYz MTc2M2Y3NjIxNzY3ZDU1ZWQ0NWU5MjVhOTI1YTRmNTIyZTRlZWM0OWNiNDVhYTQ1YWE0NThhNDFh YTQ1DQphYTQ1OGE0NTg5NDE4YTQ1ODk0MTg5NDE2OTNkODk0MTY5M2Q4OTNkNjkzOTg5M2Q2OTM5 OGEzZDY5Mzk2YTM5NjkzOTY5Mzk0OTM1NmEzOTY5MzU2YTM1NDkzNTZhMzU0OTMxNDkzNTQ5MzE0 OTJkNDgyZDQ5MmQyODI5MjgyOQ0KMDgyNTI4MjUwNzIxNzA0ZTcxNTI3MDUyNzE1MjcwNGU3MTUy NzA1MjcxNTI3MDUyNzE1MjcxNTI5MTUyNzE1MjcxNTI3MTUyOTE1NjcxNTI5MjU2OTE1MjkyNTY3 MTUyOTI1NjkxNTI5MjU2OTE1MjkyNTY5MTUyOTI1NjcxNTINCjkxNTY3MTUyOTE1NjcwNTI5MTUy NzA1MjkxNTI3MDUyOTE1MjcxNTI5MjU2OTI1MjkyNTY5MjUyOTI1MjcyNTI5MjUyNzI1MjkzNTI3 MjUyOTM1NjkzNTZiNDVhYjQ1YWQ1NWVkNTVlZjY2MmY2NjIxNjY3MTY2MzE3NjcxNzY3DQozNzY3 MTc2NzM3NmIzNzY3Mzg2YjM3Njc1ODZiMzg2YjU4NmIzODZiNTg2YjM4NmI1ODZiNTg2YjU5NmYz ODZiNTk2ZjU4NmI1ODZmNTg2Yjc4NmI1ODZiNTg2NzM3Njc1OTZiNzk2YjdhNmYzODY3ZDU1YTUx NGFjZTM5NGEyOQ0KMDcyMWM1MThjNTE4ODQxMDg0MTA2MzBjNjMwYzYzMGM4NDEwNjMwYzQyMDgw MDAwNDIwODYzMGM4MzEwNjMwYzYzMGM0MjA4NjMwYzIxMDQ2MzBjODQxMGE1MTQ2MzBjNDIwODIw MDQyMDA0YTQxNGNkMzViNDUyMTc1ZmY2NWUNCjM3NjMzODY3Mzg2N2Y2NWFmNjVhZDU1YWQ1NWFi MzUyOTM1MjcyNGU5MjRlNzE0YTkyNGU5MjRlYjM1MjkyNTJkNDVhZDQ1YWY2NWVmNjVlMTc2MzE4 NjMzOTY3MTg2MzE4NjNmNzYyMTc2M2Y2NjJmNTYyYjM1YWIyNWE3MTU2DQo0ZjUyMGQ0ZTBkNGFh YTQxYWI0NThhNDFhYTQ1OGE0MWFhNDU4OTQxOGE0NTY5NDE4OTQxNjk0MTg5NDE2ODNkODkzZDY4 M2Q4OTNkNjkzOTg5Mzk2OTM5NjkzOTY5MzU2OTM5NDkzNTY5Mzk0OTM1NjkzNTQ5MzU2YTM1NDkz MQ0KNDkzMTI4MzE0OTMxMjgyZDQ4MmQyODI5MjgyOTA3MjUwNzI1MDcyNTA3MjU3MTUyNzE1Mjkx NTI3MTUyNzE1MjcxNTI5MTUyNzE1MjkxNTY3MTUyOTE1NjcxNTI5MTU2NzE1MjkyNTY5MTUyOTI1 NjkxNTI5MjU2OTE1NjkyNTYNCjkxNTI5MjU2OTE1NjkyNTY5MTU2OTI1NjkxNTY5MjU2NzE1Mjky NTY3MTUyOTE1NjcwNTI5MTU2NzE1MjkxNTI3MTUyOTI1NjkyNTJiMjU2OTI1MjkzNTY5MjUyOTI1 MjkyNTI5MzU2OTI1MjkzNTY5MzU2YjQ1YWI0NWFkNTVlDQpkNTVlZjY2MmY2NjIxNzY3MTY2NzM3 NmIzNzY3Mzg2YjM3NmIzODZiMzc2YjU4NmIzODZiNTk2ZjU4NmI1OTZmNTg2YjU5NmY1ODZiNTk2 ZjU5NmY3OTZmNTk2Zjc5NmY1OTZmNzk2Zjc5NmY3OTZmNzg2Yjc5NmY3OTZiNzk2Yg0KNTg2Yjc5 NmI3OTZmNTg2YjM3NjMxNjYzYjQ1NjcyNGFjZDM5NDkyOWU2MWNjNjE4YTQxNDgzMTA2MjBjODMw YzYyMDg0MTA4MDAwMDQxMDg2MjA4ODQxMDgzMTA4MzBjNDIwODYyMGM0MjA4NDEwODYyMGNhNDE0 YzUxODA3MjENCjQ5MjllZTNkMzA0NmQ1NWExNjVmNTg2NzM3NjczNzY3Mzc2MzE3NjNkNDU2MTc1 ZjE2NWYxNjVmZDU1YWQ0NTZiMzUyYjM1MjkyNGU5MjRlNzI0ZTkzNTI5MzUyYjM1NmIzNTZmNTVl ZjY1ZWY3NjJmNzYyMzg2NzM4NjczODY3DQoxNzYzMTg2N2Y3NjIxNzYzZDU1ZWQ0NWU5MjVhOTE1 YTRmNTIyZTUyMGQ0YWNiNDVhYTQxYWI0NWFhNDFhYTQ1OGE0MWFhNDU4OTQxOGE0NTg5NDE4YTQ1 ODk0MTg5NDE2OTNkODkzZDY4Mzk4OTNkNjkzOTg5M2Q2OTM5NjkzOQ0KNjkzNTY5Mzk2OTM1Njkz NTQ5MzU2YTM1NDkzNTQ5MzU0ODMxNDkzMTI4MmQ0OTJkMjgyOTQ4MmQyODI5MjgyOTA3MjUwNzI1 MDcyNTcxNTI5MTU2NzE1MjkxNTI3MTUyOTE1NjcxNTI5MTUyNzE1MjkxNTI3MTUyNzE1MjcxNTIN CjkxNTY3MTUyOTE1NjcxNTI5MjU2NzE1MjkxNTY3MTUyOTI1NjcxNTI5MTU2OTE1MjkyNTY3MTUy OTE1NjcxNTI5MjU2NzE1MjkxNTY3MTUyOTE1NjcxNTI3MTUyNzE1MjkxNTY3MTUyOTI1NjkyNTI5 MzU2OTI1MjkzNTI5MjUyDQo5MzUyNzI1MjkzNTI5MzU2YjQ1YWI0NWFkNTVlZDU1ZWY2NjJmNjYy MTc2NzE3NjczODZiMzc2YjM4NmIzODZiNTk2ZjM4NmI1OTZmNTg2YjU5NmY1ODZiNTk2ZjU5NmY3 OTZmNTk2Zjc5NmY3OTZmN2E3MzU5NmY3YTczNzk2Zg0KN2E3Mzc5NmY3YTczNzk2Zjc5NmY3OTZm OWE3MzlhNzM5YTczNzk2ZjlhNzM3OTZmNzk2YjM3NjcxNzYzZjY1ZWQ0NTY1MTRhMGY0MjZhMmQ0 OTI5MDcxZGU2MWNjNTE4YTQxNDQxMDgwMDAwMDAwMDIwMDQwMDAwMDAwMDAwMDANCjQxMDg2MzBj YzUxODA3MjFhYzMxNTE0YWQ1NWExNzVmMTc2MzE2NjMxNzYzOWE3Mzc5NmIzNzYzMzc2MzE3NjMz NzY3MTc2MzM3NjcxNjVmMTc1ZmY2NWFmNTVhZDQ1NmI0NTY5MjRlOTI0ZTcyNGU5MjRlOTI0ZTkz NTI5MzUyDQpkNDU2ZDQ1YWY2NWVmNjVlMTg2MzE4NjMzOTY3MTg2MzE4NjNmNzYyZjc2MmY2NjJk NTYyYjM1YTkyNWE3MTU2NzA1NjBkNGUwZDRhY2I0NWNiNDU4YTQxYWE0NThhNDFhYTQ1ODk0MThh NDU4OTQxOGE0NTY5NDE4OTQxNjkzZA0KODkzZDY4Mzk2ODM5NjgzOTY5Mzk2ODM5NjkzOTY4MzU2 OTM5NDgzNTY5Mzk0ODM1NjkzNTQ4MzE0OTMxNDgzMTQ4MzEyODJkMjgyZDI3MjkyNzJkMDcyOTA3 MjkwNjI1MDcyNWU2MjBlNjIwOTI1NjkxNTI5MjU2NzE1MjkyNTYNCjkxNTI5MjU2NzE1MjkxNTY3 MTUyOTE1NjcxNTI5MjU2OTE1MjkyNTY3MTUyYjI1YTkyNTZiMjU2OTI1NmIyNWE5MjU2YjI1Njky NTZiMjVhOTI1NmIyNTY5MjU2YjI1YTkyNTZiMjU2OTI1NmIyNTY5MjU2OTI1NjkxNTY5MjU2DQo5 MjU2YjM1NjkyNTZiMzU2OTM1NmIzNTY5MzU2YjQ1NjkzNTZiNDU2OTM1NmQ1NWVkNDVlZjU1ZWQ1 NWUxNjYzMTY2MzM3NmIzNzZiNTk2ZjU5NmY1OTZmNTk2ZjdhNzM3OTczN2E3Mzc5NmY3YTczN2E3 MzdhNzM3YTczOWE3Mw0KN2E3MzlhNzM3YTczOWI3NzlhNzM5Yjc3OWE3MzliNzc5YTczOWI3Nzlh NzNiYjc3OWE3MzlhNzM5YTczYmI3NzlhNzNiYjczOWI3M2RjNzc5YjczOWE2ZjU5NmI5YTZmN2E2 Zjc5NmYzNzY3NTk2YjM4NjcxNzYzZjY1ZWY2NWUNCmI0NTY5MzRlNTE0NmNkMzVhYzM1Y2QzOWVl M2QzMDQ2NzI0ZWQ1NWFmNjVlN2E2ZjdhNmY5YjczNzk2ZjU5NmIzODY3NTk2YjU5NmI1ODZiNTg2 Yjc5NmY3OTZmNTg2YjM2NjM1ODZiNzk2ZjM3NjMzNzYzMTc1ZmY2NWFmNTVhDQpkNDU2YjM1Mjkz NTI5MzUyOTI1MjkzNTI5MjUyYjM1NmIzNTZmNTVhZjU1ZWY3NjJmNzYyMzk2NzE5NjczOTY3MTg2 MzE3NjNmNzYyZjc2MmQ1NWViNDVlOTI1YTkyNWE0ZjUyMmU1MjBkNGFjYjQ1YWE0NWFhNDU4YTQx YWE0NQ0KYWE0NThhNDU4OTQxOGE0NTg5NDE4YTQ1ODk0MTg5NDE2OTNkODkzZDY4Mzk2ODM5Njgz OTY4Mzk2ODM1NjkzOTY4MzU2OTM5NjgzNTY5MzU0ODM1NjkzNTQ4MzE0OTM1MjgzMTQ4MzEyNzJk MjcyZDA3MjkwNzI5MDYyNTA2MjkNCmU2MjRlNjI0ZTUyMDkxNTI5MjU2OTE1NjkyNTY5MTUyOTI1 NjkxNTY5MjU2OTE1NjkyNTY5MTU2OTI1NjkxNTY5MjU2OTI1NmIyNTY5MjU2YjM1YWIyNTZiMzVh OTI1NmIzNWFiMjU2YjM1YWIyNTZiMzVhYjI1YWIzNWFiMjU2DQpiMzVhYjI1YWIzNWE5MjU2YjM1 YTkyNTZiMzVhOTI1NmIzNWFiMzU2YjQ1YWIzNTZiNDVhYjM1NmI0NWE5NDU2YjQ1NmI0NTZiNDVh ZDU1ZWY1NjJmNjYyMTY2N2Y2NjIzNzY3Mzg2YjU5NmY1OTZmNzk3Mzc5NmY3YTczN2E3Mw0KN2E3 MzdhNzM5YTc3N2E3MzliNzc5YTczOWI3NzlhNzM5Yjc3OWI3N2JiNzc5YTczOWI3NzliNzdiYjc3 OWI3N2JiNzc5Yjc3YmI3N2JiNzdkYzc3YmI3N2JiNzc5YTczOWI3MzlhNzM5YjczYmI3M2RjNzdi Yjc3YmI3N2JiNzcNCmRjN2JiYjc3OWI3M2JjNzdiYzc3YmI3M2JjNzdiYzc3ZGM3N2JiNzM5Yjcz Nzk2YjlhNmY5YjczYmM3N2JiNzNiYzc3YmI3M2JjNzc1ODZiNzk2Yjc5NmY5YTczN2E2ZjlhNzM5 YTczOWE3Mzc5NmY3OTZiNTg2Nzc4NmI3OTZmDQo5OTczNTc2NzE2NjMzNzYzMzc2MzE2NWYxNjVm ZjU1YWQ0NTZiMzUyYjQ1NjkyNGU5MzUyOTI1MmIzNTI5MjUyYjM1NmQ0NTZmNjVlZDY1ZTE4NjMx ODYzMzk2NzE4NjMxODYzZjc2MjE3NjNmNjVlZDU1ZWIzNWFiMzVhNzA1Ng0KNzA1NjJlNGUwZDRl YWE0MWFiNDU4YTQxYWE0NThhNDFhYTQ1ODk0MThhNDU4OTQxOGE0NTg5NDE4OTQxNjgzZDY5M2Q2 ODM5NjgzOTQ3MzU2ODM5NDczNTY4Mzk0NzM1NjgzNTQ4MzU2ODM1NDgzMTQ4MzU0ODMxNjkzNTQ4 MzENCjQ4MzEyODMxNDgzMTI3MmQyNzJkMDYyOTA3MjllNjI0MDYyNWU1MjQwNjI1YjI1YTkyNTZi MzVhOTI1NmIyNWE5MjU2YjM1YTkyNTZiMzVhYjI1YWIzNWFiMzVhYjM1YWIzNWFkMzVhYjM1YWQz NWViMzVhZDQ1ZWIzNWFkMzVlDQpiMzVhZDQ1ZWIzNWFkMzVlYjM1YWQ0NWVkMzVhZDQ1ZWIzNWFk NDVlZDM1ZWQ0NWViMzVhZDQ1ZWIzNWFkNDVlYjM1YWQ1NWVkNDVhZDQ1YWI0NWFkNTVhYjQ1YWQ1 NWFiNDVhZDU1YWQ1NWFmNjYyZjY2MjE3NjcxNzY3Mzc2Yg0KMzg2YjU5NmY1OTZmN2E3MzdhNzM5 YTc3N2E3MzliNzc5YTczOWI3NzliNzdiYjc3OWI3N2JiNzdiYjc3YmM3YmJiNzdiYzdiYmI3N2Jj N2JiYjc3YmM3YmJiNzdiYzdiYmI3N2RjN2JiYzc3YmI3N2RjNzdmZDdmZGM3N2JjNzcNCmJjNzdk YzdiYmM3N2JiNzdkYzc3ZGM3YmJiNzdiYjc3YmI3N2RiNzdiYjczZGM3N2JiNzdiYzc3YmI3M2Jj NzdiYzc3ZGQ3YmRjNzdkZDdiYmM3N2JjNzdiYjczYmM3NzliNzM5YjczOWE2ZmJjNzc5YjczOWI3 MzlhNzM5YjczDQo5YTczYmI3MzlhNzM3ODZiYmE3M2RiNzc3OTZmNTc2YjU4NmI5OTZmNzg2YjU4 NjczNzYzMzg2MzE2NWYxNjVmZDU1NmQ1NWFiNDU2YjM1MjkzNTJiMzUyOTI1MmIzNTJiMzU2ZDU1 YWY1NWFmNzYyZjc2MjM5NjczOTY3Mzk2Nw0KMTg2MzE4NjNmNzYyZjc2MmQ1NWVkNDVlOTI1YTkx NWE0ZjUyMmU1MjBkNGVjYjQ1YWE0MWFiNDVhYTQxYWE0NThhNDFhYTQ1ODk0MThhNDU4OTQxOGE0 NTg5NDE4OTQxNjgzZDg5M2Q2ODM5NjgzOTY3MzU2ODM5NDczNTY4MzUNCjQ3MzU2ODM5NDgzNTY4 MzU0ODM1NjkzNTY5MzU2OTM1NDgzMTQ5MzU0ODMxNDgzMTQ4MzE0ODMxMjcyZDI3MmQwNjI5Mjcy OTA2Mjk0YzAwMDAwMDY0MDAwMDAwMDAwMDAwMDAwMDAwMDAwMGM3MDAwMDAwN2QwMDAwMDAwMDAw DQowMDAwMDAwMDAwMDBjODAwMDAwMDdlMDAwMDAwMjkwMGFhMDAwMDAwMDAwMDAwMDAwMDAwMDAw MDgwM2YwMDAwMDAwMDAwMDAwMDAwMDAwMDgwM2YwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw MDAwMDAwMDAwMDAwMDAwMA0KMDAwMDAwMDAwMDAwMDAwMDAwMDAyMjAwMDAwMDBjMDAwMDAwZmZm ZmZmZmY0NjAwMDAwMDFjMDAwMDAwMTAwMDAwMDA0NTRkNDYyYjAyNDAwMDAwMGMwMDAwMDAwMDAw MDAwMDBlMDAwMDAwMTQwMDAwMDAwMDAwMDAwMDEwMDANCjAwMDAxNDAwMDAwMDA0MDAwMDAwMDMw MTA4MDAwNTAwMDAwMDBiMDIwMDAwMDAwMDA1MDAwMDAwMGMwMjdlMDBjODAwMDMwMDAwMDAxZTAw MDQwMDAwMDAwNzAxMDQwMDA0MDAwMDAwMDcwMTA0MDBjOTkzMDAwMDQxMGIyMDAwDQpjYzAwN2Uw MGM4MDAwMDAwMDAwMDdlMDBjODAwMDAwMDAwMDAyODAwMDAwMGM4MDAwMDAwN2UwMDAwMDAwMTAw MTgwMDAwMDAwMDAwNTAyNzAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDZiYmQ5 YzczYmQ5Yw0KNmJiZDljNzNiZGE1NmJiNTljNzNiZDljNmJiNTljNzNiZGE1NmJiNTljNmJiNTlj NmJiNTljNzNiZGE1NmJiNTljNmJiNWE1NmJiNTljNmJiNWE1NjNhZDljNmJiNTljNjNhZDljNmJi NTljNjNhZDljNmJiNTljNjNhZDljNmINCmI1OWM2M2FkOWM2YmI1OWM2YmFkOWM2YmI1YTU2YmI1 OWM2YmI1YTU2YmI1OWM3M2JkYTU2YmI1OWM2YmI1YTU2YmFkOWM3M2I1YTU3M2FkOWM3YmI1YTU3 YmI1YTU4NGI1YWQ3YmFkYTU4NGFkYTU3YmE1YTU4NGFkYTU4NGE1DQphNTg0YWRhNTg0YWRhNTg0 YWRhNTczYTU5YzczYWRhNTczYTU5YzczYWRhNTZiYTU5YzZiYWRhNTZiYWRhNTZiYjVhNTZiYjVh NTZiYjVhNTYzYjVhNTZiYjVhNTYzYWQ5YzZiYjVhNTZiYWQ5YzZiYjVhNTZiYWQ5YzczYjU5Yw0K NmJhZDljNmJiNTljNjNhZDljNjNiNTljNjNhZDljNjNiNWE1NWFhNTljNmJhZGE1NmJhZDljNmJh ZGE1NzNhNTljNzNhNTljNTI4NDg0NGE3MzZiMzk0YTQyODQ4Yzg0ZjdlZmU3ZWZlN2Q2YmRhZGE1 YjVhNTljOWM4Yzg0NzMNCjYzNjM2MzUyNWE2YjYzNmI2MzYzNzM2MzYzNzM0YTUyNWEyOTMxMzkw ODA4MTAwMDA4MTAwODE4MzExODMxNGE0YTYzODQ3YjhjYWQ3MzhjYTVhNWFkYzZhZGI1YmRiZGJk YmQ4Yzg0ODQ4NDczNjM2MzUyNDI1YTRhMzk0MjMxDQoyOTMxMjkyMTI5MjExODI5MjkyOTIxMTgx ODIxMjEyMTIxMjEyMTIxMjEyMTIxMjEyMTI5MjEyMTIxMjEyMTI5MjkyOTIxMjEyMTI5MjEyMTIx MjEyMTI5MjkyOTIxMjEyMTI5MjEyMTIxMjEyMTI5MjkyOTI5MjEyMTI5MjkyOQ0KMjkyMTIxMjky OTI5MjkyOTI5MzEyOTI5MjEyMTIxMTgxODE4MTAxMDEwMTgxODE4MTgxODE4MjEyMTIxMTgxODE4 MjEyMTIxMjEyMTIxMjkyOTI5MjkyMTI5MzEyOTI5MjkyMTI5MzEyOTI5MjkyMTIxMjkyOTI5Mjky MTIxMjkNCjI5MjkyOTIxMjEyOTI5MjkyOTIxMjEzMTI5MjkyOTIxMjEyOTI5MjkyOTIxMjEyOTI5 MjkyOTIxMjEyOTI5MjkyOTIxMjEzMTI5MjkyOTIxMjEyOTI5MjkyOTIxMjEyOTI5MjkyMTIxMjEy OTIxMjkyOTIxMjkzMTI5MjkyOTIxDQoyOTI5MjkyOTIxMjEyMTIxMjEyMTIxMTgxODIxMjEyMTE4 MTgxODIxMjEyMTE4MTgxODIxMjEyMTE4MTgxODIxMjEyMTE4MTgxODE4MTgxODE4MTgxODE4MTgx ODEwMTAxMDEwMTAxMDA4MDgwODAwMDAwMDA4MDAwMDEwMDgwOA0KMTAxMDEwMTgxMDEwMTAxMDEw MTAxMDEwMTAwODA4MTAxMDEwNzNiZGE1NmJiZGE1NzNiZGE1NmJiZGE1NzNiZGE1NmJiNWE1NzNi ZGE1NmJiNWE1NzNiZGE1NmJiNWE1NzNiZGE1NmJiNWE1NmJiNWE1NmJiNWE1NmJiNWE1NmINCmI1 YTU2YmI1YTU2YmFkOWM2YmI1YTU2YmFkOWM2YmI1YTU2YmFkOWM2YmI1YTU2YmI1YTU2YmI1YTU2 YmFkOWM2YmI1YTU2YmI1YTU2YmI1YTU2YmI1YTU3M2JkYTU2YmI1YTU3M2JkYWQ2YmI1YTU3M2I1 YWQ2YmI1YTU3YmI1DQphZDdiYjVhZDg0YmRhZDdiYjVhZDg0YjVhZDdiYWRhNTg0YWRhZDg0YWRh NTg0YWRhZDg0YWRhZDg0YWRhZDdiYWRhNTdiYWRhZDczYWRhNTczYWRhZDZiYWRhNTZiYWRhNTZi YWRhNTZiYjVhZDZiYjVhNTZiYjVhZDYzYjVhNQ0KNmJiNWFkNjNiNWE1NmJiNWE1NjNhZGE1NmJi NWE1NmJiNWE1NzNiNWE1NmJhZDljNmJiNWE1NjNhZGE1NjNiNWE1NjNhZGE1NjNiNWE1NWFhZGE1 NjNhZGE1NjNhZDljNmJhZGE1NmJhZGE1NzNhZGFkNzNhZGE1NmI5YzljNjMNCjhjODQ0MjVhNTI2 MzZiNmJkZWRlZDZmN2VmZTdkNmNlYmRjNmJkYWRhNTk0OGM3MzYzNjM2MzVhNWE1YTVhNjM2MzYz NzM2MzYzNzM1MjVhNjMzMTMxMzkxMDE4MTgwMDAwMDgwMDE4MjkxMDI5NDI1YTZiOGM3YjhjYWQ4 Yzk0DQpiNWE1YjVjNmJkYzZjZWM2YzZjNmE1OWM5NDk0ODQ3Yjg0NzM2MzZiNTI0MjUyNDIzMTM5 MjkyMTMxMjEyMTI5MjEyMTI5MjEyMTIxMjEyMTI5MjEyMTIxMjEyMTI5MjEyMTIxMjEyMTI5Mjky OTI5MjEyMTI5MjkyOTIxMjEyMQ0KMjkyOTI5MjkyMTIxMjkyOTI5MjEyMTIxMjkyOTI5MjkyMTIx MjkyOTI5MjkyOTI5MjkyOTI5MjkyOTI5MzEzMTMxMzEyOTI5MjkyOTI5MTgxODE4MTAxMDEwMTgx MDEwMjEyMTIxMjEyMTIxMjEyMTIxMjEyMTIxMjkyMTIxMjENCjIxMjEzMTI5MjkyOTI5MjkzMTI5 MjkyOTI5MjkzMTI5MjkyOTIxMjkzMTI5MjkyOTIxMjkzMTI5MjkyOTIxMjEzMTI5MjkyOTI5Mjkz MTI5MjkyOTIxMjkzMTI5MjkyOTIxMjkzMTI5MjkyOTIxMjkzMTI5MjkyOTI5MjkzMTI5DQoyOTI5 MjEyOTMxMjkyOTI5MjEyOTI5MjEyOTI5MjEyMTMxMjkyOTMxMjkyOTMxMjkyOTI5MjEyOTI5Mjky OTIxMjEyMTIxMjEyMTIxMjEyMTIxMjEyMTIxMjEyMTIxMjEyMTE4MTgxODIxMjEyMTE4MTgxODE4 MTgxODE4MTgxOA0KMTgxODE4MTgxODE4MTgxODE4MTAxMDEwMTAxMDEwMDAwMDAwMDgwODA4MDgw ODA4MTgxMDEwMTAxMDEwMTgxMDEwMTAxMDEwMTAxMDEwMTAxMDEwNmJiNWE1NmJiZGFkNmJiNWE1 NmJiZGFkNmJiNWE1NmJiZGFkNmJiNWE1NmINCmI1YWQ2M2I1YTU2YmI1YWQ2M2FkYTU2YmI1YTU2 M2FkYTU2YmI1YWQ2M2FkYTU2YmI1YTU2M2I1YTU2YmI1YTU2M2FkOWM2M2I1YTU2M2FkOWM2YmI1 YTU2M2FkOWM2YmI1YTU2M2I1YTU2YmI1YTU2M2FkOWM2YmI1YTU2M2I1DQphNTZiYjVhNTYzYjVh NTZiYjVhZDZiYjVhZDZiYjVhZDYzYWRhZDZiYjVhZDczYjVhZDdiYjViNTdiYjViNTdiYjViNTdi YWRhZDdiYWRhZDdiYTVhZDdiYWRhZDdiYTVhZDdiYWRhZDdiYTVhZDdiYWRhZDczYTVhZDczYWRh ZA0KNmJhNWE1NmJhZGFkNjNhNWE1NjNhZGFkNjNhZGFkNjNhZGFkNjNhZGFkNjNiNWFkNWFhZGE1 NjNiNWFkNjNhZGE1NjNiNWFkNWFhZGE1NjNhZGFkNjNhZGE1NjNhZGFkNjNhZGE1NjNhZGFkNWFh ZGE1NWFhZGFkNWFhZGE1NWENCmFkYWQ1MmE1YTU1YWFkYWQ1YWE1YTU2M2E1YWQ2YmFkYWQ3M2Fk YWQ2YmE1YTU2YjljYTU1MjczNzM1YTZiNmJhZGI1YWRlZmVmZTdkZWRlZDZkNmNlYzZhNTljOTQ3 YjczNzM1YTUyNWE1MjUyNWE1MjUyNWE1YTYzNmI1MjVhDQo2MzQyNDI0YTE4MTgyMTAwMDAwODAw MDgyMTEwMjE0MjVhNmI4Yzg0OTRhZDk0OWNiNWI1YjVjNmJkYmRjNmNlYmRiZGM2YjVhNWM2YWQ5 Y2FkOTQ3Yjk0N2I2YjYzNTI0YTRhMzkzMTI5MjEyMTI5MjEyMTIxMTgyMTIxMjEyMQ0KMjExODE4 MjEyMTIxMjEyMTIxMjkyMTIxMjEyMTIxMjkyMTIxMjEyMTIxMjkyMTIxMjEyMTIxMjkyMTIxMjEy MTIxMjkyMTIxMjEyMTIxMjkyMTIxMjkyMTIxMjkyOTI5MjEyMTIxMjkyOTI5MjkyMTIxMjkyOTI5 MTgxODE4MTANCjEwMTAxMDA4MDgxODE4MTgxODE4MTgyMTIxMjEyMTIxMjEyOTIxMjEyMTE4MTgy MTIxMjEyOTIxMjEyOTI5MjkyOTIxMjEzMTI5MjkyOTIxMjkzMTI5MjkyOTIxMjEyOTI5MjkyOTIx MjEzMTI5MjkyOTIxMjEzMTI5MjkyOTIxDQoyOTMxMjkyOTI5MjEyMTI5MjkyOTI5MjEyMTMxMjky OTI5MjEyMTMxMjkyOTI5MjEyOTMxMjkyOTI5MjEyMTI5MjkyOTI5MjEyMTI5MjkyOTI5MjEyMTMx MjkyOTI5MjkyOTMxMjkyOTI5MjEyMTI5MjEyMTIxMjEyMTIxMjEyMQ0KMTgxODE4MjEyMTIxMTgx ODE4MjEyMTIxMTgxODE4MTgxODE4MTgxODE4MTgxODE4MTgxODE4MTgxODE4MTgxODE4MTgxODE4 MDgwODA4MDgwODA4MDgwODA4MTAxMDEwMTAxMDEwMTgxMDEwMTAxMDEwMTAxMDEwMTAwODA4MTAN CjEwMTA2YmJkYjU2YmI1YWQ2YmJkYjU2M2I1YWQ2YmJkYjU2M2I1YWQ2YmI1YjU2M2I1YWQ2YmI1 YjU2M2I1YWQ2M2I1YWQ2M2FkYWQ2M2I1YjU2M2FkYWQ2M2I1YWQ2M2FkYWQ2YmI1YWQ2M2I1YTU2 M2I1YWQ2M2I1YTU2M2I1DQphZDYzYjVhNTYzYjVhZDYzYjVhNTZiYjVhZDYzYjVhNTZiYjVhZDYz YjVhNTZiYjVhZDYzYjVhZDZiYjVhZDYzYjVhZDZiYmRiNTYzYjViNTZiYjViNTZiYjViNTczYjVi ZDczYjViZDdiYjViZDdiYjViNTdiYjViZDczYWRiNQ0KN2JhZGI1NzNhNWI1N2JhZGI1N2JhNWI1 N2JhZGI1NzNhNWI1NzNhZGI1NmJhZGI1NmJhZGI1NjNhNWFkNjNhZGI1NWFhZGFkNjNhZGI1NWFh ZGFkNjNiNWI1NWFhZGFkNjNiNWI1NWFhZGFkNjNiNWI1NWFhZGFkNjNhZGI1NWENCmFkYWQ2M2I1 YjU1YWFkYWQ1YWFkYjU1YWFkYWQ1YWFkYjU1YWFkYWQ1YWFkYjU1MmFkYWQ1YWFkYjU1MmFkYWQ1 YWE1YWQ1YWE1YWQ2M2FkYjU2M2E1YWQ2YmE1YjU2YmE1YWQ3YmE1YTU2Yjg0ODQ4YzljOWNkNmRl ZGVkZWU3DQpkZWQ2ZDZjZWI1YWRhZDhjODQ4NDYzNWE2MzRhNGE1MjUyNTI1YTVhNWE2MzVhNWE2 MzRhNGE1MjMxMzEzMTA4MDgxMDAwMDgyMTA4MTgzOTYzNzM4Yzg0OTRhZGE1YWRiZGFkYWRiNWJk YjViNWI1YTU5Y2Q2YmRhZGQ2YjVhNQ0KY2VhZDk0YWQ4YzdiODQ3MzYzNWE0YTQyMzkyOTMxMjEx ODIxMjkyMTIxMjEyMTIxMjEyMTIxMjEyMTIxMjkyMTIxMjEyMTIxMjkyMTIxMjEyMTIxMjkyOTI5 MjEyMTIxMjkyOTI5MjEyMTIxMjkyOTI5MjEyMTIxMjkyOTI5MjENCjIxMjEyOTI5MjkyOTI5Mjky OTI5MjkyMTIxMjEyOTIxMjEyMTE4MTgxMDEwMTAwMDAwMDAxODEwMTAxODEwMTAyMTE4MTgyMTIx MjEyOTI5MjkyMTIxMjEyMTIxMjEyMTIxMjEyOTIxMjEyOTIxMjEyOTI5MjkyOTIxMjkzMTI5DQoy OTI5MjkyOTMxMjkyOTI5MjEyMTMxMjkyOTI5MjkyOTMxMjkyOTI5MjkyOTMxMjkyOTI5MjkyOTMx MjkyOTI5MjEyOTMxMjkyOTI5MjkyOTMxMjkyOTI5MjkyOTMxMjkyOTI5MjkyOTMxMjkyOTI5MjEy MTMxMjkyOTI5MjEyOQ0KMzEyOTI5MjkyOTI5MzEyOTI5MjkyOTI5MzEyOTI5MjkyMTIxMjkyOTI5 MjEyMTIxMjEyMTIxMjEyMTIxMjEyMTIxMjEyMTIxMjEyMTIxMTgxODE4MjEyMTIxMTgxODE4MTgx ODE4MTgxODE4MjEyMTIxMTgxODE4MTAxMDEwMDgNCjA4MDgxMDEwMTAxMDEwMTAxODE4MTgxODEw MTAxODE4MTgxMDEwMTAxODEwMTAxMDEwMTA2M2I1YWQ2YmI1YjU2M2I1YjU2YmI1YjU2M2I1YWQ2 YmI1YjU2M2FkYjU2YmI1YjU2M2FkYWQ2M2I1YjU2M2FkYWQ2M2FkYjU1YWFkDQphZDYzYWRiNTYz YWRiNTYzYWRiNTYzYWRhZDYzYjViNTYzYWRhZDYzYjViNTYzYWRhZDYzYjVhZDYzYWRhZDYzYjVi NTYzYWRhZDYzYjViNTYzYWRiNTYzYjViNTYzYWRhZDYzYjViNTYzYWRiNTYzYjViNTVhYWRiNTYz YjViZA0KNjNhZGI1NmJiNWJkNmJhZGJkNzNiNWJkNzNhZGJkNzNiNWJkNzNhZGJkNzNhZGJkNzNh NWI1NzNhNWI1NzNhNWI1NzNhZGJkNzNhNWI1NzNhNWI1NmJhNWI1NmJhZGJkNjNhNWI1NjNhNWI1 NWFhNWI1NWFhZGI1NWFhNWI1NWENCmFkYmQ1MmE1YjU1YWFkYjU1YWFkYjU1YWI1YjU1YWFkYjU1 YWFkYjU1YWFkYWQ1YWFkYjU1YWE1YjU1YWFkYjU1MmE1YjU1YWFkYjU1MmE1YjU1MmFkYjU1MmE1 YjU1MmFkYjU1MmE1YjU1MmE1YjU1MmE1YWQ1YWE1YjU1YWE1DQphZDYzYTViNTYzOWNhZDZiYTVi NTczYTVhZDg0YTVhZDczOTQ5NGM2ZDZkNmNlZGVkNmNlZDZjZWJkYmRiNTk0OTQ5NDYzNjM2YjUy NTI1YTRhNTI1YTVhNWE2MzUyNTI1MjUyNTI1MjQyMzkzOTE4MTgyMTAwMDAxODA4MTgzOQ0KNjM3 MzhjOGM5Y2I1YTVhZGJkYjViNWJkYjVhZGE1YWQ5YzhjYmRhNThjYzZhNThjYmRhNTg0YjU5Yzg0 OTQ4NDczNzM2MzYzNDIzOTQyMjEyMTI5MjExODIxMjEyMTIxMjEyMTIxMjEyMTIxMjExODE4MjEy MTIxMjEyMTIxMjENCjIxMjEyMTIxMjEyOTIxMjEyMTIxMjEyOTIxMjEyMTIxMjEyOTIxMjEyMTIx MjEyOTIxMjEyMTIxMjEyOTI5MjkyMTIxMjEyOTIxMjEyMTIxMjEyMTIxMjExMDEwMTAwODA4MDgw ODA4MDgxMDEwMTAxMDEwMTAxODEwMTAxODEwDQoxMDE4MTgxODE4MTgxODIxMTgxODIxMTgxODIx MjEyMTI5MjEyMTI5MjkyOTI5MjEyMTMxMjkyOTI5MjEyMTI5MjkyOTI5MjEyMTMxMjkyOTI5MjEy OTMxMjkyOTI5MjEyOTMxMjkyOTI5MjEyOTMxMjkyOTI5MjEyMTI5MjkyOQ0KMjkyMTIxMzEyOTI5 MjkyMTIxMjkyOTI5MjkyMTIxMjkyOTI5MjkyMTIxMjkyOTI5MjkyMTIxMjkyOTI5MjkyMTIxMjky OTI5MjkyMTIxMzEyOTI5MjEyMTIxMjkyMTIxMjEyMTIxMjEyMTIxMjExODE4MjEyMTIxMjExODE4 MjENCjIxMjExODE4MTgyMTE4MTgxODE4MTgyMTE4MTgxODE4MTgxODE4MTgxMDEwMTAxMDEwMTAw ODA4MDgxMDEwMTAxMDEwMTAxODE4MTgxODEwMTAxODEwMTAxMDEwMTAxODEwMTg2YmI1YmQ2M2I1 YjU2YmI1YmQ2M2I1YmQ2YmI1DQpiZDYzYWRiNTZiYjViZDYzYWRiNTYzYjViZDYzYWRiNTYzYjVi ZDVhYWRiNTYzYWRiNTVhYWRiNTYzYWRiZDYzYWRiZDYzYjViZDYzYWRiZDYzYjViZDYzYWRiNTYz YWRiZDYzYWRiNTYzYjViZDYzYWRiZDYzYjViZDYzYWRiZA0KNjNiNWJkNjNhZGJkNjNiNWJkNjNh ZGJkNmJiNWJkNjNhZGJkNjNiNWJkNWFhZGJkNjNiNWM2NjNhZGJkNmJiNWM2NmJhZGM2NzNiNWM2 NzNhZGJkNzNhZGM2NzNhNWJkNzNhZGJkNzNhNWJkNzNhNWJkNzNhNWJkNzNhNWJkNmINCmE1YmQ2 YmFkYmQ2M2E1YmQ2M2FkYmQ1YWE1YmQ2M2FkYmQ1YWE1YjU1YWFkYmQ1YWFkYmQ1YWFkYmQ1YWFk YmQ2M2FkYmQ1YWFkYmQ1YWFkYmQ1YWFkYjU2M2FkYmQ1YWE1YjU1YWFkYmQ1YWE1YjU1YWFkYmQ1 MmE1YmQ1MmFkDQpiZDUyYTViNTVhYWRiZDUyYTViNTUyYTViNTUyYTViNTVhYWRiZDVhYWRiZDYz YWRiZDVhYTViNTYzYTViZDYzYTViNTZiOWNhZDhjYjViZDczOWM5Y2JkZDZkNmNlZGVkZWNlZDZj ZWNlY2VjNjk0OTQ5NDczNzM3MzVhNWE1YQ0KNWE1YTYzNTI1YTYzNTI1MjUyNGE0YTUyNGE0YTRh MjEyOTI5MDAwODIxMDgyMTQyNzM4NGE1OWNhNWJkYzZjNmQ2YzZjNmM2Y2ViZGJkYjU5YzhjYWQ5 NDdiYWQ5NDczYmQ5Yzg0YmQ5Yzg0YjU5YzhjOGM3YjdiNWE1MjVhMzENCjI5MzEyMTIxMjEyMTIx MjEyOTIxMjEyMTIxMjEyMTIxMjEyMTIxMjEyOTIxMjEyMTIxMjEyOTIxMjEyMTIxMjEyOTI5Mjky MTIxMjEyOTIxMjEyMTIxMjEyOTI5MjkyMTIxMjEyOTI5MjkyOTIxMjEyOTI5MjkyOTI5MjkzMTI5 DQoyOTI5MjkyOTIxMjEyMTEwMTAxMDEwMDgwODA4MDgwODA4MDgwODA4MDgwODEwMDgwODEwMTAx MDE4MTgxODE4MTgxODIxMTgyMTIxMTgxODI5MjEyMTI5MjEyMTMxMjkyOTI5MjkyOTMxMjkyOTI5 MjkyOTMxMjkyOTI5MjkyOQ0KMzEyOTI5MzEyOTI5MzEyOTI5MjkyOTI5MzEyOTI5MjkyOTI5MzEy OTI5MjkyMTI5MzEyOTI5MjkyOTI5MzEyOTI5MjkyMTI5MzEyOTI5MjkyMTI5MzEyOTI5MjkyMTI5 MzEyOTI5MjkyMTIxMjkyOTI5MjkyMTI5MzEyOTI5MzENCjI5MjkyOTI5MjkyOTIxMjEyOTI5Mjky MTIxMjEyOTIxMjEyMTIxMjEyMTIxMjEyMTIxMjEyMTIxMjEyMTE4MTgyMTIxMjExODE4MTgyMTIx MjExODE4MTgxODE4MTgxMDEwMTAxMDEwMTAxMDEwMTAxODE4MTgxODE4MTgxODE4DQoxODE4MTAx MDE4MTgxODE4MTAxMDYzYWRiZDYzYjViZDVhYWRiNTYzYWRiZDYzYWRiZDYzYWRiZDVhYWRiNTYz YWRiZDVhYWRiNTYzYWRiZDVhYTViNTVhYWRiZDVhYTViNTYzYWRiZDVhYTViNTVhYWRiZDVhYTVi ZDYzYWRjNg0KNWFhNWJkNjNhZGM2NWFhZGJkNjNhZGM2NWFhZGJkNjNhZGM2NWFhNWJkNjNhZGM2 NWFhNWJkNjNhZGM2NjNhZGJkNjNhZGM2NjNhZGJkNjNhZGM2NWFhZGJkNjNhZGM2NWFhZGJkNjNh ZGJkNjNhNWJkNmJhZGJkNmJhNWJkNzMNCmFkYzY3M2E1YmQ3M2FkYzY3M2E1YmQ3M2FkYzY3M2E1 YmQ3M2E1YmQ2YmE1YmQ2YmE1YmQ2YmE1YmQ2M2E1YzY2M2E1YmQ2M2E1YmQ1YWE1YmQ2M2FkYzY1 YWE1YmQ2M2FkYmQ1YWE1YmQ1YWFkYmQ1YWE1YmQ1YWFkYmQ1YWE1DQpiNTYzYWRiZDVhYTViNTVh YWRiZDVhYTViNTVhYTViZDUyYTViZDVhYTViZDUyYTViZDUyYTViZDUyYTViNTVhYTViZDUyYTVi ZDVhYTViZDVhYTViNTYzYTViZDVhYTViZDYzYTViZDYzYTViZDZiYTViZDczYTViNTg0YWRiZA0K N2JhNWE1OTRiNWI1YzZkZWQ2ZDZlN2RlYjViNWI1YTVhNWE1NmI2YjZiNTI1MjVhNGE0YTUyNWE2 MzZiNTI1MjVhNGE0YTRhNDI0MjQyMzkzOTQyMDAxMDI5MjkzOTVhNmI3YjljYTViNWNlYjViZGNl YzZiZGM2YzZiZGI1YzYNCmI1YWRiZDljOGNiNTk0ODRiNTk0N2JiNTk0ODRhNThjN2JhNThjOGM3 YjZiNzM0MjM5NDIxODE4MTgyOTIxMjEwODA4MDgyMTE4MTgyMTE4MTgxODE4MTgyOTI5MjkyMTIx MjEyMTIxMjEyOTIxMjEyMTIxMjEyMTIxMjEyMTIxDQoyMTI5MjEyMTIxMjEyMTI5MjEyMTIxMjEy MTI5MjEyMTIxMjEyMTI5MjEyMTIxMjEyMTI5MjEyMTIxMjEyMTI5MjEyMTIxMjEyMTIxMTgxODEw MDgwODA4MDAwMDAwMDAwMDAwMDAwMDA4MDAwMDEwMDgwODEwMDgwODE4MTAxOA0KMjExODE4MzEy OTI5MjkyOTI5MjkyOTI5MjkyMTIxMzEyOTI5MjkyOTI5MzEyOTI5MjkyMTI5MzEyOTI5MjkyMTI5 MzEyOTI5MjkyMTIxMjkyOTI5MjkyMTIxMzEyOTI5MjkyMTIxMjkyOTI5MjkyMTIxMzEyOTI5Mjky MTIxMjkNCjI5MjkyOTI5MjkzMTI5MjkyOTIxMjEyOTI5MjkyOTIxMjEyOTI5MjkyOTIxMjEyOTIx MjkyOTIxMjEyOTI5MjkyOTIxMjEyOTIxMjEyMTIxMjEyOTIxMjEyMTE4MjEyMTIxMjEyMTE4MjEy MTIxMjEyMTE4MTgyMTE4MTgxODE4DQoxODIxMTgxODE4MTAxMDE4MTgxODA4MDgwODE4MTAxMDE4 MTgxODE4MTgxODEwMTAxMDEwMTAxMDEwMTAxMDIxMTgxODYzYWRjNjYzYWRiZDYzYWRiZDYzYWRi ZDYzYWRiZDYzYWRiZDYzYWRiZDVhYWRiZDYzYWRiZDVhYTViZA0KNjNhZGJkNWFhNWJkNjNhZGM2 NWFhNWJkNjNhNWJkNWFhNWJkNjNhNWM2NWFhNWJkNjNhNWM2NWFhNWJkNjNhNWM2NWFhNWM2NjNh NWM2NWFhNWJkNjNhNWM2NWFhNWJkNjNhNWM2NWFhNWJkNjNhNWM2NWFhNWM2NjNhNWM2NWENCmE1 YzY2M2FkYzY1YWFkYmQ2M2FkYzY1YWE1YmQ2M2FkYzY2YmE1YmQ3M2FkYzY3M2FkYzY3YmFkY2U3 M2FkYzY3YmFkYzY3YmFkYzY3YmFkYzY3YmFkYzY3YmFkYzY3M2E1YmQ2YmE1YzY2M2E1YmQ2M2E1 YmQ2M2E1YmQ2M2E1DQpiZDYzYTViZDYzYWRiZDVhYTViZDYzYWRjNjYzYWRiZDYzYWRiZDYzYTVi ZDYzYWRiZDYzYWRiZDZiYWRiZDYzYTViZDYzYWRjNjVhYTViZDYzYWRjNjVhYTViZDYzYWRjNjVh YTViZDYzYWRiZDVhYTViZDYzYWRjNjYzYTViZA0KNmJhZGJkNjNhNWJkNmJhZGM2NmJhNWJkNzNh ZGM2NmJhNWJkNzNhZGJkN2JhZGI1ODRhZGI1OTRiNWI1YzZkNmQ2ZDZkZWRlYzZjNmM2YTVhNWE1 N2I3MzdiNTI1MjVhNTI1MjVhNTI1MjVhNTI1MjVhNGE0YTUyNGE0YTRhMzkNCjQyNGExMDIxMzk0 MjVhN2I4YzljYmQ5Y2FkY2U5Y2E1YmQ5NDljYTVhNTljYTViNWE1OWNiZGE1OTRhNThjN2JiNTk0 ODRiNTljOGNiNTljOGM5YzhjOGM4NDdiN2I1MjUyNTIzMTMxMzEyOTIxMjEyOTI5MjkyOTI5Mjky OTI5DQoyOTIxMTgxODE4MTgxODIxMjEyMTI5MjEyMTIxMjEyMTI5MjEyMTIxMjEyMTI5MjkyOTIx MjEyMTI5MjkyOTIxMjEyMTI5MjkyOTIxMjEyMTI5MjEyMTIxMjEyMTI5MjkyOTIxMjEyMTI5MjEy MTIxMjEyMTI5MjkyOTIxMjEyMQ0KMjEyMTIxMTgxMDEwMTAxMDEwMDgwODA4MTAwODA4MDgwODA4 MTAwODA4MTAwODA4MTgxODE4MjEyMTIxMzEyOTI5MjkyMTI5MzEyOTI5MjkyOTI5MzEyOTMxMzEy OTI5MzEyOTI5MjkyOTI5MzEyOTI5MjkyOTI5MzEyOTI5MjkNCjIxMjkzMTI5MjkyOTI5MjkzMTI5 MjkyOTIxMjkzMTI5MjkyOTI5MjkzMTI5MjkyOTIxMjkzMTI5MjkyOTI5MjkzMTI5MjkyOTIxMjkz MTI5MjkyOTIxMjkzMTI5MjkyOTIxMjEzMTI5MjkyOTI5MjkyOTI5MjkyOTIxMjEyOTI5DQoyOTI5 MjEyMTI5MjEyMTIxMjEyMTI5MjkyOTI5MjEyMTI5MjEyMTIxMTgxODIxMjEyMTIxMTgxODIxMTgx ODE4MTgxODE4MTgxODE4MTgxODE4MTgxODE4MTgxODE4MTgxODE4MTAxMDE4MTAxODEwMTAxMDYz YTViZDYzYWRiZA0KNjNhNWJkNjNhZGJkNWFhNWI1NjNhNWJkNWFhNWJkNjNhZGJkNWFhNWI1NWFh NWJkNWFhNWJkNWFhNWJkNWE5Y2JkNWFhNWJkNWE5Y2JkNWFhNWJkNTI5NGJkNWE5Y2JkNWE5Y2Jk NWE5Y2M2NWE5Y2JkNWE5Y2M2NWE5Y2JkNWENCjljYzY1YTljYmQ1YTljYmQ1YTljYmQ1YTljYzY1 YTljYmQ1YTljYzY1YTljYmQ1YWE1YzY1YTljYmQ1YWE1YmQ1YWE1YmQ2M2E1YmQ1YTljYjU2YmE1 YmQ2YmE1YzY3YmFkY2U3YmFkYzY3YmFkYzY3YmFkYzY4NGI1YzY3YmFkDQpjNjdiYWRjNjdiYWRj NjdiYWRjNjZiYTViZDZiYTViZDYzOWNiZDYzYTViZDYzOWNiNTYzYTViZDYzYTViZDYzYWRiZDYz YTViZDYzYWRiZDYzYTViZDZiYWRiZDYzYTViZDZiYWRiZDZiYTViZDZiYWRiZDYzYTViZDYzYTVi ZA0KNjNhNWJkNjNhZGJkNjNhNWJkNmJhZGJkNjNhNWJkNmJhZGJkNmJhNWJkNzNhZGJkNmJhNWJk NzNhZGM2NzNhZGJkN2JhZGM2NzNhZGJkN2JiNWM2NzNhNWJkN2JhZGJkODRhZGI1OTRiNWJkYjVj NmM2ZDZkZWQ2YzZjZWM2YWQNCmFkYWQ3YjdiODQ2MzYzNmI0YTRhNWE0YTUyNWE0YTRhNTI0YTUy NWE0YTRhNTIzOTQyNTIwODE4Mzk1YTczOTQ4Y2E1Y2U5Y2FkY2U5NGE1YmQ5NDljYWQ4YzhjOWNh NWE1YTU4YzdiNzM5NDg0NzNhNThjN2JiZGE1OTRiNTljDQo5NGFkOWM5NDk0OGM4YzdiNzM3MzM5 MzEzMTE4MTgxODI5MjkyOTI5MjkyOTIxMjEyMTIxMjEyMTA4MDgwODI5MjkyOTIxMjEyMTIxMjEy MTIxMjEyMTIxMjEyMTIxMjEyMTIxMjEyMTIxMjEyMTI5MjEyMTIxMjEyMTIxMjEyMQ0KMjEyMTIx MjkyMTIxMjEyMTIxMjEyMTIxMjEyMTIxMjkyMTIxMjEyMTIxMjkyOTI5MjkyMTIxMjkyOTI5MjEy MTIxMTgxODE4MTAxMDEwMTAxMDEwMDAwMDAwMDgwMDAwMDgwMDAwMTgxODE4MjExODIxMjkyOTI5 MjkyMTI5MzENCjI5MjkyOTIxMjkzMTI5MjkyOTI5MjkzMTI5MjkyOTIxMjEzMTI5MjkyOTIxMjEz MTI5MjkyOTIxMjEyOTI5MjkyOTIxMjEzMTI5MjkyOTIxMjEyOTI5MjkyOTIxMjEzMTI5MjkyOTIx MjkzMTI5MjkyOTIxMjkzMTI5MjkyOTIxDQoyMTI5MjkyOTI5MjEyMTMxMjkyOTI5MjEyOTI5Mjky OTI5MjEyOTI5MjkyOTI5MjEyMTI5MjEyOTI5MjEyMTI5MjkyOTIxMjEyMTI5MjEyMTIxMjEyMTI5 MjEyMTIxMTgxODIxMTgxODE4MTgxODIxMTgxODE4MTgxODE4MTgxOA0KMTgxMDEwMjExODE4MTgx ODE4MTgxODE4MTgxMDEwMTAxMDE4NjNhZGJkNjNhNWI1NjNhZGJkNjNhNWJkNjNhNWJkNWFhNWI1 NjNhNWJkNWFhNWJkNjNhNWJkNWFhNWI1NjNhNWJkNWFhNWJkNjNhNWJkNWE5Y2JkNjNhNWJkNWEN CjljYmQ1YTljYmQ1YTljYmQ2MzljYzY1YTljYmQ2MzljYzY1YTljYmQ2MzljYzY1YTljYmQ1YTlj YzY1YTljYmQ2MzljYzY1YTljYmQ2MzljYzY1YTljYmQ2MzljYzY1YTljYmQ1YWE1YmQ1YTljYjU2 M2E1YmQ1YTljYjU2M2E1DQpiZDZiYTViZDdiYWRjNjdiYWRjNjg0YjVjZTg0YjVjNjhjYjVjZTg0 YjVjNjhjYjVjZTg0YWRjNjhjYjVjZTg0YWRjNjdiYWRjNjczYTViZDczYWRjNjZiYTViZDZiYTVi ZDZiYTViZDczYWRjNjZiYTViZDczYWRjNjZiYTViZA0KNzNhZGM2NzNhZGJkNzNhZGJkNzNhNWJk N2JhZGM2NzNhZGJkNmJhNWJkNmJhNWJkNzNhZGJkNzNhNWJkNzNhZGM2NzNhZGJkN2JhZGM2N2Jh ZGJkN2JhZGM2N2JhZGJkODRiNWM2N2JiNWM2ODRiNWM2ODRiNWM2OGNiNWM2ODQNCmI1YzY4NGJk Y2U4NGI1YzY5NGJkYzY5Y2I1YmRhZGJkYmRjZWQ2Y2VkNmQ2Y2VhZGFkYTU5NDhjOTQ2YjZiNzM1 YTVhNjM0YTRhNWE0YTUyNWE1MjUyNjM1MjUyNjMzMTQyNGEyOTQyNWE2Yjg0YWQ4Y2FkY2U4NDlj YzY5NGE1DQpjZTg0OTRhZDczN2I4YzZiNzM3YmFkYTVhZGE1OTQ5NDljOGM4NDk0N2I3M2E1OGM4 NGFkOWM5NDk0OGM4NDZiNjM2MzYzNWE1YTI5MjEyMTE4MTgxODE4MTgxODI5MjEyMTIxMjEyMTE4 MTgxODI5MjEyMTIxMjEyMTIxMjEyMQ0KMjkyMTIxMjEyMTIxMjkyMTIxMjEyMTIxMjkyOTI5MjEy MTIxMjkyMTIxMjEyMTIxMjkyOTI5MjEyMTIxMjkyMTIxMjEyMTIxMjkyOTI5MjEyMTIxMjEyMTIx MjEyMTIxMjkyOTI5MjkyOTI5MzEyOTI5MjkyMTIxMjkyMTIxMjENCjE4MTgxMDA4MTAwODAwMDAw ODA4MDgxMDEwMTAyOTIxMjEyOTIxMjEzMTI5MjkzMTI5MjkzMTI5MjkyOTI5MjkzMTI5MjkyOTI5 MjkzMTI5MjkyOTI5MjkzMTI5MjkyOTI5MjkzMTI5MjkyOTI5MjkzMTI5MjkyOTI5MjkzMTI5DQoy OTI5MjkyOTMxMjkyOTI5MjkyOTMxMjkyOTI5MjkyOTMxMjkyOTMxMjkyOTMxMjkyOTI5MjkyOTMx MjkyOTI5MjkyOTMxMjkyOTI5MjkyOTMxMjkzMTI5MjkyOTMxMjkyOTI5MjkyOTMxMjkyOTI5Mjky OTI5MjkyOTI5MjEyMQ0KMjkyOTI5MjEyMTIxMjkyMTIxMjExODE4MjEyMTIxMjExODE4MjExODE4 MTgxODE4MjExODE4MjExODE4MjEyMTIxMjExODE4MjEyMTIxMTgxODIxNWE5Y2I1NjNhNWI1NWE5 Y2I1NjNhNWI1NWE5Y2I1NjNhNWJkNWE5Y2I1NWENCjljYjU1YTljYjU1YTljYmQ1YTljYjU1YTlj YjU1YTljYjU1YTljYmQ1YTljYjU1YTljYmQ1YTk0YjU1YTljYmQ1YTk0YmQ1YTljYmQ1YTljYmQ2 MzljYmQ1YTljYmQ2MzljYmQ1YTljYmQ2MzljYmQ1YTk0YmQ1YTljYmQ1YTljDQpiZDVhOWNiZDVh OTRiZDVhOWNiZDVhOWNiNTVhOWNiNTVhOWNiNTYzOWNiNTYzOWNiNTczYTViZDczYTViZDg0YjVj Njg0YjVjNjhjYjVjNjhjYjVjNjhjYjVjNjhjYjVjNjhjYjVjNjg0YWRjNjg0YjVjNjg0YWRjNjg0 YWRjNg0KNzNhNWJkNzNhNWJkNzNhNWI1NzNhNWJkNzNhNWJkNzNhZGJkNzNhNWJkN2JhZGJkNzNh NWJkN2JhZGJkN2JhZGJkODRhZGJkN2JhNWJkODRhZGJkNzNhNWI1N2JhZGJkNzNhNWI1N2JhZGJk N2JhZGJkODRhZGM2ODRhZGJkODQNCmFkYmQ4NGFkYmQ4Y2I1YzY4NGFkYmQ4Y2I1YzY4Y2I1YzY5 NGJkYzY4Y2I1YzY5NGJkYzY4Y2JkY2U4Y2JkY2U5Y2JkYzZhNWJkYmRhNWI1YjVjZWNlY2VjZWNl Y2ViZGI1YjU5NDhjOTQ3MzczN2I1MjUyNjM0YTUyNjM0MjRhDQo1YTUyNTI2MzQyNGE1YTI5Mzk0 YTQyNWE3YjdiOWNiZDg0YTVjZTdiOWNjNjhjYWRkNjhjYTVjZTZiODRhNTczN2I5NDZiNmI3Mzhj OGM4YzljOTQ4Y2E1OTQ4YzljOGM3YjhjN2I3Mzg0NzM2YjhjN2I3YjljOWM5NDYzNjM2Mw0KMTgx MDEwMTgxMDEwMjExODE4MjExODE4MjEyMTIxMTgxODE4MjExODE4MjEyMTIxMjExODE4MjEyMTIx MjEyMTIxMjEyMTIxMjEyMTIxMjEyMTIxMjEyMTIxMjEyMTIxMjEyMTIxMjEyMTIxMjEyMTIxMjEy MTIxMjEyMTIxMjENCjIxMjEyMTE4MTgyMTIxMjEyMTIxMjEyOTIxMjEyMTIxMjEyOTI5MjkyOTIx MjEyOTI5MjkyMTE4MTgxODEwMTAwODAwMDgxMDEwMTAyMTE4MTgyOTIxMjEyOTIxMjEyOTI5Mjky OTIxMjkzMTI5MjkyOTIxMjEzMTI5MjkyOTIxDQoyOTMxMjkyOTI5MjEyMTMxMjkyOTI5MjEyOTMx MjkyOTI5MjEyMTMxMjkyOTI5MjEyOTMxMjkyOTI5MjEyMTMxMjkyOTI5MjkyOTMxMjkyOTI5Mjky OTMxMjkyOTI5MjkyOTMxMjkyOTI5MjkyOTMxMjkyOTMxMjkyOTMxMjkyOQ0KMjkyOTI5MzEyOTI5 MjkyOTI5MzEyOTI5MjkyOTI5MzEyOTI5MjkyOTI5MzEyOTI5MjkyMTIxMjkyOTI5MjkyMTIxMjky MTIxMjExODIxMjkyMTIxMjExODE4MjkyMTIxMjEyMTIxMjEyMTIxMTgxODE4MjEyMTIxMjEyMTI5 MjkNCjI5MzE2M2E1YjU2MzljYjU2MzljYjU1YTljYjU2MzljYjU1YTljYjU2MzljYjU1YTljYjU2 MzljYmQ1YTljYjU2MzljYjU1YTljYjU2MzljYmQ1YTk0YjU2MzljYjU1YTk0YjU2MzljYmQ1YTk0 YjU2MzljYmQ1YTk0YjU2MzljDQpiZDVhOWNiNTYzOWNiZDVhOTRiNTYzOWNiZDVhOTRiNTYzOWNi ZDVhOTRiNTYzOWNiZDVhOTRiNTYzOWNiZDVhOTRiNTYzOWNiNTVhOWNhZDYzOWNiNTYzOWNhZDZi YTViNTczYTViZDg0YWRjNjg0YjVjNjhjYjVjZThjYjVjNg0KOTRiNWNlOGNiNWM2OTRiZGNlOTRi NWM2OTRiNWM2OGNiNWM2OGNiNWM2ODRhZGM2ODRhZGM2N2JhNWI1N2JhNWJkNzNhNWI1N2JhZGJk N2JhNWJkODRhZGM2ODRhZGJkODRhZGM2ODRhZGJkOGNiNWM2OGNhZGJkOGNiNWM2OGMNCmFkYmQ4 NGI1YmQ4NGFkYmQ4NGI1YmQ4NGFkYmQ4Y2I1YzY4Y2I1YmQ5NGI1YzY5NGI1YmQ5Y2JkYzY5NGI1 YzY5Y2JkYzY5Y2I1YzY5Y2JkYzY5Y2JkYzY5Y2JkYzY5NGJkYzY5NGJkY2U5NGJkY2VhNWM2Y2Vh NWJkYmRiNWJkDQpiZGM2Y2VjNmQ2ZDZkNmNlYzZjNmE1OWNhNTczNzM3YjVhNWE2YjRhNGE2MzRh NTI2MzQyNGE2MzQyNTI1YTI5Mzk1MjVhNzM5NDczOWNjNjg0YWRkNjdiOWNjZTg0YWRkNjg0YWRk NjhjYTVjZTk0YWRjNjYzNmI4NDYzNmI3Mw0KN2I3MzczOTQ4Yzg0YWQ5Yzk0OWM4Yzg0YWQ5Yzhj YzZiZGI1YzZiZGJkOTQ5NDk0MzkzOTM5MTgxODE4MjExODE4MTgxODE4MzEzMTMxMTAxMDEwMjEy MTIxMjEyMTIxMjEyMTIxMjEyMTIxMjEyMTIxMjEyMTIxMjEyMTIxMjENCjIxMjEyOTIxMjEyMTIx MjEyOTIxMjEyMTIxMjEyOTIxMjEyMTIxMjEyOTIxMjEyMTIxMjEyOTI5MjkyMTIxMjEyMTIxMjEy MTE4MTgyMTIxMjEyMTIxMjEyOTI5MjkyOTI5MjkzMTI5MzEyMTE4MTgxODEwMTAxMDA4MTAyMTE4 DQoxODIxMTgxODI5MjEyMTI5MjEyMTMxMjkyOTI5MjkyOTMxMjkyOTI5MjkyOTMxMjkyOTMxMjky OTMxMjkyOTI5MjkyOTMxMjkyOTMxMjkyOTMxMjkyOTI5MjkyOTMxMjkyOTMxMjkyOTMxMjkyOTI5 MjkyOTMxMjkzMTMxMjkyOQ0KMzEyOTI5MzEyOTI5MzEzMTMxMzEyOTI5MzEyOTMxMzEyOTI5MzEz MTMxMzEyOTI5MzEyOTMxMzEyOTI5MzEzMTMxMzEyOTI5MzEyOTMxMzEyOTI5MzkzMTMxMzEyOTI5 MzEzMTMxMzEyOTI5MzEzMTMxMzEyOTI5MzEyOTI5MjkNCjI5MjkzMTI5MjkzMTI5MjkzMTI5Mjky OTIxMjEyOTI5MjkyOTI5MjkzMTMxMzkzOTM5NDI1YTljYWQ2MzljYjU1YTljYWQ2MzljYjU1YTk0 YWQ1YTljYWQ1YTk0YWQ2MzljYjU1YTk0YWQ2MzljYjU1YTk0YWQ2MzljYjU1YTk0DQpiNTVhOTRi NTVhOTRiNTVhOTRiNTVhOTRhZDVhOWNiNTVhOTRhZDYzOWNiNTVhOTRhZDYzOWNiNTVhOTRhZDYz OWNiNTVhOTRhZDYzOWNiNTVhOTRhZDYzOWNiNTVhOTRhZDVhOTRiNTVhOTRhZDVhOTRiNTVhOTRh ZDYzOWNhZA0KNWE5NGFkNjM5Y2I1NmI5Y2FkN2JhNWJkODRhZGJkOTRiNWNlOGNiNWM2OTRiNWM2 OTRiNWM2OTRiZGM2OTRiNWM2OTRiZGM2OTRiNWM2OTRiNWM2OGNhZGM2OGNhZGM2ODRhNWJkODRh NWJkN2I5Y2I1N2JhNWI1N2JhNWI1ODQNCmFkYmQ4NGFkYmQ4Y2FkYmQ4Y2FkYmQ4Y2I1YzY4Y2Fk YmQ5NGI1YzY5NGFkYmQ5NGI1YzY4Y2I1YmQ5NGI1YzY4Y2I1YmQ5NGI1YzY5NGI1YzY5Y2JkYzY5 Y2I1YzY5Y2JkYzY5Y2JkYzZhNWJkYzZhNWJkYzZhNWJkYzZhNWJkDQpiZGE1YzZjNmE1YmRjNmE1 YzZjZTk0YmRjZTljYzZkNmE1YmRjNmFkYzZjNmJkYzZiZGM2YzZjNmNlY2VjNmU3ZGVkZWI1YWRi NTg0ODQ4YzUyNWE2MzRhNTI2MzM5NGE1YTQyNGE1YTQyNGE2MzQyNTI2YjczOGNhZDdiOWNjZQ0K N2JhNWNlNmI5Y2NlNWE4NGJkNWE4NGI1NWE4NGFkNjM4NGE1YjVjNmRlOGM5NGE1NWE1YTVhNmI2 MzYzYWQ5Yzk0ZDZjNmI1YzZiNWFkYzZiNWFkYjVhZGFkYWRhNWE1NzM3MzczMzEzMTMxMTAxMDEw MTgxODE4MjkyMTIxMjENCjE4MTgxODE4MTgyMTIxMjEyMTE4MTgyMTIxMjExODE4MTgyMTIxMjEy MTE4MTgyMTIxMjEyMTE4MTgyMTIxMjEyMTIxMjEyMTIxMjEyMTE4MTgyMTIxMjEyMTIxMjEyMTIx MjEyMTIxMjEyMTIxMjEyMTE4MTgyMTIxMjExODE4DQoxODIxMjEyMTIxMjEyMTI5MjEyMTMxMjky OTIxMjEyMTEwMDgxMDEwMTAxMDEwMTAxMDIxMTgxODIxMTgyMTMxMjkyOTI5MjEyMTI5MjkyOTI5 MjEyMTMxMjkyOTI5MjEyMTMxMjkyOTI5MjkyOTMxMjkyOTI5MjEyOTMxMjkyOQ0KMjkyOTI5MzEy OTI5MjkyMTI5MzEyOTI5MjkyOTI5MzEyOTI5MjkyOTI5MzEyOTI5MzEyOTI5MzEyOTI5MzEyOTI5 MzEyOTI5MzEyOTI5MzEzMTMxMjkyOTI5MzEyOTI5MjkyOTI5MzEyOTI5MjkyOTI5MzEyOTI5MzEy OTI5MzENCjI5MjkzMTI5MjkzMTI5MjkzMTI5MjkzMTI5MzEzMTI5MjkzMTI5MzEzMTI5MjkzMTMx MzEzMTI5MjkzMTI5MjkyOTI5MjkzMTI5MjkyOTI5MjkzOTM5Mzk0MjRhNGE1MjUyNWE2YjljYjU2 MzljYWQ2YjljYjU2MzljYWQ2YjljDQphZDYzOTRhZDZiOWNiNTYzOTRhZDZiOWNiNTYzOTRhZDZi OWNiNTYzOTRhZDYzOWNiNTYzOTRhZDYzOWNiNTYzOTRhZDZiOWNiNTYzOTRhZDZiOWNiNTYzOWNh ZDZiOWNiNTYzOWNhZDZiOWNiNTYzOWNhZDZiOWNiNTYzOWNhZA0KNmI5Y2I1NjM5NGFkNmI5Y2I1 NjM5NGFkNmI5Y2I1NjM5NGFkNjM5Y2FkNjM5NGFkNmI5Y2FkNmI5Y2FkNzNhNWI1N2JhNWI1OGNi NWM2OTRiNWM2OWNiZGM2OWNiNWM2YTViZGM2OWNiZGM2YTViZGM2OWNiZGM2YTViZGM2OWMNCmJk YzY5Y2JkY2U5NGI1YzY5NGI1YzY4Y2FkYmQ4Y2FkYmQ4NGE1YjU4Y2FkYmQ4Y2FkYmQ5NGI1YmQ4 Y2FkYmQ5NGI1YmQ5NGI1YmQ5Y2I1YzY5NGI1YmQ5Y2I1YzY5Y2I1YmQ5Y2JkYzY5Y2JkYzZhNWJk YzY5Y2JkYzZhNWJkDQpjNmE1YmRjNmFkYzZjNmE1YmRjNmFkYzZjZWFkYmRjNmI1YzZjNmFkYzZj NmI1YzZjNmFkYzZjNmI1YzZjNmFkYzZjNmFkYzZjZWFkY2VkNmI1YzZjZWI1YzZjNmM2Y2VjZWJk YzZiZGNlYzZjNmU3ZGVkZWNlYzZjZThjOGM4Yw0KNjM2MzZiNGE1MjYzNDI0YTYzMzk0YTVhNGE1 YTczNGE2MzdiODRhNWNlNzM5Y2NlN2JhNWQ2NzM5Y2Q2NmI5NGNlNjM4Y2JkNWE4NGI1NGE2Yjk0 NTI2YjhjYTViNWM2ZDZkNmRlYzZiZGJkY2VjNmJkY2VjNmJkYzZiZGFkYjUNCmE1OWNiNWE1YTVi ZGI1YWRiZGI1YWQ1MjRhNGExODEwMTAyMTE4MTgxODE4MTgxODE4MTgyMTIxMjExODE4MTgyMTIx MjEyMTIxMjEyMTIxMjEyMTE4MTgyMTIxMjEyMTIxMjEyMTIxMjEyMTIxMjEyOTIxMjEyMTIxMjEy MTIxDQoyMTIxMjEyMTI5MjEyMTIxMjEyMTIxMjEyMTIxMTgxODI5MjEyMTIxMjEyMTI5MjEyMTIx MjEyMTI5MjEyMTIxMjEyMTMxMjkzMTIxMTgxODE4MTAxMDEwMDgwODEwMTAxMDE4MTAxMDI5MjEy MTMxMjkyOTMxMjkyOTI5MjEyOQ0KMzEyOTI5MjkyOTI5MzEyOTI5MjkyOTI5MzEyOTMxMzEyOTI5 MzEyOTI5MjkyOTI5MzEyOTI5MzEyOTI5MzEyOTI5MjkyOTI5MzEyOTI5MzEyOTI5MzEyOTI5MzEy OTI5MzEzMTMxMzEyOTI5MzEzMTMxMzEyOTI5MzkzMTMxMzENCjI5MjkzMTI5MzEzMTI5MjkzMTI5 MzEzMTI5MjkzMTI5MzEzMTI5MjkzOTMxMzEzMTI5MjkzMTI5MjkyOTI5MjkzMTI5MjkzMTI5Mjkz MTI5MjkzMTI5MjkzMTMxMzEzMTI5MjkzMTMxMzEyOTI5MjkyOTI5MjkyOTI5MjkzOTM5DQozOTRh NGE0YTVhNjM2MzYzNmI2YjZiOWNhNTZiOWNhZDZiOTRhNTZiOWNhZDZiOTRhNTZiOWNhZDZiOTRh NTZiOWNhZDZiOTRhNTZiOWNhNTZiOTRhNTczOTRhNTZiOTRhNTczOWNhNTZiOTRhNTZiOTRhZDZi OTRhZDczOWNhZA0KNmI5NGE1NmI5Y2FkNmI5Y2FkNzM5Y2FkNmI5NGFkNzM5Y2FkNmI5Y2FkNzM5 Y2FkNmI5NGE1NmI5Y2FkNmI5NGE1NmI5Y2FkNmI5NGE1NmI5Y2FkNmI5NGE1NmI5Y2E1NjM5NGE1 NzM5Y2E1N2JhNWFkOGNhZGI1OTRiNWI1OWMNCmI1YmQ5Y2JkYmRhNWJkYzZhNWI1YmRhNWJkYzZh NWJkYzZhNWJkYzZhNWJkYzZhNWJkYzZhNWI1YmQ5Y2JkYmQ5NGFkYjU5NGFkYjU4Y2E1YWQ5NGFk YjU5NGFkYjU5Y2I1YmQ5Y2I1YmQ5Y2I1YmQ5Y2I1YmRhNWI1YmRhNWI1DQpiZGE1YmRjNmE1YjVi ZGE1YmRiZGE1YmRiZGFkYzZjNmE1YmRiZGFkYzZjNmFkYmRiZGFkYzZjNmFkYmRjNmI1YzZjNmI1 YzZjNmI1Y2VjNmI1YzZjNmI1YzZjNmI1YzZjNmI1Y2VjZWI1YzZjNmI1Y2VjZWI1YzZjNmJkY2Vj ZQ0KYjVjNmM2YmRjZWNlYmRjZWNlYzZjZWNlYzZjZWM2Y2VjZWNlZGVkZWQ2YWRhZGE1NzM3Yjdi NjM2YjczNGE1MjYzMzk0YTVhMzk1MjZiNWE3YjljN2JhNWNlNzM5Y2NlNjM5NGM2NmI5NGNlNmI5 NGNlNmI5NGM2NTI3YmFkNGENCjZiOTQzMTRhNzM1MjZiODQ4NDhjYTViNWJkYzZjZWNlY2VjZWNl YzZiZGI1YWRiZGFkYTViZGE1OWNjNmFkOWNiNTljOTRhNTk0OGM0YTQyMzkxMDA4MDgyMTIxMjEx ODIxMjExMDE4MTgxODIxMjExMDE4MTgxODE4MTgxODE4DQoxODIxMTgxODE4MTAxMDI5MjEyMTIx MjEyMTIxMjEyMTIxMTgxODIxMjEyMTIxMTgxODIxMjEyMTE4MTgxODIxMTgxODIxMTgxODIxMjEy MTIxMTgxODIxMjEyMTIxMjEyMTIxMjEyMTIxMjEyMTIxMjEyMTI5MjkyOTI5MjEyMQ0KMTAxMDEw MDgwODA4MDgwODA4MjExODE4MjEyMTIxMjkyMTI5MjEyMTIxMjkyMTI5MjkyMTIxMjkyOTI5Mjky OTI5MzEyOTI5MjkyOTI5MzEyOTI5MjkyOTI5MzEyOTI5MjkyOTI5MzEyOTI5MjkyOTI5MzEyOTI5 MjkyMTI5MjkNCjI5MjkyOTI5MjkzMTI5MjkyOTI5MjkzMTI5MjkzMTI5MjkzMTI5MjkzMTI5Mjkz MTI5MjkzOTI5MzEzOTI5MzEzMTIxMjkzMTI5MjkzMTI5MjkzOTI5MjkzMTI5MjkzMTMxMjkzMTI5 MjEzMTI5MjkzMTMxMjk0MjM5MzEzOTMxDQoyOTMxMjkyOTI5MjEyMTMxMzEyOTIxMjkyMTI5Mjky OTI5MzEyOTQyNDI0MjRhNTI1MjVhNjM2MzVhNWE1YTUyNWE1YTczOWNhZDczOWNhNTczOWNhZDcz OWNhNTczOWNhZDczOTRhNTczOWNhNTczOTRhNTczOWNhNTczOTRhNQ0KNzM5Y2E1NzM5NGE1N2I5 Y2E1NzM5NGE1N2I5Y2E1NzM5NGE1N2I5Y2FkNzM5Y2E1N2I5Y2FkNzM5NGE1N2I5Y2FkNzM5Y2E1 N2I5Y2FkNzM5Y2E1N2I5Y2FkNzM5Y2E1N2I5Y2FkNzM5NGE1N2I5Y2FkNzM5NGE1NzM5Y2FkNzMN Cjk0YTU3MzljYWQ2Yjk0YTU3MzljYTU3MzljYTU4NGE1YWQ4Y2FkYjU5Y2JkYmQ5Y2JkYmRhZGM2 YzZhZGJkYmRhZGJkYzZhZGJkYzZhZGM2YzZhZGJkYzZhZGJkYzZhZGJkYzZhZGM2YzZhNWJkYmQ5 Y2I1YjU5NGFkYWQ5Y2FkDQpiNTk0YWRhZDljYjViNTljYjViNWFkYmRiZGE1YmRiZGFkYmRiZGFk YmRiZGFkYmRjNmFkYmRiZGI1YzZjNmFkYmRiZGI1YzZjNmI1YzZiZGI1YzZjNmI1YzZiZGJkY2Vj NmI1YzZjNmJkY2VjNmI1YzZjNmJkY2VjZWJkY2VjNg0KYmRjZWNlYmRjZWM2YzZjZWNlYmRjZWNl YzZjZWNlYmRjZWM2YzZkNmNlYzZjZWNlYzZjZWNlYmRjZWNlYzZkNmQ2YzZjZWNlY2VkNmNlY2Vj ZWNlZTdlN2RlYmRiZGI1OTQ5NDhjNmI3MzdiNTI1YTZiMzE0YTVhNDI2MzdiNjMNCjg0YTU4NGFk ZDY3MzljZDY2YjljY2U2Yjk0Y2U2YjljY2U2MzhjYzY1MjdiYWQ0MjYzOTQ0MjYzOGMzMTRhNzMz OTUyNmI2MzczODRhNWFkYjVjNmM2YzZjNmJkYzZiZGFkYWRjNmFkOWNiNTk0ODRjNmFkOWNiZGE1 OWM3YjczDQo2YjM5MzEyOTIxMTgxODEwMTgxODE4MTgyMTEwMTgyMTEwMTgxODEwMTgxODIxMjEy MTIxMTgxODIxMTgxODIxMjExODIxMjEyMTIxMjEyMTIxMjEyMTIxMTgxODIxMjEyMTIxMTgxODIx MjEyMTE4MTgxODIxMjEyMTIxMjEyMQ0KMjEyMTIxMjEyMTIxMjkyMTIxMjEyMTIxMjkyMTIxMjEy MTIxMjkyOTI5MjEyMTIxMTgxODE4MDgwODA4MTAxMDEwMTgxODE4MjkyOTI5MjEyMTIxMjkyOTI5 MjkyMTIxMjkyOTI5MjkyMTI5MzEyOTI5MzEyOTI5MzEyOTI5MjkNCjI5MjkzMTI5MzEyOTI5Mjkz MTI5MjkyOTI5MjkzMTI5MzEyOTI5MjkzMTI5MjkyOTI5MjkzMTMxMzEzMTI5MjkzMTMxMzEzMTI5 MjkzOTMxMzEzMTI5MjkzOTMxMzEzMTI5Mjk0MjMxMzkzOTI5MzEzOTI5MzEzOTI5MzEzOTMxDQoz MTMxMjkyOTM5MzEyOTMxMjkyMTQyMzkzMTMxMjkyMTMxMjkyMTMxMjkyMTM5MzEzMTMxMjkyOTMx MzEyOTMxMjkyOTMxMzEzMTMxMzkzMTQyNGE0YTRhNWE1MjVhNjM2MzUyNjM1YTUyNWE1YTRhNTI0 YTczOTQ5YzczOWNhNQ0KNzM5NDljNzM5Y2E1NzM5NDljNzM5NGE1NzM5NDljNzM5Y2E1NmI5NDlj NzM5NGE1NzM5NDljNzM5NGE1NzM5NDljNzM5NGE1NzM5NDljN2I5NGE1NzM5NGE1NzM5Y2E1NzM5 NGE1NzM5Y2E1NzM5NGE1NzM5Y2E1NzM5NGE1N2INCjljYWQ3Mzk0YTU3MzljYTU3Mzk0YTU3Mzlj YTU3Mzk0YTU3Mzk0YTU3Mzk0YTU3Mzk0YTU2Yjk0OWM2Yjk0OWM2Yjk0OWM3YjljYTU4NGE1YTU5 NGI1YjU5Y2I1YmRhZGM2YzZhNWJkYmRhZGJkYzZhZGJkYmRhZGM2YzZhZGJkDQpiZGFkYmRjNmFk YmRjNmFkYzZjNmFkYmRiZGFkYmRiZDljYjViNTljYjViNTk0YWRhZDljYjVhZDljYjViNWE1YmRi NWFkYmRiZGFkYmRiZGFkYmRiZGI1YzZjNmFkYmRiZGI1YzZjNmI1YzZjNmI1YzZjNmI1YzZjNmJk Y2VjNg0KYmRjNmM2YmRjZWM2YmRjNmM2YmRjZWM2YmRjZWM2YmRjZWM2YmRjZWNlYzZkNmNlYmRj ZWNlYzZkNmNlYmRjZWNlYzZkNmNlYzZjZWNlYzZkNmNlYzZjZWNlYzZkNmNlYzZjZWNlYzZkNmQ2 YzZjZWNlY2VkNmQ2Y2VkNmNlZDYNCmQ2Y2VkZWRlZDZjZWNlYzZhZGFkYWQ4NDhjOGM0YTVhNjMz OTRhNjM0YTYzODQ3Mzk0YmQ3MzljY2U2YjljZDY2Mzk0Y2U2YjljZDY2Mzk0Y2U2Mzk0YzY0YTdi YWQ0MjZiYTUzMTUyODQyOTRhNzMyMTM5NWEzOTUyNmI2MzZiDQo4NDk0OWNhNWI1YjViZGNlYzZj ZWJkYWRhNTljOGM3YmFkOWM5NGI1YTU5YzljOTQ4YzZiNmI2MzE4MTgxMDEwMTAxMDEwMTgxMDE4 MTgxODEwMTgxODE4MTgxODE4MTgxODIxMjEyMTE4MTgxODIxMTgxODE4MTgxODIxMjEyMQ0KMjEx ODE4MjEyMTIxMTgxODE4MjEyMTIxMTgxODE4MjEyMTIxMjExODE4MjEyMTIxMjExODE4MjEyMTIx MjExODE4MjEyMTIxMjEyMTIxMjEyMTIxMTgxODE4MjkyOTI5MTgxODE4MDgwODA4MDAwMDAwMTgx ODE4MjEyMTIxMjENCjIxMjEyMTIxMjEyOTIxMjkyOTIxMjEyOTI5MjkyOTIxMjEzMTI5MjkyOTIx MjEzMTI5MjkyOTIxMjEzMTI5MjkyOTI5MjkzMTI5MjkyOTI5MjkzMTI5MjkzMTI5MjkzMTI5Mjkz MTI5MjkzMTMxMzEzMTI5MjkzOTMxMzEzMTI5DQoyOTM5MzEzMTMxMjkyOTM5MzEzMTMxMjkzMTM5 MjkzMTM5MjkzMTM5MjkzMTMxMjkyOTM5MzEyOTMxMjkyOTMxMzEyOTMxMjkyMTMxMjkyMTMxMjky MTM5MzEzMTMxMzEyOTMxMzEyOTI5MjkyOTI5MjkyOTM5NDIzOTRhNTI0YQ0KNTI2MzVhNjM2YjYz NTI1YTVhNTI1YTUyNDI0YTRhNGE1MjUyNzM5Y2E1NzM5NDljN2I5Y2E1NzM5NDljN2I5Y2E1NzM5 NDljN2I5Y2E1NzM5NDljN2I5NGE1NzM5NDljN2I5Y2E1NzM5NDljN2I5NGE1NzM5NDljN2I5NGE1 NzMNCjk0OWM3YjljYTU3Mzk0YTU3YjljYTU3Yjk0YTU3YjljYTU3Yjk0YTU4NDljYTU3YjljYTU3 YjljYTU3Yjk0YTU3YjljYTU3Yjk0YTU3YjljYTU3Mzk0YTU3YjljYTU3Mzk0YTU3MzljYTU2Yjk0 OWM3MzljOWM3YjljOWM4Y2E1DQphZDk0YWRiNWFkYzZjNmFkYzZiZGI1YzZjNmFkYmRiZGI1YzZj NmI1YzZjNmI1YzZjNmI1YzZjNmI1YzZjZWI1YzZjNmI1Y2VjNmFkYzZiZGFkYmRiZGE1YjViNWE1 YjViNTljYjVhZGFkYmRiZGFkYmRiNWI1YzZjNmI1YmRiZA0KYjVjNmM2YjVjNmM2YmRjNmM2YjVj NmM2YmRjZWNlYmRjNmM2YmRjZWM2YmRjZWM2YzZjZWNlYmRjZWM2YzZkNmNlYmRjZWM2YzZkNmNl YzZjZWNlY2VkNmNlYzZkNmNlY2VkNmQ2YzZkNmNlY2VkNmQ2YzZkNmNlY2VkZWQ2Y2UNCmQ2Y2Vj ZWRlZDZjZWQ2ZDZjZWRlZDZjZWQ2ZDZjZWQ2ZDZjZWQ2ZDZkNmRlZDZkNmQ2Y2VkZWRlZDZkZWRl ZDZkNmQ2Y2U5Y2E1YTU2MzczN2I0MjVhNmI1YTdiOTQ3MzljYzY3MzljZDY2Mzk0ZDY2YjljZDY2 MzljZDY2YjljDQpkZTYzOTRjZTUyODRiZDQyNzNhZDI5NTI4YzI5NTI3YjMxNTI3YjM5NTI3MzRh NWE3MzYzNmI4NDk0OWNhZGI1YjVjNmJkYjViNWE1OTQ5NDljOTQ4Yzk0OGM4Y2FkYTU5Yzk0OGM4 NDRhNDI0MjE4MTgxMDE4MTgxODE4MTgxMA0KMjEyMTIxMjEyMTIxMjEyMTIxMTgxODE4MjEyMTIx MTgxODE4MjEyMTIxMjExODE4MjEyMTIxMjExODE4MjEyMTIxMTgxODE4MjEyMTIxMjExODE4MjEy MTIxMjExODE4MjEyMTIxMjEyMTIxMjEyMTIxMjEyMTIxMjkyMTIxMjENCjIxMjEyMTIxMjEyMTIx MjEyMTIxMjEwODA4MDgwODA4MDgxODE4MTgyOTIxMjExODE4MTgyOTI5MjkyOTIxMjEzMTI5Mjky OTI5MjkzMTI5MjkyOTIxMjkzMTI5MjkyOTIxMjkzMTI5MjkyOTI5MjEzMTI5MjkzMTI5MjkzMTI5 DQozMTMxMjkyOTM5MzEzMTMxMjkyOTMxMzEzMTMxMjkyOTM5MzEzMTMxMjkyOTM5MzEzMTMxMjky OTM5MzEzMTM5MzEzMTM5MjkzMTM5MjkzMTQyMzEzOTM5MzEzMTM5MzEzMTMxMjkyOTM5MzEyOTMx MjkyOTMxMjkyOTMxMzEyOQ0KMzkzOTM5MzkzMTMxMzEzMTMxMjkyOTI5MzkzOTM5NDI0MjQyNWE2 MzVhNWE2MzVhNjM2YjYzNWE2MzVhNTI1YTVhNGE1MjRhNGE1MjUyNGE1MjUyNzM5NDljN2I5Y2E1 NzM5NDljN2I5YzljN2I5NDljN2I5Y2E1NzM5NDljN2INCjk0OWM3Mzk0OWM3Yjk0OWM3Yjk0OWM3 Yjk0OWM3Yjk0OWM3Yjk0OWM3Yjk0OWM3Yjk0OWM3Yjk0YTU4NDljYTU3Yjk0OWM4NDljYTU4NDk0 YTU4NDljYTU4NDk0YTU4NDljYTU4NDk0YTU4NDljYTU3Yjk0OWM4NDljYTU3Yjk0DQo5Yzg0OWNh NTdiOTQ5YzdiOWNhNTczOTQ5YzczOWM5YzczOTQ5NDdiOWM5Yzg0YTVhNTljYjViNWE1YmRiNWI1 YzZjNmI1YzZiZGI1YzZjNmI1YmRiZGI1YzZjNmI1YzZjNmI1YzZjNmI1YzZjNmI1YzZjNmI1YzZj NmI1YzZjNg0KYTViZGI1YTViNWI1YTViNWFkYTViNWI1YTViNWI1YWRiZGJkYjViZGJkYjVjNmM2 YjVjNmJkYmRjNmM2YjVjNmM2YmRjZWM2YmRjNmM2YzZjZWNlYmRjZWM2YzZjZWM2YzZjZWM2YzZk NmNlYzZjZWM2YzZkNmNlYzZjZWM2YzYNCmQ2Y2VjZWQ2Y2VjZWQ2Y2VjNmQ2Y2VjZWQ2Y2VjZWQ2 Y2VjZWRlZDZjZWQ2Y2VjZWRlZDZjZWQ2Y2VjZWRlZDZjZWQ2ZDZjZWQ2ZDZjZWQ2ZDZjZWQ2ZDZj ZWQ2Y2VkNmQ2Y2VkNmQ2Y2VlN2U3ZGVkZWRlZGViNWJkYzY3Mzg0DQo5NDVhNzM4YzYzODQ5Yzdi YTVjZTZiOWNkNjYzOWNkZTYzOWNkNjZiOWNkZTYzOWNkNjVhOTRkNjRhODRiZDRhN2JiNTMxNjM5 NDI5NWE4YzIxNGE3MzMxNTI3YjM5NWE3YjUyNmI4NDVhNmI4YzZiN2I4YzljOWNhNWM2YmRjNg0K OWM5YzljOGM4YzhjOTQ5NDk0OWM5Yzk0N2I3YjczNDIzOTMxMTgxODEwMTgxMDA4MTgxODEwMjEy MTIxMTgxMDEwMTgxODE4MTgxODIxMTgxODE4MTgxODE4MjExODE4MTgxODE4MjExODE4MTgxODE4 MjExODE4MTgxODE4MjENCjE4MTgyMTE4MTgyMTIxMjExODE4MTgyMTIxMjEyMTE4MTgyMTIxMjEy MTE4MTgyMTIxMjExODE4MTgyOTI5MjkxODE4MTgwODA4MDgwMDAwMDAxMDEwMTAxODE4MTgxODE4 MTgyOTIxMjEyOTI5MjkyOTIxMjEyOTI5MjkyOTIxDQoyMTI5MjkyOTI5MjEyMTI5MjEyOTI5MjEy MTMxMjkyOTI5MjEyMTMxMjkyOTMxMjkyOTM5MzEyOTMxMjkyOTM5MzEyOTMxMjkyOTMxMzEyOTMx MjkyOTMxMzEyOTMxMjkyOTM5MzEyOTMxMjkyOTM5MzEzMTM5MjkyOTM5MjkzMQ0KMzEyOTI5Mzkz MTMxMzkyOTI5MzkzMTMxMzEyOTI5MzEyOTI5MzEzMTI5MzEzMTMxMjkyOTI5MjkyOTI5MjkyOTMx NDI0MjQyNTI1MjVhNjM2YjZiNjM2YjYzNjM2YjYzNTI1YTVhNTI1YTVhNGE1MjUyNGE1MjUyNGE1 MjUyNTINCjUyNTI4NGE1YTU3YjljYTU4NDljYTU3YjljOWM4NDljYTU3YjljOWM4NDljYTU3Yjlj OWM4NDljYTU3YjljOWM4NDljOWM4NDk0OWM4NDljYTU4NDk0OWM4NDljOWM4NDk0OWM4YzljYTU4 YzljYTU4YzljYTU4NDljYTU4Y2E1DQphNThjOWNhNThjOWNhNThjOWNhNThjYTVhNThjOWNhNThj OWNhNTg0OWNhNThjOWNhNTg0OWNhNThjOWNhNTg0OWM5Yzg0YTVhNTdiOWM5YzdiOWM5Yzg0OWM5 Yzk0YWRhNTljYjVhZGFkYzZiZGI1YzZiZGJkYzZjNmI1YzZiZA0KYmRjNmM2YjVjNmJkYmRjNmM2 YjVjNmM2YmRjNmM2YjVjNmM2YmRjZWM2YjVjNmJkYjViZGJkYTViNWI1YWRiZGI1YWRiZGI1YjVi ZGJkYjViZGJkYmRjNmM2YmRjNmJkYmRjNmM2YmRjNmM2YzZjZWNlYzZjZWM2YzZjZWNlYzYNCmNl YzZjZWQ2Y2VjNmNlYzZjZWQ2Y2VjNmNlYzZjZWQ2Y2VjNmQ2Y2VjZWQ2Y2VjNmQ2Y2VkNmRlZDZj ZWQ2Y2VkNmRlZDZjZWQ2Y2VkNmRlZDZjZWRlY2VkNmRlZDZjZWRlZDZkNmRlZDZjZWRlZDZjZWRl ZDZjZWQ2ZDZkNmRlDQpkZWNlZDZkNmQ2ZGVkNmQ2ZDZjZWQ2ZGVkNmRlZTdkNmU3ZTdlN2M2ZDZk NjljYWRiZDczOGNhNTczOTRiNTdiYTVjNjczYWRkZTZiYTVkZTZiYTVlNzYzOWNkZTYzOWNkZTUy OGNjZTRhODRiZDQyNzNhZDM5NmJhNTI5NWE4Yw0KMjE0YTdiMjk0YTdiMzk1YTg0NDI2Mzg0NDI2 Mzg0NDI1YTczNmI3MzhjYWRhZGJkYWRhZGI1OTQ5NDljOGM4YzhjOGM4Yzg0YTU5Yzk0NmI2MzVh MzkzMTIxMTgxMDAwMTgxMDEwMjEyMTE4MTgxODE4MTAxMDEwMjEyMTIxMTgNCjE4MTgxODE4MjEx ODE4MTgyMTE4MTgxODE4MTgyMTIxMjExODE4MTgyMTIxMjExODE4MTgyMTIxMjEyMTIxMjEyMTIx MjEyMTE4MTgyMTIxMjEyMTIxMjEyMTIxMjEyMTIxMjEyMTIxMjEyMTIxMjEyMTIxMjExMDEwMTAw ODA4DQowODEwMTAxMDE4MTgxODE4MTgxODI5MjkyOTI5MjEyMTI5MjkyOTI5MjEyMTMxMjkyOTI5 MjEyOTMxMjkyOTI5MjEyMTMxMjkyOTMxMjkyMTMxMjkyOTMxMjkyOTM5MzEyOTMxMjkyOTM5MzEz MTMxMzEyOTM5MzEyOTMxMjkyOQ0KMzkzMTI5MzEyOTI5MzkzMTMxMzEzMTI5MzkzMTMxMzEyOTI5 MzkzMTMxMzkyOTMxMzkzMTMxMzEyOTMxMzkzMTMxMzEzMTI5MzEzMTMxMzEyOTI5MzEzMTMxMjky OTI5MzEzMTMxMzk0MjQyNTI1YTYzNmI2YjczNmI3MzdiNjMNCjZiNzM2MzZiNmI1YTYzNWE1YTYz NWE1MjVhNWE1YTYzNWE1MjVhNTI1MjUyNTI0YTRhNGE4NDljOWM4NDljYTU4NDljOWM4NGE1YTU4 NDljOWM4NDljYTU4NDljOWM4NDljYTU4NDljOWM4NDljOWM4NDljOWM4YzljOWM4NDk0DQo5Yzhj OWM5Yzg0OWM5YzhjOWM5YzhjOWNhNTk0OWNhNThjOWNhNTk0YTVhNThjOWNhNTk0YTVhNTk0OWNh NTk0YTVhZDhjOWNhNTk0YTVhNThjOWNhNTk0YTVhNThjOWNhNTk0OWNhNThjOWNhNThjYTVhNTg0 OWM5Yzg0OWM5Yw0KODQ5YzljOGM5YzljOGNhNTljYTViNWFkYWRiZGI1YjVjNmJkYjVjNmJkYmRj NmJkYmRjNmJkYmRjNmM2YjVjNmJkYmRjNmM2YjVjNmJkYmRjNmM2YjVjNmJkYjVjNmJkYWRiZGI1 YWRiZGI1YTViNWFkYWRiZGI1YjViZGI1YmQNCmM2YmRiZGM2YmRiZGNlYzZiZGM2YmRjNmNlYzZj NmM2YzZjNmNlYzZjNmNlYzZjZWQ2Y2VjNmNlYzZjZWQ2YzZjZWQ2YzZjZWQ2Y2VjZWQ2YzZjZWQ2 Y2VjZWQ2Y2VjZWRlY2VjZWQ2Y2VkNmRlY2VjZWQ2Y2VkNmRlZDZjZWQ2DQpjZWQ2ZGVkNmQ2ZGVj ZWQ2ZGVkNmNlZDZjZWQ2ZGVkNmNlZDZkNmQ2ZGVkZWNlZDZkNmQ2ZGVkZWQ2ZGVkNmRlZGVkNmQ2 ZGVjZWQ2ZGVkNmQ2ZGVkZWQ2ZTdlN2I1YzZkNjk0YWRjNjdiOWNiZDdiYTVjZTczYTVkNjZiYTVk ZQ0KNmJhNWQ2NjM5Y2Q2NWE5NGNlNTI4Y2M2NDI3YmI1NDI3M2FkMzE2MzljMzE1YTk0Mjk1Mjg0 MzE1YTg0MzE1MjdiMzk1YTg0Mzk1YTg0NGE2YjhjNDI1YTczNmI3MzhjOGM4Y2E1OWM5Y2FkODQ4 NDg0ODQ4NDg0OTQ4Yzg0OGMNCjg0NzM2MzUyNGEyOTIxMTAxODA4MDAyOTIxMTgxODEwMTAxMDEw MTgxODE4MjExODE4MjExMDEwMTgxODE4MTgxODE4MTgxODE4MTgxODE4MTgxODE4MTgxODE4MTgy MTE4MTgxODE4MTgyMTIxMjEyMTE4MTgyMTIxMjExODE4DQoxODIxMjEyMTIxMTgxODIxMjEyMTE4 MTgxODIxMjEyMTIxMjEyMTE4MTgxODA4MDgwODA4MDgwODEwMTAxMDIxMjEyMTIxMTgyMTI5MjEy MTI5MjEyMTI5MjkyOTI5MjEyMTI5MjkyOTI5MjEyMTMxMjkyOTI5MjkyMTMxMjkyOQ0KMzEyOTIx MzkyOTI5MzEyOTIxMzkzMTI5MzEyOTI5MzkzMTI5MzEyOTI5MzkzMTI5MzEyOTI5MzEzMTI5MzEy OTI5MzEzMTMxMzEyOTI5MzkzMTMxMzEyOTMxMzkzMTMxMzEyOTI5MzEzMTMxMzEyOTI5MzEzMTMx MjkyOTI5MzENCjMxMzEyOTI5MzEzOTQyNDI0YTUyNTI2MzZiNmI2YjczN2I3MzdiODQ2MzZiN2I1 YTYzNmI1YTYzNjM1YTYzNjM1YTVhNWE1YTYzNjM1MjVhNWE1MjVhNWE0YTUyNTI0YTUyNGE4Y2E1 YTU4YzljYTU4Y2E1YTU4Y2E1YTU4Y2E1DQphNThjOWM5YzhjYTVhNThjOWM5YzhjYTVhNThjOWM5 YzhjYTVhNThjOWM5Yzk0OWNhNThjOWM5Yzk0YTVhNThjOWM5Yzk0YTVhNTk0YTVhNTljYTVhZDk0 YTVhNTljYTVhZDk0YTVhNTljYTVhZDk0YTVhNTljYTVhZDk0YTVhNQ0KOWNhNWFkOTRhNWE1OWNh NWE1OTQ5Y2E1OWNhNWE1OTRhNWE1OTRhNWE1ODQ5YzljOGM5YzljODQ5YzljOTRhNWE1YTViNWFk YjViZGI1YjVjNmI1YmRjNmJkYmRjNmJkYmRjZWJkYmRjNmJkYmRjNmM2YmRjNmJkYmRjZWM2YmQN CmM2YmRiZGNlYzZiNWM2YmRiNWM2YmRhZGJkYjVhZGJkYjVhZGJkYjViZGM2YmRiZGM2YmRjNmNl YzZiZGM2YmRjNmNlYzZjNmNlYzZjZWQ2Y2VjZWNlY2VjZWQ2Y2VjZWQ2Y2VjZWQ2Y2VjZWQ2YzZk NmRlY2VjZWQ2Y2VkNmRlDQpjZWNlZDZjZWQ2ZGVkNmNlZDZjZWQ2ZGVkNmQ2ZGVjZWQ2ZGVkNmQ2 ZGVkNmQ2ZGVkNmQ2ZGVkNmRlZTdkNmQ2ZGVkNmQ2ZGVkNmNlZGVkNmQ2ZGVkZWNlZGVkNmQ2ZGVk ZWQ2ZGVkZWRlZTdkZWRlZTdkNmU3ZTdkZWQ2ZDZjZQ0KZDZkZWRlZGVlN2VmY2VkZWVmYTViZGQ2 OGNhZGNlN2JhNWNlNzNhNWQ2NmJhNWQ2NzNhNWQ2NjM5Y2NlNWE5NGM2NTI4NGJkNGE4NGI1NDI3 YmFkMzk2YmE1Mjk1YThjMjk1Mjg0Mjk1Mjg0Mzk2MzhjMzk2MzhjNDI2YjhjNGENCjYzOGM0YTYz ODQyOTM5NWE2YjczOGM4Yzk0YTU4Yzk0OWM4YzhjOGM4Yzg0N2I5NDhjODQ5NDhjN2IzOTMxMjEy MTEwMDgyOTIxMTgyMTE4MTgxMDEwMTAyMTIxMjkxMDE4MTgxODE4MTgxODE4MTgyMTE4MTgxODE4 MTgyMTE4DQoxODE4MTgxODIxMjEyMTE4MTgxODIxMjEyMTIxMTgxODIxMjEyMTIxMjEyMTIxMjEy MTIxMTgxODIxMjEyMTIxMjEyMTIxMjEyMTIxMjEyMTIxMjEyMTE4MTgxODEwMTAxMDA4MDgwODE4 MTAxMDIxMjEyMTI5MjEyMTIxMjEyMQ0KMjkyOTI5MjkyMTIxMzEyOTI5MjkyMTI5MzEyOTI5Mjky OTI5MzEyOTI5MzEyOTIxMzkzMTI5MzEyOTI5MzkzMTI5MzEyOTI5MzkzMTI5MzEzMTI5MzkzMTMx MzEzMTI5MzkzMTMxMzEzMTMxMzkzMTMxMzEzMTMxMzkzMTMxMzENCjMxMzEzOTMxMzEzMTMxMzEz OTMxMzEzMTI5MzEzMTMxMzEyOTI5MzEzMTMxMzkyOTMxMzE0YTUyNWE1YTYzNmI3MzdiODQ2Yjcz N2I2MzZiNzM1YTYzNmI2MzZiN2I2MzZiNzM2MzZiNmI2MzYzNjM2MzZiNjM1YTYzNWE1YTVhDQo1 YTUyNTI1MjUyNWE1YTRhNTI1MjhjYTVhNTk0YWRhNThjYTVhNTk0YTVhNThjYTVhNTk0YTVhNThj YTU5Yzk0YTVhNThjOWM5Yzk0YTVhNThjOWM5Yzk0YTVhNTk0OWM5Yzk0YTVhNTk0OWM5Yzk0YTVh NTk0YTVhNTljYTVhNQ0KOTRhNWE1OWNhNWE1OWNhNWE1OWNhNWE1OWNhNWE1OWNhNWE1OWNhNWE1 OWNhNWE1OTRhNWE1OWNhNWE1OWNhNWE1OWNhNWE1OTRhNWE1OWNhNWE1OGNhNWE1OGNhNWE1OGM5 YzljOTRhNWE1OWNhNWE1YWRiNWFkYWRiZGFkYmQNCmM2YjViNWM2YjViZGM2YmRiZGM2YjViZGM2 YmRiZGM2YmRiZGM2YmRiZGM2YmRiZGM2YzZiZGM2YmRiZGM2YmRiNWJkYjViNWJkYjVhZGJkYjVi ZGM2YmRiZGM2YjViZGNlYmRjNmNlYmRjNmNlYzZjNmNlYmRjZWNlYzZjNmNlDQpjNmNlZDZjZWNl Y2VjNmNlZDZjZWQ2ZDZjZWQ2ZGVjZWNlZDZjZWQ2ZGVjZWQ2ZDZjZWQ2ZGVkNmQ2ZDZjZWQ2ZGVk NmQ2ZGVkNmRlZGVkNmQ2ZGVjZWRlZGVkNmQ2ZGVjZWRlZGVkNmQ2ZGVjZWQ2ZGVkNmQ2ZGVjZWQ2 ZGVkNg0KY2VkZWQ2ZDZkZWQ2Y2VkZWQ2ZDZkZWRlZDZkZWQ2ZDZkZWQ2ZDZkNmNlZGVlN2RlY2Vk NmQ2Y2VkNmRlYzZkZWVmYWRjZWU3ODRhNWM2N2JhNWNlNzNhNWNlNzNhNWQ2NmI5Y2M2NjM5NGM2 NWE4Y2JkNTI4NGFkNDI3MzljNDINCjZiOWMzMTVhOGMzMTVhODQyOTUyN2IzMTVhODQyOTUyN2Iz MTUyN2IzOTVhN2I0YTZiOGM1YTczOTQ0MjVhN2IzMTQyNjM1MjVhNzM4NDhjOTRhNWE1YTU5NDhj OGM4NDczNmI5YzhjODQ3YjczNjM0MjM5MjkxODEwMDgwODA4DQowMDE4MTgxODE4MTgyMTEwMTgx ODE4MTAxODE4MTgxODE4MTAxMDE4MTgxODE4MTgxODE4MTgxODE4MTgxODE4MTgxODE4MTgxODIx MTgxODE4MTgxODIxMTgxODE4MTgxODIxMjEyMTE4MTgxODIxMjEyMTE4MTgxODIxMjEyMQ0KMTgx ODE4MjEyMTIxMTAxMDEwMDgwODA4MDgwODA4MjEyMTIxMTgxODE4MjExODE4MjExODE4MjkyMTIx MjkyMTIxMjkyOTI5MjkyMTIxMzEyOTI5MzEyOTIxMzEyOTI5MzEyOTIxMzkzMTI5MzEzMTI5Mzkz MTMxMzEyOTI5MzENCjI5MjkzMTI5MjkzMTMxMzEzMTMxMzEzOTMxMzEzMTMxMzEzMTMxMzEyOTI5 MjkzMTMxMzEyOTI5MjkzMTI5MzEyMTIxMjEyMTIxMjkyMTIxMjkzOTM5NDI0YTRhNTI2MzYzNmI2 YjZiN2I2YjczN2I2MzZiNzM2MzZiN2I1YTZiDQo3MzYzNmI3YjVhNmI3MzYzNmI3MzVhNjM2MzYz NjM2MzVhNWE1YTVhNjM1YTUyNWE1MjUyNWE1YTRhNTI1MjRhNTI1MjljYWRhZDk0YTVhNTk0YWRh NTk0YTVhNTk0YWRhZDk0YTVhNTk0YTVhNTk0YTVhNTljYTVhNTk0YTVhNQ0KOWNhNWE1OTRhNWE1 OWNhNWE1OTRhNWE1OWNhNWE1OTRhNWE1YTVhZGFkOWNhNWE1OWNhNWE1OWNhNWE1YTVhZGFkOWNh NWE1YTVhZGFkOWNhNWE1YTVhZGFkOWNhNWE1YTVhZGFkOWNhNWE1YTVhZGFkOWNhNWE1YTVhZGFk OWMNCmE1YTU5NGE1YTU5NGE1YTU5NGE1YTU5NGE1OWNhNWFkYTVhZGI1YWRiNWJkYjViNWM2YjVi ZGM2YmRiZGM2YjViZGM2YmRiZGM2YjViZGM2YzZiZGM2YmRiZGNlYzZiZGM2YmRiZGNlYzZiZGM2 YmRiNWM2YmRiNWJkYjViZGM2DQpiZGJkYzZiNWM2Y2ViZGJkY2ViZGNlZDZjNmM2Y2VjNmNlZDZj ZWNlY2VjNmQ2ZDZjZWNlZDZjZWQ2ZDZjZWQ2ZDZjZWQ2ZGVkNmQ2ZGVjZWQ2ZGVkNmQ2ZGVjZWRl ZGVkNmQ2ZGVjZWQ2ZGVkNmQ2ZGVjZWRlZTdkZWQ2ZGVkNg0KZGVkZWQ2ZDZkZWQ2ZGVkZWQ2ZDZk ZWQ2ZGVkZWQ2ZDZkZWQ2ZGVlN2Q2ZDZkZWQ2ZDZkZWQ2Y2VkZWQ2ZDZkZWRlZDZkZWQ2ZDZkZWRl ZDZkZWQ2ZTdlN2RlZGVlN2RlZDZkZWRlY2VkZWU3YzZkZWVmOWNiZGQ2ODRhNWNlN2INCmE1Y2U3 YmE1Y2U3MzljY2U3M2E1Y2U2Yjk0YmQ2Mzk0YmQ1Mjg0YWQ0YTdiYTU0MjZiOTQ0MjYzOGMzMTVh ODQzOTVhODQzMTUyN2IzOTVhN2IzMTUyNzMzMTUyNzMzOTVhN2I0YTZiOGM0MjVhN2I0MjVhNzM0 MjUyNmI1YTYzDQo3MzczNzM3YjhjOGM4YzljOTQ4YzhjODQ3Yjg0N2I3MzZiNWE1YTMxMjkyMTEw MTAxMDA4MDgwODEwMTAxODA4MTAxMDE4MTgxODE4MTgxODE4MTgxODE4MTgxODIxMTgxODE4MTgx ODIxMTgxODE4MTgxODIxMjEyMTE4MTgxOA0KMjEyMTIxMTgxODE4MjEyMTIxMjExODE4MjEyMTIx MjExODE4MjEyMTIxMTgxODE4MjEyMTIxMjEyMTIxMTgxODE4MDgwODA4MTAxMDEwMTgxODE4MjEx ODE4MjExODE4MjEyMTIxMjEyMTIxMjkyOTI5MjkyMTI5MzEyOTI5MjkNCjI5MjkzMTMxMjkzMTI5 MjEzOTMxMjkzMTI5MjkzOTMxMzEzOTMxMjkzOTMxMzEzMTMxMzEzOTM5MzkzOTMxMzEzOTMxMzEz MTI5MzEzMTMxMzEzMTMxMzEzMTM5MzkzMTM5MzkyMTIxMjkyOTI5MzEzOTQyNDI0MjQyNGE1MjUy DQo1YTUyNWE2MzYzNmI3MzZiNzM3YjZiNzM4NDYzNzM3YjYzNzM3YjVhNmI3YjYzNzM3YjVhNmI3 YjVhNmI3YjVhNmI3MzYzNmI2YjYzNjM2MzYzNjM2MzVhNWE1YTVhNWE1YTUyNTI1MjUyNTI1MjRh NTI1Mjk0YTVhNTljYWRhNQ0KOTRhNWE1OWNhZGE1OTRhNWE1OWNhNWE1OTRhNWE1OWNhNWE1OTRh NWE1OWNhNWE1OWNhNWE1OWNhZGFkOWNhNWE1OWNhNWE1OWNhNWE1OWNhZGFkOWNhNWE1OWNhNWE1 OWNhNWE1OWNhNWE1OWNhNWE1OWNhNWE1OWNhNWE1YTUNCmFkYWQ5Y2E1YTU5Y2E1YTU5Y2E1YTVh NWFkYTU5Y2E1YTU5Y2E1YTU5Y2E1YTU5Y2FkYTU5NGE1YTU5NGE1YTU5NGE1OWM5Y2E1YTU5Y2E1 YTVhZGI1YWRiNWJkYjViZGM2YmRiZGJkYjViZGM2YmRiZGM2YjViZGM2YmRiZGM2DQpiZGJkYzZi ZGJkYzZiZGJkYzZjNmJkYzZiZGJkYzZiZGI1YmRiNWI1YzZiZGI1YmRiNWJkYzZiZGJkYzZiZGM2 Y2VjNmM2Y2VjNmNlZDZjZWNlY2VjZWQ2ZDZjZWNlZDZjZWQ2ZDZkNmQ2ZDZjZWQ2ZGVkNmQ2ZDZj ZWQ2ZGVkNg0KZDZkNmQ2ZDZkZWQ2ZDZkNmQ2ZDZkZWQ2ZDZkZWQ2ZDZkZWQ2ZDZkZWQ2ZDZkZWQ2 ZDZkZWQ2ZDZkZWQ2ZDZkZWQ2ZDZkZWQ2ZDZkZWQ2ZDZkZWQ2ZDZkZWNlZDZkZWQ2Y2VkZWQ2ZDZk ZWRlY2VkZWQ2ZDZkZWRlZDZkZWQ2ZGUNCmRlZGVkZWU3ZGVkNmRlZDZkNmRlZGVkNmU3ZWZiNWM2 ZDY5NGFkY2U3YjljYzY3MzljYzY3MzljYzY3MzljYzY2Yjk0YmQ2Mzk0YjU1YTg0YTU1MjdiOWM0 MjZiOTQ0MjZiOGMzOTYzODQzOTYzODQzOTVhN2IzOTVhN2IzOTUyDQo3MzMxNTI3MzI5NGE2YjMx NGE2YjI5NGE2YjM5NWE3MzQyNWE3MzQyNTI2YjM5NDI1MjRhNGE1MjZiNmI2YjhjOGM4YzhjODQ3 Yjk0ODQ4NDdiNzM2YjUyNGE0YTIxMTgyMTEwMTAxMDA4MTAxMDEwMTAxODEwMTAxMDE4MTgxOA0K MTgxMDEwMTgxODE4MTgxMDEwMTgxODE4MTgxODE4MTgxODE4MTgxODE4MTgxODE4MTgxODE4MjEx ODE4MTgxODE4MjExODE4MTgxODE4MjEyMTIxMTgxODE4MTgxODE4MTgxODE4MjEyMTIxMTgxODE4 MTAxMDEwMTAwODA4MTgNCjEwMTAxODEwMTgyMTE4MTgyMTE4MTgyOTIxMjEyMTIxMjEyOTIxMjky OTIxMjEzMTI5MjkzMTI5MjEzMTI5MjkzMTI5MjEzMTMxMjkyOTI5MjEzMTI5MjkyOTI5MjkzMTI5 MjkyMTIxMjEyOTMxMzEzMTMxMzEzOTM5NDIzMTMxDQozOTI5MzEzMTIxMjkyOTIxMjkyOTMxMzkz OTQyNGE1MjUyNWE2MzYzNmI3MzYzNzM3YjZiNzM3YjYzNmI3YjZiNzM4NDYzNmI3YjYzNzM3YjYz NmI3YjYzNzM3YjVhNmI3MzVhNmI3YjVhNmI3MzYzNmI3MzVhNjM2MzYzNjM2Mw0KNWE2MzYzNWE2 MzYzNTI1MjVhNTI1MjVhNGE1MjUyNTI1MjUyOWNhZGFkOTRhNWE1OWNhZGFkOTRhNWE1OWNhZGFk OWNhNWE1OWNhZGFkOWNhNWE1OWNhZGFkOWNhNWE1YTVhZGFkOWNhNWE1YTVhZGFkOWNhNWE1YTVh ZGFkOWMNCmE1YTU5Y2FkYTU5Y2E1YTVhNWFkYWQ5Y2E1YTVhNWFkYWQ5Y2E1YTVhNWFkYWQ5Y2Fk YTVhNWFkYWQ5Y2E1YTVhNWFkYWQ5Y2E1YTVhNWFkYWQ5Y2E1YTVhNWFkYWQ5Y2E1YTU5Y2FkYWQ5 NGE1YTU5Y2E1YTU5Y2E1YTVhNWFkDQphZGFkYjVhZGJkYzZiNWJkYzZiNWJkYzZiZGJkYzZiNWJk YzZiZGJkYzZiZGJkYzZiZGJkYzZiZGJkY2VjNmJkYzZiZGM2Y2VjNmJkYzZiZGJkYzZiZGI1YzZi ZGJkYzZiZGJkYzZiZGM2Y2VjNmM2Y2VjNmNlZDZjZWNlZDZjZQ0KZDZkNmQ2ZDZkNmNlZDZkZWQ2 ZDZkNmQ2ZGVkZWQ2ZDZkZWQ2ZDZkZWQ2ZDZkZWQ2ZDZkZWQ2ZDZkZWQ2ZDZkZWQ2ZDZkZWQ2ZGVl N2RlZDZkZWQ2ZGVlN2RlZDZkZWQ2ZGVlN2RlZDZkZWQ2ZGVkZWRlZDZkZWQ2ZGVkZWRlZDYNCmRl ZDZkNmRlZDZkNmRlZDZkNmU3ZDZkNmRlZDZkNmU3ZGVkNmRlZDZkNmU3ZGVkNmRlZDZkZWU3ZGVj ZWQ2Y2VkZWU3ZTdkNmU3ZWZhZGM2ZDY4NDljYmQ3YjljYzY2Yjk0YmQ2Yjk0YmQ2MzhjYjU2Mzhj YjU1MjdiYTU1MjczDQo5YzQyNjM4YzQyNjM4NDM5NWE3YjQyNjM4YzM5NWE3YjQyNWE4NDM5NWE3 YjQyNWE3YjM5NTI3MzMxNTI3MzI5NGE2MzI5NDI2MzI5NGE2MzM5NTI2YjM5NGE2MzM5NGE1YTM5 NDI0YTRhNGE1MjUyNGE1Mjg0N2I4NDg0N2I4NA0KOGM4NDg0NzM2YjZiNDI0MjQyMTgxMDEwMTAx MDEwMTgxODE4MTgxODE4MTgxMDEwMTgxODE4MTgxODE4MTgxODE4MTgxODE4MjExODE4MTgxODE4 MjExODE4MTgxODE4MjExODE4MTgxODE4MjExODE4MTgxODE4MjEyMTIxMTgNCjE4MTgyMTIxMjEx ODE4MTgyMTIxMjEyMTIxMjEyMTIxMjExODE4MTgxODEwMTAxMDEwMTAyMTE4MTgxODE4MTgyMTIx MjEyMTIxMjEyOTIxMjkyOTIxMjEzMTI5MjkyOTI5MjkzMTI5MjkzMTI5MjkzOTMxMjkzMTMxMjkz MTMxDQoyOTI5MjkyOTMxMzEzMTI5MjkyOTM5MzkzOTI5MjkzMTI5MjkyOTE4MjEyMTIxMjkzMTI5 MzEzOTQyNGE1MjUyNWE1YTVhNmI3MzVhNmI3MzZiN2I4NDZiN2I4NDZiN2I4NDYzNmI3YjYzNzM4 NDVhNmI3YjYzNzM4NDYzNmI3Yg0KNjM3Mzg0NWE2YjdiNjM3MzdiNWE2YjczNWE3MzdiNWE2Yjcz NjM2YjZiNjM2MzYzNjM2MzYzNWE1YTYzNWE1YTVhNTI1MjUyNTI1YTVhNGE1MjUyOWNhNWFkOWNh ZGFkOTRhNWE1OWNhZGFkOWNhNWE1OWNhZGFkOTRhNWE1OWMNCmFkYWQ5Y2E1YTU5Y2FkYWQ5Y2E1 YTU5Y2E1YWQ5Y2E1YTU5Y2FkYWQ5Y2E1YTU5Y2FkYWQ5Y2E1YTU5Y2FkYTU5Y2E1YTU5Y2FkYTU5 Y2E1YTU5Y2FkYWQ5Y2E1YTU5Y2FkYWQ5Y2E1YTU5Y2FkYWQ5Y2E1YTU5Y2FkYTU5Y2E1DQphNTlj YWRhZDljYTVhNTljYWRhNTljYTVhNTljYWRhNTk0YTVhNTljYWRhNWE1YWRhNWFkYjVhZGI1YmRi NWJkYzZiZGJkYzZiNWJkYzZiZGJkYzZiNWJkYzZiZGJkYzZiZGJkYzZiZGJkYzZiZGJkYzZjNmJk YzZjNmJkY2VjNg0KYjVjNmJkYmRjNmJkYjVjNmJkYmRjZWM2YzZjZWM2Y2VjZWNlY2VjZWNlY2Vk NmNlY2VkNmNlY2VkNmQ2ZDZkNmNlZDZkZWQ2ZDZkNmQ2ZDZkZWQ2ZDZkZWQ2ZDZkZWQ2ZDZkZWQ2 ZDZkZWQ2ZDZkZWQ2ZDZkZWRlZDZkZWQ2ZDYNCmRlZGVkNmRlZDZkZWRlZGVkNmRlZDZkNmRlZGVk NmRlZDZkNmRlZGVkNmRlZDZkNmRlZDZkNmRlZDZkNmU3ZDZjZWRlZDZkNmRlZDZjZWRlZDZkNmRl ZGVkNmRlZDZkNmU3ZDZkNmRlZDZkNmRlZDZkNmU3ZGVjZWRlZTc5NGFkDQpiZDczOTRiNTYzOGNi NTYzOGNiNTVhODRiNTVhODRiNTRhNzNhNTRhNzM5YzQyNjM5NDM5NjM4YzM5NWE4NDM5NWE4NDM5 NWE3YjM5NWE3YjM5NTI3MzM5NTI3YjM5NTI3MzM5NTI3YjMxNGE2YjMxNGE2YjIxMzk1YTIxMzk1 Mg0KMTgzMTRhMjkzOTUyMjkzOTUyMzEzOTUyMjkyOTM5MjkyOTMxNDI0MjRhNWE1YTYzN2I3Mzdi OGM4NDhjNjM1YTVhMjEyMTIxMDgwODA4MTgxMDEwMTAxMDEwMTgxODE4MTAxMDEwMTgxODE4MTgx MDEwMTgxODE4MTgxMDEwMTgNCjE4MTgxODE4MTgxODE4MTgxODEwMTAxODE4MTgxODE4MTgyMTE4 MTgxODE4MTgxODE4MTgyMTIxMjEyMTIxMjExODE4MTgyMTIxMjEyMTIxMjEyMTIxMjExMDEwMTAx MDEwMTAxODEwMTgyMTE4MTgxODE4MTgyMTIxMjEyMTIxDQoyMTI5MjkyOTI5MjEyMTI5MjkyOTI5 MjEyMTMxMjkyOTMxMjkyOTMxMzEzMTMxMjkyOTMxMzEzMTI5MjkyOTI5MzEzMTIxMjkyOTI5MzEz MTI5MjkzMTMxMzk0MjM5NDI0YTUyNWE2MzYzNmI3MzczN2I4YzYzNzM3YjYzN2I4NA0KNjM3Mzdi NjM3Mzg0NWE2YjdiNjM3Mzg0NWE2YjdiNjM3Mzg0NWE2YjdiNjM3Mzg0NWE2YjdiNWE2YjdiNWE2 YjczNjM2YjdiNWE2YjczNjM2YjczNjM2MzZiNjM2MzZiNWE1YTYzNWE1YTYzNTI1YTVhNTI1YTVh NGE1MjUyNTINCjUyNTI5Y2FkYjU5Y2FkYWQ5Y2FkYWQ5Y2FkYWRhNWFkYWQ5Y2FkYWQ5Y2FkYWQ5 Y2E1YWQ5Y2FkYWQ5Y2E1YWRhNWFkYWQ5Y2E1YWRhNWFkYWQ5Y2E1YWRhNWFkYWQ5Y2E1YWQ5Y2Fk YWQ5Y2FkYTU5Y2FkYWQ5Y2FkYTVhNWFkDQphZDljYWRhZGE1YWRhZDljYWRhNWE1YWRhZDljYWRh NTljYWRhZDljYWRhNWE1YWRhZDljYWRhNTljYWRhZDljYTVhNTljYWRhZDljYTVhZDljYWRhZDlj YTVhNWE1YWRhZGFkYjVhZGJkYmRiZGJkYzZiNWJkYzZiZGJkYzZiNQ0KYmRjNmJkYmRjNmJkYmRj ZWM2YmRjNmJkYmRjZWM2YmRjNmJkYzZjZWM2YmRjNmM2YmRjNmM2YjVjNmJkYmRjZWM2YmRjZWM2 Y2VjZWNlY2VjZWNlY2VkNmQ2Y2VkNmNlZDZkNmQ2Y2VkNmNlZDZkZWQ2ZDZkZWQ2ZGVkZWQ2ZDYN CmRlZDZkZWU3ZGVkNmRlZDZkZWRlZGVkNmRlZDZkZWU3ZGVkNmRlZGVkZWU3ZGVkNmRlZGVkZWU3 ZGVkNmRlZGVkZWU3ZGVkNmRlZDZkZWU3ZGVkNmRlZDZkNmRlZGVkNmRlZDZkZWU3ZDZkNmRlZDZk NmU3ZDZkNmRlZDZkNmU3DQpkZWQ2ZGVkNmQ2ZTdkZWQ2ZGVkNmRlZTdkZWRlZTdkZWRlZTdlN2I1 Y2VjZThjYTViNTZiOGNhNTYzOGNiNTVhODRiNTVhOGNiNTVhODRiNTUyN2JhZDRhNzNhNTUyNzNh NTRhNmI5NDRhNmI5NDQyNmI4YzQyNWE4NDM5NWE4NA0KMzk1YTdiMzE0YTczMzE1MjczMzE0YTcz Mzk1MjczMjk0YTZiMzE0YTYzMjEzOTUyMTgzMTQyMTAyOTM5MTgyOTQyMjEyOTQyMjkzMTQyMjky OTM5MjkzMTQyMjkyOTM5NTI1MjVhN2I3YjdiOGM4NDhjNWE1YTVhMjkyMTIxMDANCjAwMDAxODE4 MTgxMDEwMTAxODE4MTgxMDEwMTAxODE4MTgxODE4MTgxODE4MTgxODE4MTgxODE4MTgxODE4MTgx ODE4MTgxODE4MTgyMTE4MTgxODE4MTgyMTE4MTgxODE4MTgyMTIxMjExODE4MTgyMTIxMjEyMTIx MjEyOTI5DQoyOTIxMjEyMTE4MTgxODEwMTAxMDIxMTgxODE4MTgxODIxMjEyMTIxMTgyMTI5MjEy OTI5MjEyMTI5MjkyOTI5MjEyMTMxMjkyOTI5MjkyOTMxMzEzMTI5MjkyOTI5MjkyOTIxMjEyOTI5 MjkzMTIxMjkzMTI5MjkzMTMxMzk0Mg0KNTI1YTYzNmI3MzdiN2I4NDhjNzM3Yjg0NmI3Mzg0NWE2 YjczNmI3YjhjNjM3Yjg0NjM3Yjg0NWE3Mzg0NjM3Mzg0NWE3Mzg0NjM3Mzg0NWE2Yjg0NjM3Mzg0 NjM2Yjg0NjM3Mzg0NWE2YjdiNjM3MzdiNWE2YjczNjM3MzczNjMNCjZiNzM2MzZiNzM2MzYzNmI2 MzYzNmI1YTVhNjM1YTVhNjM1MjVhNWE1MjVhNWE1MjUyNTI5Y2FkYWQ5Y2FkYWQ5Y2FkYWQ5Y2Fk YWQ5Y2E1YWQ5Y2FkYWQ5Y2E1YWQ5Y2FkYWQ5Y2E1YTU5Y2FkYWQ5Y2E1YWRhNWFkYWQ5Y2E1DQph NTljYWRhZDljYTVhZGE1YWRhZDljYTVhNTljYWRhZDljYTVhNTljYWRhZDljYTVhNTljYWRhZDlj YWRhZDljYWRhZDljYTVhNTljYWRhZDljYWRhNTljYWRhZDljYTVhNTljYWRhZDljYWRhNTljYWRh ZDljYTVhZDljYWRhZA0KOWNhNWE1OWNhZGE1YTVhZGE1YWRiNWFkYjViZGI1YmRjNmJkYjViZGI1 YmRjNmJkYmRjNmJkYmRjNmJkYjVjNmJkYmRjNmJkYjVjNmJkYmRjNmM2YmRjNmM2YmRjNmM2YjVj NmJkYmRjNmM2YjVjNmJkYmRjZWM2YzZjZWM2Y2UNCmQ2Y2VjZWQ2Y2VjZWQ2ZDZjZWQ2ZDZkNmRl ZDZjZWQ2ZDZkNmRlZDZkNmRlZDZkNmRlZGVkNmRlZDZkNmRlZGVkNmRlZGVkNmRlZGVkNmRlZGVk NmRlZGVkNmRlZGVkZWU3ZGVkNmRlZGVkNmRlZGVkNmRlZGVkNmRlZGVkNmRlDQpkNmQ2ZGVkZWQ2 ZGVkZWQ2ZGVkZWQ2ZGVkNmQ2ZTdkNmQ2ZGVkNmQ2ZTdkZWNlZGVkNmQ2ZTdkZWQ2ZGVkNmRlZTdk ZWQ2ZGVjZWU3ZWZlN2NlZGVkZWE1YjViZDdiOTRhNTZiOTRhZDYzOGNiNTYzOTRiZDVhOGNiZDYz OGNjNg0KNjM4Y2JkNjM4Y2JkNWE4NGI1NWE4NGFkNTI3M2E1NTI3M2E1NGE2Yjk0NGE2Yjk0NDI1 YTg0MzE1MjczMjk0MjZiMjk0YTZiMjk0MjZiMzE0YTZiMjk0MjVhMjk0MjUyMTgzMTQyMTAyOTM5 MTAyMTMxMTgyMTM5MTgyOTM5MjkNCjMxNDIyMTI5MzkyMTIxMzEyMTIxMzE0MjQyNGE2YjZiNzM3 YjdiN2I1MjRhNGExODE4MTgxMDEwMDgxMDEwMTAxMDEwMTAxODEwMTAxMDEwMTAxODE4MTgxODEw MTAxODE4MTgxMDEwMTAxODE4MTgxODEwMTAxODE4MTgxODEwDQoxMDE4MTgxODE4MTgxODE4MTgx ODE4MTgxODIxMjEyMTE4MTgxODIxMjEyMTIxMjEyMTIxMjEyMTE4MTgxODE4MTgxODE4MTAxMDIx MTgxODE4MTgxODIxMjEyMTIxMjEyMTI5MjEyMTI5MjEyMTI5MjkyOTI5MjkyOTI5MzEyOQ0KMjky OTI5MjkyOTI5MjEyMTI5MjkzMTMxMzEzOTM5NDI0MjRhNWE2MzYzNjM2YjczNjM2YjczNmI3Mzdi NjM2YjdiNmI3Mzg0NjM2YjdiNjM3Mzg0NWE3Mzg0NWE3Yjg0NWE3Mzg0NWE3Mzg0NWE2Yjg0NWE3 Mzg0NTI2YjdiNWENCjZiODQ1YTZiODQ2MzczODQ1YTZiN2I2MzczN2I1YTZiNzM1YTZiNzM1YTZi NmI2MzZiNzM2MzYzNmI2MzYzNmI2MzYzNjM2MzYzNjM1MjVhNWE1MjVhNWE1MjUyNTI1MjUyNTJh NWFkYjU5Y2FkYWRhNWFkYjU5Y2FkYWQ5Y2FkDQphZDljYWRhZDljYWRiNTljYWRhZDljYWRhZDlj YWRhZGE1YWRhZDljYWRhZGE1YWRhZDljYWRhZGE1YWRhZDljYWRhZDljYWRhZDljYWRhNWE1YWRh ZDljYWRhZGE1YWRhZDljYWRhZGE1YWRhZDljYWRhZDljYWRhZDljYWRhZA0KYTVhZGFkOWNhZGFk OWNhZGFkOWNhZGFkYTVhZGFkOWNhZGFkYTVhZGFkOWNhNWFkOWNhZGFkOWNhZGE1YTVhZGFkYWRi NWI1YmRjNmJkYmRjNmJkYmRjNmJkYmRjNmJkYmRjNmJkYmRjNmJkYmRjNmM2YmRjNmJkYmRjZWM2 YmQNCmM2YzZjNmNlYzZiZGM2YzZiZGM2YzZiNWM2YmRiZGM2YzZiZGM2YzZjNmQ2Y2VjZWQ2Y2Vk NmQ2ZDZjZWQ2ZDZkNmRlZDZkNmRlZDZkNmRlZGVkNmRlZDZkZWRlZGVkNmRlZGVkZWU3ZGVkNmRl ZGVkZWU3ZTdkNmRlZGVkZWU3DQpkZWQ2ZGVkZWRlZTdlN2Q2ZGVkZWRlZTdkZWQ2ZGVkZWRlZTdk ZWQ2ZGVkZWRlZGVkZWQ2ZGVkZWRlZGVkZWQ2ZGVkNmRlZTdkNmQ2ZGVkNmRlZTdkNmQ2ZGVkNmQ2 ZTdkZWNlZGVkZWQ2ZTdkZWQ2ZGVkZWNlZDZkNmRlZWZlZg0KYzZkNmRlOGM5Y2FkNzM5NGE1NzM5 NGI1NzM5Y2M2NzNhNWNlNzM5Y2NlNmI5Y2NlNzNhNWQ2NzM5Y2NlNzM5Y2NlNjM4Y2I1NWE4NGFk NTI3M2E1NWE4NGFkNWE3YmE1NTI2YjljMzE1MjdiMjk0MjczMjE0MjZiMjk0YTczMjkNCjQyNmIz MTRhNjMyOTQyNTIyMTM5NGExODMxNDIyMTMxNGExODI5NDIxODI5NDIxMDE4MzExODIxMzEyMTI5 MzkyMTI5MzkxMDEwMjEzMTMxMzk2MzYzNjM3MzczNzM1MjUyNTIxMDEwMTAxMDEwMTAxODEwMTgx MDEwMTAxODE4DQoxODE4MTAxMDE4MTgxODE4MTgxODE4MTgxODE4MTAxMDE4MTgxODE4MTgxODE4 MTgxODE4MTgxODE4MTgxODE4MTgxODIxMjEyMTE4MTgxODIxMjEyMTIxMjEyMTIxMjEyMTIxMjEy MTIxMjEyMTE4MTgxODE4MTgxODE4MTgxOA0KMjEyMTIxMjEyMTIxMjkyMTI5MjEyMTI5MjkyOTI5 MjEyMTI5MjEyMTI5MjEyMTI5MjkyOTMxMjkyOTMxMzEzOTQyNDI0YTUyNjM2YjczNmI3Yjg0NmI3 Yjg0NmI3Yjg0NzM4NDhjNmI3Yjg0NmI3YjhjNjM3Mzg0NmI3YjhjNjMNCjdiODQ1YTczODQ1Mjcz N2I1YTczODQ1MjczODQ1YTczODQ1YTZiODQ2MzczOGM1YTZiODQ2MzczODQ1YTZiODQ2MzczODQ1 YTZiN2I2MzczN2I1YTZiNzM2MzczNzM2MzZiNzM2MzZiNmI2MzYzNmI2MzYzNmI1YTVhNjM1YTVh DQo2MzUyNTI1YTUyNWE1YTUyNTI1MjljYWRhZDljYjVhZDljYWRhZDljYWRhZDljYWRhZDljYWRh ZDljYWRhZDljYWRhZDk0YWRhZDljYWRhZDk0YWRhNTljYWRhZDk0YWRhZDljYWRhZDk0YWRhNTlj YWRhZDljYWRhNTljYWRhZA0KOWNhZGE1OWNhZGFkOWNhZGFkYTVhZGFkOWNhZGFkOWNhZGFkOWNh ZGFkYTVhZGFkOWNhZGFkOWNhZGFkOWNhZGFkOWNhZGFkOWNhNWE1OWNhZGFkOWNhZGFkOWNhZGFk OTRhZGE1OWNhZGFkYTVhZGFkYWRiNWI1YjViNWI1YmQNCmJkYmRiZGJkYmRiZGM2YmRiZGJkYjVi ZGM2YmRiZGJkYmRiZGM2YmRiZGM2YmRiZGM2YzZiZGM2YmRjNmM2YzZiZGM2YmRiZGM2YzZiZGM2 YmRjNmNlYzZjNmNlYzZjZWQ2Y2VjZWQ2ZDZkNmRlZDZjZWQ2ZDZkNmRlZDZkNmRlDQpkNmRlZGVk ZWQ2ZGVkNmRlZGVkZWRlZGVkZWRlZTdkZWQ2ZGVkZWRlZTdkZWRlZGVkZWRlZTdkZWQ2ZGVkZWRl ZTdkZWRlZGVkZWRlZTdkZWQ2ZGVkZWRlZTdkZWQ2ZGVkZWRlZTdkZWQ2ZGVkZWRlZTdkZWQ2ZGVk NmQ2ZTdkNg0KZDZkZWNlZDZlN2RlZDZkZWRlZDZlN2U3Y2VkZWRlY2VlN2U3ZDZlN2Y3YzZkZWVm OWNiNWNlN2I5Y2I1NmI4Y2FkN2I5Y2JkN2JhNWM2ODRhNWQ2NzM5Y2NlN2JhNWQ2NzM5Y2NlNzM5 Y2NlNmI5Y2M2NzM5Y2M2NjM4Y2JkNjMNCjg0YjU2Mzg0YjU1YTg0YWQ0YTZiOWM0MjYzOGMzMTUy N2IyOTRhN2IyMTQyNzMyOTRhNzMzMTRhNmIzMTRhNjMyOTM5NWEyOTM5NWEyMTMxNGExODI5NDIx MDIxMzExODIxMzkxODIxMzkyMTI5MzkxODIxMzEyMTIxMzExODIxDQoyOTI5MzEzOTQyNGE0YTYz NjM2YjM5NDI0YTA4MDgxMDAwMDAwMDE4MTgyMTEwMTAxODEwMTAxMDE4MTgxODE4MTgxODE4MTAx MDE4MTgxODE4MTAxMDE4MTgxODEwMTAxODE4MTgxODEwMTAxODE4MTgxODE4MTgxODE4MTgxOA0K MTgxMDEwMjEyMTIxMjEyMTIxMjEyMTIxMTgxODE4MjEyMTIxMjEyMTIxMTgxODIxMTAxMDE4MjEy MTI5MjEyMTI5MjEyMTMxMTgxODI5MTgyMTMxMDgxMDIxMTgyMTMxMjkzOTRhNDI1MjYzNTI2Mzcz NjM3Mzg0NjM3Mzg0NjMNCjdiOGM1YTczODQ2MzdiODQ1YTczODQ1YTdiODQ1YTczODQ1YTdiODQ1 YTczODQ1YTczODQ1YTczODQ1YTczODQ1MjczODQ1YTczODQ1YTZiN2I1YTczODQ1YTZiN2I1YTcz ODQ1YTZiN2I2MzczODQ1YTZiN2I2MzczN2I1YTZiDQo3YjYzNzM3YjVhNmI3MzYzNmI3MzYzNjM2 YjYzNmI2YjVhNjM2MzVhNjM2MzUyNWE1YTUyNWE1YTRhNTI1MjUyNTI1MjljYjViNTljYWRhZDlj YjViNTljYWRhZDljYjViNTljYWRhZDljYjVhZDk0YWRhZDljYjVhZDk0YWRhZA0KOWNhZGFkOTRh ZGFkOWNiNWFkOTRhZGFkOWNhZGFkOWNhZGFkOWNhZGFkOWNhZGFkYTVhZGFkOWNhZGFkYTVhZGFk OWNhZGFkYTVhZGFkOWNhZGFkYTViNWFkOWNhZGFkYTVhZGFkOWNhZGFkYTVhZGFkOWNhZGFkOWNh ZGFkOWMNCmFkYWQ5Y2I1YWQ5Y2FkYWQ5Y2FkYWQ5Y2FkYWRhNWI1YjVhZGI1YjViNWJkYmRiNWJk YmRiZGM2YmRiZGJkYmRiZGM2YmRiZGJkYmRiZGM2YmRiZGM2YmRjNmM2YzZiZGM2YmRjNmNlYzZi ZGM2YzZjNmNlYzZiZGM2YmRjNmNlDQpjNmM2Y2VjNmNlZDZjZWNlZDZjZWQ2ZGVkNmQ2ZGVkNmQ2 ZGVkNmQ2ZGVkNmRlZGVkZWQ2ZGVkZWRlZTdkZWQ2ZGVkZWRlZTdkZWRlZTdkZWRlZTdkZWRlZGVk ZWRlZTdkZWRlZTdkZWRlZTdkZWRlZGVkZWRlZTdkZWRlZTdkZQ0KZGVlN2RlZGVkZWRlZGVlN2Rl ZGVkZWRlZGVlN2RlZDZkZWQ2ZGVlN2Q2ZGVlN2Q2ZGVlN2RlZDZkZWQ2ZDZlN2U3Y2VlN2U3ZDZl N2VmYzZkZWVmYzZkZWVmYTViZGQ2OGNhNWM2N2I5NGJkN2I5Y2JkN2I5Y2M2ODRhNWNlODQNCmE1 ZDY3YmE1ZDY3YmE1ZDY3YmE1ZDY3YmE1Y2U3YmE1ZDY3YmE1Y2U3MzljY2U2MzhjYmQ2Yjk0YzY2 MzhjYjU1YTg0YWQ0YTZiOWM0MjYzOTQzMTUyODQyOTRhN2IyOTRhNzMzMTRhNzMyOTQyNjMzMTQy NjMyOTQyNWEyOTM5DQo1MjE4Mjk0MjE4Mjk0MjE4Mjk0MjIxMjk0MjE4MjkzOTIxMjkzOTE4MjEz MTE4MjEzMTE4MjEyOTMxMzE0MjM5NDI0YTRhNTI1YTM5NDI0YTEwMTAxODAwMDAwMDE4MTgxODE4 MTAxODEwMTAxMDE4MTgxODIxMTgxODE4MTAxOA0KMTgxODE4MTgxODE4MTgxODE4MTgxODE4MTgx ODIxMTAxODE4MjEyMTIxMTgyMTE4MjEyMTIxMjEyMTIxMjkyOTIxMjEyMTE4MjEyMTIxMjEyMTE4 MTgxODE4MTgxODIxMjEyOTI5MTgyMTI5MTAxODIxMDgxMDE4MTgyMTMxMjkNCjMxNGE0MjUyNmI0 MjUyNmI1MjYzN2I1YTczODQ2MzdiOTQ2MzdiOTQ2MzdiOGM1YTdiOGM1YTdiOGM1YTdiODQ1YTdi OGM1MjczODQ1YTdiOGM1MjczODQ1YTdiODQ1MjczODQ1YTdiOGM1YTczODQ1YTczODQ1YTczODQ1 YTczDQo4NDVhNzM4NDVhNzM4NDVhNzM3YjYzNzM4NDVhNzM3YjYzNzM4NDVhNzM3YjYzNzM3YjVh NmI3YjYzNmI3YjYzNmI3MzYzNmI3MzYzNjM2YjYzNmI2YjVhNjM2MzVhNjM2MzUyNWE1YTUyNWE1 YTUyNTI1MjljYWRhZDljYjVhZA0KOWNhZGFkOWNiNWFkOTRhZGFkOWNhZGFkOTRhZGFkOWNhZGFk OTRhZGE1OWNhZGFkOTRhZGFkOWNhZGFkOTRhZGE1OWNhZGFkOTRhZGFkOWNhZGFkOTRhNWE1OWNh ZGFkOWNhZGFkOWNhZGFkOWNhZGE1OWNhZGFkOWNhZGFkYTUNCmFkYWQ5Y2FkYWQ5Y2FkYWQ5Y2Fk YWQ5Y2FkYWQ5Y2FkYTU5Y2FkYWQ5Y2FkYTU5Y2FkYWQ5Y2FkYTU5Y2FkYWQ5Y2FkYTU5Y2FkYWQ5 Y2FkYWRhZGI1YjViNWJkYjViZGJkYmRiZGJkYjViZGM2YmRiZGJkYmRiZGM2YmRiNWJkDQpiNWJk YzZiZGJkYzZiZGJkYzZiZGJkYzZiZGM2YzZjNmJkYzZiZGM2Y2VjNmJkYzZiZGM2Y2VjNmNlY2Vj ZWQ2ZDZkNmQ2ZDZkNmQ2ZGVkNmQ2ZGVkNmQ2ZGVkZWQ2ZGVkNmRlZGVkZWQ2ZGVkNmRlZTdkZWRl ZGVkZWRlZTdkZQ0KZGVkZWRlZGVlN2RlZGVkZWRlZGVlN2RlZGVkZWRlZGVlN2RlZGVkZWRlZGVl N2RlZGVkZWRlZGVlN2RlZDZkZWRlZGVlN2RlZDZkZWRlZGVlN2RlZDZkZWQ2ZGVlN2RlZGVlN2Q2 ZDZlN2RlY2VkZWRlZDZlN2VmY2VlN2VmYzYNCmRlZWZhZGM2ZDY4Y2E1YzY3Mzk0YjU3YjljYzY3 YmE1YzY3YjljYzY3YjljYzY4NGFkZDY3YmE1Y2U3YmFkZDY3YmE1ZDY3YmE1ZDY3YmE1Y2U3YmE1 ZDY3MzljYzY2Yjk0YzY2YjhjYmQ2Yjk0YmQ2MzhjYjU1YTg0YWQ0YTZiDQo5YzM5NWE4YzMxNTI4 NDMxNTI3YjI5NDI2YjI5NGE2YjI5NDI2MzMxNDI2MzIxMzk1YTE4MzE0YTE4Mjk0YTIxMzE0YTE4 Mjk0MjE4Mjk0MjIxMjkzOTIxMjkzOTE4MjEyOTE4MjEyOTE4MTgyOTIxMjkzMTQyNDI1MjVhNWE2 Mw0KMzEzMTM5MDAwMDA4MDAwMDA4MTAxMDEwMTAwODEwMTgxODE4MTgxMDEwMTgxODE4MTgxMDEw MTgxODE4MTgxMDEwMTgxODE4MTgxMDE4MTgxODE4MTgxODE4MjEyMTE4MjExODE4MjExODE4MjEx ODE4MjkyMTIxMjEyMTIxMjkNCjIxMjExMDEwMTAxMDEwMTgwODEwMTgxODIxMjkyMTI5MzkzOTRh NTI1MjVhNmI2MzczODQ2MzczOGM2MzdiOTQ2MzdiOTQ2Yjg0OTQ2MzdiOTQ2MzdiOTQ1YTczOGM1 YTdiOGM1YTczODQ1YTdiOGM1MjczODQ1YTdiOGM1MjczDQo4NDVhN2I4NDUyNzM4NDVhN2I4NDUy NzM4NDVhNzM4NDVhNzM4NDVhNzM4NDVhNmI3YjVhNzM4NDVhNzM3YjVhNzM4NDVhNmI3YjYzNzM4 NDVhNzM3YjYzNzM4NDVhNmI3YjVhNmI3YjVhNmI3MzYzNmI3MzVhNjM2YjYzNmI2Yg0KNWE2MzYz NWE2MzYzNTI1YTVhNTI1YTVhNTI1MjUyNTI1YTUyOWNiNWI1OWNhZGFkOWNiNWI1OWNhZGFkOWNi NWFkOWNhZGFkOWNiNWI1OWNhZGFkOWNhZGFkOTRhZGFkOWNiNWFkOTRhZGFkOWNhZGFkOTRhZGFk OWNiNWFkOWMNCmFkYWQ5Y2FkYWQ5Y2FkYWRhNWFkYWQ5Y2FkYWRhNWFkYWQ5Y2FkYWRhNWI1YWQ5 Y2FkYWRhNWFkYWQ5Y2FkYWRhNWI1YWQ5Y2FkYWRhNWFkYWQ5Y2FkYWRhNWFkYWQ5Y2FkYWQ5Y2Fk YWQ5Y2FkYWQ5Y2FkYWQ5Y2FkYWRhNWI1DQpiNWFkYjViNWI1YmRiZGJkYmRiZGJkYzZiZGJkYmRi ZGJkYzZiZGJkYmRiZGJkYzZiZGJkYzZiZGM2YzZjNmJkYzZiZGM2Y2VjNmJkYzZjNmM2Y2VjNmM2 YzZjNmM2Y2VjNmM2Y2VjNmNlZDZkNmNlZDZkNmQ2ZGVkZWQ2ZGVkNg0KZGVkZWRlZDZkZWRlZGVl N2RlZGVkZWRlZGVlN2RlZGVlN2RlZGVlN2U3ZGVlN2RlZTdlN2U3ZGVlN2RlZGVlN2U3ZGVlN2Rl ZTdlN2U3ZGVlN2RlZGVlN2U3ZGVlN2RlZGVlN2U3ZGVlN2RlZGVlN2RlZGVkZWRlZGVlN2RlZGUN CmU3ZGVkZWU3ZDZkZWU3ZDZkZWU3ZGVkNmRlZGVkZWU3ZTdkNmVmZWZjZWU3ZWZhZGM2ZGU5Y2I1 Y2U4NDljYmQ3YjljYmQ4NGE1YzY4Y2FkZDY3YmE1Y2U4NGE1ZDY3YmE1ZDY3YmE1ZDY3YmE1ZDY4 NGFkZDY3YmE1Y2U3YmE1DQpjZTczOWNjNjczOTRjNjYzOGNiNTZiOGNiZDZiOGNiZDczOTRjNjYz OGNiNTVhN2JhZDRhNmI5YzQyNjM5NDM5NjM4YzM5NWE4NDMxNTI3MzMxNTI3MzI5NDI2YjI5NDI2 MzIxMzk1YTIxMzk1MjIxMzE0YTIxMzE0YTE4Mjk0Mg0KMjEzMTQyMjEzMTQyMjkzMTM5MTgyMTMx MTgyMTMxMTgyMTI5MjkzMTM5MzEzOTQyNGE1MjVhMzEzMTM5MDAwMDA4MDAwMDAwMjEyMTIxMTgx ODE4MTgxODE4MTgxMDEwMjExODE4MTgxODE4MjExODE4MTgxODE4MjExODE4MTgNCjE4MTgyMTE4 MTgyMTE4MTgyMTE4MTgxODEwMTAyMTIxMTgyOTI5MjEzMTMxMjkyOTI5MjkyOTMxMzEyOTI5Mjkz MTM5NDI0MjUyNWE2MzczN2I3MzdiOGM3Mzg0OTQ2YjdiOGM2YjdiOTQ2MzdiOTQ2YjdiOTQ2Mzdi OGM2MzdiDQo5NDVhNzM4YzYzN2I4YzVhN2I4YzYzN2I4YzVhNzM4YzVhN2I4YzVhN2I4YzVhN2I4 YzVhNzM4NDVhN2I4YzVhN2I4NDVhN2I4YzVhNzM4NDYzN2I4YzVhNzM4NDVhNzM4NDVhNzM4NDYz NzM4NDVhNzM4NDYzNzM4NDVhNzM3Yg0KNjM3Mzg0NjM3MzdiNjM3MzdiNWE2YjdiNjM3MzdiNjM2 YjczNjM2YjczNjM2MzZiNjM2YjZiNWE2MzYzNWE2MzYzNTI1YTVhNTI1YTVhNTI1MjUyOWNhZGFk OWNiNWI1OTRhZGFkOWNhZGI1OTRhZGFkOWNhZGI1OTRhZGFkOWMNCmFkYWQ5NGFkYWQ5Y2FkYWQ5 NGFkYWQ5Y2FkYWQ5NGFkYWQ5Y2FkYWQ5NGFkYWQ5Y2FkYWQ5Y2E1YWQ5Y2FkYWQ5Y2E1YWQ5Y2Fk YWQ5Y2FkYWQ5Y2FkYWQ5Y2FkYWQ5Y2FkYWQ5Y2FkYWQ5Y2FkYWQ5Y2FkYWQ5Y2FkYWQ5Y2FkDQph ZDljYWRhZDk0YTVhZDljYWRhZDk0YWRhNTljYWRhZDk0YWRhNTljYWRhZGE1YWRhZGFkYjViNWI1 YjViNWJkYmRiZGJkYmRiNWJkYzZiZGI1YmRiNWJkYmRiZGI1YmRiNWJkYzZiZGJkYmRiZGJkYzZi ZGJkYzZiZGM2Y2VjNg0KYmRjNmJkYzZjZWM2YzZjNmM2Y2VjZWNlY2VkNmNlZDZkZWQ2ZDZkZWQ2 ZGVkZWRlZDZkZWQ2ZGVkZWRlZDZkZWRlZGVlN2RlZGVkZWRlZGVlN2RlZGVlN2RlZGVlN2U3ZGVl N2RlZGVlN2RlZGVlN2RlZGVlN2U3ZGVlN2RlZGUNCmU3ZGVkZWU3ZGVkZWU3ZTdkZWRlZGVkZWU3 ZGVkZWU3ZGVkZWU3ZGVkZWRlZGVkZWU3ZGVkZWU3ZDZkZWU3ZGVkNmRlZDZkNmU3ZGVkZWU3ZWZk NmVmZjdiNWNlZGU5Y2I1Y2U3YjljYjU4NGE1YmQ3YjljYzY3YmE1Y2U3YmE1DQpjZTg0YWRkNjdi YTVkNjdiYTVkNjczOWNjZTdiYTVkNjdiYTVkNjdiYTVkNjczOWNjZTczOWNjZTZiOGNiZDYzOGNi ZDYzODRiNTZiOGNiZDZiOGNiZDZiOGNiZDYzODRiNTVhN2JhZDRhNmI5YzRhNmI5YzRhNmI5NDQy NjM4Yw0KMzE1MjdiMzE0YTczMjk0MjZiMjk0MjZiMjEzMTVhMTgzMTUyMTgzMTRhMjEzMTRhMjEz MTQyMjkzMTRhMjEzMTQyMjEyOTM5MTgyMTMxMjEyOTMxMTAxODI5MTgyMTI5Mzk0MjRhNGE0YTUy MTgxODIxMDgwMDA4MTAxMDEwMTgNCjE4MTgxODEwMTAxODE4MTAxODEwMTAxODE4MTgxODEwMTAy MTE4MTgxODEwMTAxODE4MTgyMTE4MTgyMTIxMjEyMTE4MTgyMTE4MTgyMTIxMTgyOTI5MjkyMTIx MjExODE4MTgxMDEwMTg0MjRhNGE3MzdiODQ5NDljYTU4NDk0DQphNTdiOGM5NDYzN2I4YzYzN2I4 YzYzN2I4YzYzN2I5NDVhNzM4YzYzN2I4YzVhNzM4YzYzN2I5NDYzN2I4YzYzODQ5NDVhN2I4YzVh N2I4YzVhNzM4NDVhN2I4YzVhNzM4NDVhN2I4YzUyNzM4NDVhN2I4YzVhNzM4NDVhN2I4Yw0KNWE3 Mzg0NWE3Mzg0NWE3Mzg0NWE3Mzg0NWE3Mzg0NjM3Mzg0NWE3MzdiNjM3Mzg0NWE3MzdiNjM3Mzg0 NWE2YjdiNjM3MzdiNWE2YjczNjM2YjczNjM2MzZiNjM2YjZiNWE2MzYzNWE2MzYzNTI1YTVhNTI1 YTVhNGE1MjUyNTINCjUyNTI5Y2I1YjU5Y2FkYWQ5Y2I1YjU5Y2FkYWQ5Y2I1YjU5Y2FkYWQ5Y2I1 YjU5NGFkYWQ5Y2FkYjU5NGFkYWQ5Y2FkYWQ5NGFkYWQ5Y2FkYjU5NGFkYWQ5Y2FkYWQ5NGFkYWQ5 Y2FkYWQ5Y2FkYWQ5Y2FkYWQ5Y2FkYWQ5Y2FkDQpiNTljYWRhZDljYWRiNTljYWRhZGE1YWRiNTlj YWRhZDljYWRiNTljYWRhZDljYWRiNTljYWRhZDljYWRhZDljYWRhZDljYWRhZDljYWRhZDljYWRh ZDljYWRhZGE1YjViNWFkYjViNWI1YmRiZGI1YmRiZGJkYzZiZGJkYmRiZA0KYmRjNmJkYmRiZGI1 YmRjNmJkYmRjNmJkYmRjNmJkYmRjNmJkYzZjZWM2YzZjNmM2YzZjZWM2YzZjNmM2Y2VjZWNlY2Vj ZWNlZDZkNmQ2ZDZkZWQ2ZGVlN2RlZDZkZWRlZGVlN2RlZGVkZWRlZGVlN2U3ZGVlN2RlZTdlN2U3 ZGUNCmU3ZGVlN2VmZTdkZWU3ZGVlN2U3ZTdkZWU3ZGVlN2VmZTdkZWU3ZGVlN2U3ZTdkZWU3ZGVl N2VmZTdkZWU3ZGVlN2U3ZTdkZWU3ZGVlN2U3ZTdkZWU3ZGVkZWU3ZTdkZWU3ZGVlN2VmZGVkZWU3 ZDZkZWU3ZGVkNmU3ZTdkZWVmDQplZmM2ZDZlN2E1YmRkNjhjYTViZDczOTRiNTczOWNiZDdiYTVj ZTczOWNjNjdiYTVjZTdiYTVkNjg0YWRkZTdiYTVkNjdiYTVkNjdiYTVkNjg0YWRkZTdiYTVkNjg0 YTVkNjdiYTVkNjdiYTVkNjczOTRjNjczOTRjNjZiOTRjNg0KNzM5NGM2NmI4Y2JkNmI4Y2JkNWE4 NGI1NWE3YmFkNTI3M2E1NWE3YmFkNGE3MzljNDI2Mzk0MzE1Mjg0MzE1MjdiMzE0YTczMjk0MjYz MTgzMTUyMjkzOTVhMjEzMTUyMjkzOTUyMjkzOTRhMjkzOTUyMjEyOTQyMjEyOTQyMjENCjI5Mzky MTI5MzkyMTI5MzkyMTI5MzEzMTMxMzk0MjRhNGExODE4MjEwMDAwMDAxMDEwMTAyMTE4MTgxODE4 MTAyMTE4MTgxODE4MTAyMTE4MTgxODE4MTgyMTE4MTgxODE4MTgyMTE4MTgxODE4MTgyMTIxMjEy MTIxMjEyOTIxDQoyMTE4MTgxODE4MTgxODE4MTgxODM5Mzk0MjYzNmI2Yjk0OWNhNTk0YTVhZDhj OWNhNTczODQ5NDZiODQ5NDZiODQ5NDZiODQ5YzYzN2I5NDZiN2I5NDYzN2I5NDZiN2I5NDYzN2I5 NDZiODQ5NDYzN2I5NDYzN2I5NDVhN2I4Yw0KNjM3YjhjNWE3YjhjNWE3YjhjNWE3YjhjNWE3Yjhj NWE3Yjg0NjM3YjhjNWE3YjhjNjM3YjhjNWE3Mzg0NjM3YjhjNWE3Mzg0NjM3Yjg0NWE3Mzg0NjM3 Mzg0NjM3Mzg0NjM3Mzg0NjM3MzdiNjM3Mzg0NWE2YjdiNjM3MzdiNjMNCjZiNzM2MzZiNzM2MzYz NmI2MzZiNmI1YTYzNjM1YTYzNjM1MjVhNWE1MjVhNWE1MjUyNTI5Y2FkYWQ5Y2FkYjU5Y2FkYWQ5 Y2I1YjU5NGFkYWQ5Y2FkYWQ5NGFkYWQ5Y2FkYWQ5NGFkYWQ5Y2FkYWQ5NGFkYWQ5Y2FkYWQ5NGFk DQphZDljYWRhZDk0YWRhZDljYWRhZDk0YTVhZDljYWRhZDljYWRhZDljYWRhZDljYTVhZDljYWRh ZDljYWRhZDljYWRhZDljYWRhZDljYWRhZDljYWRhZDljYWRhZDljYTVhZDljYWRhZDljYTVhZDlj YWRhZDk0YWRhNTljYWRhZA0KOWNhZGE1OWNhZGFkOWNhZGFkYWRiNWI1YjViZGI1YmRiZGJkYjVi ZGI1YmRiZGJkYjViZGI1YmRiZGJkYjViZGI1YmRjNmJkYmRjNmJkYmRjNmJkYmRjNmJkYzZjZWM2 YzZjNmM2YzZjZWM2YzZjZWM2Y2VkNmNlY2VkNmNlZDYNCmRlZDZkNmRlZDZkZWRlZGVkNmRlZGVk ZWU3ZGVkZWRlZGVkZWU3ZGVkZWU3ZGVlN2U3ZTdkZWU3ZGVkZWU3ZTdkZWU3ZGVlN2U3ZTdkZWU3 ZGVkZWU3ZTdkZWU3ZGVlN2U3ZTdkZWU3ZGVkZWU3ZTdkZWU3ZGVlN2U3ZTdkZWU3DQpkZWRlZTdk ZWRlZTdkZWRlZTdkZWRlZTdkZWRlZTdkZWQ2ZTdkZWRlZWZlN2M2ZDZkZWFkYzZjZThjYWRiZDg0 YTVjNjczOTRiZDczOWNjNjczOTRjNjczOWNjZTczOWNjZTczOWNkNjczOWNjZTdiYTVkNjczOWNj ZTdiYTVkNg0KODRhZGRlODRhZGRlN2JhNWQ2N2JhNWQ2N2I5Y2NlN2I5Y2NlNmI5NGM2NmI5NGM2 NjM4NGI1NjM4NGJkNjM4NGI1NjM4NGI1NWE3YmFkNTI3YmFkNTI3M2E1NTI3YmFkNGE3M2E1NDI2 Mzk0MzE1Mjg0MzE1MjdiMjk0MjZiMjENCjM5NjMxODMxNWEyMTM5NWEyMTM5NWEyOTQyNWEyOTMx NTIyMTMxNGExODI5NDIyMTMxNDIyMTI5NDIyOTMxNGExODIxMzEyMTI5MzE0MjQyNGEzOTM5NDIx MDEwMTAxMDA4MDgxODEwMTAxODE4MTgxODEwMTAyMTE4MTgxODEwDQoxMDIxMTgxODE4MTgxMDIx MTgxODE4MTAxMDE4MTAxODE4MTAxODIxMjEyMTE4MTAxMDE4MTgxODMxMzEzMTUyNTI1Mjk0OTQ5 YzljYTVhNTk0OWNhNTg0OTRhNTczODQ5NDZiODQ5NDYzN2I4YzVhN2I4YzYzN2I5NDYzN2I5NA0K NjM3Yjk0NjM3Yjk0NjM3YjhjNjM3Yjk0NjM3YjhjNjM3Yjk0NWE3MzhjNjM3YjhjNWE3YjhjNjM3 YjhjNWE3MzhjNWE3YjhjNWE3Yjg0NWE3YjhjNWE3Mzg0NjM3YjhjNWE3Mzg0NWE3YjhjNWE3Mzg0 NWE3Mzg0NWE3Mzg0NjMNCjdiODQ1YTczN2I2MzczODQ2MzczN2I2MzczODQ1YTZiN2I2MzczN2I1 YTZiN2I2MzZiN2I1YTYzNmI2MzZiNmI1YTYzNjM1YTYzNjM1MjVhNWE1MjVhNWE1MjUyNTI1MjVh NTI5Y2I1YjU5Y2FkYWQ5Y2I1YjU5Y2FkYWQ5Y2I1DQpiNTljYWRhZDljYjViNTljYWRhZDljYWRh ZDk0YWRhZDljYWRiNTk0YWRhZDljYWRhZDk0YWRhZDljYWRiNTk0YWRhZDljYWRhZDljYWRhZDlj YWRiNTljYWRhZDljYWRhZDljYWRhZGE1YWRiNTljYWRhZDljYWRiNTljYWRhZA0KYTVhZGI1OWNh ZGFkOWNhZGFkOWNhZGFkOWNhZGFkOWNhZGFkOWNhZGFkOWNhZGFkOWNhZGFkOWNhZGFkYTViNWI1 YWRiNWI1YjViZGJkYmRiZGJkYmRjNmJkYmRiZGI1YmRjNmJkYmRiZGJkYmRjNmJkYmRiZGJkYmRj NmJkYmQNCmM2YmRjNmNlYzZjNmM2YzZjNmNlYzZjNmNlYzZjZWNlY2VjZWNlY2VkNmRlZDZkNmRl ZDZkZWU3ZGVkZWRlZGVkZWU3ZGVkZWU3ZGVkZWU3ZTdkZWU3ZGVlN2VmZTdkZWU3ZTdlN2VmZTdk ZWU3ZGVlN2VmZTdkZWU3ZTdlN2VmDQplN2RlZTdkZWU3ZWZlN2RlZTdlN2U3ZWZlN2RlZTdkZWU3 ZWZlN2RlZTdkZWU3ZTdlN2RlZTdkZWU3ZTdlN2RlZTdkZWU3ZWZlN2Q2ZTdkZWRlZWZlN2Q2ZTdl ZmJkZDZkZTk0YWRiZDg0YTViZDg0YTVjNjhjYjVkNjczOWNjNg0KNmI5NGM2NzM5Y2NlN2JhNWQ2 NmI5NGM2NzM5Y2NlN2JhNWQ2NzM5Y2Q2N2JhNWQ2ODRhZGRlN2JhNWQ2N2JhNWQ2N2I5Y2NlN2Jh NWQ2NzM5Y2NlNzM5NGM2NjM4Y2JkNjM4NGI1NWE3YmFkNjM4NGI1NWE4NGI1NjM4NGI1NTINCjcz YWQ0YTczYTU1MjdiYWQ1YTg0YjU0YTczYTU0MjYzOTQzMTUyN2IzMTRhN2IyOTQyNmIyMTM5NWEy MTM5NWEyOTQyNjMzMTQyNjMzMTQyNWEyMTMxNGEyMTMxNGEyMTMxNGEyMTMxNDIxODI5MzkyOTMx NGEyOTMxMzkyOTMxDQozOTRhNGE1MjQyNDI0YTAwMDAwMDE4MTgxODE4MTAxMDIxMTgxODIxMTgx MDIxMTgxODE4MTgxMDIxMTgxODE4MTgxODI5MjEyMTIxMTgxODIxMTgxODIxMTgxODIxMTgxODI5 MjEyMTYzNjM2MzljYTVhNWE1YWRhZDljYTVhZA0KOTRhNWFkODQ5NDljN2I5NDljNzM4YzljNzM4 YzljNjM3Yjk0NjM3Yjk0NjM3Yjk0NjM3Yjk0NjM3Yjk0NmI4NDk0NjM3Yjk0NmI4NDk0NjM3Yjk0 NjM3Yjk0NjM3YjhjNjM3Yjk0NWE3YjhjNjM3YjhjNWE3YjhjNjM3YjhjNWENCjdiOGM2MzdiOGM1 YTdiOGM2MzdiOGM1YTczODQ2MzdiOGM1YTczODQ2MzdiOGM2MzczODQ2MzczODQ2MzczODQ2Mzdi ODQ2MzczODQ2MzczODQ1YTZiN2I2MzczN2I2MzZiNzM2MzZiNzM2MzYzNmI2MzZiNmI1YTYzNjM1 YTYzDQo2MzUyNWE1YTUyNWE1YTUyNTI1MjljYWRhZDljYWRiNTk0YWRhZDljYWRiNTljYWRhZDlj YWRiNTk0YWRhZDljYWRiNTk0YWRhZDljYWRiNTk0YWRhZDljYWRhZDk0YWRhZDljYWRiNTk0YWRh ZDljYWRhZDljYWRhZDljYWRiNQ0KOWNhZGFkOWNhZGI1OWNhZGFkOWNhZGI1OWNhZGFkOWNhZGI1 OWNhZGFkOWNhZGI1OWNhZGFkOWNhZGI1OWNhZGFkOWNhZGI1OTRhZGFkOWNhZGFkOWNhZGFkOWNh ZGFkOTRhZGE1OWNhZGFkOWNhZGFkYWRiNWI1YWRiNWI1YjUNCmJkYmRiNWJkYjViZGJkYmRiNWJk YjViZGJkYjViNWJkYjViZGM2YmRiZGJkYmRiZGM2YmRiZGM2YmRjNmM2YzZiZGM2YzZjNmNlYzZj NmNlYzZjZWQ2Y2VjZWQ2ZDZkZWRlZGVkNmRlZGVkZWU3ZGVkNmRlZGVkZWU3ZGVkZWU3DQpkZWU3 ZTdlN2RlZTdkZWU3ZTdlN2RlZTdlN2U3ZWZlN2RlZTdkZWU3ZWZlN2RlZTdlN2U3ZWZlN2RlZTdk ZWU3ZWZlN2RlZTdlN2U3ZWZlN2RlZTdkZWU3ZTdlN2RlZTdkZWU3ZTdlN2RlZTdkZWRlZTdlN2U3 ZWZlN2U3ZWZlZg0KZGVlZmY3Y2VkZWU3OTRhZGJkOGNhNWJkODRhNWM2N2I5Y2M2N2JhNWNlNzM5 Y2NlNmI5NGNlNzM5Y2NlNmI5NGNlNzM5Y2Q2NmI5NGNlNzM5Y2NlODRhZGRlN2JhNWQ2NmI5NGM2 NWE4NGI1NTI3M2FkNTI3M2FkNDI2YjljNDINCjYzOWMzOTVhOGMzMTVhOGMzMTUyODQ0MjZiOWM1 MjczYTU1MjczYWQ0YTZiOWM0YTZiOWM0MjYzOWM0MjZiYTU0MjZiOWM0YTZiOWMzOTYzOTQzOTVh ODQyOTRhNzMyOTRhNzMyMTQyNmIxODM5NWEyMTM5NWEzMTRhNmIyOTQyDQo2MzI5NDI2MzIxMzk1 MjIxMzE1MjI5Mzk1MjEwMjEzOTIxMzE0MjMxMzk0YTEwMTgyOTMxMzk0MjVhNWE2MzRhNGE1MjEw MTAxMDA4MDAwMDI5MjkyMTE4MTAxMDEwMDgwODE4MTgxMDIxMTgxODIxMTgxODI5MjEyMTA4MDAw MA0KMjExODE4MjkyOTI5MTAwODA4NjM2MzYzYjViZGJkYWRhZGFkOWNhNWFkOTRhNWE1ODQ5NDlj ODQ5NGE1NzM4YzljNmI4Yzk0NjM3YjhjNjM3Yjk0NjM3Yjk0NjM3YjljNjM3Yjk0NjM3Yjk0NjM3 Yjk0NjM3Yjk0NjM3Yjk0NjMNCjdiOTQ2MzdiOGM2MzdiOTQ2MzdiOGM2MzdiOTQ1YTdiOGM2Mzdi OGM1YTczODQ1YTdiOGM1YTczODQ2MzdiOGM1YTczODQ1YTdiOGM1YTczODQ2MzdiOGM1YTczODQ2 MzczODQ1YTczN2I2MzczODQ1YTczN2I2MzczODQ2MzczDQo3YjYzNzM3YjVhNmI3MzYzNmI3YjYz NjM2YjYzNmI2YjVhNjM2MzVhNjM2MzUyNWE1YTUyNWE1YTUyNTI1MjUyNWE1MjljYjViNTljYWRi NTljYjViNTljYWRiNTljYjViNTljYWRiNTljYjViNTljYWRiNTljYjViNTljYWRhZA0KOWNhZGI1 OWNhZGFkOWNiNWI1OWNhZGFkOWNhZGI1OWNhZGFkOWNiNWI1OWNhZGFkOWNhZGI1OWNhZGFkYTVi NWI1OWNhZGI1YTViNWI1OWNhZGI1YTViNWI1OWNhZGI1OWNiNWI1OWNhZGFkOWNiNWI1OWNhZGFk OWNhZGI1OWMNCmFkYWQ5Y2I1YWQ5Y2FkYWQ5Y2FkYWQ5Y2FkYTVhNWI1YWRhZGI1YjViNWJkYmRi NWJkYjViZGM2YmRiNWJkYjViZGJkYmRiNWJkYjViZGM2YmRiZGJkYmRiZGM2YmRiZGM2YmRjNmNl YzZjNmM2YzZjNmNlYzZjNmNlYzZjZWQ2DQpjZWNlZDZjZWQ2ZGVkNmQ2ZGVkNmRlZTdkZWRlZTdk ZWRlZTdkZWRlZTdkZWU3ZTdlN2RlZTdkZWU3ZWZlN2RlZTdlN2U3ZWZlN2U3ZTdlN2U3ZWZlN2U3 ZTdlN2U3ZWZlN2U3ZTdlN2U3ZWZlN2U3ZTdlN2U3ZWZlN2U3ZWZlNw0KZTdlZmU3ZTdlN2U3ZTdl ZmU3ZTdlN2U3ZTdlZmU3ZGVlN2U3ZGVlZmVmZGVlN2VmZDZlN2VmYjVjZWRlOWNiNWNlOGNhNWM2 ODRhZGNlN2JhNWNlN2JhNWQ2NzM5Y2NlNmI5Y2NlNmI5NGNlNzM5Y2Q2NzM5Y2NlN2I5Y2Q2NzMN CjljY2U3YmE1ZDY3MzljY2U2Yjk0YzY1MjdiYWQ0YTZiOWMzOTYzOTQzOTYzOTQzOTVhOGM0MjYz OWMzMTVhOGMzMTVhOGMzMTUyOGMzOTVhOTQzOTVhOGMzOTYzOTQzOTYzOTQ0MjYzOTQzOTYzOTQ0 MjZiOWM0MjZiOWM0MjZiDQo5YzM5NWE4YzMxNWE4NDMxNTI3YjI5NGE3MzE4Mzk2MzIxNDI2MzI5 NGE2YjI5NGE2YjI5NDI2MzI5NDI2MzE4MzE1MjE4MzE0YTE4Mjk0YTI5Mzk1MjI5Mzk1MjI5MzE0 MjIxMjkzOTQyNGE1MjYzNmI2YjRhNGE0YTA4MDgwOA0KMTAwODA4MTgxMDEwMjkyOTIxMjExODE4 MTgxMDEwMjEyMTIxMjExODE4MjkyMTIxMTgxODE4MTgxMDE4NWE1YTVhOWM5YzljYjViNWI1YWRi NWI1YTVhZGI1OTRhNWE1OGM5Y2E1ODQ5NGE1N2I5NGE1NmI4NDk0NjM4NDk0NWENCjdiOTQ2Mzg0 OWM2MzdiOTQ2Mzg0OWM2MzdiOTQ2Mzg0OWM2MzdiOTQ2Yjg0OTQ2MzdiOTQ2Yjg0OTQ2MzdiOTQ2 MzdiOTQ2MzdiOGM2MzdiOTQ2MzdiOGM2MzdiOGM1YTczOGM2MzdiOGM1YTdiOGM2MzdiOGM1YTcz ODQ2MzdiDQo4YzVhNzM4NDYzN2I4NDVhNzM4NDYzNzM4NDYzNzM4NDYzNzM4NDYzNzM3YjYzNzM4 NDYzNzM3YjYzNzM3YjYzNmI3MzYzNmI3MzYzNjM2YjYzNjM2YjVhNWE2MzVhNjM2MzUyNWE1YTUy NWE1YTUyNTI1MjljYWRhZDljYjViNQ0KOWNhZGI1OWNiNWI1OWNhZGFkOWNiNWI1OWNhZGI1OWNi NWI1OTRhZGFkOWNhZGI1OTRhZGFkOWNhZGI1OTRhZGFkOWNhZGI1OTRhZGFkOWNhZGI1OTRhZGFk OWNhZGI1OWNhZGFkOWNhZGI1OWNhZGFkOWNhZGI1OWNhZGFkOWMNCmI1YjU5Y2FkYWQ5Y2FkYjU5 Y2FkYWQ5Y2I1YjU5NGFkYWQ5Y2FkYjU5NGFkYWQ5Y2FkYjU5Y2FkYWQ5Y2FkYWQ5Y2FkYTU5Y2Fk YWQ5Y2FkYWRhZGI1YjVhZGI1YjViNWJkYmRiNWJkYjViZGJkYjViNWJkYjViZGJkYmRiNWJkDQpi NWJkYzZiZGJkYzZiZGJkYzZiZGJkYzZiZGM2YzZjNmM2YzZjNmNlY2VjZWM2Y2VjNmNlZDZjZWQ2 ZDZkNmRlZTdkZWRlZGVkZWRlZTdkZWRlZTdkZWRlZTdlN2RlZTdkZWU3ZTdlN2RlZTdkZWU3ZWZl N2RlZTdlN2U3ZWZlNw0KZTdlN2U3ZTdlZmU3ZGVlN2U3ZTdlZmU3ZTdlN2U3ZTdlZmU3ZTdlN2U3 ZTdlZmU3ZTdlZmU3ZTdlZmU3ZTdlN2U3ZTdlZmU3ZTdlN2U3ZTdlZmVmZDZlN2U3ZDZlN2VmYmRj ZWRlYTViZGNlOTRhZGNlOGNhZGNlODRhNWQ2ODQNCmFkZGU2YjljY2U2YjljY2U2Mzk0YzY2Yjk0 Y2U2Yjk0YzY3MzljY2U3MzljY2U3YjljY2U2YjhjYzY2Yjk0YzY2MzhjYmQ1MjdiYWQzOTYzOTQz OTYzOTQzOTYzOTQ0MjZiOWMzOTYzOTQzOTYzOTQzOTVhOGMzOTVhOGMyOTRhDQo3YjI5NGE3YjI5 NGE4NDM5NWE5NDMxNWE4YzM5NWE4YzM5NWE4YzQyNjM5NDM5NjM4YzQyNjM4YzMxNWE4NDM5NTI4 NDIxNDI3MzIxNDI2YjIxNDI2YjI5NGE3MzIxNDI2YjI5NDI2YjIxNDI2YjIxMzk2MzEwMjk0YTIx Mzk1YQ0KMTgzMTRhMjkzOTUyMzEzOTUyMTgyMTMxMjEyOTMxNmI3MzdiN2I4NDg0MzkzOTQyMDgw MDAwMTgxMDEwMjEyMTIxMjkyMTIxMTAwODA4MjkyMTIxMTgxMDEwMjkyOTI5MTAxMDEwMzkzOTM5 OWM5YzljYzZjZWNlYWRhZGI1YWQNCmI1YmQ5Y2E1YWQ5NGE1YWQ4NDljYTU4NDljYTU3MzhjOWM2 YjhjOWM2MzdiOGM2Mzg0OTQ1YTdiOTQ2MzdiOTQ1YTdiOTQ2MzdiOWM2MzdiOTQ2MzdiOTQ2Mzdi OTQ2Mzg0OTQ2MzdiOGM2MzdiOTQ2MzdiOGM2MzdiOTQ1YTczDQo4YzYzN2I4YzVhNzM4YzYzN2I4 YzVhNzM4NDYzN2I4YzVhNzM4NDYzN2I4YzVhNzM4NDYzNzM4NDVhNzM4NDYzNzM4NDVhNzM3YjYz NzM4NDYzNzM3YjYzNzM4NDVhNmI3YjYzNzM3YjVhNmI3YjYzNmI3YjYzNjM2YjYzNmI2Yg0KNWE2 MzYzNWE2MzYzNTI1YTVhNTI1YTVhNTI1MjUyNTI1YTVhOWNiNWI1OWNhZGI1YTViNWI1OWNhZGI1 OWNiNWI1OWNhZGI1YTViNWI1OWNhZGI1OWNiNWI1OWNhZGFkOWNiNWI1OWNhZGI1OWNiNWI1OWNh ZGFkOWNiNWI1OWMNCmFkYjU5Y2I1YjU5Y2FkYWQ5Y2I1YjU5Y2FkYjU5Y2I1YjU5Y2FkYjVhNWI1 YjU5Y2FkYjU5Y2I1YjU5Y2FkYjVhNWI1YjU5Y2FkYjU5Y2I1YjU5Y2FkYjU5Y2I1YjU5Y2FkYWQ5 Y2I1YjU5Y2FkYWQ5Y2I1YWQ5Y2FkYWRhNWI1DQphZGFkYjViNWI1YmRiZGI1YmRiZGJkYmRiZGI1 YmRiNWJkYmRiZGI1YmRiNWJkYzZiZGI1YmRiNWJkYzZiZGJkYzZiZGM2Y2VjNmM2YzZjNmNlY2Vj ZWM2Y2VjZWNlZDZjZWNlZDZjZWRlZGVkZWRlZGVkZWRlZTdlN2RlZTdkZQ0KZTdlN2U3ZGVlN2Rl ZTdlZmU3ZTdlN2U3ZTdlZmU3ZTdlZmU3ZTdlZmVmZTdlZmU3ZWZlZmVmZTdlZmU3ZTdlZmVmZTdl ZmU3ZWZlZmVmZTdlZmU3ZTdlZmVmZTdlZmU3ZWZlZmVmZTdlZmU3ZTdlZmU3ZTdlZmU3ZTdlZmVm ZGUNCmVmZTdkZWVmZjdjZWRlZWZhZGM2ZDY4Y2FkYzY5NGJkZDY4Y2I1ZDY4NGFkZGU4NGFkZTc3 M2E1ZDY2Yjk0Y2U2Yjk0Y2U2MzhjYzY3Mzk0Y2U3MzljY2U3YjljZDY3YjljY2U3YjljY2U3Mzlj Y2U2Yjk0YzY1MjdiYWQ0MjZiDQo5YzM5NjM5NDQyNjM5YzM5NjM5NDM5NWE4YzM5NWE4YzQyNjM5 YzM5NWE5NDMxNTI4YzI5NGE3YjMxNTI4NDMxNTI4NDM5NWE4YzMxNTI4NDM5NWE4YzM5NWE4YzM5 NjM4YzM5NWE4YzM5NWE4YzMxNTI4NDM5NTI4NDI5NGE3Mw0KMzE0YTdiMjk0YTdiMjk0YTczMjk0 YTczMjk0YTczMjEzOTYzMjEzOTYzMjEzOTVhMTgyOTUyMjEzMTUyMzk0YTYzMTgyOTQyMTgyMTMx NGE1MjVhOTQ5Y2E1N2I4NDg0MzkzOTQyMTAwODA4MDgwODA4MjkyMTIxMTgxODE4MTgNCjE4MTgy MTIxMjEwMDA4MDgzMTMxMzE4NDhjOGNiZGJkYmRiZGJkYmRiNWJkYmRhNWFkYWRhNWFkYjU5NGE1 YWQ4YzljYTU4NDk0YTU3Yjk0YTU2Yjg0OTQ2Yjg0OTQ2MzdiOTQ2Mzg0OWM2MzdiOTQ2Mzg0OWM2 MzdiOTQ2Mzg0DQo5YzYzN2I5NDZiODQ5YzYzN2I5NDYzN2I5NDYzN2I5NDZiN2I5NDYzN2I4YzYz N2I5NDYzN2I4YzYzN2I5NDVhNzM4YzYzN2I4YzVhN2I4YzYzN2I4YzVhNzM4NDYzN2I4YzVhNzM4 NDYzN2I4YzYzNzM4NDYzNzM4NDVhNzM3Yg0KNjM3Mzg0NjM3Mzg0NjM3Mzg0NWE2YjdiNjM3Mzdi NjM2YjczNjM2YjczNjM2MzZiNjM2YjZiNWE2MzYzNWE1YTYzNTI1YTVhNTI1YTVhNTI1MjUyOWNh ZGI1OWNiNWI1OWNhZGI1OWNiNWI1OWNhZGI1OWNiNWI1OWNhZGI1OWMNCmI1YjU5Y2FkYjU5Y2I1 YjU5Y2FkYjU5Y2FkYjU5Y2FkYjU5Y2I1YjU5Y2FkYjU5Y2FkYjU5Y2FkYjU5Y2I1YjU5Y2FkYjU5 Y2I1YjU5Y2FkYjU5Y2I1YjU5Y2FkYjU5Y2I1YjU5Y2FkYjU5Y2I1YjU5Y2FkYjU5Y2I1YjU5Y2Fk DQpiNTljYjViNTljYWRiNTljYWRiNTljYWRhZDljYjVhZDljYWRhNTljYWRhZDljYWRhZGFkYjVi NWFkYjViNWI1YmRiZGI1YmRiNWJkYmRiZGI1YmRiNWJkYmRiNWI1YmRiNWJkYzZiZGJkYmRiZGJk YzZiZGJkYzZiZGM2Y2VjNg0KYzZjZWM2Y2VjZWNlY2VjZWNlZDZkNmQ2ZDZkZWQ2ZGVlN2RlZGVl N2RlZTdlN2U3ZGVlN2RlZTdlN2U3ZGVlN2U3ZTdlZmU3ZTdlN2U3ZTdlZmU3ZTdlZmU3ZTdlZmVm ZTdlZmU3ZTdlZmU3ZTdlZmU3ZTdlZmVmZTdlZmU3ZTcNCmVmZTdlN2VmZTdlN2VmZTdlN2U3ZTdl N2VmZTdlN2U3ZTdlN2VmZTdkZWU3ZTdkZWVmZWZkNmU3ZjdjNmRlZjc5Y2I1Y2U4Y2FkYzY5NGI1 ZGU4Y2I1ZTc3YmE1ZDY4NGFkZTc3MzljZDY2YjljZDY1YThjYzY2MzhjYzY2Yjk0DQpjNjdiOWNj ZTdiOWNjZTdiOWNjZTg0YTVkNjdiYTVkNjYzOGNiZDUyN2JhZDQyNjM5YzM5NjM5NDI5NTI4YzI5 NTI4NDI5NGE4NDMxNTI4YzMxNTI4YzMxNTI4YzI5NGE4NDI5NGE4NDIxNDI3YjI5NGE3YjMxNTI4 NDM5NWE4NA0KMzE1MjdiMzk1Mjg0Mzk1Mjg0Mzk1YThjMzk1YTg0Mzk1YThjNDI2MzhjMzk1YThj MzE1Mjg0MzE1Mjg0Mjk0YTdiMjk1MjdiMjk0YTdiMjE0MjczMTgzOTZiMTgzMTVhMTAyOTUyMjEz OTVhMjkzOTVhMjkzOTUyMjEyOTQyMjkNCjMxNDI2YjczN2JhNWFkYjU3MzczN2IzMTMxMzEwMDAw MDAxODE4MTgxODEwMTAxODE4MTgxMDEwMTgxMDE4MTg2MzZiNmJiZGM2YzZiNWJkYmRhNWFkYWRh ZGI1YjVhNWFkYjU5Y2E1YWQ5NGE1YWQ4YzljYTU4NDljYTU3YjhjDQo5YzczOGM5YzYzN2I5NDYz ODQ5NDYzN2I5NDYzN2I5YzVhN2I5NDYzN2I5YzYzN2I5NDYzN2I5YzYzN2I5NDYzN2I5NDYzN2I5 NDYzN2I5NDYzN2I4YzYzN2I5NDYzNzM4YzYzN2I4YzVhNzM4YzYzN2I4YzVhNzM4YzYzN2I4Yw0K NWE3Mzg0NWE3YjhjNWE3Mzg0NjM3YjhjNWE3Mzg0NjM3Mzg0NWE3MzdiNjM3Mzg0NWE3MzdiNjM3 Mzg0NjM3MzdiNjM3MzdiNWE2YjczNjM2YjdiNjM2MzZiNjM2YjZiNWE2MzYzNWE2MzYzNTI1YTVh NTI1YTVhNTI1MjUyNTINCjVhNTJhNWI1YmQ5Y2I1YjVhNWI1YmQ5Y2I1YjVhNWI1YmQ5Y2I1YjVh NWI1YmQ5Y2I1YjVhNWI1YmQ5Y2FkYjU5Y2I1YjU5Y2FkYjVhNWI1YmQ5Y2FkYjU5Y2I1YjU5Y2Fk YjVhNWI1YmQ5Y2FkYjVhNWI1YmQ5Y2FkYjVhNWI1DQpiZDljYjViNWE1YjViZDljYjViNWE1YjVi ZDljYjViNWE1YjViZDljYWRiNWE1YjViZDljYjViNTljYjViNTljYWRiNWE1YjViNTljYjVhZGE1 YjVhZDljYWRhZGE1YjViNWFkYjViNWI1YmRiZGI1YmRiNWJkYzZiZGI1YmRiNQ0KYmRiZGJkYjVi ZGI1YmRjNmJkYmRiZGJkYmRjNmJkYmRjNmJkYzZjZWM2YzZjZWM2Y2VjZWNlYzZjZWNlY2VkNmQ2 ZDZkNmQ2ZGVkZWRlZGVkZWRlZTdlZmU3ZGVlN2U3ZTdlZmU3ZTdlN2U3ZTdlZmU3ZTdlZmU3ZTdl ZmVmZTcNCmVmZTdlZmY3ZWZlN2VmZTdlZmVmZWZlN2VmZTdlZmY3ZWZlN2VmZTdlZmVmZWZlN2Vm ZTdlZmVmZWZlN2VmZTdlN2VmZWZlN2VmZTdlN2VmZWZlN2VmZTdlN2VmZTdkZWU3ZWZkNmVmZmZi NWQ2ZWY5Y2JkZGU4Y2FkZDY5NGJkDQpkZTg0YjVkZTdiYWRkZTdiYWRlNzczYTVkZTYzOTRjZTVh OGNjNjVhODRiZDczOTRjNjdiOWNjZThjYTVjZTg0OWNjZTg0YTVkNjczOWNkNjZiOTRjNjVhODRi NTUyN2JiNTRhNzNhNTQyNmJhNTM5NWE5NDQyNjM5NDM5NWE5NA0KMzk1YTk0Mjk0YTg0Mjk0YTg0 Mjk0YTg0MzE1MjhjMjk0YTg0Mzk1YTg0Mzk1MjdiMzk1YTg0Mzk1MjdiMzk1YTg0Mzk1YTg0NDI1 YThjNDI2MzhjNTI3M2E1NDI2Mzk0NDI2Mzk0MzE1YThjMzE1MjhjMzE1MjhjMzE1YThjMjENCjRh N2IxODM5NmIxMDMxNWEyMTQyNmIyOTQyNjMyMTMxNTIyMTM5NTIzMTQyNWEyMTI5NDI1MjUyNjM5 NDljYTVhNWE1YWQ3MzczN2IzMTM5MzkxODEwMTgyMTE4MjExODIxMjEwODEwMTA1YTYzNjNhNWFk YjViZGM2YzZiZGM2DQpjNmFkYjViNWFkYjViNWFkYmRiZGE1YWRiNTk0YTVhZDhjOWNhNTg0OTRh NTg0OTRhNTczODQ5YzZiODQ5YzYzN2I5NDYzODQ5YzYzN2I5YzYzODQ5YzYzN2I5NDYzODQ5YzYz N2I5YzZiODQ5YzYzN2I5NDZiODQ5YzYzN2I5NA0KNjM3Yjk0NjM3YjhjNmI3Yjk0NjM3YjhjNjM3 YjhjNjM3MzhjNjM3YjhjNWE3YjhjNjM3YjhjNWE3Mzg0NjM3YjhjNWE3Mzg0NjM3Yjg0NWE3Mzg0 NjM3Mzg0NjM3Mzg0NjM3Mzg0NjM3MzdiNjM3Mzg0NjM3MzdiNjM3MzdiNjMNCjZiNzM2MzZiNzM2 MzYzNmI2MzYzNmI1YTVhNjM1YTYzNjM1MjVhNWE1MjVhNWE1MjUyNTI5Y2FkYjVhNWI1YmQ5Y2I1 YjVhNWI1YmQ5Y2FkYjVhNWI1YmQ5Y2I1YjVhNWI1YmQ5Y2FkYjU5Y2I1YjU5Y2FkYjU5Y2I1YjU5 Y2FkDQpiNTljYjViNTljYWRiNTljYjViNTljYWRiNTljYjViNTljYWRiNWE1YjViZDljYWRiNTlj YjViNTljYjViNWE1YjViZDljYWRiNWE1YjViZDljYWRiNWE1YjViZDljYWRiNTljYjViNTljYWRi NTljYjViNTljYWRhZDljYjVhZA0KOWNhZGFkYTVhZGFkOWNhZGFkYWRiNWI1YWRiNWI1YjViZGJk YjViZGI1YmRiZGI1YjViZGI1YmRiZGJkYjViZGI1YmRjNmJkYmRjNmJkYmRjNmJkYmRjNmM2YzZj ZWM2YzZjZWM2Y2VkNmNlY2VjZWNlZDZkZWQ2ZDZkZWQ2ZGUNCmU3ZGVkZWU3ZGVlN2U3ZTdkZWU3 ZTdlN2VmZTdlN2U3ZTdlN2VmZTdlN2VmZTdlZmVmZWZlN2VmZTdlZmVmZWZlN2VmZTdlZmVmZWZl N2VmZTdlZmVmZWZlN2VmZTdlZmVmZWZlN2VmZTdlN2VmZWZlN2VmZTdlN2VmZWZlN2VmDQplN2U3 ZWZlN2U3ZWZlN2RlZWZlZmM2ZGVlZmFkYzZlNzk0YmRkNjk0YmRkZTg0YWRkZTdiYWRkZTdiYWRk ZTczYTVlNzYzOTRjZTVhOGNjNjUyN2JiNTVhODRiNTZiOGNiZDdiOWNjZThjYTVjZThjYTVkNjcz OWNjZTdiYTVkNg0KNzM5Y2Q2NzM5Y2Q2NmI5NGM2NmI5NGM2NjM4NGJkNjM4NGJkNWE4NGI1NWE4 NGI1NTI3M2E1NDI2Mzk0MzE1Mjg0MzE1MjhjMzE1MjhjMzk1YThjMzE0YTczMzk1MjdiMzk1Mjdi Mzk1MjdiMjk0YTczMzE0YTczMzE1MjdiNDINCjYzOGM1MjczYTU0YTZiOWM0MjYzOTQzOTYzOTQz MTUyOGMzOTYzOTQzOTYzOTQzMTVhOGMxODM5NmIxODM5NmIyMTQyNmIyOTQyNmIxODMxNWEyOTM5 NWEzMTQyNWEzMTM5NTIzMTM5NTI2YjczODQ5YzljYTVhNWE1YWQ2MzZiDQo2YjE4MTgyMTE4MTgy MTE4MTgyMTI5MzEzOTljYTVhNWM2Y2VjZWI1YmRiZGI1YmRiZGI1YzZjNmE1YjViNWI1YmRiZDlj YWRhZDk0YTVhZDhjOWNhNThjOWNhZDdiOGM5YzczOGM5YzZiN2I5NDZiODQ5YzYzN2I5NDYzN2I5 Yw0KNWE3Yjk0NjM4NDljNjM3Yjk0NjM3YjljNjM3Yjk0NjM4NDljNjM3Yjk0NjM3Yjk0NjM3Yjhj NjM3Yjk0NjM3MzhjNjM3YjhjNjM3MzhjNjM3YjhjNWE3Mzg0NjM3YjhjNWE3Mzg0NjM3YjhjNWE3 Mzg0NjM3Mzg0NWE3Mzg0NjMNCjczODQ1YTczN2I2MzczODQ2MzczN2I2MzczODQ1YTZiN2I2Mzcz N2I1YTZiN2I2MzZiN2I2MzYzNmI2MzZiNmI1YTYzNjM1YTYzNjM1MjVhNWE1MjVhNWE1MjUyNTI1 MjVhNWFhNWI1YmQ5Y2I1YjVhNWI1YmQ5Y2I1YjVhNWI1DQpiZDljYjViNWE1YjViZDljYjViNWE1 YjViZDljYWRiNWE1YjViZDljYjViNWE1YjViZDljYWRiNWE1YjViZDljYjViNWE1YjViZDljYWRi NWE1YjViZDljYjViNWE1YjViZDljYjViNWE1YjViZDljYjViNWE1YjViZDljYjViNQ0KYTViNWJk OWNiNWI1YTViNWJkOWNiNWI1YTViNWJkOWNiNWI1YTViNWI1OWNhZGFkYTViNWI1OWNhZGFkYTVi NWI1YTViNWI1YjViZGJkYjViZGJkYmRiZGJkYjViZGI1YmRiZGJkYjViZGI1YmRjNmJkYjViZGI1 YmRjNmJkYmQNCmM2YmRjNmNlYzZjNmNlYzZjZWQ2Y2VjZWNlY2VjZWQ2ZDZkNmQ2ZDZkZWU3ZGVk ZWU3ZGVlN2VmZTdlN2U3ZTdlN2VmZTdlN2VmZTdlN2VmZWZlN2VmZTdlZmY3ZWZlN2VmZWZlZmY3 ZWZlZmVmZWZlZmY3ZWZlZmVmZWZlZmY3DQplZmU3ZWZlN2VmZjdlZmU3ZjdlZmVmZjdlZmU3ZWZl ZmVmZjdlZmU3ZWZlZmVmZjdlZmU3ZWZlN2VmZjdlZmRlZWZlZmM2ZGVmNzljYmRkZTljYmRlNzk0 YmRlNzg0YWRkZTdiYWRkZTg0YjVlNzczYTVkZTYzOTRjZTUyODRiZA0KNTI3YmI1NTI3YmFkNmI4 Y2JkN2I5Y2M2OGNhZGQ2OGNhZGQ2OGNhZGRlOGNhZGU3OTRiZGVmOGNhZGU3ODRhNWRlNzM5Y2Nl NzM5NGNlNmI4Y2M2N2I5Y2Q2NzM5Y2NlNzM5NGM2NTI3M2FkNDI2Mzk0Mzk1YThjMzk1YThjMzkN CjVhODQzOTUyN2IzOTUyNzM0MjVhN2IzMTRhNzMyOTQyNmIyMTQyNmIzMTRhNzMzMTUyODQ1YTdi YWQ0YTZiYTU0YTZiYTUzOTYzOWMzOTYzOTQ0MjYzOWM0YTczYTUzOTVhOTQzMTUyOGMyOTRhN2Iy MTQyNmIxODM5NmIzMTRhDQo3MzI5NDI2YjI5NDI2MzMxNDI1YTI5Mzk0YTQyNGE2Mzg0OGM5NDlj YTVhZDdiN2I4NDE4MjEyMTE4MjEyMTAwMDAwMDZiNzM3M2FkYjViNWNlZDZkNmI1YzZjNmI1YzZj NmI1YzZjNmI1YmRiZGE1YjViNWE1YWRiNTk0YTVhZA0KOTQ5Y2FkODQ5NGE1ODQ5NGE1NzM4NDlj NmI4NDljNjM3Yjk0NmI4NDljNjM3YjljNjM4NDljNjM3YjljNjM4NDljNjM3Yjk0NmI4NDljNjM3 Yjk0NjM3Yjk0NjM3Yjk0NmI3Yjk0NjM3Yjk0NjM3Yjk0NjM3MzhjNjM3Yjk0NjMNCjczOGM2Mzdi OGM1YTdiOGM2MzdiOGM1YTczOGM2MzdiOGM1YTczODQ2MzdiOGM2MzczODQ2MzczODQ1YTczODQ2 MzczODQ2MzczODQ2MzczODQ1YTZiN2I2MzczN2I2MzZiNzM2MzZiNzM2MzYzNmI2MzZiNmI1YTYz NjM1YTVhDQo2MzUyNWE1YTUyNWE1YTUyNTI1MjljYjViNWE1YjViZDljYjViNWE1YjViZDljYjVi NWE1YjViZDljYWRiNWE1YjViZDljYjViNWE1YjViZDljYWRiNWE1YjViZDljYjViNWE1YjViZDlj YWRiNWE1YjViZDljYjViNWE1YjViZA0KOWNhZGI1YTViNWJkOWNiNWI1YTViNWJkOWNhZGI1YTVi NWJkOWNiNWI1YTViNWJkOWNhZGI1YTViNWJkOWNiNWI1YTViNWJkOWNhZGI1YTViNWJkOWNhZGI1 OWNiNWI1OWNhZGFkYTViNWI1YTVhZGI1YWRiNWI1YWRiNWI1YmQNCmJkYmRiNWJkYjViZGJkYmRi NWJkYjViNWJkYjViNWJkYjViNWJkYmRiNWJkYmRiZGM2YzZiZGM2YzZjNmNlY2VjNmNlY2VjZWQ2 Y2VjZWQ2Y2VkNmRlZGVkNmRlZGVkZWU3ZTdkZWU3ZTdlN2VmZTdkZWU3ZTdlN2VmZWZlN2VmDQpl N2VmZWZlZmU3ZWZlN2VmZWZlZmVmZWZlZmY3ZWZlZmVmZWZlN2VmZjdlZmU3ZjdlN2U3ZjdlN2Rl ZWZlN2U3ZjdlN2U3ZjdlZmU3ZWZlZmU3ZWZlZmVmZjdmN2RlZWZlZmU3ZWZlZmU3ZWZlN2Q2ZTdl ZmI1Y2VlZjk0YmRkZQ0KODRiNWQ2OGNiNWRlODRiNWRlOGNiNWU3NzNhNWQ2NmI5NGNlNWE4NGJk NWE4NGJkNDI2YjljMzE1YThjMzk1YThjNGE2Yjk0NWE3M2E1NzM4Y2JkNzM5NGM2N2I5Y2Q2N2I5 NGQ2NzM5NGNlNjM4NGJkNWE3YmJkNGE3M2FkNGENCjczYWQ0MjYzOWM0YTZiYTU0YTZiOWM0YTZi OWM0MjYzOTQzOTUyODQyOTQyNmIyMTM5NjMyMTM5NTIyOTRhNWEyMTM5NTIxMDMxNGExMDI5NGEy MTM5NjMyMTQyNmIyOTQyNzM0YTZiOWM1YTdiYWQ0MjYzOWM0MjYzOWMzOTYzDQo5YzM5NjM5YzM5 NjM5YzQyNmJhNTM5NjM5NDI5NGE3YjE4Mzk2YjE4NDI2YjIxNDI3MzIxNDI3MzE4Mzk2YjI5NGE2 YjEwMjk0YTI5Mzk1YTQyNTI2Yjg0OTRhNTVhNmI3MzMxMzkzOTQyNGE0YThjOTQ4Y2JkYzZjNmM2 YzZjNg0KYmRjNmJkYmRjNmM2YjViZGJkYjViZGJkYWRiNWI1YTViNWI1YTVhZGI1OWNhZGI1OGM5 Y2E1ODQ5Y2E1N2I5NGE1NzM4Y2E1NmI4NDljNjM3Yjk0NjM3Yjk0NjM4NDljNjM3Yjk0NjM4NDlj NjM3Yjk0NmI4NDljNjM3Yjk0NjMNCjdiOTQ2MzdiOTQ2MzdiOTQ2MzdiOGM2MzdiOTQ1YTdiOGM2 MzdiOGM1YTczOGM1YTdiOGM1YTczOGM1YTdiOGM1MjczODQ1YTczOGM1YTczODQ1YTczOGM1YTcz ODQ1YTczODQ1YTczODQ2MzczODQ1YTczODQ2MzczODQ1YTZiDQo3YjYzNzM4NDVhNmI3YjYzNmI3 YjYzNjM2YjYzNmI2YjVhNjM2MzVhNjM2MzUyNWE1YTUyNWE1YTRhNTI1MjUyNTI1MmE1YmRiZGE1 YjViZGE1YjViZGE1YjViZGE1YjViZGE1YjViZGE1YjViZDljYjViNWE1YjViZDljYjViNQ0KYTVi NWJkOWNiNWI1YTViNWJkOWNiNWI1YTViNWJkOWNiNWI1YTViNWJkOWNiNWI1YTViNWJkOWNiNWI1 YTViNWJkOWNiNWI1YTViNWJkOWNiNWI1YTViNWJkOWNiNWI1YTViNWJkOWNiNWI1YTViNWJkOWNi NWI1YTViNWJkOWMNCmI1YjU5Y2I1YjU5Y2I1YjVhNWI1YjVhNWFkYjVhZGI1YjVhZGI1YjViNWJk YmRiNWJkYmRiZGJkYmRiNWJkYmRiZGJkYmRiNWJkYjViNWJkYmRiNWJkYjViZGM2YmRiZGM2YmRj NmNlY2VjNmNlYzZjZWQ2Y2VjZWQ2Y2VkNmRlDQpkNmQ2ZGVkNmRlZTdkZWRlZTdkZWU3ZWZlZmU3 ZTdlN2U3ZWZlZmU3ZWZlN2VmZWZlZmU3ZWZlZmVmZWZlZmVmZWZlZmY3ZWZmN2Y3ZWZlZmY3Zjdl ZmVmZjdlN2VmZmZlZmU3ZjdlN2U3ZjdlN2RlZjdlN2U3ZjdlZmRlZWZlNw0KZGVlZmY3ZGVlZmY3 ZTdmN2Y3ZTdlZmY3ZWZmN2Y3ZDZlN2VmYWRkNmVmOGNiZGRlOGNiNWRlODRiNWRlODRiNWRlN2Jh ZGQ2NzM5Y2NlNWE4Y2I1NWE4NGJkNWE4NGI1NGE2YjljMzE1Mjg0MzE1YTg0MzE1Mjg0Mzk1YThj NDINCjYzOTQ1MjZiYTU0YTYzYTU0YTZiYTU0MjYzOWM0MjYzOWMzMTVhOTQyOTRhOGMxODM5N2Ix ODM5N2IxODM5NzMxODM5NzMxODM5NmIxODM5NjMxMDI5NWEwODI5NTIwODIxNDIwMDE4MzEwODIx MzEwODIxMzkwMDE4MzkxMDI5DQo0YTIxMzk1YTI5NGE3MzI5NDI3MzUyNmI5YzVhN2JhZDRhNmJh NTQyNjM5YzRhNmJhNTM5NjM5YzQyNmJhNTQyNmJhNTRhNmI5YzI5NTI3YjIxNDI3MzE4NDI3MzIx NDI3YjE4Mzk2YjE4NDI3MzIxNDI3MzMxNTI3MzIxNDI1YQ0KMzE0YTYzOGM5Y2FkYWRiZGM2OWNh NWFkYTVhZGE1YjViZGI1YzZjZWNlYzZjNmM2YzZjZWM2YmRjNmM2YmRjNmM2YjViZGJkYjViZGJk YWRiNWI1YTViNWI1OWNhNWFkOTRhNWFkODQ5NGE1ODQ5NGFkNzM4Y2E1NmI4NDljNjMNCjdiOTQ2 Yjg0OWM2MzdiOWM2Yjg0OWM2MzdiOWM2Yjg0OWM2MzdiOWM2Yjg0OWM2MzdiOTQ2Yjg0OTQ2Mzdi OTQ2MzdiOTQ2MzdiOGM2MzdiOTQ2MzdiOGM2MzdiOGM1YTczOGM1YTdiOGM1YTczOGM1YTdiOGM1 YTczOGM1YTdiDQo4YzVhNzM4YzYzNzM4YzVhNzM4NDYzNzM4YzVhNzM4NDYzNzM4NDVhNzM4NDYz NzM4NDVhNmI4NDYzNmI4NDYzNmI3YjYzNmI3MzYzNjM2YjYzNjM2MzVhNWE1YTVhNWE2MzUyNWE1 YTUyNWE1YTRhNTI1MjljYjViNWE1YjViZA0KYTViNWJkYTViNWJkOWNiNWI1YTViNWJkOWNiNWI1 YTViNWJkOWNiNWI1YTViNWJkOWNiNWI1YTViNWJkOWNiNWI1YTViNWJkOWNiNWI1YTViNWJkOWNi NWI1YTViNWJkOWNiNWI1YTViNWJkOWNiNWI1YTViNWJkOWNiNWI1YTUNCmI1YmQ5Y2I1YjVhNWI1 YmQ5Y2I1YjVhNWI1YmQ5Y2I1YjVhNWI1YmQ5Y2I1YjVhNWI1YmQ5Y2FkYjU5Y2I1YjU5Y2FkYjVh NWI1YjVhNWFkYjVhZGI1YjVhZGI1YjViNWJkYmRiNWJkYjViNWJkYmRiNWJkYjViNWJkYmRiNWJk DQpiNWI1YmRiNWI1YzZiZGJkY2VjNmM2YzZjNmM2Y2VjZWM2Y2VjZWNlZDZkNmNlZDZkNmQ2ZGVk ZWRlZGVkZWU3ZTdlN2RlZTdlN2U3ZWZlN2U3ZTdlN2U3ZWZlZmU3ZTdlN2U3ZWZlZmU3ZWZlZmVm ZWZlZmVmZTdlZmY3ZWZmNw0KZWZlZmVmZWZmN2VmZTdmN2U3ZWZmN2U3ZTdmN2U3ZTdmN2U3ZGVl ZmU3ZGVlZmVmZGVlN2VmZGVlZmY3ZGVlZmY3ZTdmN2ZmZGVlZmY3ZDZlZmZmOWNjNmU3OGNiNWRl ODRiNWRlODRiNWRlN2JhNWQ2NzNhNWQ2NjM5NGJkNTINCjdiYWQ2MzhjYmQ3MzljY2U2MzhjYmQ2 Mzg0YjU2Mzg0YjU2Mzg0YjU2Mzg0YWQ2Yjg0YjU2YjhjYmQ2Yjg0YmQ2MzdiYjU2Mzg0YmQ2Mzg0 YmQ2Mzg0YzY1MjczYWQ0MjYzYTUzMTUyOGMyOTUyODQyMTQyNzMyMTM5NmIxMDMxDQo1YTEwMzE1 YTEwMjk1MjEwMjk1MjA4MjEzOTEwMjk0MjEwMjk0MjEwMzE0YTE4MzE1MjI5NGE2YjMxNGE3MzI5 NGE3YjQyNjM5NDVhN2JhZDRhNmJhNTQyNmJhNTQyNjM5YzM5NjM5YzQyNmJhNTRhNmJhNTQyNjM5 YzM5NWE4Yw0KMjE0YTdiMjE0MjdiMTgzOTczMTgzOTZiMTgzOTZiMjk0YTczMjE0MjZiMjEzOTVh MjEzOTUyOGM5Y2FkYjViZGM2YmRjNmNlYmRiZGJkYzZjZWM2YmRjNmM2YzZjNmM2YmRjNmM2YmRj NmM2YjViZGJkYjViZGJkYWRiNWI1YWQNCmI1YjVhNWFkYWQ5Y2FkYjU4YzljYWQ4NDljYWQ3Yjk0 YTU3MzhjYTU2Yjg0OWM2MzdiOWM2MzdiOTQ2YjdiOWM2MzdiOTQ2Yjg0OWM2MzdiOTQ2YjdiOWM2 MzdiOTQ2Yjg0OWM2MzdiOGM2MzdiOTQ2MzdiOGM2MzdiOTQ1YTczDQo4YzYzN2I4YzVhNzM4YzYz N2I4YzUyNzM4NDVhNzM4YzVhNzM4YzVhNzM4YzVhNzM4NDVhNzM4YzVhNzM4NDVhNzM4YzVhNmI4 NDVhNzM4NDVhNzM4NDYzNzM4NDVhNmI3YjVhNmI4NDVhNmI3YjYzNmI3YjVhNjM2YjYzNjM2Yg0K NWE2MzYzNWE2MzYzNTI1YTVhNTI1YTVhNGE1MjUyNTI1MjUyYTViZGJkYTViNWJkYTViZGJkYTVi NWJkYTViZGJkYTViNWJkYTViZGJkYTViNWJkYTViNWJkOWNiNWI1YTViNWJkYTViNWJkYTViNWJk OWNiNWI1YTViNWJkYTUNCmI1YmRhNWI1YmQ5Y2I1YjVhNWI1YmRhNWI1YmRhNWI1YmQ5Y2I1YjVh NWI1YmRhNWI1YmRhNWI1YmQ5Y2I1YjVhNWI1YmRhNWI1YmRhNWI1YmQ5Y2I1YjVhNWI1YmRhNWI1 YmRhNWI1YjU5Y2I1YjVhNWI1YmRhNWI1YjVhNWI1DQpiNWE1YjViNWI1YmRiZGI1YmRiZGJkYmRi ZGI1YmRiZGJkYzZiZGI1YmRiNWI1YmRiNWI1YmRiNWJkYzZiZGJkYzZiZGM2Y2VjZWM2Y2VjZWNl ZDZkNmNlZDZkNmQ2ZGVkNmQ2ZGVkNmRlZTdlN2RlZTdlN2U3ZWZlZmU3ZTdlNw0KZTdlZmVmZTdl ZmVmZWZlZmVmZTdlZmVmZWZmN2VmZWZlZmVmZjdlZmY3ZWZlZmY3ZjdmN2Y3ZWZmN2VmZjdmN2Vm ZWZmN2U3ZWZmZmU3ZTdmN2U3ZTdmN2VmZTdmN2Y3ZGVlZmY3ZDZlN2Y3ZDZlN2Y3Y2VkZWVmYzZk ZWVmYmQNCmRlZWY5NGJkZTc4NGI1ZGU4Y2JkZTc4NGI1ZTc3YmFkZGU2YjljY2U2MzhjYzY0Mjcz YTU2Yjk0YzY3MzljY2U3YmE1ZDY3YjljY2U4Y2FkZDY5NGFkZGU5NGI1ZGU5NGI1ZGU4NGE1ZDY3 YjljY2U3Yjk0Y2U3Mzk0YzY3YjljDQpkNjdiOWNkNjczOTRjZTVhN2JiNTVhN2JiNTUyNzNhNTRh NmI5YzM5NWE4NDMxNTI3YjI5NGE3MzMxNGE3MzMxNGE2YjM5NTI3MzMxNTI2MzMxNGE2YjI5NGE2 MzMxNTI3MzM5NTI3YjM5NWE4NDI5NGE3YjM5NWE5NDUyNzNhNQ0KNGE2YmE1NDI2MzljNDI2M2E1 MzE1YTk0NDI2YmE1NDI2YmE1NGE2YmE1Mzk1YTk0MzE1MjhjMjE0YTdiMTg0MjczMTAzOTZiMjE0 MjczMjk0YTczMjk0YTZiMjk0MjYzMzk1MjZiOGM5Y2FkYWRiNWJkYjViZGJkYmRiZGJkYmQNCmM2 YzZjNmM2YzZiZGM2YzZjNmM2YzZiZGM2YmRiZGJkYmRiNWI1YjViNWJkYmRhNWI1YjVhNWI1YmQ5 Y2E1YWQ5NGE1YWQ4NDljYTU4NDk0YWQ3MzhjYTU3MzhjYTU2MzdiOTQ2Yjg0OWM2MzdiOTQ2Yjg0 OWM2YjdiOWM2Yjg0DQo5YzYzN2I5NDZiODQ5YzYzN2I5NDYzN2I5NDYzN2I5NDYzN2I5NDYzN2I4 YzYzN2I5NDVhNzM4YzYzN2I4YzVhNzM4YzVhN2I4YzVhNzM4YzVhN2I4YzVhNzM4YzVhNzM4YzVh NzM4NDYzNzM4YzVhNzM4NDYzNzM4NDVhNzM4NA0KNjM3Mzg0NWE3Mzg0NjM3Mzg0NWE2YjdiNjM2 Yjg0NjM2YjdiNjM2YjczNjM2MzZiNjM2MzZiNWE1YTYzNWE1YTVhNTI1MjVhNTI1YTVhNTI1MjUy YTViNWJkYTViZGJkYTViNWJkYTViNWJkYTViNWJkYTViNWJkOWNiNWI1YTUNCmI1YmQ5Y2I1YjVh NWI1YmQ5Y2I1YjVhNWI1YmQ5Y2I1YjVhNWI1YmQ5Y2I1YjVhNWI1YmQ5Y2I1YjVhNWI1YmQ5Y2I1 YjVhNWI1YmQ5Y2I1YjVhNWI1YmQ5Y2I1YjVhNWI1YmQ5Y2I1YjVhNWI1YmQ5Y2I1YjVhNWI1YmQ5 Y2I1DQpiNWE1YjViZDljYjViNWE1YjViZDljYjViNWE1YjViZDljYjViNWE1YjViNWE1YjViNWFk YjViZGFkYjViNWI1YmRiZGI1YmRiZGJkYmRiZGI1YmRiNWI1YmRiNWI1YmRiNWI1YmRiZGI1YzZi ZGJkY2VjNmM2YzZjNmM2Y2VjZQ0KYzZjZWNlY2VkNmQ2Y2VkNmQ2ZDZkZWRlZDZkZWRlZGVlN2U3 ZTdlN2U3ZTdlZmVmZTdlN2U3ZTdlZmVmZTdlZmU3ZWZlZmVmZTdlZmVmZWZlZmVmZTdlZmY3ZWZl ZmY3ZWZlZmVmZWZmN2VmZWZmN2U3ZjdmN2U3ZWZmN2RlZWYNCmY3ZTdlN2VmZTdlZmY3ZjdkNmU3 ZWZjNmQ2ZWZiNWNlZTdhNWJkZGU5NGFkY2U5Y2JkZGU4Y2JkZTc4NGJkZTc4NGI1ZTc4NGI1ZTc3 M2E1ZDY2YjljY2U1MjdiYjUzOTYzOWM1YThjYmQ3MzljY2U3YjljY2U3YjljYzY4NDljDQpjZTk0 YWRkNjhjYTVkNjk0YWRkNjk0YWRkZTk0YWRkZTg0OWNkNjdiOWNjZTczOTRjNjdiOWNjZTczOGNj NjZiOGNjNjYzODRiNTYzODRiNTUyNzNhNTUyNmI5YzRhNjM4YzRhNmI4YzRhNjM4YzUyNmI4YzQy NWE3MzM5NWE3Mw0KMjk0YTZiMjk0YTZiMzE0YTczMzk1YTg0MzE0YTdiMjk0YTdiMzE1MjhjNTI3 M2FkNDI2MzljNDI2M2E1Mzk2MzljMzE1YTk0Mzk2MzljNDI2YmE1NDI2YjljNDI2MzljMjk1Mjhj MjE0YTg0MTg0MjczMTg0MjczMTg0MjZiMjkNCjRhNzMzMTRhNzMzMTRhNmIyOTQyNWE4NDhjOWNh ZGI1YmRjNmNlY2ViZGJkYmRiZGJkYmRiZGM2YmRiZGM2YzZiZGJkYmRiZGM2YzZiNWJkYmRiNWJk YmRhZGI1YjVhZGI1YjVhNWFkYjU5Y2FkYjU4YzljYWQ4NDljYWQ3Yjk0DQphNTdiOGNhNTZiODQ5 YzYzN2I5NDYzN2I5NDZiODQ5YzYzN2I5NDZiODQ5YzYzN2I5NDZiODQ5YzYzN2I5NDYzN2I5NDYz N2I4YzYzN2I5NDVhNzM4YzYzN2I5NDVhNzM4YzYzN2I4YzVhNzM4NDVhNzM4YzUyNzM4NDVhNzM4 Yw0KNTI3Mzg0NWE3MzhjNWE3Mzg0NWE3MzhjNWE2Yjg0NWE3Mzg0NWE2Yjg0NWE3Mzg0NWE2Yjdi NWE3Mzg0NWE2YjdiNjM3Mzg0NWE2YjdiNjM2YjdiNjM2MzZiNjM2YjZiNWE2MzYzNWE2MzYzNTI1 YTVhNTI1YTVhNGE1MjUyNTINCjUyNTJhZGJkYzZhNWJkYmRhNWJkYmRhNWI1YmRhZGJkYzZhNWI1 YmRhNWJkYmRhNWI1YmRhNWJkYmRhNWI1YmRhNWI1YmRhNWI1YmRhNWJkYmRhNWI1YmRhNWI1YmRh NWI1YmRhNWJkYmRhNWI1YmRhNWI1YmRhNWI1YmRhNWJkDQpiZGE1YjViZGE1YjViZGE1YjViZGE1 YmRiZGE1YjViZGE1YjViZGE1YjViZGE1YmRiZGE1YjViZGE1YjViZGE1YjViZGE1YmRiZGE1YjVi NWE1YjViZGE1YjViNWFkYjViZGFkYjViNWI1YmRiZGI1YmRiZGJkYmRiZGI1YmRiZA0KYmRiZGJk YjViZGI1YjViZGJkYjViZGI1YmRjNmJkYmRjNmJkYzZjZWNlYzZjZWNlY2VkNmNlY2VkNmNlZDZk ZWQ2ZDZkZWRlZGVlN2U3ZGVlN2U3ZTdlZmVmZTdlZmU3ZTdlZmVmZTdlZmU3ZWZmN2VmZTdlZmVm ZWZmN2VmZTcNCmVmZWZlZmVmZmZlZmVmZjdmN2Y3ZjdlZmY3ZWZmN2ZmZWZmN2Y3ZTdmN2Y3ZTdl ZmY3ZTdlZmY3ZWZlZmY3ZmZkNmU3ZjdiNWNlZTdhZGNlZWY5NGFkZDY3YmE1Y2U4NGFkZDY5NGM2 Zjc4NGJkZWY4Y2JkZWY3YmFkZTc3M2E1DQpkNjYzOTRjNjRhN2JhZDIxNTI4YzYzOGNiZDdiYTVk Njg0YWRkZTdiOWNjZTg0YTVjZThjYTVjZThjYWRkNjhjYTVjZThjYTVkNjg0OWNjZTdiOWNjNjYz ODRiNTVhN2JhZDUyNzNhNTVhN2JhNTVhNzNhNTczOTRiZDZiODRiNQ0KNjM4NGFkNWE3MzljNWE3 MzljNTI2Yjk0NWE3Mzk0NTI3Mzk0NDI2Mzg0Mzk1YTczMzE1MjczMjk0YTczMzE1MjdiMzE1Mjdi MzE1Mjg0MjE0YTdiNDI2MzljNGE3M2FkNDI2YmE1Mzk2MzljNDI2YmE1MzE1YTk0NDI2YmE1NDIN CjZiYTU0YTZiYTU0MjYzOWMzMTVhOTQyMTRhODQyMTRhN2IxODQyNzMyMTRhNzMyOTRhNzMyOTRh NmIyOTQyNjMyOTQyNWE3YjhjOWNhZGI1YmRiZGM2YzZiZGM2YzZiNWJkYmRjNmM2Y2ViZGM2YzZj NmM2YzZiZGM2YzZiZGM2DQpjNmI1YmRiZGI1YmRiZGFkYjViNWFkYjViZDljYTViNTk0YTVhZDg0 OWNhNTg0OWNhZDczOGNhNTczOGNhNTYzN2I5NDZiODQ5YzYzN2I5YzZiODQ5YzYzN2I5YzZiODQ5 YzYzN2I5YzZiODQ5YzYzN2I5NDYzN2I5NDYzN2I5NA0KNjM3Yjk0NWE3MzhjNjM3Yjk0NWE3Mzhj NjM3YjhjNWE3MzhjNWE3YjhjNWE3MzhjNWE3MzhjNTI3Mzg0NWE3MzhjNWE3Mzg0NWE3MzhjNWE3 Mzg0NjM3Mzg0NWE3Mzg0NjM3Mzg0NWE2Yjg0NjM3Mzg0NWE2YjdiNWE2YjdiNWENCjZiNzM2MzZi NzM2MzYzNmI2MzYzNjM1YTVhNWE1YTVhNjM1MjVhNWE1MjVhNWE0YTUyNTJhNWI1YmRhNWJkYmRh NWI1YmRhNWJkYmRhNWI1YmRhNWJkYmRhNWI1YmRhNWJkYmQ5Y2I1YjVhNWI1YmQ5Y2I1YjVhNWI1 YmQ5Y2I1DQpiNWE1YjViZDljYjViNWE1YjViZDljYjViNWE1YjViZDljYjViNWE1YjViZDljYjVi NWE1YjViZDljYjViNWE1YjViZDljYjViNWE1YjViZDljYjViNWE1YjViZDljYjViNWE1YjViZDlj YjViNWE1YjViZDljYjViNWE1YjViZA0KYTViNWI1YTViNWJkYTVhZGI1YWRiNWI1YWRiNWI1YjVi ZGJkYjViZGI1YjViZGJkYjViZGI1YjViZGJkYjViZGI1YjViZGI1YjVjNmJkYmRjZWM2YmRjNmM2 YzZjZWNlYzZjZWNlY2VkNmQ2Y2VkNmNlZDZkZWQ2ZDZkZWRlZGUNCmU3ZTdkZWU3ZTdlN2VmZWZl N2VmZTdlN2VmZWZlN2VmZTdlZmVmZWZlN2VmZWZlZmY3ZjdlN2VmZjdlZmVmZmZlZmVmZjdmN2Y3 ZWZlZmY3ZTdmN2Y3ZTdmN2Y3ZTdmN2Y3ZWZlN2VmZWZlZmY3ZmZjZWRlZjdiNWNlZWZhZGNlDQpm Nzk0YmRlZjdiYTVkNjg0YjVlNzhjYmRlZjg0YmRlZjg0YjVlZjdiYjVlNzZiOWNkNjZiOTRjZTRh N2JhZDI5NTI4YzM5NmI5YzZiOTRjNjdiYTVkNjdiOWNjZTdiOWNjNjg0YTVjZTg0OWNjNjhjYTVj ZTdiOTRjNjg0OWNjZQ0KN2I5NGM2NmI4Y2I1NTI3MzljNTI3MzljNTI3M2E1NWE3YmFkNjM3YmFk NWE3YmE1NTI2YjljNGE2Yjk0NDI1YTg0NDI1YTg0NDI1YTg0NGE2Mzg0NDI2Mzg0NDI2Mzg0Mzk1 YTdiMzk1YTg0Mzk1YTg0Mzk1YThjMjk1Mjg0MjkNCjRhODQzOTVhOTQ1MjczYWQzOTYzOWMzOTYz OWMzOTVhOWMzMTVhOWMzOTYzYTU0MjZiYTUzOTYzOWMzOTYzOWMzMTUyOGMyOTUyODQyMTQyNzMy MTRhN2IyMTQyNzMyOTRhNzMyOTQyNmIzMTRhNmIzOTUyNmI5NDljYjVhNWFkDQpiZGI1YmRjNmI1 YmRiZGM2YzZjNmJkYzZjNmJkYzZjNmJkYzZjNmJkYzZjNmI1YmRiZGI1YmRiZGFkYjViZGFkYjVi ZGE1YWRiNTljYWRiNThjOWNhZDhjOWNhZDdiOTRhNTczOGNhNTZiODQ5YzZiODQ5YzYzN2I5NDZi N2I5Yw0KNjM3Yjk0NmI4NDljNjM3Yjk0NmI3YjljNjM3Yjk0NmI4NDljNWE3MzhjNjM3Yjk0NWE3 MzhjNjM3Yjk0NWE3MzhjNWE3MzhjNWE3MzhjNWE3MzhjNTI3Mzg0NWE3MzhjNTI3Mzg0NWE3Mzhj NTI2Yjg0NWE3Mzg0NWE2Yjg0NWENCjczOGM1YTZiN2I1YTczODQ1YTZiN2I2MzczODQ1YTZiN2I1 YTZiN2I1YTZiN2I2MzZiN2I1YTYzNmI2MzYzNmI1YTYzNjM1YTYzNjM1MjVhNWE1MjVhNWE0YTUy NTI1MjUyNTJhZGJkYzZhNWJkYmRhZGJkYzZhNWJkYmRhZGJkDQpjNmE1YjViZGFkYmRjNmE1YjVi ZGE1YjViZGE1YjViZGE1YmRiZGE1YjViZGE1YjViZGE1YjViZGE1YmRiZGE1YjViZGE1YjViZGE1 YjViZGE1YmRiZGE1YjViZGE1YjViZGE1YjViZGE1YmRiZGE1YjViZGE1YjViZGE1YjViZA0KYTVi ZGJkYTViNWJkYTViNWJkYTViNWJkYTViZGJkYTViNWJkYTViZGJkYTViNWI1YWRiZGJkYTViNWI1 YWRiNWI1YTViNWI1YjViZGJkYjViZGJkYmRiZGJkYjViZGJkYmRjNmJkYjViZGI1YjViZGI1YjVi ZGI1YmRjNmJkYmQNCmM2YmRjNmNlYzZjNmNlYzZjZWQ2Y2VjZWQ2Y2VkNmQ2ZDZkNmRlZDZkZWU3 ZGVkZWU3ZGVlN2VmZWZlN2VmZTdlZmVmZWZlN2VmZWZlZmY3ZWZlN2VmZWZlZmY3ZjdlN2VmZWZl ZmVmZmZlN2VmZmZlZmY3ZjdlZmY3ZWZmN2Y3DQplZmY3ZjdlN2Y3ZmZlZmVmZjdlZmU3ZWZlZmU3 ZWZmZmM2ZDZmN2FkYmRlN2I1ZDZmZjljYzZmZjg0YWRlZjg0YjVlZjhjYmRmNzg0YjVlZjg0YjVl ZjdiYWRlNzdiYWRlNzZiOWNkNjVhODRjNjI5NWE5NDMxNWE5NDYzODRiZA0KODRhZGRlODRhNWQ2 OGNhNWQ2OGNhNWNlOGNhNWNlOGNhNWNlNzM4Y2JkNzM5NGJkN2I5NGM2NjM4NGFkNTI3M2E1NGE2 YjljNWE3YmE1NWE3YmE1NWE3YmE1NTI2Yjk0NGE2Yjk0NDI2Mzg0NDI1YTg0NDI1YTg0NGE2Yjhj NGENCjZiOGM0MjYzOGMzOTVhODQ0MjYzOGM0MjYzOGM0MjYzOTQzOTVhOTQzOTVhOTQyOTUyOGM0 MjYzOWM0YTZiYWQzOTYzOWMzMTVhOTQzOTYzOWMzMTVhOTQ0MjZiYTUzOTYzYTU0MjZiYTUzOTYz OTQzMTVhOTQyMTRhODQyOTRhDQo4NDIxNGE3YjI5NGE3YjIxNDI3MzI5NGE2YjI5NDI2MzM5NTI2 YjhjOWNiNWI1YmRjZWI1YmRjNmI1YmRjNmI1YmRjNmJkYzZjNmI1YmRjNmJkYzZjZWI1YmRjNmJk YmRjNmFkYjViZGI1YmRiZGFkYjViZGE1YjViZDljYTViNQ0KOTRhNWI1ODQ5Y2FkODQ5NGFkNzM4 Y2E1NzM4YzljNjM3Yjk0NmI4NDljNjM3Yjk0NmI4NDljNmI3YjljNmI4NDljNjM3Yjk0NmI4NDlj NjM3Yjk0NjM3Yjk0NjM3YjhjNjM3Yjk0NjM3YjhjNjM3YjhjNWE3MzhjNjM3YjhjNWENCjczOGM1 YTczOGM1MjczODQ1YTczOGM1YTczOGM1YTczOGM1YTczODQ2MzczOGM1YTczODQ1YTczODQ1YTZi ODQ2MzczODQ1YTczODQ2MzczODQ1YTZiN2I2MzZiODQ1YTZiN2I2MzZiNzM2MzYzNmI2MzYzNmI1 YTVhNjM1YTVhDQo1YTUyNTI1YTUyNWE1YTUyNTI1MmE1YjViZGE1YmRiZGE1YjViZGE1YmRiZGE1 YjViZGE1YmRiZGE1YjViZGE1YmRiZGE1YjViZGE1YjViZDljYjViNWE1YjViZGE1YjViZGE1YjVi ZDljYjViNWE1YjViZGE1YjViZGE1YjViZA0KOWNiNWI1YTViNWJkYTViNWJkYTViNWJkOWNiNWI1 YTViNWJkYTViNWJkYTViNWJkOWNiNWI1YTViNWJkYTViNWJkYTViNWJkOWNiNWI1YTViNWJkOWNi NWI1YTViZGJkYTViNWI1YTViNWI1YTViNWI1YWRiNWJkYWRiNWI1YjUNCmJkYmRiNWJkYmRiZGJk YmRiNWJkYjViNWJkYjViNWJkYjViNWJkYjViNWJkYjViZGM2YmRiZGM2YzZjNmNlY2VjNmNlY2Vj ZWQ2ZDZjZWQ2ZDZkNmRlZGVkNmRlZGVkZWU3ZTdkZWU3ZTdlN2VmZTdkZWU3ZTdlN2VmZWZlN2Vm DQplN2U3ZjdlZmU3ZWZlZmVmZjdmN2U3ZWZmN2VmZWZmZmU3ZWZlZmVmZjdlZmVmZjdlN2Y3Zjdl N2VmZWZlN2VmZjdlZmQ2ZGVlN2Y3ZmZmZmI1YzZlZmI1Y2VmNzljYmRmNzk0YmRmZjg0YjVmNzdi YWRlZjg0YjVmNzhjYmRmNw0KODRiNWVmODRiNWY3N2JhZGVmNzNhNWRlNWE4NGM2NGE3M2FkMjE0 YTg0NGE3M2FkN2I5Y2Q2OTRiNWU3ODRhNWQ2ODRhNWNlODQ5Y2M2N2I5Y2M2NzM5NGM2NzM5NGM2 NmI4Y2I1NmI4Y2I1NTI3MzljNDI2MzhjNDI1YTg0NTINCjZiOWM0YTYzOGM0MjVhODQzMTRhN2Iz OTVhODQzOTVhODQ0MjYzOGM0MjYzOGM1MjZiOTQ0YTczOWM0MjYzOTQzOTYzOGM0YTczYTU0YTZi YTUzOTYzOWMzMTUyOGMzOTYzOWM0MjZiYTU0YTZiYWQ0MjYzYTUzOTYzYTUzMTVhDQo5NDMxNWE5 YzMxNjM5YzQyNmJhNTQyNmJhNTM5NjM5YzI5NTI4YzI5NTI4NDIxNGE3YjI5NGE3YjIxNDI3MzI5 NGE3MzIxMzk2MzMxNGE2YjRhNjM3Yjg0OTRhZDljYWRjNmFkYjVjZWFkYjVjNmI1YmRjZWI1YmRj NmJkYzZjZQ0KYjViZGM2YmRjNmM2YmRjNmM2YjViZGM2YTVhZGI1YWRiNWJkYTVhZGI1OWNhZGI1 OGM5Y2FkOGM5Y2FkN2I5NGE1N2I5NGE1NmI4NDljNmI4NDljNjM3Yjk0NmI3YjljNjM3Yjk0NmI3 YjljNjM3Yjk0NmI3YjljNjM3Yjk0NjMNCjdiOTQ2MzdiOGM2MzdiOTQ1YTczOGM2MzdiOGM1YTcz OGM1YTdiOGM1YTczODQ1YTczOGM1YTczOGM1YTczOGM1MjczODQ1YTczOGM1MjczODQ1YTczODQ1 YTZiODQ1YTczODQ1YTZiODQ1YTczODQ1YTZiN2I1YTczODQ1YTZiDQo3YjVhNmI4NDVhNjM3YjYz NmI3YjYzNjM2YjYzNmI2YjVhNjM2MzVhNjM2MzUyNWE1YTUyNWE1YTUyNTI1MjUyNWE1MmFkYmRj NmE1YmRiZGFkYmRjNmE1YjViZGFkYmRjNmE1YmRiZGFkYmRjNmE1YjViZGE1YmRiZGE1YjViZA0K YTViZGJkYTViNWJkYTViZGJkYTViNWJkYTViZGJkYTViNWJkYTViZGJkYTViNWJkYTViZGJkYTVi NWJkYTViZGJkYTViNWJkYTViZGJkYTViNWJkYTViZGJkYTViNWJkYTViZGJkYTViNWJkYTViZGJk YTViNWJkYTViZGJkYTUNCmI1YmRhNWJkYmRhNWI1YmRhNWJkYmRhNWI1YjVhZGI1YmRhZGI1YjVi NWJkYmRiNWJkYmRiZGM2YmRiNWJkYmRiZGJkYmRiNWJkYjViNWJkYjViNWJkYjViZGM2YmRiNWM2 YmRjNmNlY2VjNmNlY2VjZWQ2Y2VjZWQ2Y2VkNmRlDQpkNmQ2ZGVkNmRlZTdkZWRlZTdkZWU3ZWZl ZmRlZWZlN2U3ZWZlZmU3ZWZlN2U3ZjdlZmU3ZWZlZmVmZjdlZmU3ZWZlZmVmZWZmZmU3ZWZmN2Vm ZjdmN2VmZjdlZmY3ZjdlZmVmZjdlN2VmZjdlZmU3ZWZlZmVmZjdmZmRlZWZmZg0KYWRiZGU3YWRj NmZmOWNiZGY3ODRhZGVmN2JhZGY3N2JiNWY3OGNiZGY3OGNiZGY3OGNiZGY3ODRiNWY3OGNiZGY3 N2JhZGU3NmI5NGQ2NTI3YmJkMzE1YTk0Mzk2Mzk0NWE4NGJkODRhNWQ2OTRiNWRlOGNhZGQ2OGNh ZGQ2ODQNCmE1Y2U4NGE1ZDY3Mzk0YzY2YjhjYmQ2Mzg0YWQ1YTdiYWQ0YTZiOTQzOTUyODQyOTRh NzMzMTRhN2IyOTRhNzMzMTRhN2IyOTRhNzMzOTUyODQ0MjYzOGM1MjZiOWM0YTZiOWM1MjczYTU0 YTczYTU1MjdiYWQ1MjdiYWQ1MjczDQphZDM5NjM5YzM5NjM5YzM5NjNhNTRhNzNhZDQyNmJhZDQy NmJhZDMxNWE5YzMxNWE5YzMxNWE5NDM5NjNhNTM5NjNhNTQyNmJhZDM5NjM5YzMxNWE5NDIxNGE4 NDI5NTI4NDIxNGE3YjI5NGE3YjI5NDI3MzM5NTI3YjI5NDI2Yg0KNDI1YTdiODQ5NGI1YmRjZWU3 YmRjNmU3YWRiZGQ2YWRiNWM2YjVjNmNlYmRjNmNlYmRjNmNlYjViZGM2YmRjNmNlYjViZGJkYWRi NWJkYWRiNWJkYTViNWJkOWNhZGI1OTRhNWFkODQ5Y2FkODQ5Y2FkN2I4Y2E1NzM4YzljNjMNCjdi OTQ2Yjg0OWM2MzdiOTQ2Yjg0OWM2MzdiOTQ2Yjg0OWM2MzdiOTQ2Yjg0OWM2MzdiOTQ2MzdiOTQ2 MzdiOTQ2MzdiOTQ1YTczOGM2MzdiOTQ1YTczOGM1YTdiOGM1YTczOGM1YTdiOGM1YTczOGM1YTcz OGM1MjczODQ1YTczDQo4YzVhNzM4NDVhNzM4YzVhNmI4NDYzNzM4NDVhNzM4NDYzNzM4NDVhNmI4 NDYzNzM4NDVhNmI3YjVhNmI3YjVhNmI3MzYzNmI3MzYzNjM2YjYzNjM2YjVhNWE2MzVhNjM2MzUy NWE1YTUyNWE1YTUyNTI1MmE1YjViZGE1YmRiZA0KYTViNWJkYTViZGJkYTViNWJkYTViZGJkYTVi NWJkYTViZGJkYTViNWJkYTViNWJkYTViNWJkYTViZGJkYTViNWJkYTViNWJkYTViNWJkYTViZGJk YTViNWJkYTViNWJkYTViNWJkYTViZGJkYTViNWJkYTViNWJkYTViNWJkYTUNCmJkYmRhNWI1YmRh NWI1YmRhNWI1YmRhNWJkYmRhNWI1YmRhNWI1YmRhNWI1YmRhNWJkYmQ5Y2I1YjVhNWJkYmRhNWI1 YjVhNWI1YmRhNWI1YjVhZGI1YjVhZGI1YjViNWJkYmRiNWJkYmRiZGJkYmRiNWJkYjViNWJkYjVh ZGI1DQpiNWI1YmRiNWI1YmRiNWJkYzZiZGJkYzZjNmM2Y2VjZWM2Y2VjZWNlZDZkNmM2ZDZjZWNl ZGVkNmQ2ZGVkZWRlZTdlN2RlZTdlN2RlZWZlN2RlZTdlN2U3ZWZlZmRlZWZlN2U3ZWZlZmU3ZWZl ZmVmZjdlZmU3ZWZlZmVmZWZmNw0KZTdlZmVmZWZmN2VmZTdlZmU3ZWZmN2VmZTdlZmVmZTdlZmY3 ZTdmN2ZmYmRkNmY3OTRhZGRlYjVkNmZmOTRiZGY3N2JhZGU3NzNhNWU3ODRiZGY3ODRiNWVmOGNi ZGY3OGNiZGY3OGNiZGY3OGNiNWY3ODRiNWVmNzM5Y2Q2NjMNCjhjY2U0MjZiYTUyOTUyOGMzMTVh OTQ2Yjk0YzY4Y2I1ZTc4Y2I1ZGU4NGE1Y2U3YjljYzY2YjhjYmQ3Mzk0YzY2Yjk0YzY2YjhjYmQ1 YTdiYWQ0YTZiOWMyOTQyNzMwODI5NTIxODM5NmIyOTRhNzMyOTQyNzMyMTQyNzMyOTQyDQo3MzQy NWE4YzRhNmI5YzRhNmI5YzRhNzNhNTVhN2JiNTVhODRiZDVhN2JiNTQyNjNhNTM5NjM5YzM5NjNh NTRhNmJhZDQyNmJhZDQyNmJhZDM5NjNhNTM5NjNhNTI5NTI5NDI5NWE5YzMxNWE5YzM5NmJhNTM5 NjNhNTM5NjM5Yw0KMzE1YThjMjk1MjhjMjE0YTdiMjk0YTdiMjk0YTdiMjk0YTdiMjk0YTdiMjk0 MjZiNDI1YTg0NzM4Y2I1OGM5Y2JkODQ5Y2JkOGM5Y2M2YjViZGRlYWRiZGNlYmRjNmNlYWRiZGM2 YjViZGM2YjViZGM2YjViZGM2YTViNWI1YWQNCmI1YmQ5Y2FkYjU5Y2FkYjU4YzljYWQ4YzljYWQ3 Yjk0YTU3YjhjYTU2Yjg0OWM2Yjg0OTQ2MzdiOTQ2MzdiOWM2MzdiOTQ2Yjg0OWM2MzdiOTQ2Mzdi OWM2MzdiOTQ2MzdiOTQ1YTczOGM2MzdiOTQ1YTczOGM2MzdiOTQ1YTczDQo4YzVhNzM4YzVhNzM4 NDVhNzM4YzUyNzM4NDVhNzM4YzUyNzM4NDVhNzM4YzUyNmI4NDVhNzM4NDVhNmI4NDVhNzM4NDVh NmI3YjVhNzM4NDVhNmI3YjYzNzM4NDVhNmI3YjVhNmI3YjVhNmI3YjYzNmI3YjYzNjM2YjYzNmI2 Yg0KNWE2MzYzNWE2MzYzNTI1YTVhNTI1YTVhNTI1MjUyNTI1YTVhYWRiZGM2YTViZGJkYWRiZGM2 YTViZGJkYWRiZGM2YTViZGJkYWRiZGM2YTViZGJkYTViZGJkYTViNWJkYTViZGJkYTViNWJkYTVi ZGJkYTViNWJkYTViZGJkYTUNCmI1YmRhNWJkYmRhNWI1YmRhNWJkYmRhNWI1YmRhNWJkYmRhNWI1 YmRhNWJkYmRhNWI1YmRhNWJkYmRhNWI1YmRhNWJkYmRhNWI1YmRhNWJkYmRhNWI1YmRhNWJkYmRh NWI1YmRhNWJkYmRhNWI1YmRhZGJkYmRhNWI1YjVhZGI1DQpiZGFkYjViNWI1YmRiZGI1YmRiZGJk YmRiZGI1YmRiZGJkYzZiZGI1YmRiNWI1YmRiNWI1YmRiNWJkYzZiZGJkYzZiZGM2Y2VjZWJkY2Vj NmNlZDZkNmM2ZDZjZWNlZDZkNmNlZGVkNmQ2ZTdkZWQ2ZTdkZWRlZWZlN2RlZTdlNw0KZTdlZmVm ZGVlZmU3ZTdlZmVmZTdlZmVmZTdmN2VmZTdlZmVmZWZlZmY3ZTdlZmVmZWZmN2Y3ZTdmN2VmZWZm N2VmZTdlZmVmZTdmN2Y3ZGVlZmY3ZGVlZmZmYTViZGRlOTRiNWU3YWRjZWZmOWNjNmZmODRhZGVm ODRiNWY3ODQNCmI1Zjc4Y2JkZjc4Y2JkZjc5NGM2ZmY5NGJkZjc5NGJkZmY4Y2I1ZWY3YmFkZTc2 Yjk0ZDY1YTg0YzYyOTUyOGMyOTUyOGM1YTg0YjU4Y2FkZTc4Y2I1ZTc3YjljY2U1YTdiYWQzOTYz OTQ1YTg0YmQ3YmE1ZGU3Mzk0Y2U2Mzg0DQpiNTQyNjM5NDI5NGE3MzAwMjE1MjE4Mzk2MzE4MzE2 MzIxMzk2YjE4MzE2MzIxMzk3MzMxNGE4NDRhNjM5YzRhNmJhNTUyN2JiNTVhODRiZDYzODRjNjRh NzNhZDM5NjM5YzM5NWE5YzRhNmJhZDRhNzNiNTRhNzNiZDQyNmJiNQ0KNDI2YmFkMzE2M2E1MzE1 YTljMjk1YTljMzk2M2E1Mzk2M2E1NDI2YmE1Mzk2MzljMzE1YTk0Mjk1MjhjMjk1Mjg0MjE0YTdi Mjk1Mjg0Mjk0YTdiMjk0YTdiMjk0MjczMzE1Mjg0Mzk1YTg0Mzk1YTg0Mzk1Mjg0NmI4NGFkOTQN CmFkY2VhZGJkZDZiZGM2Y2ViNWM2Y2VhZGJkYzZiZGM2Y2ViNWJkYzZhZGI1YmRhNWI1YmRhNWI1 YmQ5Y2FkYjU5NGE1YjU4NDljYWQ4NDk0YWQ3MzhjOWM3MzhjOWM2YjdiOTQ2Yjg0OWM2MzdiOTQ2 Yjg0OWM2MzdiOWM2Yjg0DQo5YzYzN2I5NDZiODQ5YzYzN2I5NDYzN2I5NDYzN2I4YzYzN2I5NDYz N2I4YzYzN2I4YzVhNzM4YzYzN2I4YzVhNzM4YzVhN2I4YzVhNzM4YzVhN2I4YzVhNzM4YzVhNzM4 YzUyNzM4NDVhNzM4YzVhNmI4NDVhNzM4NDVhNmI4NA0KNjM3Mzg0NWE3Mzg0NjM3Mzg0NWE2Yjdi NjM2Yjg0NWE2YjdiNjM2YjczNjM2MzZiNjM2YjZiNWE2MzYzNWE1YTYzNTI1YTVhNTI1YTVhNTI1 MjUyYTViNWJkYWRiZGM2YTViNWJkYTViZGJkYTViNWJkYWRiZGM2YTViNWJkYTUNCmJkYmRhNWI1 YmRhNWJkYmRhNWI1YmRhNWJkYmRhNWI1YmRhNWJkYmRhNWI1YmRhNWJkYmRhNWI1YmRhNWJkYmRh NWI1YmRhNWJkYmRhNWI1YmRhNWJkYmRhNWI1YmRhNWJkYmRhNWI1YmRhNWJkYmRhNWI1YmRhNWJk YmRhNWI1DQpiZGE1YmRiZGE1YjViZGE1YmRiZGE1YjViNWE1YmRiZGE1YjViNWE1YjViZGE1YjVi NWFkYjViZGFkYjViNWI1YmRiZGI1YmRiZGJkYmRiZGI1YmRiNWI1YmRiNWI1YmRiNWI1YmRiNWI1 YmRiNWJkYzZiZGJkYzZjNmM2Y2VjZQ0KYzZjZWNlYzZkNmNlYzZkNmNlY2VkZWQ2Y2VkZWQ2ZDZl N2RlZGVlN2U3ZGVlZmU3ZGVlN2U3ZGVlZmU3ZGVlZmU3ZTdlZmVmZTdlZmVmZTdlZmVmZTdlZmVm ZWZlZmVmZTdlZmU3ZTdmN2VmZGVlZmVmZGVmN2Y3ZDZlZmY3ZDYNCmVmZmZiZGRlZmY5NGI1ZGU4 Y2FkZGU5NGI1ZWY4NGFkZTc4Y2I1ZWY4Y2I1ZWY4Y2I1ZWY4Y2JkZWY5Y2M2Zjc5NGJkZjc5NGJk ZmY5NGJkZjc4Y2JkZjc3YmE1ZTc3MzljZGU2Mzk0Y2U0MjZiYWQyOTUyOGM0YTczYWQ3MzljDQpj ZThjYjVlZjdiYTVkNjVhODRiNTMxNWE5NDYzOGNjNjg0YWRkZTczOWNkNjVhN2JiNTUyNzNhNTI5 NGE4NDEwMzE2MzAwMTg1MjAwMTg0YTAwMTA0YTA4Mjk2MzEwMzE2YjIxNDI4NDM5NWE5NDVhN2Ji ZDUyN2JiNTVhODRiZA0KNGE3M2I1Mzk2M2E1MzE1YTljNDI2YmFkNGE3M2I1NGE3YmJkNGE3M2I1 NGE3M2I1Mzk2M2FkMzE2M2E1Mjk1YTljMzE1YTljMjk1YTljMzE2MzljMzk2MzljMzk2MzljMzE1 YThjMjk1MjhjMjE0YTg0Mjk0YTg0Mjk0YTdiMzENCjUyODQzMTUyOGMyOTRhN2IxMDMxNjMxMDMx NjMyMTQyNzM0MjVhOTQ0YTZiOWM1YTczOWM5Y2I1YzZiZGM2ZDZiNWM2Y2ViNWM2YzZiNWJkYzZi NWJkYzZhNWFkYjVhNWI1YmRhNWFkYjU5Y2FkYjU4YzljYWQ4YzljYWQ3Yjk0DQphNTdiOTRhNTZi ODQ5YzZiODQ5NDYzN2I5NDZiN2I5YzYzN2I5NDZiN2I5YzYzN2I5NDZiN2I5YzYzN2I5NDYzN2I5 NDYzN2I4YzYzN2I5NDVhNzM4YzYzN2I4YzVhNzM4YzVhN2I4YzVhNzM4NDVhNzM4YzVhNzM4YzVh NzM4Yw0KNTI3Mzg0NWE3MzhjNTI3Mzg0NWE3Mzg0NWE2Yjg0NWE3Mzg0NWE2Yjg0NWE3Mzg0NWE2 YjdiNWE3Mzg0NWE2YjdiNWE2Yjg0NWE2MzdiNjM2YjdiNjM2MzZiNjM2YjZiNWE2MzYzNWE2MzYz NTI1YTVhNTI1YTVhNTI1MjUyNTINCjVhNTJhZGJkYzZhNWJkYmRhZGJkYzZhNWJkYmRhZGJkYzZh NWJkYmRhZGJkYzZhNWJkYmRhZGJkYzZhNWI1YmRhNWJkYmRhNWI1YmRhZGJkYzZhNWI1YmRhNWJk YmRhNWI1YmRhZGJkYzZhNWI1YmRhNWJkYmRhNWI1YmRhZGJkDQpjNmE1YjViZGE1YmRiZGE1YjVi ZGFkYmRjNmE1YjViZGE1YmRiZGE1YjViZGFkYmRjNmE1YjViZGE1YmRiZGE1YjViZGE1YmRiZGE1 YmRiZGFkYmRiZGE1YjViNWFkYmRiZGFkYjViZGI1YmRiZGI1YmRiZGJkYzZiZGI1YmRiZA0KYmRi ZGJkYjViZGI1YjViZGI1YjViZGI1YmRjNmJkYjVjNmJkYzZjZWNlYmRjZWM2YzZkNmNlYzZkNmNl Y2VkNmQ2Y2VkZWQ2ZDZlN2RlZDZlN2RlZGVlZmU3ZGVlN2U3ZGVlZmU3ZGVlZmU3ZTdlZmVmZTdl ZmVmZTdmN2VmZTcNCmVmZWZlZmY3ZWZlZmVmZWZlZmY3ZWZlN2VmZWZlN2Y3ZjdkZWVmZjdkNmVm ZmZjZWU3ZmZiNWQ2Zjc5NGI1ZTc5NGI1ZTc2YjhjY2U3MzljZDY4NGFkZTc5NGJkZjc4Y2I1ZWY5 Y2M2Zjc5Y2M2ZjdhNWM2ZmY5Y2M2Zjc5Y2M2DQpmZjhjYmRmNzg0YjVlZjczYTVkZTczYTVlNzVh ODRjNjQyNzNhZDM5NmJhNTVhOGNjNjhjYjVlZjljYzZmNzdiYTVkZTczOWNkZThjYjVlZjk0YmRm NzdiYTVkZTczOWNjZTZiOGNjNjUyNzNhZDI5NGE3YjEwMjk2MzAwMTg1Mg0KMDAyMTVhMTgzOTcz Mjk0YTg0Mjk0YThjMzk1YTljNTI3M2I1NWE4NGJkNTI3YmI1NDI2YmFkMzE1YWE1NDI2YmFkNGE3 M2JkNWE4NGM2NTI3YmM2NTI3YmJkNDI3M2I1NDI2YmFkMzE1YWE1MzE1YTljMjk1YTljMzE1YTlj MzENCjVhOWMzOTZiYTUzOTYzOWMzMTVhOTQyOTUyODQyOTUyODQyMTRhODQyOTUyODQyOTUyODQz OTVhOTQyOTRhODQyMTQyN2IyMTQyN2I0MjYzOWM1YTdiYjU1MjdiYjU0MjVhOGM5NGFkYmRhZGJk Y2ViZGM2ZDZiNWJkY2ViNWM2DQpjZWFkYmRjNmE1YjViZGE1YWRiNWE1YjViZDljYWRiNTk0YTVi NTg0OWNhZDg0OWNhZDdiOGNhNTczOGM5YzYzN2I5NDZiODQ5YzYzN2I5NDZiODQ5YzYzN2I5NDZi ODQ5YzYzN2I5NDZiODQ5YzYzN2I5NDYzN2I5NDYzN2I5NA0KNjM3Yjk0NWE3MzhjNjM3Yjk0NWE3 MzhjNWE3YjhjNWE3MzhjNWE3YjhjNWE3MzhjNWE3MzhjNTI3Mzg0NWE3MzhjNWE3Mzg0NWE3Mzhj NWE2Yjg0NjM3Mzg0NWE3Mzg0NjM3Mzg0NWE2Yjg0NjM3Mzg0NWE2YjdiNWE2YjdiNWENCjZiNzM2 MzZiNzM2MzYzNmI2MzYzNmI1YTVhNjM1YTYzNjM1MjVhNWE1MjVhNWE1MjUyNTJhNWI1YmRhZGJk YzZhNWJkYmRhZGJkYzZhNWI1YmRhZGJkYzZhNWJkYmRhZGJkYzZhNWI1YmRhNWJkYmRhNWI1YmRh NWJkYmRhNWI1DQpiZGE1YmRiZGE1YjViZGE1YmRiZGE1YjViZGE1YmRiZGE1YjViZGE1YmRiZGE1 YjViZGE1YmRiZGE1YjViZGE1YmRiZGE1YjViZGE1YmRiZGE1YjViZGE1YmRiZGE1YjViZGE1YmRi ZGE1YjViZGE1YmRiZGE1YjViNWE1YmRiZA0KYTViNWJkYWRiNWJkYTViNWI1YWRiNWJkYjViZGJk YmRjNmJkYjViZGJkYmRiZGJkYjViZGI1YjViZGI1YWRiNWI1YjViZGI1YjViZGI1YmRjNmJkYmRj NmM2YzZjZWNlYzZjZWNlYzZkNmNlYzZkNmNlY2VkZWQ2ZDZkZWRlZDYNCmU3ZGVkNmU3ZGVkZWU3 ZTdkZWU3ZTdkZWVmZTdkZWU3ZTdlN2VmZWZlN2VmZWZlN2Y3ZWZlN2VmZTdlZmY3ZTdlN2VmZTdl N2Y3ZWZkZWVmZWZkNmVmZjdjZWU3ZmZjZWVmZmY5Y2JkZTc5NGI1ZTc4Y2FkZTc2Mzg0YmQ3Mzlj DQpjZThjYjVlZjhjYmRlNzk0YmRlZjljYmRlZmE1YzZmZmE1YzZmZjljYzZmZjk0YmRmNzk0YmRm Nzg0YWRlZjdiYWRlNzczOWNkZTZiOWNkZTVhOGNjZTUyN2JiNTUyN2JiNTdiYWRlNzljYzZmZjk0 YzZmZjk0YzZmZmE1Y2VmZg0KOWNjNmZmOGNiNWVmN2JhNWRlN2JhNWQ2NjM4NGJkNDI2MzljMjk0 YTdiMjk0MjdiMjk0YTg0NDI2M2E1NDI2M2E1Mzk2M2E1Mzk1YWE1NDI2M2FkNDI2YmFkNDI2YmFk Mzk2M2E1NDI2YmI1NGE3M2JkNWE4NGNlNWE4NGNlNWENCjg0Y2U0YTczYmQ0YTczYmQzOTZiYWQz OTYzYTUyOTVhOWMzMTVhOWMyOTVhOWMzMTYzOWMzMTYzOTQzOTYzOTQzMTVhOGMyOTUyOGMyMTRh N2IyMTRhODQyOTRhODQzMTUyOGMyMTRhN2IzMTUyOGMzMTUyOTQ0MjYzOWM0YTZiDQphZDUyN2Ji ZDUyN2JiNTUyNzNhZDczOGNhNWE1YjViZGI1YzZjZWI1YzZjZWFkYmRjNmFkYmRjNmE1YjViZGE1 YjViZDljYWRiNTljYWRiNThjOWNhZDhjOWNhZDdiOTRhNTdiOGNhNTZiODQ5YzZiODQ5NDYzN2I5 NDYzN2I5Yw0KNjM3Yjk0NmI4NDljNjM3Yjk0NjM3YjljNjM3Yjk0NjM3Yjk0NWE3MzhjNjM3Yjk0 NWE3MzhjNjM3Yjk0NWE3MzhjNWE3MzhjNWE3Mzg0NWE3MzhjNTI3Mzg0NWE3MzhjNTI3Mzg0NWE3 MzhjNTI2Yjg0NWE3Mzg0NWE2Yjg0NWENCjczODQ1YTZiN2I1YTczODQ1YTZiN2I2MzczODQ1YTZi N2I1YTZiN2I1YTZiN2I2MzZiN2I2MzYzNmI2MzZiNmI1YTYzNjM1YTYzNjM1MjVhNWE1MjVhNWE1 MjUyNTI1MjVhNWFhZGJkYzZhNWJkYmRhZGJkYzZhNWJkYmRhZGJkDQpjNmE1YmRiZGFkYmRjNmE1 YmRiZGFkYmRjNmE1YjViZGFkYmRjNmE1YmRiZGFkYmRjNmE1YjViZGFkYmRjNmE1YmRiZGFkYmRj NmE1YjViZGFkYmRjNmE1YmRiZGFkYmRjNmE1YjViZGFkYmRjNmE1YmRiZGFkYmRjNmE1YjViZA0K YWRiZGM2YTViZGJkYWRiZGM2YTViNWJkYWRiZGM2YTViZGJkYTViZGJkYTViZGJkYWRiZGJkYTVi NWJkYWRiNWJkYWRiNWI1YjViZGJkYjViZGJkYmRiZGJkYjViZGJkYmRjNmJkYjViZGI1YjViZGI1 YjViZGI1YmRjNmJkYjUNCmM2YmRiZGNlYzZiZGNlYzZjNmQ2Y2VjNmQ2Y2VjZWQ2ZDZjZWQ2ZDZk NmU3ZGVkNmU3ZGVkZWVmZTdkZWU3ZTdlN2VmZWZkZWVmZTdlN2VmZWZkZWVmZTdlN2Y3ZWZlN2Vm ZWZlZmY3ZWZlZmVmZTdlZmY3ZWZlN2Y3ZWZkZWY3DQpmN2Q2ZWZmN2NlZWZmZmM2ZTdmZjhjYWRk ZTg0YWRkZTk0YjVlZjYzOGNjNjg0YWRlNzk0YmRlZjk0YmRlZjljYzZmN2E1YzZmN2E1YzZmN2Fk Y2VmZmE1YzZmZjljYzZmZjk0YmRmNzk0YmRmNzg0YWRlZjdiYTVlNzdiYTVlNw0KN2JhZGU3NjM5 NGNlNWE4NGM2NmI5Y2Q2OTRiZGZmOWNjNmZmOTRjNmZmYTVjZWZmYWRkNmZmOTRiZGY3ODRhZGU3 NzM5Y2Q2NjM4Y2M2NGE2YmE1Mzk1YTk0NDI2MzljNTI3M2I1NWE3YmJkNjM4NGM2NTI3M2JkNDI2 YmFkMzENCjUyOWM0MjYzYTUzOTYzOWM0MjZiYWQ0YTczYmQ2MzhjY2U2MzhjY2U2MzhjY2U1YTg0 YzY1YTg0Y2U0YTdiYmQ0YTczYjUzOTYzYTUzOTYzYTUzMTYzOWMzOTYzYTUzMTYzOWMzOTYzOWMz MTYzOTQzMTVhOTQyOTUyOGMyMTRhDQo4NDIxNGE3YjI5NTI4NDI5NTI4YzI5NTI4YzI5NGE4NDMx NTI5NDM5NjM5YzQyNmJhZDQyNmJhZDUyN2JiZDVhODRiZDYzN2I5Yzk0YTViNWI1YzZkNmFkYmRj ZWI1YzZjZWFkYmRiZGFkYjViZGE1YjViZGE1YjViZDk0YWRiNQ0KOTRhNWI1ODQ5Y2FkODQ5NGFk NzM4Y2E1NzM4YzljNmI3Yjk0NmI4NDljNjM3Yjk0NmI4NDljNjM3YjljNmI4NDljNjM3Yjk0NmI4 NDljNjM3Yjk0NjM3Yjk0NjM3YjhjNjM3Yjk0NjM3YjhjNjM3YjhjNWE3MzhjNjM3YjhjNWENCjcz OGM1YTdiOGM1YTczOGM1YTdiOGM1YTczOGM1YTczOGM1MjczODQ1YTczOGM1YTZiODQ1YTczODQ1 YTZiODQ2MzczODQ1YTczODQ2MzczODQ1YTZiN2I2MzZiODQ1YTZiN2I2MzZiNzM2MzYzNmI2MzZi NmI1YTYzNjM1YTVhDQo2MzUyNWE1YTVhNWE1YTUyNTI1MmE1YmRiZGFkYmRiZGE1YmRiZGFkYmRi ZGE1YmRiZGFkYmRiZGE1YmRiZGFkYmRiZGE1YmRiZGFkYmRiZGE1YjViZGE1YmRiZGE1YjViZGE1 YmRiZGE1YjViZGE1YmRiZGE1YjViZGE1YmRiZA0KYTViNWJkYTViZGJkYTViNWJkYTViZGJkYTVi NWJkYTViZGJkYTViNWJkYTViZGJkYTViNWJkYTViZGJkYTViNWJkYWRiZGM2YTViNWJkYWRiZGM2 YTViNWJkYTViZGJkYTViNWJkYTViZGJkYTViNWI1YWRiZGJkYWRiZGJkYjUNCmJkYmRiNWJkYmRi ZGM2YmRiNWJkYjViNWJkYjViNWJkYjViNWJkYjViNWJkYjViZGM2YmRiZGM2YzZiZGNlY2ViZGM2 YzZjNmQ2Y2VjNmNlY2VjZWRlZDZjZWRlZGVkNmU3ZGVkNmU3ZTdkZWU3ZTdkNmU3ZTdkZWVmZWZk ZWVmDQplZmU3ZWZlZmRlZWZlZmU3ZWZlZmU3ZWZlZmVmZjdlZmVmZjdlZmU3ZWZlZmQ2ZTdlZmQ2 ZjdmZmNlZWZmZmI1ZDZmNzdiOWNjNjk0YmRlZjdiYTVkZTZiOTRjZTg0YWRlNzljYzZmZjhjYmRl ZjljYzZlZjljYzZlZmE1Y2VmNw0KYTVjNmY3YWRjZWZmYTVjNmZmOWNjNmZmOGNiNWY3OGNiNWY3 ODRhZGVmODRhZGVmN2JhNWRlNzM5Y2RlNmI5NGNlN2JhNWRlODRhZGU3OWNjNmZmOWNjNmZmYTVj ZWZmOWNjNmZmOTRiZGY3ODRhZGVmODRhZGU3NjM4Y2NlNTINCjdiYjU0MjZiYTU0YTczYjU1YTg0 YzY3Mzk0ZDY2Mzg0YzY0YTZiYWQzOTVhOWM0MjZiYWQ0MjZiYTU1MjczYjU1YTdiYjU2Mzg0YzY2 MzhjYzY2Yjk0Y2U2MzhjYzY2Mzg0YzY1YTg0YzY1MjdiYmQ0YTczYjU0MjZiYWQzOTYzDQphNTMx NWE5YzMxNWE5NDM5NjNhNTMxNWE5YzMxNjM5YzI5NTI5NDIxNTI4YzE4NGE4NDIxNTI4NDIxNGE4 NDIxNGE4NDMxNWE4YzI5NTI4YzI5NWE4YzMxNjM5YzM5NmJhNTRhN2JiNTQyNzNhZDVhODRiZDUy NzM5YzdiOWNiZA0KYTViZGQ2YWRiZGNlYWRiZGM2YjVjNmM2YTVhZGFkYWRiZGJkOWNiNWI1OWNh ZGI1OGM5Y2FkODQ5Y2FkN2I5NGE1N2I5NGE1NmI4NDljNmI4NDk0NjM3Yjk0NjM3YjljNjM3Yjk0 NjM3YjljNjM3Yjk0NjM3YjljNjM3Yjk0NjMNCjdiOTQ1YTczOGM2MzdiOTQ1YTczOGM2MzdiOGM1 YTczOGM2MzdiOGM1YTczODQ1YTczOGM1YTczOGM1YTczOGM1MjczODQ1YTczOGM1MjczODQ1YTcz ODQ1YTZiODQ1YTczODQ1YTZiODQ1YTczODQ1YTZiN2I1YTczODQ1YTZiDQo3YjVhNmI3YjVhNjM3 YjVhNmI3YjVhNjM3MzYzNmI2YjVhNWE2MzVhNjM2MzVhNWE1YTVhNWE2MzUyNTI1MjUyNTI1MmFk YzZiZGFkYmRiZGFkYzZiZGE1YmRiZGFkYzZjNmFkYmRiZGFkYmRjNmE1YmRiZGFkYmRjNmE1YmRi ZA0KYWRiZGM2YTViZGJkYWRiZGM2YTViZGJkYWRiZGM2YTViNWJkYWRiZGM2YTViZGJkYWRiZGM2 YTViNWJkYWRiZGM2YTViZGJkYWRiZGM2YTViNWJkYWRiZGM2YTViZGJkYWRiZGM2YTViZGJkYWRi ZGM2YTViZGJkYWRiZGM2YTUNCmJkYmRhNWJkYmRhNWJkYmRhZGJkYmRhNWI1YmRhZGJkYmRhZGJk YmRiNWJkYmRiNWJkYmRiZGM2YzZiNWJkYmRiZGM2YmRiNWJkYjViNWM2YmRiNWJkYjViNWM2YmRi NWM2YmRiZGNlYzZiZGM2YzZjNmNlY2VjNmNlY2VjZWQ2DQpkNmNlZDZkNmQ2ZGVkZWQ2ZGVkZWRl ZTdlN2RlZTdlN2RlZWZlZmRlZTdlN2U3ZWZlZmRlZWZlZmU3ZWZlZmU3ZWZlZmVmZWZmN2VmZWZl ZmVmZjdmN2RlZWZlZmRlZWZmN2Q2ZjdmZmNlZWZmZmE1Y2VlNzdiYTVjZTk0YmRlZg0KODRhZGU3 NmI5NGQ2OGNiZGVmOWNjNmZmOTRjNmY3OWNjNmVmYTVjZWY3YTVjNmY3YTVjZWY3YTVjNmY3YTVj ZWZmOWNjNmZmOWNiZGZmOGNiNWY3OGNiNWY3OGNhZGY3OGNiNWY3ODRhZGU3OGNiNWVmODRhZGU3 OGNiZGVmOTQNCmJkZWZhZGQ2ZmZhZGQ2ZmZhZGQ2ZmY5Y2M2Zjc5NGJkZjc4NGI1ZWY3MzljZGU1 Mjg0YzY0YTdiYmQ0YTdiYmQ1YThjYzY2MzhjY2U1YTg0YzY0MjYzYTU0MjYzYTU0YTZiYWQ1YTdi YmQ2Mzg0YmQ2YjhjYzY2MzhjYzY3Mzk0DQpjZTczOTRjZTczOTRkNjZiOGNjZTYzOGNjNjVhODRi ZDUyN2JiZDRhNzNiNTQyNmJhZDMxNWE5YzM5NjNhNTM5NjNhNTM5NjNhNTMxNjM5YzMxNWE5YzIx NTI4YzIxNTI4YzIxNTI4NDI5NTI4YzIxNGE4NDMxNWE5NDI5NTI4Yw0KMzE2MzljMzE2MzljNGE3 YmI1NWE4Y2M2NGE3M2I1MzE2MzljNGE3M2E1NzM5NGJkYTVjNmRlYWRiZGNlYjVjNmNlYjVjNmM2 YWRiNWI1YWRiZGI1YTViNWJkOWNhZGI1OGNhNWI1ODQ5Y2FkODQ5Y2FkNzM5NGE1NzM4YzljNjMN CjdiOTQ2Yjg0OWM2MzdiOTQ2Yjg0OWM2MzdiOTQ2Yjg0OWM2MzdiOTQ2MzdiOTQ2MzdiOTQ2Mzdi OTQ2MzdiOGM2MzdiOTQ1YTczOGM2MzdiOTQ1YTczOGM2MzdiOGM1YTczOGM1YTdiOGM1YTczOGM1 YTczOGM1MjczODQ1YTczDQo4YzVhNzM4NDVhNzM4YzVhNmI4NDYzNzM4NDVhNzM4NDYzNzM4NDVh NmI3YjYzNzM4NDVhNmI3YjVhNmI3YjVhNmI3YjYzNmI3MzVhNmI2YjVhNjM2YjVhNWE2MzVhNjM2 MzVhNWE1YTVhNTI1YTUyNTI1MmE1YmRiZGFkYmRiZA0KYTViZGJkYWRjNmJkYTViZGJkYWRiZGJk YTViZGJkYWRiZGM2YTViNWJkYWRiZGJkYTViZGJkYWRiZGJkYTViNWJkYTViZGJkYTViNWJkYTVi ZGJkYTViNWJkYTViZGJkYTViNWJkYTViZGJkYTViNWJkYTViZGJkYTViNWJkYTUNCmJkYmRhNWI1 YmRhNWJkYmRhNWI1YmRhZGJkYzZhNWI1YmRhZGJkYzZhNWJkYmRhZGJkYzZhNWI1YjVhNWJkYmRh NWI1YmRhZGJkYmRhNWI1YjVhZGJkYmRhZGJkYmRiNWM2YmRiNWJkYmRiZGJkYmRiNWJkYjViNWJk YmRhZGJkDQpiNWI1YmRiNWI1YmRiNWJkYzZjNmI1YzZjNmJkY2VjZWJkY2VjZWM2ZDZkNmM2Y2Vj ZWNlZDZkNmNlZGVkZWQ2ZTdlN2Q2ZTdlN2RlZTdlN2RlZTdlN2RlZWZlZmRlZTdlN2U3ZWZlZmRl ZWZlZmU3ZWZlZmU3ZWZlZmU3ZWZlZg0KZTdlZmVmZTdlZmY3ZDZlZmVmZDZmN2ZmYmRkZWY3OWNi ZGU3N2I5Y2NlOTRiZGY3OGNiNWVmN2JhNWU3OGNiNWVmOWNjNmZmOTRjNmVmOWNjZWY3OWNjNmY3 YTVjNmY3OWNiZGVmOWNjNmY3OWNiZGY3OWNiZGZmOTRiNWY3OTQNCmJkZmY4Y2FkZjc4Y2I1Zjc4 NGI1ZWY4Y2I1Zjc4Y2I1ZWY4Y2JkZWY4NGI1ZTc4NGI1ZTdhNWNlZmZhZGQ2ZmZhNWNlZmZhNWNl ZmY5NGJkZjc4Y2JkZjc3MzljZGU1YThjY2U0YTdiYmQ0YTdiYmQ0YTdiYmQ1Mjg0YmQ0MjZiDQph ZDM5NjNhNTM5NjNhNTUyN2JiNTYzOGNjNjZiOTRjZTZiOTRjZTczOTRkNjZiOTRjZTczOWNkNjcz OWNkNjczOWNkNjYzODRjNjVhODRjNjUyN2JiZDUyN2JiZDQyNmJhZDM5NjNhNTM5NjNhNTM5NmJh NTMxNjM5YzMxNjNhNQ0KMjk1YTljMjk1Mjk0MjE0YTg0Mjk1MjhjMjE1Mjg0Mjk1MjhjMjk1Mjhj Mjk1MjhjMzE1YTk0MzE1YTk0NGE3M2I1NmI5Y2Q2NDI3M2I1MjE1MjhjMzE1YThjNjM4Y2FkOWNi ZGQ2YWRjNmQ2YWRiZGM2YjVjNmM2YTViNWI1YWQNCmJkYmQ5Y2FkYjU5Y2FkYjU4YzljYWQ4NDlj YWQ3Yjk0YTU3Yjk0YWQ2Yjg0OWM2Yjg0OWM2MzdiOTQ2MzdiOTQ2MzdiOTQ2YjdiOWM2MzdiOTQ2 MzdiOTQ2MzdiOTQ2MzdiOTQ1YTczOGM2MzdiOTQ1YTczOGM2MzdiOTQ1YTczDQo4YzVhN2I4YzVh NzM4YzVhN2I4YzUyNzM4NDVhNzM4YzUyNzM4NDVhNzM4YzUyNmI4NDVhNzM4NDVhNmI4NDVhNzM4 NDVhNmI4NDVhNzM4NDVhNmI3YjVhNzM4NDVhNmI3YjVhNmI3YjVhNmI3YjYzNmI3YjVhNjM2YjYz NmI2Yg0KNWE2MzYzNWE2MzYzNTI1YTVhNWE1YTVhNTI1MjUyNTI1MjVhYWRjNmJkYWRiZGJkYWRj NmM2YWRiZGJkYWRjNmM2YWRiZGJkYWRjNmM2YWRiZGJkYWRiZGM2YTViZGJkYWRiZGM2YTViZGJk YWRiZGM2YTViZGJkYWRiZGM2YTUNCmJkYmRhZGJkYzZhNWJkYmRhZGJkYzZhNWJkYmRhZGJkYzZh NWJkYmRhZGJkYzZhNWJkYmRhZGJkYzZhNWJkYmRhZGJkYzZhNWJkYmRhZGJkYzZhNWJkYmRhZGJk YzZhNWJkYmRhNWJkYmRhNWJkYmRhZGJkYmRhNWI1YmRhZGJkDQpiZGFkYjViZGI1YmRiZGI1YmRi ZGJkYzZiZGI1YmRiZGJkYzZiZGI1YmRiNWI1YmRiNWI1YmRiNWJkYzZiZGJkYzZiZGJkY2VjNmJk YzZjNmM2Y2VjZWM2Y2VjZWNlZDZkNmNlZDZkNmQ2ZTdlN2Q2ZTdlN2RlZTdlN2RlZTdlNw0KZGVl ZmVmZGVlZmVmZTdlZmVmZGVlZmVmZTdmN2Y3ZTdlZmVmZWZmN2Y3ZTdlZmVmZTdmN2VmZGVlZmY3 ZGVmN2ZmZDZlZmZmYmRkZWY3OGNhZGQ2ODRhNWRlOTRiZGY3OWNiZGZmODRiNWVmOTRiZGY3OTRj NmY3OWNjZWY3OWMNCmNlZjc5Y2M2Zjc5Y2M2Zjc5Y2M2Zjc5NGJkZjc5NGJkZjc4Y2I1ZWY5NGJk Zjc4Y2I1Zjc4Y2I1Zjc4NGFkZWY4Y2I1Zjc4NGFkZWY4Y2I1ZWY4NGI1ZWY4NGI1ZWY4NGFkZTdh NWNlZmZhNWNlZmZhZGQ2ZmZhNWNlZmZhNWNlDQpmZjhjYmRmNzdiYWRlNzVhOGNjZTRhN2JiZDQy NzNiNTRhNzNiNTQyNmJhZDM5NmJhZDMxNWE5YzQyNmJiNTVhN2JiZDZiOTRjZTZiOTRkNjdiOWNk ZTczOWNkNjdiOWNkZTdiOWNkZTdiYTVlNzczOWNkZTZiOTRkNjVhOGNjZQ0KNWE4Y2M2NTI3YmJk NGE3M2I1Mzk2YmFkNDI2YmFkMzk2YmFkMzk2YmFkMzE2M2E1Mzk2M2E1Mjk1Mjk0Mjk1Mjk0Mjk1 MjhjMzE1YTk0Mjk1MjhjMzE1YTk0Mjk1MjhjMzk2MzljMjk1YTk0NDI3M2FkNjM4Y2NlNGE3YmJk MzENCjVhOWMzMTUyODQ1MjczOWM5Y2I1ZDZhNWJkZDZhZGJkYzZiNWJkYzZhZGJkYmRhZGI1YjVh NWI1YmQ5NGFkYjU4Y2E1YjU4NDljYWQ3Yjk0YWQ3MzhjYTU3MzhjYTU2YjdiOWM2YjdiOWM2Mzdi OTQ2Yjg0OWM2MzdiOTQ2Yjg0DQo5YzYzN2I5NDYzN2I5NDYzN2I5NDYzN2I5NDYzN2I4YzYzN2I5 NDYzN2I4YzYzN2I4YzVhNzM4YzYzN2I4YzVhNzM4YzVhN2I4YzVhNzM4YzVhN2I4YzVhNzM4YzVh NzM4YzUyNzM4NDVhNzM4YzVhNmI4NDYzNzM4NDVhNzM4NA0KNjM3Mzg0NWE2Yjg0NjM3Mzg0NWE2 YjdiNjM2Yjg0NWE2YjdiNjM2YjczNWE2MzZiNjM2MzZiNWE1YTYzNWE2MzYzNWE1YTVhNWE1YTVh NTI1MjUyYWRiZGJkYWRjNmJkYTViZGJkYWRjNmJkYWRiZGJkYWRjNmM2YTViZGJkYWQNCmJkYzZh NWJkYmRhZGJkYzZhNWJkYmRhZGJkYmRhNWJkYmRhZGJkYzZhNWI1YmRhNWJkYmRhNWI1YmRhZGJk YzZhNWI1YmRhNWJkYmRhNWI1YmRhZGJkYzZhNWI1YmRhNWJkYmRhNWJkYmRhZGJkYzZhNWI1YmRh ZGJkYzZhNWJkDQpiZGFkYmRjNmE1YjViZGE1YmRjNmE1YjViZGE1YmRiZGE1YjViZGE1YmRiZGE1 YjViNWFkYmRiZGFkYmRiZGI1YzZiZGI1YmRiZGJkYzZiZGI1YmRiNWI1YmRiNWFkYmRiNWI1YmRi NWI1YmRiNWJkYzZiZGI1YzZjNmJkY2VjZQ0KYmRjZWNlYzZkNmQ2YzZkNmQ2Y2VkZWRlY2VkZWRl ZDZlN2U3ZDZlN2U3ZGVlZmVmZGVlN2U3ZGVlZmVmZGVlZmVmZTdlZmVmZGVlZmVmZTdlZmVmZTdm N2VmZTdlZmVmZGVlZmVmZGVlZmY3ZDZlZmZmZDZlZmZmYWRjZWVmN2INCjljY2U4NGE1ZGU5Y2Jk ZmY5Y2JkZmY5NGJkZmY4Y2JkZWY5NGM2Zjc5NGM2ZWY5Y2NlZjc5NGJkZWY5Y2M2Zjc5Y2M2Zjc5 Y2M2Zjc4Y2I1ZWY4NGFkZWY4NGFkZTc4NGFkZWY3YmE1ZTc4NGFkZWY4NGFkZWY4Y2I1Zjc4NGI1 DQplZjg0YjVlZjg0YWRlZjg0YjVlZjljYzZmN2FkZDZmZmFkZDZmZmFkZDZmZmE1Y2VmZjk0YzZm ZjdiYTVlNzYzOTRkNjQyNzNiNTQyNzNiNTM5NmJhZDM5NmJhZDMxNjNhNTM5NjNhNTQyNmJiNTVh ODRjNjYzOGNjZTczOWNkNg0KNzM5Y2Q2NzNhNWRlN2JhNWRlN2JhNWU3NzNhNWRlNzM5Y2RlNmI5 NGQ2NjM5NGQ2NWE4NGM2NTI3YmJkNDI3M2I1NDI3M2I1NDI2YmI1NDI3M2I1Mzk2M2E1Mzk2YmFk MzE1YTljMjk1YTljMjk1MjhjMzE1YTk0Mjk1MjhjMjkNCjUyOGMyOTUyOGMzMTVhOTQzOTYzOWMz OTYzYTUzOTYzYTU0MjczYjUzOTYzYTU0YTczYjUyOTUyOGM0YTZiOWM4Y2E1YzZhNWJkZDZhNWI1 YzZiNWM2YzZhZGI1YjVhZGI1YmQ5Y2FkYjU5Y2FkYjU4NDljYWQ4NDljYWQ3Yjk0DQphZDdiOTRh ZDZiODQ5YzZiN2I5YzYzN2I5NDYzN2I5YzYzN2I5NDYzN2I5YzYzN2I5NDYzN2I5YzYzN2I5NDYz N2I5NDVhNzM4YzYzN2I5NDVhNzM4YzYzN2I4YzVhNzM4YzYzN2I4YzVhNzM4NDVhNzM4YzVhNzM4 YzVhNzM4Yw0KNTI3Mzg0NWE3MzhjNTI3Mzg0NWE3Mzg0NWE2Yjg0NWE3Mzg0NWE2Yjg0NWE3Mzg0 NWE2YjdiNWE3Mzg0NWE2YjdiNWE2YjdiNWE2MzdiNWE2YjdiNWE2MzczNjM2YjZiNWE1YTYzNWE2 MzYzNWE1YTVhNWE1YTYzNTI1MjUyNTINCjUyNTJhZGM2YzZhZGJkYmRhZGM2YzZhZGJkYmRhZGM2 YzZhZGJkYmRhZGM2YzZhZGJkYmRhZGM2YzZhZGJkYmRhZGJkYzZhNWJkYmRhZGJkYzZhNWJkYmRh ZGJkYzZhNWJkYmRhZGJkYzZhNWJkYmRhZGJkYzZhNWJkYmRhZGJkDQpjNmE1YmRiZGFkYmRjNmE1 YmRiZGFkYzZjNmFkYmRjNmFkYmRjNmE1YmRiZGFkYmRjNmE1YmRiZGFkYmRjNmE1YmRiZGE1YmRi ZGE1YmRiZGFkYmRiZGE1YjViZGFkYmRiZGFkYmRiZGI1YmRiZGI1YmRiZGJkYzZjNmI1YmRiZA0K YmRjNmJkYjViZGI1YjVjNmJkYjViZGI1YjVjNmJkYjVjNmJkYmRjZWNlYmRjZWNlYzZjZWNlYzZj ZWNlY2VkNmQ2Y2VkNmQ2ZDZlN2U3ZDZlN2U3ZGVlZmVmZGVlN2U3ZGVlZmVmZGVlZmVmZTdmN2Y3 ZTdlZmVmZTdmN2Y3ZTcNCmVmZWZlZmY3ZjdkZWVmZTdlN2Y3ZWZkZWVmZjdkZWY3ZmZjZWVmZmZh ZGNlZjc3Mzk0Y2U4NGFkZWY5NGI1ZmZhNWM2ZmY5NGJkZmY5NGJkZjc5NGM2ZWY5NGNlZWY5NGM2 ZTc5NGJkZWY5NGJkZjc5Y2M2ZmY5NGJkZjc4Y2I1DQplZjdiYTVlNzdiYTVlNzdiYTVkZTczOWNk ZTdiYTVkZThjYjVlZjhjYjVmNzk0YmRmZjhjYjVmNzhjYmRmNzg0YjVlZjljYmRmN2E1Y2VmZmFk ZDZmZmE1Y2VmZmE1Y2VmZjhjYmRmNzdiYTVlNzYzOGNjZTUyN2JjNjQyNzNiNQ0KNDI3M2I1Mzk2 YmFkMzk2YmFkMzk2M2FkNGE3M2JkNWE4NGM2NjM5NGNlNmI5NGQ2NzM5Y2RlNzM5Y2RlN2JhNWU3 N2JhNWU3N2JhNWU3NzM5Y2RlNzM5Y2RlNmI5NGQ2NjM4Y2NlNTI3YmJkNGE3YmJkNGE3YmJkNGE3 YmJkNDINCjczYjU0MjZiYWQzOTZiYWQzOTYzYWQzMTVhOWMzMTVhOWMzMTVhOTQzMTVhOTQyOTUy OGMzMTVhOTQzMTVhOTQ1MjdiYjU0YTczYjUzOTYzYTUyOTUyOTQyOTVhOWM1MjdiYmQ0YTZiYTU0 MjYzOTQ4NDljYzZhZGJkZGViNWM2DQpkNmI1YmRjNmFkYmRiZGE1YjViNWE1YjViZDljYWRiNThj YTViNTg0OWNhZDg0OTRiNTdiOGNhZDczODRhNTZiN2I5YzZiN2I5YzYzN2I5NDZiODQ5YzYzN2I5 NDZiODQ5YzYzN2I5NDYzN2I5NDYzN2I5NDYzN2I5NDYzN2I4Yw0KNjM3Yjk0NWE3MzhjNjM3Yjk0 NWE3MzhjNjM3YjhjNWE3MzhjNWE3YjhjNWE3MzhjNWE3MzhjNTI3Mzg0NWE3MzhjNWE3Mzg0NWE3 MzhjNWE2Yjg0NjM3Mzg0NWE3Mzg0NjM3Mzg0NWE2YjdiNjM3Mzg0NWE2YjdiNWE2YjdiNWENCjZi N2I2MzZiNzM1YTZiNmI1YTYzNmI1YTVhNjM1YTYzNjM1YTVhNWE1YTUyNWE1MjUyNTJhNWJkYmRh ZGM2YmRhZGJkYmRhZGM2YmRhNWJkYmRhZGJkYzZhZGJkYmRhZGM2YzZhNWJkYmRhZGJkYzZhNWJk YmRhZGJkYzZhNWJkDQpiZGFkYmRjNmE1YmRiZGFkYmRjNmE1YjViZGFkYmRjNmE1YmRiZGFkYmRj NmE1YjViZGFkYmRjNmE1YmRiZGFkYmRjNmE1YmRiZGFkYmRjNmE1YmRiZGFkYmRjNmE1YmRiZGFk YmRjNmE1YmRiZGFkYmRjNmE1YjViNWE1YmRiZA0KYTViNWJkYWRiZGJkYTViNWI1YWRiZGJkYWRi ZGJkYjVjNmJkYjViZGJkYmRiZGJkYjViZGI1YjViZGJkYWRiZGI1YjViZGI1YjViZGI1YmRjNmM2 YjVjNmM2YmRjZWNlYmRjZWNlYzZkNmQ2YzZkNmQ2Y2VkZWRlY2VkZWRlZDYNCmU3ZTdkNmU3ZTdk ZWU3ZTdkZWU3ZTdlN2VmZWZkZWVmZWZlN2VmZWZkZWVmZWZlN2Y3ZWZlN2Y3ZWZlN2Y3ZWZkZWVm ZWZkZWY3ZjdkNmVmZmZjZWVmZmZhNWM2ZWY3Yjk0Y2U3YmE1ZTc4Y2I1Zjc5Y2JkZmY5Y2M2ZmY4 Y2JkDQplZjk0YzZlZjk0YzZlNzhjYmRlNzg0YjVlNzhjYjVlZjg0YWRlZjg0YWRlZjdiYTVkZTdi YTVkZTczOTRkNjZiOTRjZTYzODRjNjYzOGNjZTZiOTRkNjdiYTVlNzdiYWRlNzhjYjVlZjg0YjVl ZjhjYjVlZjg0YWRlNzljYzZmNw0KYTVjZWZmYTVjZWZmOTRiZGY3ODRhZGVmNmI5NGQ2NWE4NGM2 NGE3M2JkNGE3M2JkMzk2YmI1Mzk2YmFkMzE2M2E1Mzk2YmFkNGE3M2I1NWE4Y2NlNWE4NGM2NmI5 NGQ2NmI5NGQ2NzM5Y2Q2NmI5NGQ2NzM5Y2RlNzM5Y2RlNzMNCjljZGU2YjljZGU2YjljZGU1YThj Y2U1Mjg0YzY0YTdiYmQ1Mjg0YzY0YTdiYmQ0YTdiYmQzOTYzYWQ0MjZiYWQzOTYzYTUzOTYzYTUz MTVhOTQzMTVhOWMzMTVhOTQzMTVhOTQyOTUyOGMzOTVhOWM1MjdiYmQ1MjdiYmQzMTVhDQo5YzE4 NGE4YzIxNTI5NDVhODRjNjRhNzNhZDM5NWE4YzZiOGNhZGFkYmRkZWFkYmRjZWI1YmRjNmFkYjVi ZGFkYjViZGE1YWRiZDljYWRiZDhjOWNiNTg0OWNiNTdiOGNhZDdiOGNhZDZiODQ5YzZiN2I5YzYz N2I5NDYzN2I5NA0KNjM3Yjk0NmI3YjljNjM3Yjk0NjM3Yjk0NjM3Yjk0NjM3Yjk0NWE3MzhjNjM3 Yjk0NWE3MzhjNjM3Yjk0NWE3MzhjNWE3YjhjNWE3MzhjNWE3YjhjNTI3Mzg0NWE3MzhjNTI3Mzg0 NWE3MzhjNTI2Yjg0NWE3Mzg0NWE2Yjg0NWENCjczODQ1YTZiODQ1YTczODQ1YTZiN2I1YTczODQ1 YTZiN2I1YTZiN2I1YTZiN2I2MzZiN2I1YTYzNmI2MzZiNmI1YTYzNjM1YTYzNjM1MjVhNWE1YTVh NWE1MjUyNTI1MjUyNWFhZGM2YzZhZGJkYmRhZGM2YzZhZGJkYmRhZGM2DQpjNmFkYmRiZGFkYzZj NmFkYmRiZGFkYmRjNmFkYmRiZGFkYzZjNmFkYmRiZGFkYmRjNmE1YmRiZGFkYmRjNmE1YmRiZGFk YmRjNmE1YmRiZGFkYmRjNmE1YmRiZGFkYmRjNmE1YmRiZGFkYmRjNmE1YmRiZGFkYzZjNmFkYmRj Ng0KYWRjNmM2YWRiZGM2YWRiZGM2YTViZGJkYWRiZGM2YTViZGJkYTViZGJkYTViZGJkYWRiZGJk YTViNWJkYWRiZGJkYWRiNWJkYjViZGJkYjViZGJkYmRjNmJkYjViZGJkYmRjNmJkYjViZGI1YjVi ZGI1YjViZGI1YmRjNmJkYmQNCmM2YmRiZGNlY2ViZGNlY2VjNmQ2ZDZjNmQ2ZDZjZWQ2ZDZjZWQ2 ZDZkNmU3ZTdkNmU3ZTdkZWVmZWZkZWU3ZTdlN2VmZWZkZWVmZWZlN2VmZWZlN2VmZWZlN2Y3Zjdl N2VmZWZlN2Y3ZWZkZWVmZWZlN2Y3ZjdkZWY3ZjdkNmVmDQpmZmNlZTdmZmFkY2VmNzczOTRjZTg0 YWRlZjhjYWRmNzljYzZmZjljYzZmZjk0YmRmNzhjYmRlNzk0Y2VlNzg0YmRkZTg0YjVlNzdiYTVk ZTdiYTVkZTczOWNkNjdiYTVkZTczOWNkNjZiOTRjZTYzODRiZDVhODRiZDUyN2JiNQ0KNWE4NGI1 NWE4NGJkNzM5Y2Q2N2JhNWU3ODRiNWVmODRhZGU3OGNiNWU3OWNjNmY3YjVkNmZmYTVjZWZmOTRi ZGY3N2JhZGU3NmI5Y2Q2NWE4NGM2NGE3YmJkNDI2YmI1NDI2YmI1Mzk2M2E1Mzk2M2FkNDI2YmFk NWE4NGM2NjMNCjhjY2U2MzhjY2U2MzhjY2U2Yjk0Y2U2MzhjY2U2Yjk0ZDY2Yjk0ZDY3MzljZGU2 Yjk0ZDY3MzljZGU2YjljZGU2Yjk0ZDY1YThjY2U1YThjY2U1YTg0YzY1YTg0YzY0YTdiYmQ0MjZi YjU0MjZiYWQ0MjZiYWQzOTYzYTUzOTVhDQo5YzMxNWE5YzM5NWE5YzMxNTI5NDMxNWE5NDM5NWE5 YzVhODRiZDRhNzNhZDI5NTI5NDE4NDI4YzMxNWE5YzVhOGNjNjUyN2JiNTI5NGE3YjYzN2JhNTlj YjVkNmI1YzZkNmFkYmRjNmFkYjVjNmFkYjViZGE1YjViZDljYTViNQ0KOTRhNWJkODQ5Y2I1ODQ5 NGI1N2I4Y2FkNzM4NGE1NmI3YjljNmI3YjljNjM3Yjk0NmI4NDljNjM3Yjk0NmI4NDljNjM3Yjk0 NjM3Yjk0NjM3Yjk0NjM3Yjk0NjM3YjhjNjM3Yjk0NjM3YjhjNjM3YjhjNWE3MzhjNjM3YjhjNWEN CjczOGM1YTdiOGM1YTczOGM1YTdiOGM1YTczOGM1YTczOGM1MjczODQ1YTczOGM1YTZiODQ2Mzcz ODQ1YTczODQ2MzczODQ1YTZiODQ2MzczODQ1YTZiN2I2MzZiODQ1YTZiN2I2MzZiNzM1YTYzNmI2 MzYzNmI1YTVhNjM1YTYzDQo2MzVhNWE1YTVhNWE1YTUyNTI1MmFkYmRiZGFkYzZiZGE1YmRiZGFk YzZiZGFkYmRiZGFkYzZjNmE1YmRiZGFkYmRjNmE1YmRiZGFkYmRjNmE1YmRiZGFkYmRiZGE1YmRi ZGFkYmRjNmE1YjViZGFkYmRjNmE1YmRiZGFkYmRjNg0KYTViZGJkYWRiZGM2YTViZGJkYWRiZGM2 YTViZGJkYWRiZGM2YTViZGJkYWRiZGM2YTViZGJkYWRiZGM2YTViZGJkYWRiZGM2YTViNWJkYTVi ZGM2YTViZGJkYTViZGJkYTViNWJkYWRiZGJkYTViNWJkYWRiZGJkYWRiZGJkYjUNCmM2YmRiNWJk YmRiZGM2YmRiNWJkYjViNWJkYjViNWJkYjViNWM2YmRiNWM2YmRiZGM2YmRiZGM2YzZjNmNlY2Vi ZGNlY2VjNmQ2ZDZjNmQ2ZDZjZWRlZGVkNmRlZGVkZWU3ZTdkZWU3ZTdkZWVmZWZkZWU3ZTdlN2Vm ZWZkZWVmDQplZmU3ZjdmN2U3ZWZlZmU3ZjdmN2U3ZjdlZmU3ZjdlZmU3ZjdmN2Q2ZWZmN2Q2ZWZm ZmNlZWZmZjljYmRlNzdiOWNkNjdiOWNkZTk0YmRmZjk0YmRmZjljYzZmZjk0YmRmNzg0YjVkZTg0 YjVkNjdiYWRjZTZiOTRjZTg0YWRlNw0KN2JhNWRlNmI5NGNlNjM4Y2M2NmI5NGM2NjM4NGI1NjM4 NGI1NTI3M2E1NGE3M2E1Mzk1YTk0Mzk2Mzk0NDI2YmE1NjM4Y2M2NmI5NGQ2N2JhNWRlODRhNWRl OWNjNmY3YTVjZWZmYTVjZWZmOTRiZGY3ODRhZGVmNjM5NGNlNTINCjdiYmQ0MjZiYWQ0MjczYjUz OTYzYTUzMTYzYTUzMTVhOWM0MjZiYWQ0YTczYjU1YTg0YmQ1YTg0YmQ2MzhjY2U1YTg0YmQ1YTg0 YmQ2MzhjYzY2Yjk0Y2U2MzhjY2U2Yjk0ZDY2Yjk0ZDY3MzljZGU2Yjk0ZDY2MzhjY2U1YTg0DQpj NjVhOGNjNjUyODRjNjUyN2JiZDQyNzNiNTQyNmJiNTQyNmJhZDQyNmJhZDM5NWE5YzM5NjM5YzM5 NWE5YzMxNWE5NDI5NGE4NDUyN2JiNTVhN2JiZDM5NjM5YzE4Mzk3YjE4NDI4NDMxNWFhNTYzOGNj ZTM5NjM5YzM5NWE4Yw0KNWE3MzljOWNhZGNlYjViZGQ2YWRiZGM2YTViNWJkYWRiZGM2YTVhZGJk OWNhZGJkOGM5Y2I1ODQ5Y2I1N2I4Y2FkN2I4Y2FkNzM4NDljNzM4NDljNjM3Yjk0NjM3YjljNjM3 Yjk0NjM3YjljNjM3Yjk0NjM3YjljNjM3Yjk0NjMNCjdiOTQ2MzdiOGM2MzdiOTQ1YTczOGM2Mzdi OTQ1YTczOGM2MzdiOGM1YTczOGM1YTdiOGM1MjczODQ1YTczOGM1MjczODQ1YTczOGM1MjZiODQ1 YTczODQ1MjZiODQ1YTZiODQ1YTZiN2I1YTczODQ1YTZiN2I1YTZiODQ1YTZiDQo3YjVhNmI3YjVh NjM3YjVhNmI3YjVhNjM2YjVhNmI2YjVhNWE2MzVhNWE2MzUyNWE1YTVhNWE1YTUyNTI1MjUyNTI1 MmFkYzZjNmFkYzZiZGFkYzZjNmFkYmRiZGFkYzZjNmFkYmRjNmFkYzZjNmFkYmRiZGFkYzZjNmFk YmRjNg0KYWRjNmM2YWRiZGJkYWRjNmM2YWRiZGM2YWRiZGM2YWRiZGM2YWRiZGM2YWRiZGM2YWRi ZGM2YTViZGJkYWRiZGM2YWRiZGM2YWRiZGM2YTViZGJkYWRiZGM2YWRiZGM2YWRiZGM2YTViZGJk YWRiZGM2YTViZGJkYWRiZGM2YTUNCmJkYmRhZGJkYmRhNWJkYmRhZGJkYmRhNWI1YmRhZGJkYmRh ZGJkYmRiNWJkYmRiNWJkYmRiZGM2YzZiNWJkYmRiZGJkYmRiNWJkYjViNWM2YmRiNWJkYjViNWM2 YmRiNWM2YmRiZGNlY2ViZGNlY2VjNmQ2ZDZjNmNlY2VjZWQ2DQpkNmNlZGVkZWQ2ZTdlN2Q2ZTdl N2RlZWZlZmRlZTdlN2U3ZWZlZmRlZWZlZmU3ZjdmN2U3ZWZlZmU3ZjdmN2U3ZWZlZmVmZjdmN2Rl ZWZlZmU3ZmZmZmQ2ZWZmN2RlZjdmZmQ2ZWZmZmE1YzZlZjg0YTVkNjk0YjVmNzk0YjVmNw0KN2Jh NWU3ODRhNWU3OWNjNmY3OGNiZGU3N2JhZGNlNWE4NGFkNWE4NGJkNTI3YmJkNjM4Y2M2NzM5Y2Nl OGNhZGRlOGNhZGRlN2I5Y2M2NjM4NGFkNjM4NGI1NDI2MzhjMzE1Mjg0MzE1YTg0NDI2Mzk0NDI2 MzljNWE4NGI1NzMNCjljZDY3MzljZDY4Y2I1ZTdhNWNlZmY5Y2NlZmY5NGM2ZmY4NGFkZTc2Yjlj ZDY1MjdiYmQ1MjdiYmQ0MjZiYWQzOTYzYTUzMTVhOTQzOTYzOWMzOTYzOWM0YTZiYWQ0YTZiYTU0 YTZiYTU0MjYzOWM0MjYzOWMzOTYzOWM0YTczDQphZDUyN2JiNTVhODRiZDVhN2JiZDYzOGNjNjYz OGNjNjZiOTRjZTYzOGNjNjYzOGNjZTYzOGNjNjVhOGNjNjUyN2JiZDUyN2JiZDQyNzNiNTRhNzNi NTQyNmJhNTM5NjM5YzM5NjM5YzQyNjM5YzMxNWE5NDMxNWE5NDQyNmJhNQ0KNDI2M2E1MTg0Mjdi MTAzOTdiMTg0Mjg0Mzk2YmE1NTI4NGJkMzk2MzljMzk1YThjNjM3YmFkOTRhZGNlYjVjNmRlYWRi NWM2YWRiNWM2YWRiNWJkYTViNWJkOWNhZGJkOTRhNWJkODQ5NGI1ODQ5NGI1N2I4Y2E1N2I4NGE1 NmINCjdiOWM2YjdiOWM2MzdiOTQ2Yjg0OWM2MzdiOTQ2Yjg0OWM2MzdiOTQ2MzdiOTQ2MzdiOTQ2 MzdiOTQ2MzdiOTQ2MzdiOTQ2MzdiOGM2MzdiOTQ1YTdiOGM2MzdiOGM1YTczOGM1YTczOGM1YTcz OGM1YTczOGM1MjczODQ1YTczDQo4YzUyNzM4NDVhNzM4NDVhNmI4NDVhNzM4NDVhNmI4NDYzNzM4 NDVhNmI3YjYzNzM4NDVhNmI3YjVhNmI3YjVhNmI3MzYzNmI3MzVhNjM2YjVhNjM2YjVhNWE2MzVh NjM2MzVhNWE1YTVhNTI1YTUyNTI1MmFkYmRiZGFkYzZjNg0KYWRiZGJkYWRjNmM2YWRiZGJkYWRj NmM2YWRiZGJkYWRjNmM2YWRiZGJkYWRiZGM2YWRiZGJkYWRiZGM2YTViZGJkYWRiZGM2YTViZGJk YWRiZGM2YTViZGJkYWRiZGM2YTViZGJkYWRiZGM2YTViZGJkYWRiZGM2YTViZGJkYWQNCmJkYzZh NWI1YmRhZGJkYzZhNWJkYmRhZGJkYzZhNWI1YmRhNWJkYmRhNWI1YmRhNWJkYmRhNWI1YjVhNWJk YmRhNWI1YmRhZGJkYmRhNWI1YjVhZGJkYmRhZGJkYmRiNWM2YmRiNWJkYmRiNWJkYmRiNWJkYjVi NWJkYjVhZGJkDQpiNWI1YmRiNWI1YmRiNWJkYzZiZGI1YzZjNmJkY2VjZWJkY2VjZWM2ZDZkNmM2 ZDZkNmNlZGVkZWNlZGVkZWQ2ZTdlN2RlZTdlN2RlZWZlZmRlZTdlN2U3ZWZlZmRlZWZlZmU3ZWZl ZmU3ZWZlZmU3ZjdmN2U3ZWZlZmU3ZWZlZg0KZTdmN2Y3ZGVmN2Y3ZDZlZmZmY2VlZmZmOTRiNWQ2 NzM5NGM2OTRiNWVmOGNhZGU3NWE3YmJkNmI5NGNlOTRiZGVmOTRiZGVmNzM5Y2JkNTI3YmE1MzE1 YThjMzE1YTk0NWE4NGI1N2JhNWQ2NzM5NGM2NzM5NGJkNzM4Y2I1NmINCjhjYWQ1YTczOTQ1Mjcz OTQ0MjYzODQzOTVhODQzMTUyODQ0YTZiOWM1YTdiYjU2YjhjYzY1YTg0YjU3YmE1ZGU5NGJkZjdh NWNlZmY5NGJkZjc4NGI1ZWY2Yjk0Y2U1YTg0YzY0YTczYWQzOTYzOWMyOTUyOGMyOTRhODQyOTUy DQo4NDM5NWE4YzMxNTI4NDMxNTI4NDMxNTI4NDI5NGE3YjIxNGE3YjI5NTI4NDE4NDI3MzIxNDI3 YjIxNGE3YjIxNGE3YjI5NTI4YzM5NjM5NDQyNmJhNTUyN2JhZDUyN2JiNTVhODRiZDVhN2JiNTUy N2JiNTRhNzNiNTRhNzNiNQ0KNGE2YmFkNDI2YmE1MzE1YTk0Mzk1YTljMzk2MzljMzk1YTk0MzE1 YTk0MzE1YTk0MTgzOTczMDAyOTYzMDgzMTZiMjk1Mjk0NDI2YmFkNTI3YmJkMzE1Mjk0Mzk1YTk0 NjM3YmFkOWNhZGNlYWRiZGNlYWRiZGNlYWRiNWJkYWQNCmI1YmQ5Y2FkYjU5Y2FkYmQ4YzljYjU4 YzljYjU3YjhjYWQ3YjhjYTU3Mzg0OWM3Mzg0OWM2MzczOTQ2MzdiOTQ2MzdiOTQ2MzdiOWM2Mzdi OTQ2MzdiOTQ2MzdiOTQ2MzdiOTQ1YTczOGM2MzdiOTQ1YTczOGM2MzdiOTQ1YTczDQo4YzYzN2I4 YzVhNzM4YzYzN2I4YzUyNzM4NDVhNzM4YzUyNzM4NDVhNzM4YzUyNmI4NDVhNzM4NDVhNmI4NDVh NzM4NDVhNmI3YjVhNzM4NDVhNmI3YjVhNzM4NDVhNmI3YjVhNmI3YjVhNjM3YjVhNmI3YjVhNjM2 YjVhNjM2Yg0KNWE1YTYzNWE2MzYzNTI1YTVhNWE1YTVhNTI1MjUyNTI1MjVhYjVjNmM2YWRjNmJk YjVjNmM2YWRjNmM2YjVjNmM2YWRjNmM2YjVjNmM2YWRjNmM2YWRjNmM2YWRiZGJkYWRjNmM2YWRi ZGJkYWRiZGM2YTViZGJkYWRiZGM2YTUNCmJkYmRhZGJkYzZhZGJkYzZhZGM2YzZhZGJkYzZhZGJk YzZhZGJkYzZhZGM2YzZhZGJkYzZhZGJkYzZhNWJkYmRhZGJkYzZhNWJkYmRhZGJkYzZhNWJkYmRh ZGJkYzZhNWJkYmRhNWJkYmRhNWJkYmRhZGJkYmRhNWI1YmRhZGJkDQpiZGFkYjViZGI1YmRiZGI1 YmRiZGJkYzZjNmI1YmRiZGJkYmRiZGI1YmRiNWI1YmRiNWI1YmRiNWJkYzZiZGI1YzZiZGJkY2Vj ZWJkY2VjZWM2ZDZkNmM2ZDZkNmNlZDZkNmNlZDZkNmQ2ZTdlN2Q2ZTdlN2RlZWZlZmRlZTdlNw0K ZTdlZmVmZGVlZmVmZTdmN2Y3ZTdlZmVmZTdmN2Y3ZTdmN2Y3ZWZmN2ZmZGVlZmVmZWZmZmZmZGVl ZmY3ZDZmN2ZmYzZkZWVmOGNhZGM2NjM4NGE1OGNhZGRlN2I5Y2NlNTI3M2FkNjM4NGJkOWNiZGVm OTRiNWU3ODRhZGNlNzMNCjljYmQ0MjYzOTQwMDIxNWEwMDIxNTIyOTRhN2I2Mzg0YWQ4Y2E1YzY3 YjljYjU0MjVhNzMyMTM5NWEyOTQyNWEyOTQyNjMyMTM5NWEyMTQyNjMyOTRhNzMzOTVhOGM0MjYz OTQ1MjdiYWQ2Yjk0Y2U5NGJkZjc5Y2M2ZmY5Y2M2DQpmZjg0YWRlNzczOWNkNjVhODRiZDQyNmJh NTMxNTI4YzI5NGE3YjIxNDI3MzMxNGE4NDMxNGE3YjMxNGE3YjI5NDI3MzI5NGE3MzIxNDI3MzM5 NWE4YzQyNjM5NDMxNTI4NDI5NGE3YjMxNTI4NDI5NTI3YjEwMzE2YjEwMzk2Yg0KMjk0YTdiMzE1 MjhjNDI2YjljNGE3M2E1NWE3YmI1NTI3YmI1NTI3YmJkNGE3M2FkNGE3M2I1NDI2YmE1Mzk2Mzlj Mzk1YTk0NDI2YmE1Mzk2Mzk0MzE1YThjMjE0YTg0MDgzMTZiMDAyMTYzMjE0YTg0NDI2YmE1NTI3 YmI1NGENCjczYjUyOTUyOTQzMTVhOTQ2Yjg0YjU5NGFkY2VhZGJkZDZhZGJkYzZiNWJkYzZhNWI1 YmRhNWI1YmQ5Y2FkYjU5NGE1YjU4NDljYWQ4NDk0YWQ3YjhjYTU3YjhjYTU3Mzg0OWM2YjdiOWM2 MzdiOTQ2Yjg0OWM2MzdiOTQ2YjdiDQo5YzYzN2I5NDYzN2I5NDYzN2I5NDYzN2I5NDYzN2I4YzYz N2I5NDYzN2I4YzYzN2I4YzVhNzM4YzYzN2I4YzVhNzM4YzVhNzM4YzUyNzM4NDVhNzM4YzUyNzM4 NDVhNzM4YzUyNmI4NDVhNzM4YzVhNmI4NDVhNzM4NDVhNmI4NA0KNjM3Mzg0NWE2YjdiNjM3Mzg0 NWE2YjdiNWE2YjdiNWE2YjczNjM2YjczNWE2MzZiNWE2MzZiNWE1YTYzNWE1YTYzNTI1YTVhNWE1 YTVhNTI1MjUyYWRjNmJkYWRjNmM2YWRiZGJkYWRjNmM2YWRiZGM2YWRjNmM2YWRiZGJkYWQNCmM2 YzZhZGJkYmRhZGM2YzZhZGJkYmRhZGJkYzZhZGJkYzZhZGJkYzZhNWJkYmRhZGJkYzZhZGJkYzZh ZGJkYzZhNWJkYmRhZGJkYzZhZGJkYzZhZGJkYzZhNWJkYmRhZGJkYzZhNWJkYmRhZGJkYzZhNWJk YmRhZGJkYzZhNWJkDQpiZGFkYmRjNmE1YjViZGE1YmRiZGE1YjViZGE1YmRiZGE1YjViZGFkYmRi ZGE1YjViNWFkYmRiZGFkYmRiZGI1YzZiZGI1YmRiZGJkYzZiZGI1YmRiNWI1YmRiNWI1YmRiNWI1 YzZiZGI1YmRiNWJkYzZiZGJkYzZjNmJkY2VjZQ0KYmRjZWNlYzZkNmQ2YzZkNmQ2Y2VkZWRlY2Vk ZWRlZDZlN2U3ZGVlN2U3ZGVlZmVmZGVlN2U3ZTdlZmVmZGVlZmVmZTdmN2Y3ZTdlZmVmZTdmN2Y3 ZTdlZmY3ZTdlZmY3ZTdmN2Y3ZTdmN2ZmZGVmN2Y3Y2VlN2VmOGNhZGJkNzMNCjk0YWQ4NGE1YzY2 Mzg0YjUzOTVhOGM2Mzg0YjU5NGI1ZTc5NGI1ZTc4Y2FkZDY4Y2I1ZGU3YjljY2UyMTQyNzMwMDA4 MzkwODI5NTI1YTczOTRhZGM2ZGU5NGFkYzY0MjVhNzMxMDI5MzkwMDEwMjkwMDEwMjkyOTQyNWEy MTM5DQo1YTA4MjE0YTEwMzE1YTQyNjM5NDQyNjM5YzYzOGNjNjg0YWRlNzk0YzZmZjk0YmRmNzhj YjVlZjZiOTRjZTVhODRiZDMxNWE4YzI5NGE4NDIxMzk3MzI5NDI3MzMxNGE3MzM5NGE3MzMxNGE2 YjM5NGE3MzM5NTI3YjQyNjM4Yw0KNTI2Yjk0NWE3YmE1NTI3Mzk0NGE2Yjk0Mzk1YTg0MzE1Mjg0 MjE0MjZiMjE0MjZiMTgzOTYzMjE0MjczMzE1MjdiNDI2Mzk0NTI3MzljNWE3YmFkNGE3M2FkNDI2 YmFkNDI2YmE1NDI2YmE1Mzk1YTk0NDI2YjljNDI2MzljMzkNCjVhOTQyMTRhN2IyOTRhODQxMDM5 NmIxODQyNzMzOTYzOWM1YTg0YmQ0YTczYWQzOTZiYTUyOTUyOGMzOTVhOTQ1YTdiYWQ5NGFkY2Vh ZGJkY2ViNWM2Y2VhZGJkYzZhNWI1YmRhNWFkYjU5Y2FkYjU4YzljYWQ4YzljYjU4NDk0DQphZDdi OGNhNTczODQ5YzczODQ5YzYzN2I5NDYzN2I5NDYzN2I5NDYzN2I5NDYzN2I5NDYzN2I5NDVhNzM4 YzYzN2I5NDVhNzM4YzYzN2I5NDVhNzM4YzYzN2I4YzVhNzM4YzYzN2I4YzVhNzM4NDVhNzM4YzUy NzM4NDVhNzM4Yw0KNTI3Mzg0NWE3MzhjNTI2Yjg0NWE3Mzg0NTI2Yjg0NWE2Yjg0NWE2YjdiNWE3 Mzg0NWE2YjdiNWE2Yjg0NWE2YjdiNWE2YjdiNWE2MzdiNWE2YjdiNWE2MzZiNWE2YjZiNWE1YTYz NWE1YTYzNTI1YTVhNWE1YTVhNTI1MjUyNTINCjUyNTJiNWM2YzZhZGM2YmRhZGM2YzZhZGM2YmRi NWM2YzZhZGM2YzZhZGM2YzZhZGJkYzZiNWM2YzZhZGM2YzZiNWM2YzZhZGJkYzZiNWM2Y2VhZGJk YzZhZGM2YzZhZGJkYzZhZGM2YzZhZGJkYzZhZGJkYzZhZGJkYzZhZGM2DQpjNmFkYmRjNmFkYmRj NmFkYmRjNmFkYmRjNmE1YmRiZGFkYmRjNmE1YmRiZGFkYmRjNmE1YmRiZGFkYmRjNmE1YjViZGE1 YmRiZGE1YmRiZGFkYmRiZGE1YjViZGFkYmRiZGFkYjViZGI1YmRiZGI1YmRiZGJkYzZjNmI1YmRi ZA0KYjViZGJkYjViZGI1YjVjNmJkYjViZGI1YjVjNmJkYjVjNmJkYmRjZWNlYmRjZWNlYzZjZWNl YzZjZWNlY2VkNmQ2Y2VkNmQ2ZDZlN2U3ZDZlN2U3ZGVlZmVmZGVlN2U3ZGVlZmVmZGVlZmVmZTdl ZmVmZTdlZmVmZTdmN2Y3ZTcNCmVmZjdlZmVmZjdkZWU3ZWZlZmY3ZmZlN2Y3ZmZlN2ZmZmZkNmY3 ZmZiNWQ2ZGU5Y2JkZDY5NGJkZDY0MjZiOGMyMTQyNzM2Mzg0YjVhNWM2ZWY5Y2JkZTc5NGI1ZGU4 Y2FkZDY4NGFkZDY1YTdiYWQzOTUyODQxMDMxNTIxMDI5DQo0YTI5NDI1YTM5NGE2MzE4MjkzOTIx MzE0MjAwMTgyOTA4MTgzMTIxMzE0YTIxMzk1MjA4MjE0MjIxMzk2MzRhNmI5NDQyNjM5YzVhODRi ZDdiYWRlNzhjYjVmNzk0YmRmNzg0YWRlNzczOWNjZTUyN2JiNTMxNTI4NDIxNDI3Mw0KMjEzOTZi MjEzOTYzMzE0MjZiMjk0MjYzMzE0MjYzMzE0YTZiNGE2Mzg0NTI3Mzk0NWE3Mzk0NGE2YjhjNWE3 YjljNWE3Mzk0NDI2Mzg0MzE1MjczNDI2Mzg0MzE0YTczMjE0MjZiMTgzOTYzMjk0MjczMzE1Mjdi NDI2MzhjNGENCjZiOWM0MjZiYTUzOTYzOWM0MjZiYTU0MjZiOWM0MjZiOWM0MjZiOWM0MjYzOWMy OTRhODQyMTQyNzMyOTRhODQyOTUyOGMzMTVhOGM1MjdiYWQ1YTg0YmQ0MjZiYWQyOTUyOGMzMTVh OTQzMTVhOGM1YTdiYTU4Y2FkY2VhZGM2DQpkNmI1YmRjZWI1YmRjNmE1YjViNWE1YjViZDljYWRi NTk0YTViNThjOWNhZDg0OWNhZDdiOGNhNTdiOGM5YzczODQ5NDZiN2I5NDYzN2I5NDYzN2I5YzYz N2I5NDZiN2I5YzYzN2I5NDYzN2I5NDYzN2I5NDYzN2I5NDYzN2I4Yw0KNjM3Yjk0NWE3MzhjNjM3 YjhjNWE3MzhjNjM3YjhjNWE3MzhjNWE3MzhjNWE3MzhjNWE3MzhjNTI3Mzg0NWE3MzhjNTI3Mzg0 NWE3Mzg0NWE2Yjg0NWE3Mzg0NWE2Yjg0NjM3Mzg0NWE2YjdiNjM3Mzg0NWE2YjdiNWE2YjdiNWEN CjZiNzM2MzZiNzM1YTYzNmI1YTYzNmI1YTVhNjM1YTYzNjM1YTVhNWE1YTUyNWE1MjUyNTJhZGJk YmRhZGM2YmRhZGJkYmRhZGM2YzZhZGJkYmRhZGM2YzZhZGJkYmRhZGM2YzZhZGJkYmRhZGJkYzZh ZGJkYmRhZGJkYzZhNWJkDQpiZGFkYmRjNmE1YmRiZGFkYmRjNmE1YjViZGFkYmRjNmE1YmRiZGFk YmRjNmE1YjViZGFkYmRjNmE1YmRiZGFkYmRjNmE1YjViZGE1YmRiZGE1YjViZGE1YmRiZGE1YjVi ZGE1YjViZGE1YjViZGE1YmRiZDljYjViNWE1YjViZA0KYTViNWI1YTViNWJkYTViNWI1YWRiNWI1 YWRiNWI1YjViZGJkYjViZGI1YjViZGJkYWRiNWI1YjViZGI1YWRiNWFkYjViZGI1YWRiZGI1YjVj NmJkYjVjNmJkYmRjNmM2YmRjNmM2YzZjZWNlYzZjZWNlY2VkNmQ2Y2VkZWRlZDYNCmU3ZTdkNmRl ZGVkNmU3ZTdkNmU3ZTdkZWU3ZTdkNmU3ZTdkZWVmZWZkZWU3ZTdlN2VmZWZlN2U3ZjdkZWRlZWZk ZWVmZjdkZWVmZjdkNmVmZjdkZWY3ZmZjNmU3ZWZjNmU3Zjc5Y2M2ZGUzMTVhNzMwODI5NTI2Yjhj YmQ5Y2JkDQplZjljYjVlNzk0YWRkZTg0YTVjZTljYmRlNzk0YWRkZTczOGNiNTRhNmI4YzI5NDI1 YTIxMzk0YTEwMjEzMTA4MTgyMTA4MTgyMTA4MTgyMTA4MTgyMTAwMTAyMTAwMTAyOTEwMjE0MjI5 Mzk2MzM5NTI3YjQyNmJhNTVhOGNjNg0KN2JhNWRlOGNiNWY3OGNiNWVmODRhZGU3NmI4Y2M2NTI3 YmFkMjk0YTdiMTgzOTZiMTAyOTUyMTgzMTVhMTgzMTUyMjEzMTUyMjEyOTRhMjkzOTUyMzk1Mjcz NmI4NGE1NWE3Mzk0Mzk1MjczMzk1MjdiNGE2Mzg0NDI1YTdiNTINCjZiOGMzMTUyNzMyMTQyNjMw ODI5NGEwODI5NGExMDI5NTIxODM5NjMyOTRhNmIzOTVhODQzMTVhOGMyOTVhOGMzMTVhOTQ0MjZi OWMzOTYzOWM0MjZiOWMzMTUyOGMxODM5NmIwODMxNjMyOTRhN2IyOTUyODQzOTYzOTQ0YTczDQph ZDUyN2JiNTM5NjM5YzI5NTI4YzMxNWE5NDI5NTI4NDUyNzM5Yzk0YWRjZWFkYmRkNmI1YmRjZWFk YmRiZGFkYmRiZDljYWRiNTljYWRiNThjOWNhZDhjOWNhZDg0OTRhNTdiOGNhNTczODQ5NDczODQ5 YzYzNzM5NDYzN2I5NA0KNjM3Yjk0NjM3Yjk0NjM3Mzk0NjM3Yjk0NWE3MzhjNjM3Yjk0NWE3Mzhj NjM3YjhjNWE3MzhjNjM3YjhjNWE3MzhjNWE3MzhjNWE3Mzg0NWE3MzhjNTI3Mzg0NWE3MzhjNTI3 Mzg0NWE3MzhjNTI2Yjg0NWE3Mzg0NWE2Yjg0NWENCjczODQ1YTZiN2I1YTczODQ1YTZiN2I1YTcz ODQ1YTZiN2I1YTZiN2I1YTYzN2I1YTZiN2I1YTYzNmI1YTYzNmI1YTVhNjM1YTYzNjM1MjVhNWE1 YTVhNWE1MjUyNTI1MjUyNWFhZGM2YzZhZGJkYmRhZGM2YzZhZGJkYmRhZGM2DQpjNmFkYmRiZGFk YzZjNmFkYmRjNmFkYmRjNmE1YmRiZGFkYmRjNmE1YmRiZGFkYmRjNmE1YjViZGFkYmRjNmE1YjVi ZGE1YmRiZGE1YjViZGFkYmRjNmE1YjViZGE1YmRiZGE1YjViZGFkYmRjNmE1YjViZGE1YmRiZGE1 YjViZA0KYTViZGJkYTViNWJkYTViNWJkOWNiNWI1YTViNWJkYTViNWJkYTViNWJkOWNiNWI1YTVi NWJkYTViNWI1YTViNWI1YTViNWI1YWRiZGJkYWRiNWJkYjViZGJkYWRiNWI1YjViZGI1YWRiNWI1 YWRiNWI1YWRiNWI1YjViZGJkYjUNCmJkYmRiNWM2YzZiNWM2YzZiZGNlY2ViZGNlY2VjNmQ2ZDZj NmQ2ZDZjZWRlZGVkNmRlZGVkNmU3ZTdkNmRlZGVkNmU3ZTdkNmU3ZTdkZWU3ZWZkNmU3ZTdkZWVm ZWZkZWU3ZWZlZmVmZmZkZWRlZWZkZWVmZjdkNmU3ZTdkNmU3DQplN2Q2ZWZlZmNlZWZlZmQ2Zjdm N2I1ZDZlNzI5NGE2MzEwMzE1MjczOTRiZGE1YzZlZjhjYWRkZTk0YjVlNzg0YTVjZTdiOWNjZTdi OWNjNjg0YTVjNjdiOWNiZDdiOTRhZDVhNzM4YzRhNjM3MzRhNWE2YjI5Mzk0MjE4MjkzOQ0KMTgz MTQyMTgzMTQyMTgzMTUyMjEzOTVhMzk1YTdiNGE3MzljNWE4NGJkNmI5NGNlODRiNWVmOGNiZGY3 OTRiZGY3ODRhZGU3NmI5NGNlNGE3M2E1MzE1MjhjMTgzOTZiMTAyOTUyMTAyOTUyMTgzMTUyMTgy OTQyMTgyOTQyMTgNCjI5NDI1YTZiODQ5Y2FkYzY4NDk0YjUyOTM5NWEwODIxMzkwMDEwMjkwMDE4 MzEyOTQyNWEyOTQyNWExMDI5NDIwMDE4MzkwMDEwMzkwODIxNDIxMDI5NTIyMTQyNjMyOTRhNzMz MTVhOGMyMTUyODQzMTVhOTQzOTYzOWM0MjZiDQo5YzQyNjM5NDMxNTI4NDA4MzE1YTA4Mjk1YTIx NDI2YjMxNTI4NDMxNWE4YzRhNzNhNTRhNzNhZDM5NjM5YzIxNGE4NDM5NjM5YzI5NTI4NDUyNzM5 YzhjYWRjNmI1YzZkZWFkYmRjZWFkYmRjNmFkYmRiZGE1YjViZDljYWRiNQ0KOTRhNWI1OGM5Y2Fk ODQ5NGFkN2I4Y2E1N2I4YzljNmI4NDljNjM3Yjk0NjM3Yjk0NjM3YjljNjM3Yjk0NjM3Yjk0NjM3 Yjk0NjM3Yjk0NjM3Yjk0NjM3Yjk0NWE3MzhjNjM3Yjk0NWE3MzhjNjM3YjhjNWE3MzhjNjM3Yjhj NWENCjczOGM1YTczOGM1MjczOGM1YTczOGM1MjczODQ1YTczOGM1MjZiODQ1YTczOGM1YTZiODQ1 YTczODQ1YTZiODQ2MzczODQ1YTZiN2I2MzczODQ1YTZiN2I1YTZiN2I1YTZiNzM2MzZiNzM1YTYz NmI1YTYzNmI1YTVhNjM1YTVhDQo2MzUyNWE1YTVhNWE1YTUyNTI1MmE1YjViNWE1YmRiZGE1YjVi NWE1YmRiZGE1YjViZGE1YmRiZGE1YjViZGE1YmRiZGE1YjViZGE1YmRiZGE1YjViZGE1YmRiZGE1 YjViZGE1YmRiZGE1YjViZGE1YjViZDljYjViNWE1YjViZA0KOWNhZGI1YTViNWJkOWNiNWI1YTVi NWJkOWNhZGI1YTViNWJkOWNiNWI1YTViNWJkOWNhZGI1OWNiNWJkOWNhZGI1OWNiNWI1OWNhZGI1 OWNhZGI1OWNhZGI1OWNiNWI1OTRhZGI1OWNhZGI1OWNhZGI1YTVhZGI1OWNhZGI1YTUNCmI1YmRh NWFkYjVhNWI1YjVhNWFkYWRhNWFkYWQ5Y2FkYWRhNWFkYWRhNWFkYWRhZGI1YjVhZGI1YjViNWJk YmRhZGJkYmRiNWM2YzZiZGM2YzZjNmNlY2VjNmNlZDZjZWQ2ZGVjZWQ2ZGVkNmRlZGVjZWQ2ZGVk NmRlZTdkNmRlDQpkZWQ2ZTdlN2Q2ZGVlN2Q2ZTdlN2NlZGVlN2RlZTdlZmQ2ZGVlN2Q2ZTdlN2Rl ZTdlN2RlZWZlN2Q2ZTdlN2RlZWZmNzljYWRiZDIxMzk0YTIxMzk1Mjg0OWNiZDhjYWRkNjk0YjVl Nzk0YjVlNzZiOTRiZDZiOTRiZDdiYTVjNg0KN2JhNWM2N2I5Y2JkNjM4NGE1NWE3Yjk0NTI2Yjhj NWE3MzhjNDI2MzdiNDI2Mzg0Mzk1YTdiMzk1YTdiMzE1YTg0NDI2Yjk0NDI3MzljNTI4NGFkNWE4 Y2M2NzNhNWRlNzNhNWRlOGNiZGY3ODRiNWVmNzNhNWRlNWE4NGM2NDINCjZiYTUyMTRhODQxODQy NmIwODI5NTIwODIxNDIwODIxMzkxMDIxMzkwODIxMzExMDIxMzEyOTM5NTI1YTZiODQ1YTZiN2I0 MjUyNjMzMTM5NTIxODIxMzkwMDEwMjExODI5MzkxODIxMzkwODE4MzEwMDAwMTgwMDAwMjEwMDEw DQozMTEwMzE1MjIxMzk2YjI5NGE3YjIxNGE4NDIxNTI4YzIxNGE4NDMxNWE4YzQyNmI5NDUyNzM5 NDI5NDI2MzAwMTgzOTAwMTgzOTI5NGE2YjMxNTI3YjM5NWE4YzIxNGE4NDQyNjNhNTI5NTI5NDIx NGE4YzMxNWE4YzI5NTI3Yg0KNWE3YjljOWNiZGQ2YTViZGQ2YTViZGNlYTViZGM2OWNhZGI1OWNh ZGI1OWNhZGI1OTRhNWFkOGM5Y2FkN2I5NGE1N2I4Y2E1NmI4NDljNmI3YjljNjM3Mzk0NjM3Yjk0 NWE3MzhjNjM3Yjk0NWE3Yjk0NjM3Yjk0NWE3Mzk0NjMNCjdiOTQ1YTczOGM1YTczOGM1YTczOGM1 YTczOGM1MjczOGM1YTczOGM1MjZiODQ1MjczOGM1MjZiODQ1MjczOGM1MjZiODQ1MjZiODQ1MjZi ODQ1MjZiODQ1MjZiN2I1MjZiODQ1MjZiN2I1YTZiN2I1MjYzN2I1YTZiN2I1MjYzDQo3MzVhNmI3 YjUyNjM3MzVhNjM3MzUyNjM2MzVhNjM2MzUyNWE2MzVhNjM2MzUyNWE1YTUyNWE1YTUyNTI1MjUy NTI1YWE1YmRiZGE1YjViZGE1YmRiZGE1YjViZGE1YmRiZGE1YjViZGE1YmRiZGE1YjViZGE1YmRi ZGE1YjViZA0KYTViZGJkYTViNWJkYTViZGJkYTViNWJkYTViNWJkOWNiNWI1YTViNWJkOWNiNWJk YTViNWJkOWNiNWI1YTViNWJkOWNiNWJkYTViNWJkOWNiNWI1YTViNWJkOWNhZGI1OWNiNWJkOWNh ZGI1OWNiNWJkOWNhZGI1OWNhZGI1OWMNCmFkYjU5Y2FkYjU5NGFkYjU5Y2FkYjU5NGE1YWQ5Y2Fk YjU5Y2FkYjVhNWFkYjU5Y2FkYjVhNWI1YjVhNWFkYjVhNWFkYjU5Y2FkYWRhNWFkYjVhNWFkYWRh ZGI1YjVhZGI1YjViNWJkYmRhZGJkYmRiNWJkYzZiNWJkYzZiZGM2DQpjZWJkYzZjZWM2Y2VkNmM2 Y2VkNmNlZGVkZWNlZDZkZWNlZGVkZWNlZDZkZWQ2ZGVlN2Q2ZGVkZWQ2ZGVlN2Q2ZGVlN2Q2ZTdl N2Q2ZTdlN2Q2ZTdlN2Q2ZGVkZWU3ZWZlZmRlZTdkZWRlZTdlN2U3ZWZlZmE1YjViZDE4MjkzOQ0K MjEzOTUyODRhNWJkOWNiZGU3OTRiNWU3OTRiZGVmNzM5Y2NlNTI3YmE1NTI3YjljNTI3YmE1NGE3 Mzk0NDI2YjhjMzE1MjczMzE1MjczMzE0YTczNDI1YTg0Mzk1YTg0Mzk2MzhjNDI2Mzk0NGE3YmE1 NGE3YmFkNWE4Y2JkNTINCjhjYmQ2YjljY2U3M2FkZGU3YmFkZTc3YmI1ZTc4NGI1ZWY2Yjk0ZDY1 YTg0YmQzOTYzOWMyMTRhN2IxODQyNzMxODM5NjMxMDMxNTIxMDI5NGEwODIxMzkxMDI5MzkxMDIx MzExODI5MzkzMTQyNTIyOTM5NGExMDE4MjkxMDE4DQozMTAwMDgxODAwMDAxODA4MTgyOTEwMTgz MTAwMTAyOTAwMTAzMTAwMTAzMTEwMjE0YTE4MzE1YTMxNGE3MzI5NGE3YjIxNGE4NDIxNGE4NDI5 NTI4YzMxNWE4NDRhNmI4YzQyNjM4NDIxNDI1YTAwMTAyOTAwMTgzMTIxMzk1Mg0KMzE0YTZiMzk1 YTg0MzE1Mjg0MzE1Mjk0MjE0YThjMTg0Mjg0Mzk1YThjMzE1MjdiNmI4Y2FkOWNiZGQ2YWRjNmQ2 YTViZGNlYWRiZGNlOWNhZGI1YTViNWJkOWNhZGI1OTRhNWI1OGM5Y2FkODQ5Y2FkNzM4Y2E1NzM4 NGE1NjMNCjdiOWM2MzdiOWM1YTdiOTQ2MzdiOTQ1YTczOTQ2MzdiOTQ2MzdiOTQ2MzdiOTQ1YTcz OTQ2MzdiOTQ1YTczOGM1YTczOTQ1YTczOGM1YTczOGM1MjczOGM1YTczOGM1MjZiODQ1YTczOGM1 MjZiOGM1MjczOGM1MjZiODQ1MjZiDQo4NDUyNmI4NDUyNmI4NDUyNmI4NDVhNmI4NDUyNmI3YjVh NmI3YjUyNjM3YjVhNmI3YjUyNjM3MzVhNmI3YjUyNjM3MzVhNmI2YjVhNjM2MzVhNjM2MzUyNWE1 YTVhNWE2MzUyNWE1YTUyNWE1YTRhNTI1MjljYWRiNWE1YjViZA0KOWNiNWI1YTViNWJkOWNiNWI1 YTViNWJkOWNiNWI1YTViNWJkOWNhZGI1YTViNWJkOWNiNWI1YTViNWJkOWNhZGI1OWNiNWI1OWNh ZGI1OWNiNWI1OWNhZGI1OWNiNWI1OWNhZGI1OWNiNWJkOWNhZGI1OWNiNWI1OWNhZGI1OWMNCmI1 YmQ5NGFkYjU5Y2FkYjU5NGFkYjU5Y2FkYjU5NGE1YWQ5Y2FkYjU5NGE1YWQ5Y2FkYjU5NGE1YWQ5 NGE1YWQ5NGE1YWQ5NGE1YWQ5NGE1YWQ5NGE1YWQ5NGE1YWQ5Y2FkYjU5Y2FkYWRhNWFkYjU5Y2Fk YWQ5Y2FkYWQ5Y2E1DQphNWE1YWRhZGE1YWRhZGFkYjViNWE1YjViNWFkYjViZGFkYjViZGI1YmRj NmI1YmRiZGI1YzZjNmJkYzZjZWM2Y2VkNmM2Y2VkNmM2ZDZkNmM2ZDZkNmNlZDZkZWM2ZDZkNmNl ZGVkZWNlZDZkZWNlZGVkZWNlZDZkZWNlZGVkZQ0KY2VkZWRlZDZlN2U3ZDZkZWRlZDZkZWRlZDZk ZWRlZTdlZmVmOTRhNWFkMTgyOTM5MTgzMTQyOGNhNWJkOWNiZGU3OTRiNWU3OGNiNWU3ODRhZGRl NjM5NGJkNjM5NGI1NWE4Y2FkNWE4NGFkNTI3MzljNTI3Mzk0NGE2YjhjNGENCjZiOGMzOTVhN2I0 MjYzOGM0MjZiOTQ1MjdiYTU1YTg0YjU2Mzk0YzY2Mzk0YzY2Mzk0YzY2YjljY2U3YmFkZTc3M2E1 ZGU3YmFkZTc3MzljZGU2MzhjY2U1MjdiYmQzOTZiYTUyMTRhODQyOTUyODQyOTRhN2IyOTRhNmIx ODMxDQo1MjEwMzE0YTEwMjk0MjE4MzE0MjE4MjkzOTMxNDI1MjI5Mzk0YTI5Mzk0YTMxNDI1MjI5 Mzk0YTEwMjEzMTEwMjEzOTA4MTgyOTEwMjEzOTE4Mjk0YTIxMzE1MjE4MzE1YTIxMzk2MzI5NGE3 MzMxNTI4NDIxNGE4NDIxNTI4Yw0KMjk1MjhjMzk1YThjNDI2Mzg0Mzk1YTczMTgzMTRhMDAxMDI5 MDAwODIxMTAyOTQyMjEzOTVhNDI1YTg0MzE1Mjg0Mjk1Mjg0MTAzOTczMjE0YTg0MjE0MjczNDI2 Mzg0N2I5NGI1YTVjNmQ2YTViZGNlYTViZGM2YWRiZGM2YTUNCmI1YmQ5Y2FkYjU5Y2FkYjU5NGE1 YWQ4YzljYWQ3Yjk0YTU3MzhjYTU2YjdiOWM2YjdiOWM1YTczOTQ1YTdiOTQ1YTczOGM2MzdiOTQ1 YTczOGM2MzdiOTQ1YTczOTQ1YTdiOTQ1YTczOGM1YTczOGM1YTczOGM1YTczOGM1MjZiDQo4NDUy NzM4YzUyNmI4NDUyNzM4YzUyNmI4NDUyNmI4YzUyNmI4NDUyNmI4NDUyNmI4NDUyNmI4NDUyNmI3 YjUyNmI4NDUyNjM3YjUyNmI3YjUyNjM3YjVhNmI3YjUyNjM3MzUyNjM3YjUyNjM3MzVhNjM3MzUy NjM2MzVhNjM2Mw0KNTI1YTVhNWE2MzYzNTI1YTVhNTI1YTVhNGE1MjUyNTI1MjVhOWNiNWI1OWNh ZGI1OWNiNWI1OWNhZGI1OWNiNWI1OWNhZGI1YTViNWJkOWNhZGI1YTViNWJkOWNhZGI1YTViNWJk OWNiNWI1OWNiNWI1OWNhZGI1OWNiNWI1OWMNCmFkYjU5Y2FkYjU5Y2FkYjU5Y2FkYjU5Y2FkYjU5 Y2FkYjU5Y2FkYjU5Y2FkYjU5Y2FkYjU5Y2FkYjU5NGE1YWQ5Y2FkYjU5NGE1YWQ5NGFkYjU5NGE1 YWQ5NGFkYjU5NGE1YWQ5NGE1YWQ4Y2E1YWQ5NGE1YWQ5NGE1YWQ5NGE1DQphZDk0YTVhZDljYWRh ZDljYTVhZDljYWRiNTljYTVhZGE1YWRhZDljYTVhZDljYTVhZDljYTVhNWE1YWRhZGE1YWRhZGFk YjViNWE1YjViNWFkYmRiZGFkYjViZGI1YmRjNmI1YmRjNmJkY2VjZWJkY2VjZWM2ZDZkNmM2Y2Vk Ng0KY2VkNmQ2YzZkNmQ2Y2VkNmRlY2VkNmQ2Y2VkZWRlY2VkNmRlZDZkZWU3YzZkNmQ2Y2VkZWRl ZDZkZWRlZDZkZWRlY2VkNmQ2ZGVlN2U3ZGVlN2U3ODQ4Yzk0MjEzMTM5Mjk0MjUyODQ5Y2I1OWNi ZGU3OTRiNWU3OTRiZGVmOGMNCmI1ZTc3YmE1ZDY2YjljYzY2Yjk0YzY2Yjk0YjU3Mzk0YmQ2Yjhj YjU2YjhjYjU2Mzg0YTU2Mzg0YWQ2Mzg0YWQ2YjhjYmQ2Yjk0YzY3MzljY2U2YjljY2U2YjljY2U2 YjljY2U3YmFkZGU3YmFkZTc3YmFkZGU3M2E1ZGU3M2E1DQpkZTYzOGNjZTYzOGNjZTRhNzNiNTRh NzNhZDRhNmJhNTRhNmI5YzM5NWE4NDI5NGE3MzIxNDI1YTIxNDI1YTIxMzk1MjI5NDI1MjM5NGE2 MzQyNTI2YjRhNWE3MzVhNmI4NDRhNWE3MzM5NGE1YTI5Mzk0YTI5Mzk1YTI5NDI1YQ0KMzk0YTZi MzE0YTZiMjk0YTZiMjk0MjZiMzE0YTdiMzE1Mjg0MzE1YThjMjk1YThjMzk2Mzk0Mzk2MzhjNDI2 Mzg0Mjk0YTYzMTgzMTQyMDAxMDIxMDAxMDIxMDAxODI5MTgyOTRhMzk1MjczNGE2Yjk0MzE1Mjg0 MTAzOTZiMjENCjQyNzMyOTRhNmI1MjZiODQ4Y2FkYzZhZGM2ZDZhNWJkY2VhNWJkYzZiNWM2Y2Vh NWI1YmRhNWI1YmQ5Y2FkYjU5NGE1YjU4YzljYWQ4NDk0YWQ3MzhjYTU3Mzg0YTU2MzdiOWM2Mzdi OTQ1YTczOTQ2MzdiOTQ1YTczOTQ2MzdiDQo5NDVhNzM5NDYzN2I5NDVhNzM4YzVhNzM5NDVhNzM4 YzVhNzM5NDUyNzM4YzVhNzM4YzUyNmI4NDVhNzM4YzUyNmI4NDUyNmI4YzUyNmI4NDUyNmI4YzUy NmI4NDUyNmI4NDUyNmI4NDUyNmI4NDUyNmI4NDVhNmI4NDUyNjM3Yg0KNWE2YjdiNTI2MzdiNWE2 YjdiNTI2MzczNWE2YjdiNTI2MzczNWE2MzZiNWE2MzYzNWE2MzYzNTI1YTVhNWE1YTVhNTI1MjVh NTI1YTVhNTI1MjUyOTRhNWFkOWNhZGI1OTRhNWFkOWNhZGI1OTRhZGFkOWNhZGI1OTRhZGFkOWMN CmFkYjU5NGFkYWQ5Y2FkYjU5NGFkYWQ5Y2FkYjU5NGFkYWQ5Y2FkYjU5NGFkYWQ5Y2FkYjU5NGE1 YWQ5NGFkYjU5NGE1YWQ5NGFkYWQ5NGE1YWQ5NGFkYjU5NGE1YWQ5NGFkYWQ5NGE1YWQ5NGFkYWQ5 NGE1YWQ5NGE1YWQ5NGE1DQphZDk0YTVhZDhjYTVhNTk0YTVhZDhjYTVhZDk0YTVhZDhjOWNhNTk0 YTVhZDk0YTVhNTk0YTVhZDk0YTVhNTljYTVhZDk0YTVhNTljYWRhZDljYTVhNTljYTVhZDk0YTVh NTljYTVhNTljYTVhNTljYWRhZDljYTVhZGE1YWRiNQ0KYTVhZGI1YWRiNWJkYWRiNWJkYjVjNmM2 YjVjNmM2YmRjZWNlYzZjZWNlYzZkNmQ2YzZjZWQ2YzZkNmQ2YzZkNmQ2Y2VkNmRlYzZkNmQ2Y2Vk NmRlY2VkZWRlYzZkNmQ2YzZkNmQ2ZDZkZWRlY2VkNmQ2ZDZkZWRlZDZkZWRlZDYNCmRlZGU1YTZi NzMzMTQyNTIzOTRhNjM3MzhjYWQ4Y2FkY2U5NGJkZTc5NGJkZWY5NGJkZWY5NGM2ZWY5NGJkZWY4 Y2I1ZTc5NGJkZTc5Y2JkZWZhNWM2ZWY5Y2I1ZGU5NGI1ZGU4Y2FkZDY5NGI1ZGU4Y2I1ZGU4Y2I1 ZGU3YmFkDQpkZTdiYWRkZTczYTVkNjdiYWRkZTdiYWRlNzhjYmRlZjczYTVkZTdiYWRkZTczOWNk NjZiOWNkNjYzOTRkNjVhOGNjNjYzOGNjNjYzOGNjNjVhODRiNTRhNzNhNTM5NjM4YzMxNWE3YjIx NDI2MzE4Mzk1YTIxMzk1YTI5NDI1YQ0KMTgzMTRhMjk0MjUyMzE0YTYzNDI1YTZiMzk1MjZiMzk1 MjZiMzk1MjZiMzk1MjczMzE0YTZiMzE0YTZiMjk0MjZiMjk0YTczMjk0YTdiMzE1Mjg0Mjk1Mjhj MzE1YTk0Mzk1YThjMzk2MzhjMzE1MjZiMjEzOTUyMDAxODI5MDANCjEwMTgwMDEwMTgwMDEwMjEw MDEwMjEyOTQyNWE1YTczOTQ0MjVhOGMxODMxNjMyMTQyNmI0MjVhN2I3MzhjYTU5Y2I1YzZiNWM2 ZDZhNWJkYzZhZGJkYzZhZGJkYmRhZGI1YmQ5Y2FkYjU5Y2FkYjU4YzljYWQ4YzljYWQ3Yjk0DQph NTczOGNhNTZiN2I5YzYzN2I5YzVhNzM5NDYzN2I5NDVhNzM4YzVhNzM5NDVhNzM4YzVhN2I5NDVh NzM4YzVhNzM4YzUyNzM4YzVhNzM4YzUyNmI4YzVhNzM4YzUyNmI4NDUyNmI4YzUyNmI4NDUyNmI4 NDUyNmI4NDUyNmI4Yw0KNTI2Mzg0NTI2Yjg0NTI2MzdiNTI2Yjg0NTI2MzdiNTI2Yjg0NTI2Mzdi NTI2YjdiNTI2MzczNTI2MzdiNTI2MzczNTI2MzczNTI2MzczNTI2MzczNTI2MzYzNWE2MzYzNTI1 YTVhNTI1YTVhNTI1YTVhNTI1YTVhNGE1MjUyNTINCjUyNTI5Y2FkYjU5NGE1YWQ5Y2FkYjU5NGE1 YWQ5Y2FkYjU5NGFkYWQ5Y2FkYjU5NGFkYWQ5Y2FkYjU5NGFkYWQ5Y2FkYjU5NGE1YWQ5Y2FkYjU5 NGE1YWQ5NGFkYWQ5NGE1YWQ5Y2FkYjU5NGE1YWQ5NGFkYjU5NGE1YWQ5Y2FkDQpiNTk0YTVhZDk0 YWRiNTk0YTVhZDljYWRiNTk0YTVhZDk0YWRhZDk0YTVhZDk0YWRhZDk0YTVhZDk0YTVhZDhjYTVh ZDk0YTVhZDk0YTVhZDk0YTVhZDk0YTVhZDljYWRhZDk0YTVhZDljYWRhZDk0YTVhZDljYWRhZDlj YTVhZA0KOWNhZGFkOTRhNWE1OWNhNWFkOWNhNWE1OWNhNWFkOWNhNWE1YTVhZGFkOWNhZGFkYTVi NWI1YTViNWI1YjViZGM2YjViZGM2YmRjZWNlYmRjZWNlYzZkNmQ2YzZjZWQ2YzZkNmQ2YzZkNmQ2 Y2VkNmRlY2VkNmRlY2VkZWRlY2UNCmQ2ZGVkNmRlZTdjNmQ2ZDZjZWRlZGVjZWRlZGVjZWQ2ZDZk NmRlZGVkZWU3ZTdiNWJkYzY0MjRhNTIzOTRhNTI0YTVhNzM2MzdiOWM4NGE1YzY5NGI1ZGU5NGJk Zjc4Y2I1ZWY5NGJkZWY4Y2JkZTc5NGJkZWY5NGJkZWZhNWM2DQpmN2E1YzZmN2E1YzZlZjljYmRl N2E1YzZmN2E1YzZmN2E1Y2VmNzk0YmRlZjhjYjVlZjg0YWRkZTg0YjVlNzg0YjVlZjhjYmRlZjhj YmRlZjg0YjVlNzdiYWRlNzdiYWRlNzZiOWNkNjdiYTVlNzZiOTRkNjczYTVkZTczOWNkNg0KNzM5 Y2Q2NjM4Y2JkNWE4NGI1NGE2YjljMzE1Mjg0MTAzOTVhMjEzOTVhMTAyOTRhMDgyOTQyMTAyOTQy MjEzOTUyMjk0MjYzMzk1MjZiMzk1MjczMzk1MjczMzE0YTczMzE0YTczMjk0MjZiMjk0YTczMjk0 YTdiMzE1Mjg0MzENCjVhODQzOTYzOTQzMTVhOTQ0MjZiOTQ0MjYzOGMzMTRhNmIxMDI5NDIwODE4 MjkwMDEwMTgxMDE4MjEwMDEwMTgwMDA4MTgyMTI5NDI3Mzg0OWM2MzdiOWM0YTYzOGM0MjYzODQ3 MzhjYTU5Y2FkYmRiNWM2ZDZiNWM2Y2ViNWM2DQpjNmFkYmRiZGFkYmRiZGE1YjViNWE1YjViNTlj YWRiNTk0YTViNTg0OWNhZDg0OTRhZDczOGNhNTZiODRhNTYzN2I5YzYzN2I5NDVhNzM5NDVhNzM5 NDVhNzM4YzYzN2I5NDVhNzM4YzVhNzM5NDUyNzM4YzVhNzM4YzVhNzM4Yw0KNWE3MzhjNTI2Yjhj NWE3MzhjNTI2Yjg0NTI2YjhjNTI2Yjg0NTI2YjhjNTI2Yjg0NTI2Yjg0NTI2Mzg0NTI2Yjg0NTI2 Mzg0NTI2Yjg0NTI2MzdiNWE2Yjg0NTI2MzdiNWE2YjdiNTI2MzczNWE2YjdiNTI2MzczNTI2Mzcz NTINCjYzNmI1YTYzNmI1YTYzNjM1YTYzNjM1MjVhNWE1YTVhNWE1MjUyNWE1MjVhNWE0YTUyNTI5 NGE1YWQ5NGFkYWQ5NGE1YWQ5Y2FkYjU5NGE1YWQ5Y2FkYjU5NGFkYWQ5Y2FkYjU5NGE1YWQ5Y2Fk YjU5NGFkYWQ5Y2FkYjU5NGE1DQphZDk0YWRhZDk0YTVhZDk0YWRhZDk0YTVhZDk0YWRiNTk0YTVh ZDljYWRiNTk0YTVhZDk0YWRiNTk0YTVhZDljYWRiNTk0YTVhZDk0YWRhZDk0YTVhZDk0YWRhZDk0 YTVhZDk0YTVhZDhjYTVhZDk0YTVhZDhjYTVhNTk0YTVhZA0KOTRhNWFkOTRhZGFkOTRhNWFkOTRh NWFkOTRhNWE1OWNhZGFkOTRhNWE1OWNhNWFkOWNhNWE1OWNhNWFkOTQ5YzljOWNhNWE1OWNhNWE1 OWNhNWFkOWNhNWFkYTVhZGI1YTVhZGI1YWRiNWJkYWRiNWJkYjViZGM2YjVjNmM2YzYNCmNlY2Vi ZGNlY2VjNmNlZDZjNmNlZDZjNmQ2ZDZjNmNlZDZjZWQ2ZGVjZWQ2ZDZjZWQ2ZGVjZWQ2ZGVjNmQ2 ZDZjZWRlZGVkNmRlZGVjNmNlY2VkZWU3ZTdjZWQ2ZDY5Y2E1YTUyMTMxMzkzMTQyNTIzOTUyNmI1 MjczOGM3Mzk0DQpiNThjYjVkZThjYjVlNzhjYjVlZjhjYjVlNzhjYjVlZjk0YjVlZjljYmRmNzk0 YmRlZjljYmRmNzljYmRlZmE1YzZlZjljYzZlZmE1YzZmN2E1YzZmNzljYzZmNzhjYjVlNzg0YjVl Nzg0YjVlNzhjYjVlZjg0YjVlNzk0YmRlZg0KODRhZGU3ODRiNWU3N2JhNWU3N2JhNWU3N2JhZGVm N2JhNWU3NzNhNWU3N2JhZGU3NzNhNWRlNmI5Y2Q2NjM5NGM2NjM4Y2M2NGE3M2E1Mzk2MzhjMjE0 YTZiMTgzOTVhMTAzMTUyMjE0MjYzMjEzOTYzMjE0MjYzMjk0MjZiMjkNCjRhNmIyOTRhNmIzMTUy NzMyOTUyNzMzMTUyN2IyOTUyN2IzMTUyODQzMTUyODQzOTVhOGMzMTVhOGMzOTYzOTQ0MjYzOTQ0 MjYzOGMyOTQyNWExMDIxMzEwMDEwMTgxMDE4MjEwODEwMTgwODEwMTgwMDA4MTAxODIxMzE3Mzg0 DQo5YzhjOWNiNTdiOTRhZDg0OTRiNTljYWRiZGI1YmRjZWI1YzZjZWI1YzZjNmFkYmRiZGFkYmRi ZGFkYjViNWFkYjViZDljYWRhZDljYWRiNThjOWNhZDhjOWNhZDdiOGNhNTczOGNhNTZiN2I5YzYz N2I5YzVhNzM5NDVhNzM5NA0KNWE3MzhjNWE3Mzk0NWE3MzhjNWE3MzhjNTI3MzhjNWE3MzhjNTI2 Yjg0NWE3MzhjNTI2Yjg0NTI3MzhjNTI2Yjg0NTI2Yjg0NTI2Yjg0NTI2Yjg0NTI2Mzg0NTI2Yjg0 NGE2Mzg0NTI2Yjg0NGE2MzdiNTI2Mzg0NTI2MzdiNTINCjZiODQ1MjYzN2I1MjYzN2I1MjYzNzM1 MjYzN2I1MjVhNzM1MjYzNzM1MjVhNmI1YTYzNzM1MjVhNjM1YTYzNjM1MjVhNWE1MjVhNWE1MjUy NTI1MjUyNWE0YTUyNTI1MjUyNTI5Y2FkYjU5NGFkYWQ5Y2FkYjU5Y2FkYjU5Y2FkDQpiNTljYWRi NTljYjViNTljYWRiNTljYjViNTljYWRiNTljYjViNTljYWRiNTljYjViNTljYWRiNTljYjViNTlj YWRiNTljYWRiNTk0YWRiNTljYWRiNTljYWRiNTljYWRiNTk0YWRiNTljYWRiNTljYWRiNTljYWRi NTk0YTVhZA0KOWNhZGI1OTRhNWFkOTRhZGFkOTRhNWFkOTRhZGFkOTRhNWFkOTRhNWFkOGNhNWFk OTRhZGFkOTRhNWFkOWNhZGFkOTRhNWFkOWNhZGFkOTRhNWFkOWNhNWFkOTRhNWE1OWNhZGFkOWNh NWE1OWNhNWE1OTRhNWE1OWNhNWE1OWMNCmE1YTVhNWFkYjVhNWFkYjVhZGI1YmRhZGI1YmRiNWJk YzZiNWJkYzZiZGM2Y2ViZGM2Y2VjNmNlZDZjNmNlZDZjNmQ2ZDZjNmQ2ZDZjZWQ2ZGVjNmQ2ZDZj ZWRlZGVjZWQ2ZGVjZWRlZGVjNmQ2ZDZkZWU3ZWZkNmRlZGVjZWQ2DQpkNmRlZTdlN2NlZDZkNjdi ODQ4YzIxMjkzMTI5Mzk0MjM5NGE2MzRhNjM4NDczOTRiZDhjYWRkNjhjYjVlNzhjYjVlNzhjYjVl ZjhjYjVlZjk0YmRmNzk0YmRlZjk0YmRlZjk0YjVlZjljYmRmNzljYzZmN2E1YzZmN2E1YzZmNw0K YTVjNmZmOWNjNmY3OWNiZGY3OTRiNWVmOGNiNWY3ODRiNWVmODRhZGU3OGNiNWVmODRhZGU3ODRh ZGU3ODRiNWVmN2JhZGU3OGNiZGY3ODRhZGVmODRiNWVmODRhZGVmODRhZGVmNzM5Y2RlNzNhNWRl NzNhNWRlNzNhNWRlNjMNCjk0YzY2Yjk0YmQ0YTczOTQ0MjZiOGM0MjYzOGMzOTYzODQzMTVhN2Iz OTVhODQyOTUyNzMyOTUyN2IzMTUyN2I0MjYzOTQ0MjYzOTQ0MjYzOTQzMTVhOGMzOTVhOGMzMTVh ODQzOTYzOTQzOTVhOGM0YTYzOTQ0MjVhN2IyOTQyDQo1YTAwMTAyMTA4MTAxODEwMTgxODEwMTAx ODEwMTAxODA4MDgxMDA4MTAxODdiOGM5NDljYWRiZGE1YjVjZWE1YmRjZWI1YmRjZWI1YzZjZWI1 YzZjZWFkYjViZGI1YmRjNmFkYmRiZGFkYmRiZGFkYjViZGE1YjViNTljYWRhZA0KOTRhNWI1OGM5 Y2FkODQ5NGFkNzM4NGE1NmI4NGE1NjM3YjljNjM3Yjk0NWE3MzhjNWE3Yjk0NWE3MzhjNWE3Mzk0 NWE3MzhjNWE3Mzk0NTI3MzhjNWE3MzhjNTI2YjhjNWE3MzhjNTI2YjhjNTI2YjhjNTI2Yjg0NTI2 YjhjNTINCjZiODQ1MjZiOGM1MjYzODQ1MjZiODQ1MjYzODQ1MjZiODQ0YTYzN2I1MjZiODQ1MjYz N2I1YTZiN2I1MjYzN2I1YTZiN2I1MjYzNzM1MjYzNzM1MjYzNzM1YTYzNzM1MjYzNmI1YTYzNmI1 YTYzNjM1YTYzNjM1MjVhNWE1MjVhDQo1YTUyNTI1MjUyNWE1YTRhNTI1Mjk0YWRhZDljYWRiNTk0 YTVhZDljYWRiNTk0YWRhZDljYWRiNTk0YWRhZDljYWRiNTljYWRiNTljYWRiNTk0YWRhZDljYWRi NTljYWRiNTljYWRiNTk0YWRhZDljYWRiNTljYWRiNTljYWRiNQ0KOTRhZGI1OWNhZGI1OWNhZGI1 OWNhZGI1OTRhZGI1OWNhZGI1OTRhZGI1OWNhZGI1OTRhNWFkOWNhZGI1OTRhNWFkOWNhZGI1OTRh NWFkOWNhZGI1OTRhNWFkOTRhZGFkOTRhNWFkOTRhNWFkOTRhNWE1OTRhZGFkOTRhNWE1OWMNCmFk YWQ5NGE1YTU5Y2FkYWQ5NGE1YTU5Y2E1YTU5NDljOWM5Y2E1YTU5Y2E1YTVhNWFkYWRhNWFkYWRh NWI1YjVhNWI1YjVhZGJkYmRhZGJkYmRiNWM2YzZiNWM2YzZiZGNlY2VjNmNlZDZjNmQ2ZDZjNmNl ZDZjZWQ2ZGVjZWQ2DQpkNmNlZGVkZWNlZDZkNmNlZDZkZWNlZGVkZWM2ZDZkNmQ2ZTdlN2Q2ZGVk ZWQ2ZGVkZWQ2ZGVkZWM2Y2VjZTYzNmI2YjIxMzEzOTI5Mzk0YTMxNDI1YTRhNjM3YjYzODRhZDhj YWRkNjhjYjVlNzhjYjVlZjg0YWRlNzhjYjVlZg0KOGNiNWVmOTRiNWVmOGNiNWVmOTRiZGY3OTRi ZGVmOWNjNmY3OWNiZGVmOWNjNmY3OWNiZGY3OWNjNmY3OTRiZGY3OTRiZGY3OGNiNWVmOGNiNWVm ODRhZGU3ODRhZGU3N2JhZGRlODRhZGU3N2JhZGU3ODRiNWVmODRhZGVmODQNCmI1Zjc3YmFkZWY4 NGFkZWY3YmE1ZTc3YmFkZTc3M2E1ZGU3M2E1ZGU2MzljZDY2YjljZDY2Yjk0YzY3MzljYzY2Yjk0 YzY2Yjk0YzY2Yjk0YmQ2Mzk0YmQ1MjdiYTU0MjZiOWM0MjZiOTQ1MjdiYTU1MjdiYTU0YTczYTUz OTYzDQo5NDM5NjM4YzMxNWE4YzM5NWE4YzMxNWE4NDQyNjM4YzM5NWE3YjI5NDI2MzEwMjEzOTA4 MTAyMTA4MDgxODE4MTgxODEwMTAxMDEwMTAxMDA4MDgwODAwMDAwODUyNWE2MzljYTViNWE1YjVj NmE1YjVjNmFkYjViZGI1YmRjNg0KYjViZGJkYjViZGM2YjViZGJkYjViZGJkYTViNWI1YTViNWI1 YTVhZGI1OWNhZGI1OGM5Y2FkOGM5Y2FkN2I5NGFkN2I4Y2FkNmI3YjljNjM3YjljNWE3MzhjNWE3 Mzk0NTI3MzhjNWE3MzhjNTI2YjhjNWE3MzhjNTI2Yjg0NWENCjczOGM1MjZiODQ1MjczOGM1MjZi ODQ1MjZiODQ0YTZiODQ1MjZiODQ0YTYzN2I1MjZiODQ0YTYzODQ1MjYzODQ0YTYzN2I0YTYzN2I0 YTYzN2I1MjYzN2I0YTYzNzM1MjYzN2I1MjYzNzM1MjYzN2I1MjVhNzM1MjYzNzM1MjVhDQo3MzUy NjM3MzUyNWE2YjUyNjM2YjUyNWE2MzVhNjM2MzUyNWE1YTUyNWE1YTUyNTI1YTUyNWE1YTRhNTI1 MjRhNTI1MjljYjViNTljYWRiNTljYjViNTljYWRiNTljYjViNTljYWRiNTljYjViNTljYWRiNTlj YjViNTljYWRiNQ0KOWNiNWI1OWNhZGI1OWNiNWI1OWNhZGI1OWNiNWI1OWNhZGI1OWNiNWI1OWNh ZGI1OWNhZGI1OWNhZGI1OWNiNWI1OWNhZGI1OWNhZGI1OWNhZGI1OWNiNWI1OWNhZGI1OWNhZGI1 OWNhZGI1OWNhZGI1OWNhZGI1OWNhZGI1OTQNCmFkYjU5Y2FkYjU5NGFkYWQ5NGFkYWQ5NGE1YWQ5 Y2FkYWQ5NGE1YWQ5Y2FkYWQ5Y2FkYWQ5Y2FkYWQ5Y2FkYWQ5Y2FkYWQ5Y2E1YTU5Y2E1YTU5Y2E1 YTVhNWFkYWRhNWFkYWRhZGI1YjVhZGI1YjVhZGJkYmRhZGJkYmRiNWM2DQpjNmI1YzZjNmJkY2Vj ZWM2Y2VjZWNlZDZkZWM2ZDZkNmNlZDZkZWNlZDZkZWQ2ZGVkZWNlZGVkZWQ2ZGVlN2NlZGVkZWQ2 ZTdlN2M2ZDZkZWRlZTdlZmNlZDZkNmRlZTdlN2RlZTdkZWJkYzZjNjQyNTI1MjIxMzEzOTMxNDI0 YQ0KNDI1YTZiNGE2Yjg0NmI4Y2FkN2JhNWNlOGNiNWU3ODRhZGU3OGNiNWVmOGNiNWVmOGNiNWY3 OGNiNWVmOTRiZGY3OTRiZGY3OWNjNmY3OWNiZGY3OWNjNmY3OWNjNmY3YTVjNmZmOWNjNmY3OWNj NmZmOTRiZGY3OTRiZGY3OGMNCmI1ZWY4NGFkZTc4NGFkZGU4NGFkZTc3YmFkZGU4NGFkZTc4NGFk ZTc4NGFkZWY4NGFkZWY4Y2JkZjc4NGI1Zjc4NGI1Zjc3YmFkZWY3M2FkZTc2YjljZGU2MzljZGU2 Mzk0Y2U3M2E1ZDY3YmE1ZDY3YmE1ZDY3M2E1Y2U3YmE1DQpkNjczOWNjZTZiOWNjNjVhODRiZDVh ODRiNTVhODRiNTVhODRiNTRhNzNhNTQyNmI5YzM5NjM4YzM5NjM5NDM5NjM4YzM5NWE4YzM5NTI3 YjMxNGE2YjE4MzE0YTEwMjEzMTA4MTAxODEwMTAxODEwMTAxMDE4MTAxMDEwMTAwOA0KMTAxMDEw MDAwMDAwNTI1YTYzOTQ5Y2E1YWRiZGM2YWRiNWM2YjViZGM2YjViZGJkYjVjNmM2YjViZGJkYjVj NmM2YWRiZGJkYWRiZGJkYTViNWI1YTViNWJkOWNhZGI1OTRhNWI1ODQ5Y2FkODQ5NGFkN2I4Y2E1 NmI4NGE1NjMNCjdiOTQ2MzdiOTQ1YTczOGM1YTczOTQ1MjczOGM1YTczOGM1MjZiOGM1YTczOGM1 MjZiOGM1YTczOGM1MjZiODQ1MjczOGM1MjZiODQ1MjZiOGM1MjZiODQ1MjZiODQ0YTYzODQ1MjZi ODQ0YTYzODQ1MjYzODQ0YTYzN2I1MjYzDQo4NDRhNjM3YjUyNjM3YjUyNjM3YjVhNjM3YjUyNjM3 MzUyNjM3YjUyNjM3MzVhNjM3MzUyNWE3MzUyNjM3MzUyNWE2YjVhNjM2MzUyNWE1YTVhNjM2MzUy NWE1YTVhNWE1YTUyNTI1MjUyNTI1YTRhNTI1MjljYWRiNTljYjViNQ0KOWNhZGI1YTViNWJkOWNh ZGI1YTViNWJkOWNiNWI1YTViNWJkOWNhZGI1OWNiNWI1OWNhZGI1YTViNWJkOWNhZGI1OWNiNWI1 OWNhZGI1YTViNWJkOWNhZGI1OWNhZGI1OWNhZGI1OWNiNWI1OWNhZGI1OWNhZGI1OWNhZGI1OWMN CmI1YjU5Y2FkYjU5Y2I1YjU5Y2FkYjU5Y2I1YmQ5Y2FkYjU5Y2FkYjU5Y2FkYjU5Y2FkYjU5NGFk YWQ5Y2FkYjU5NGFkYWQ5Y2FkYWQ5NGE1YWQ5Y2FkYWQ5Y2FkYWQ5Y2FkYjU5Y2FkYWRhNWFkYWQ5 Y2FkYWQ5Y2FkYWQ5Y2E1DQphNTljYWRhNWE1YWRhZGE1YjViNWFkYjViNWFkYmRiZGFkYmRiZGI1 YzZjNmI1YmRjNmJkYzZjZWJkY2VjZWM2ZDZkNmM2ZDZkNmNlZDZkZWNlZDZkZWQ2ZGVlN2NlZGVk ZWQ2ZGVlN2Q2ZGVkZWQ2ZGVlN2Q2ZGVlN2Q2ZTdlNw0KZGVlN2U3Y2VkZWRlZGVlN2U3ZGVlN2U3 OWNhNWE1Mzk0MjQyMTgyOTMxMzk0YTVhNTI2YjdiNWE3Yjk0NjM4NGFkODRhNWQ2OGNiNWU3OGNi NWVmOGNiNWVmOGNiNWVmODRhZGVmOGNiNWY3OTRiZGVmOWNjNmY3OTRiZGY3OWMNCmJkZjc5NGJk Zjc5Y2M2Zjc5Y2M2Zjc5Y2M2Zjc5NGJkZjc5NGJkZjc4Y2I1ZWY4Y2I1ZWY3YmE1ZGU3YmFkZGU3 YmE1ZGU4NGFkZTc3YmE1ZGU4NGFkZTc4NGFkZTc4NGFkZWY4Y2I1Zjc4Y2I1Zjc4NGFkZWY3YmFk ZWY3M2E1DQpkZTZiOWNkZTYzOTRkNjYzOTRkNjVhOGNiZDYzOTRjNjYzOTRjNjYzOTRjNjVhOGNj NjYzOTRjNjVhOGNiZDUyODRiZDUyODRiNTUyODRiNTRhNzNhZDQyNmI5YzMxNWE4YzMxNWE4YzMx NWE4YzM5NWE4YzMxNTI3YjI5NGE2Yg0KMTgzMTRhMTAyMTM5MDgxMDIxMDgxMDE4MDgwODEwMTAx MDEwMDgwODA4MTAwODA4MDgwODA4MDAwMDAwMzk0MjRhOGM5NDljYTViNWJkYWRiNWM2YWRiNWJk YjViZGJkYjViZGJkYjViZGM2YWRiZGJkYWRiZGJkYTViNWI1YTUNCmI1YmQ5Y2FkYjU5Y2FkYjU4 YzljYWQ4YzljYWQ3Yjk0YTU3YjhjYTU2YjdiOWM2MzdiOTQ1YTczOGM1YTczOGM1YTczOGM1YTcz OGM1MjZiODQ1MjczOGM1MjZiODQ1YTczOGM1MjZiODQ1MjZiOGM1MjZiODQ1MjZiODQ0YTYzDQo4 NDUyNmI4NDRhNjM4NDUyNmI4NDRhNjM3YjUyNjM4NDRhNjM3YjUyNjM3YjRhNWE3YjUyNjM3YjUy NjM3MzUyNjM3YjUyNWE3MzUyNjM3YjUyNWE3MzUyNjM3MzUyNWE2YjUyNjM3MzUyNWE2YjVhNjM2 YjUyNWE2MzVhNjM2Mw0KNTI1YTVhNTI1YTVhNTI1MjUyNTI1MjVhNGE1MjUyNGE1MjUyYTViNWJk OWNiNWI1YTViNWJkYTViNWJkYTViNWJkYTViNWJkYTViZGJkYTViNWJkYTViNWJkYTViNWJkYTVi ZGJkYTViNWJkYTViNWJkYTViNWJkYTViZGJkYTUNCmI1YmRhNWI1YmQ5Y2I1YmRhNWI1YmRhNWI1 YmRhNWI1YmQ5Y2I1YmRhNWI1YmRhNWI1YmRhNWI1YmRhNWI1YmRhNWI1YmRhNWI1YmRhNWI1YmQ5 Y2I1YmRhNWI1YmQ5Y2I1YjVhNWI1YmQ5Y2I1YjVhNWI1YjU5Y2FkYjVhNWI1DQpiNTljYWRiNWE1 YjViNWE1YjViNWE1YjViNWE1YjVhZGE1YjViNWE1YWRhZGE1YWRhZGE1YWRhZGFkYjViNWFkYjVi NWI1YmRjNmI1YmRjNmJkYzZjZWJkYzZjZWJkY2VjZWM2Y2VjZWNlZDZkZWNlZDZkZWQ2ZGVlN2Nl ZGVkZQ0KZDZlN2U3ZDZkZWU3ZGVlN2VmZDZlN2U3ZGVlN2VmZDZlN2U3ZGVlZmVmZGVlN2VmZTdl ZmY3ZDZlN2U3ZTdlZmVmY2VkNmQ2N2I4NDg0Mzk0MjQyMjkzMTM5NDI1MjVhNWE3MzhjNjM3Yjlj NzM5NGI1OGNhZGQ2OWNjNmY3OTQNCmJkZWY5NGJkZjc4Y2I1ZWY4Y2I1Zjc4Y2I1ZWY5NGM2Zjc5 Y2M2Zjc5Y2M2Zjc5NGJkZWY5Y2M2Zjc5NGJkZjc5Y2M2Zjc5Y2JkZjc5Y2JkZjc4Y2I1ZWY4Y2I1 ZWY4NGFkZTc3YmFkZGU3YmE1ZGU4NGFkZTc4NGFkZGU4NGFkDQplNzg0YWRlNzhjYjVlZjhjYjVl ZjhjYjVlZjg0YWRlZjg0YWRlZjdiYTVlNzczYTVlNzZiOWNkZTZiOWNkZTYzOWNkNjYzOTRjZTYz OTRjNjYzOTRjZTVhOGNiZDUyODRiZDRhN2JiNTUyODRiZDRhN2JiNTRhN2JiNTQyNzNhZA0KNDI2 YmE1MzE1YThjMzE1YThjMzE1YThjMzk1YThjMzk1YTg0MzE1MjczMjEzOTVhMTgyOTQyMDgxMDI5 MDgxMDIxMDgxMDE4MTgxMDE4MTgxMDEwMTAwODA4MTAwODA4MTgxMDEwMDAwMDAwMzEzOTM5ODQ4 Yzk0YWRiNWJkYTUNCmI1YmRiNWJkYzZhZGJkYmRiNWM2YzZiNWJkYzZiNWJkYzZhZGJkYmRhZGJk YmRhNWI1YmQ5Y2I1YmQ5NGE1YjU5NGE1YjU4NDljYWQ4NDk0YWQ3MzhjYTU3Mzg0YTU2MzdiOTQ2 MzdiOTQ1YTczOGM1YTczOTQ1MjczOGM1YTczDQo4YzUyNmI4YzVhNzM4YzUyNmI4YzUyNzM4YzUy NmI4NDUyNzM4YzUyNmI4NDUyNmI4NDRhNjM4NDUyNmI4NDUyNjM4NDUyNmI4NDRhNjM3YjUyNjM4 NDRhNjM3YjUyNjM3YjRhNjM3YjUyNjM3YjUyNjM3YjUyNjM3YjUyNjM3Mw0KNTI2MzdiNTI2Mzcz NTI2MzczNTI1YTczNWE2MzczNTI1YTZiNWE2MzYzNTI1YTVhNWE2MzYzNTI1YTVhNTI1YTVhNTI1 MjUyNTI1YTVhNGE1MjUyOWNiNWI1YTViNWJkOWNiNWI1YTViNWJkYTViNWJkYTViZGJkYTViNWJk YTUNCmI1YmRhNWI1YmRhNWJkYmRhNWI1YmRhNWJkYmRhNWI1YmRhNWJkYmRhNWI1YmRhNWJkYmRh NWI1YmRhNWJkYzZhNWI1YmRhNWJkYmRhNWI1YmRhNWJkYzZhNWI1YmRhNWJkYmRhNWI1YmRhZGJk YzZhNWI1YmRhNWJkYmRhNWI1DQpiZGE1YmRiZGE1YjViZGE1YmRiZGE1YjViZGE1YmRiZDljYjVi NWE1YjViZGE1YjViNWE1YjViZGE1YjViNWFkYmRiNWE1YjViNWFkYmRiNWE1YjViNWE1YjViNWE1 YWRhZGFkYjViNWFkYjVhZGFkYmRiZGI1YmRjNmJkYzZjNg0KYjVjNmM2YmRjZWNlYmRjZWNlYzZk NmQ2Y2VkNmQ2ZDZkZWRlZDZkZWU3ZDZlN2U3ZDZkZWU3ZGVlN2VmZGVlN2VmZGVlZmVmZGVlN2Vm ZGVlZmVmZGVlN2VmZGVlZmY3ZGVlZmVmZTdlZmVmZTdlZmVmYjViZGJkNGE1MjUyNGENCjUyNTIy OTM5NDI0MjUyNWE0YTYzN2I1YTdiOTQ3Mzk0YjU4Y2I1ZGU5NGJkZWY5NGJkZWY4Y2I1Zjc4Y2I1 Zjc4NGI1ZWY4Y2JkZjc5NGJkZjc5Y2M2ZmY5NGJkZWY5NGJkZWY5NGJkZWY5Y2M2Zjc5NGJkZWY5 NGJkZWY5NGI1DQplZjk0YjVlZjhjYWRkZTg0YWRlNzdiYTVkZTdiYWRlNzdiYTVkZTg0YWRlNzg0 YWRkZTg0YWRlNzg0YTVkZTg0YWRlNzdiYTVkZTdiYTVlNzczOWNkZTczOWNkZTZiOWNkNjZiOWNk ZTYzOTRkNjYzOWNkNjYzOTRjZTYzOTRjZQ0KNTI4NGM2NTI4NGJkNDI3YmI1NDI3M2I1Mzk2YmFk NDI3M2I1NDI2YmFkNDI2YmFkMzE2MzljMzE1YTk0MzE1YThjMzk2Mzk0MzE1MjhjMzE1MjdiMjEz OTVhMjEzMTUyMTAyMTM5MDgxODI5MDgwODE4MTAxMDE4MTAwODEwMTgNCjEwMTAxMDA4MDgxODEw MTAxMDA4MDgwMDAwMDAyMTI5Mjk4NDhjOTRhNWI1YjVhNWI1YzZhZGI1YmRiNWJkYzZhZGJkYzZi NWJkYzZhZGJkYmRhZGJkYzY5Y2I1YmRhNWI1YmQ5Y2FkYjU5NGFkYjU4YzljYWQ4NDljYWQ3Yjk0 DQphNTdiOGNhNTZiN2I5YzYzN2I5NDVhNzM4YzVhNzM4YzUyNmI4YzVhNzM4YzUyNmI4NDUyNzM4 YzUyNmI4NDUyNmI4YzUyNmI4NDUyNmI4YzRhNmI4NDUyNmI4NDRhNjM4NDUyNmI4NDRhNjM3YjUy NjM4NDRhNjM3YjUyNjM4NA0KNGE2MzdiNGE2MzdiNGE1YTdiNTI2MzdiNGE1YTczNTI2MzdiNTI1 YTczNTI2MzdiNTI1YTczNTI2MzczNTI1YTZiNTI2MzczNTI1YTZiNTI1YTZiNTI1YTYzNWE2MzYz NTI1YTVhNTI1YTVhNTI1MjVhNTI1YTVhNGE1MjUyNGENCjUyNTJhZGJkYzZhNWI1YmRhNWJkYmRh NWI1YmRhZGJkYzZhNWJkYmRhZGJkYzZhNWJkYmRhZGJkYzZhNWJkYmRhZGJkYzZhNWJkYmRhZGJk YzZhNWJkYmRhZGJkYzZhNWJkYmRhZGJkYzZhZGJkYzZhZGJkYzZhZGJkYzZhZGJkDQpjNmFkYmRj NmFkYmRjNmFkYmRjNmFkYzZjNmFkYmRjNmFkYmRjNmFkYmRjNmFkYmRjNmFkYmRjNmFkYmRjNmE1 YmRiZGFkYmRjNmE1YmRiZGFkYmRiZGE1YjViZGFkYmRiZGFkYmRiZGFkYmRiZGFkYmRiZGI1YmRi ZGFkYmRiZA0KYWRiZGJkYWRiNWI1YWRiZGI1YWRiNWI1YjViZGJkYjViZGJkYmRjNmNlYmRjNmNl YzZjZWQ2YzZjZWNlY2VkNmRlY2VkNmRlZDZkZWU3ZDZkZWU3ZGVlN2VmZGVlN2VmZGVlZmVmZGVl N2VmZTdlZmY3ZTdlZmVmZTdlZmY3ZGUNCmVmZWZkZWVmZjdkZWVmZjdlN2VmZjdlN2Y3ZjdlZmY3 Zjc5Y2E1YTUyOTMxMzE0YTUyNTI0MjUyNWE0MjUyNWE0YTYzNzM1YTdiOTQ4NGE1YzY5NGI1ZGU5 NGJkZWY4Y2I1ZWY5NGJkZjc4Y2I1Zjc5NGJkZjc4Y2JkZjc5Y2M2DQpmZjk0YzZmNzk0YzZmNzhj YmRlZjljYzZmNzk0YzZmNzljYzZmNzk0YmRlZjljYmRmNzk0YjVlNzk0YjVlNzg0YWRlNzg0YWRl NzdiYWRlNzg0YWRlNzdiYTVkZTg0YWRlNzdiYTVkZTdiYTVkZTdiOWNkNjg0YTVkZTdiOWNkZQ0K N2I5Y2RlNmI5NGQ2NmI5Y2Q2NjM5NGNlNjM5NGNlNWE4Y2NlNWE4Y2NlNTI4NGJkNGE3YmJkNDI3 M2I1NDI3M2I1Mzk2YmFkMzk2YmFkMzk2YmFkNDI3M2I1Mzk2YmFkMzk2YmE1Mzk1YTk0Mzk2Mzlj Mzk1YThjMzE1Mjg0MjkNCjRhNzMxODMxNTIxODI5NDIxMDIxMzEwODEwMjExMDEwMTgxMDA4MTAx ODEwMTAxMDA4MTAxODEwMTAxODEwMTAxODEwMTAwMDA4MDgyMTI5Mjk3YjhjOTRhNWI1YmRhNWI1 YmRiNWJkYzZhZGJkYzZiNWJkY2VhZGJkYzZhZGJkDQpjNmE1YjVjNmE1YjViZDljYjViZDljYjVi ZDk0YTViNThjYTViNTg0OWNhZDg0OWNhZDdiOGNhNTczODQ5YzYzN2I5NDYzN2I5NDVhNzM4YzVh NzM4YzUyNmI4YzVhNzM4YzUyNmI4YzVhNzM4YzUyNmI4NDUyNzM4YzUyNmI4NA0KNTI2YjhjNTI2 Yjg0NTI2Yjg0NGE2Mzg0NTI2Yjg0NGE2MzdiNTI2Yjg0NTI2MzdiNTI2Mzg0NGE2MzdiNTI2Mzdi NGE2MzdiNTI2MzdiNTI2MzczNTI2MzdiNTI2MzczNTI2MzczNTI1YTczNWE2MzczNTI1YTczNTI2 MzczNTINCjVhNmI1YTYzNjM1MjVhNWE1YTYzNjM1MjVhNWE1YTVhNWE1MjUyNTI1MjUyNWE0YTUy NTJhNWI1YmRhZGJkYzZhNWJkYmRhZGJkYzZhNWJkYmRhZGJkYzZhNWJkYmRhZGJkYzZhNWJkYmRh ZGJkYzZhZGJkYzZhZGJkYzZhNWJkDQpiZGFkYmRjNmFkYmRjNmFkYmRjNmFkYmRjNmFkYmRjNmFk YmRjNmFkYmRjNmFkYmRjNmFkYmRjNmFkYmRjNmFkYmRjNmFkYmRjNmFkYzZjNmFkYmRjNmFkYzZj NmFkYmRjNmFkYmRjNmFkYmRjNmFkYzZjNmE1YmRiZGFkYmRjNg0KYTViZGJkYWRiZGJkYTViZGJk YWRiZGJkYWRiZGJkYjVjNmJkYWRiZGJkYjViZGJkYWRiZGJkYWRiZGJkYWRiNWI1YjViZGJkYjVi ZGJkYmRjNmM2YmRjNmM2YmRjZWNlYmRjZWNlYzZkNmQ2YzZjZWQ2Y2VkNmRlY2VkZWRlZDYNCmU3 ZTdkNmU3ZTdkZWU3ZWZkZWU3ZWZlN2VmZjdkZWVmZWZlN2VmZjdlN2VmZWZlN2VmZjdkZWU3ZWZl ZmY3ZmZkZWVmZWZlZmY3ZjdlZmY3Zjc5Y2E1YTUxMDE4MTgzOTQyNGE0MjUyNWEzOTRhNWE0MjUy NmI2Yjg0OWM4NGE1DQpjZTk0YjVlNzk0YmRlZjk0YmRmNzhjYjVlZjhjYmRmNzhjYmRmNzk0YzZm Nzk0YmRmNzk0YzZmNzhjYmRlZjk0YmRlZjk0YmRlZjk0YzZlZjk0YmRlZjk0YzZlZjk0YjVlNzk0 YjVlNzhjYWRkZThjYWRlNzdiYTVkZTdiYWRlNw0KN2JhNWRlODRhZGU3N2JhNWQ2N2JhNWRlNzM5 Y2Q2N2I5Y2Q2N2I5Y2Q2N2I5Y2Q2NzM5NGNlNmI5NGNlNjM4Y2M2NjM4Y2NlNWE4Y2M2NWE4Y2Nl NWE4Y2M2NTI4NGM2NDI3YmI1NGE3YmJkNDI3M2I1NDI3M2I1Mzk2YmI1NDINCjczYjUzMTYzYTUz OTZiYWQzOTYzYTUzOTYzOWMzMTVhOTQzOTVhOGMyOTRhN2IyOTQyNmIxMDI5NGExODI5NDIwODE4 MjkwODE4MjEwODA4MTgxMDEwMTgxMDA4MTAxODEwMTAxMDA4MDgxODEwMTAxMDEwMTAwODA4MTAx MDE4DQoyMTdiOGM5NGE1YjViZDljYjViZGE1YjViZGFkYmRjNmFkYmRjNmFkYmRjNmE1YjVjNmE1 YmRjNjljYjViZDljYjViZDk0YWRiNTk0YWRiNThjOWNhZDhjOWNhZDg0OTRhNTdiOGNhNTczODQ5 NDZiN2I5NDVhNzM4YzVhNzM4Yw0KNTI2YjhjNWE3MzhjNTI2Yjg0NTI2YjhjNTI2Yjg0NTI2Yjhj NTI2Yjg0NTI2Yjg0NGE2Yjg0NTI2Yjg0NGE2MzdiNGE2Yjg0NGE2MzdiNTI2Yjg0NGE2MzdiNTI2 Mzg0NGE2MzdiNGE2MzdiNGE1YTczNGE2MzdiNGE1YTczNTINCjYzN2I1MjVhNzM1MjYzNzM1MjVh NzM1MjYzNzM1MjVhNmI1MjVhNzM1MjVhNmI1MjVhNmI1MjVhNjM1YTYzNjM1MjVhNWE1MjVhNWE1 MjUyNTI1MjUyNWE0YTUyNTI0YTUyNTJhZGM2YzZhZGJkYzZhZGM2YzZhZGJkYzZhZGM2DQpjNmFk YmRjNmI1YzZjZWFkYmRjNmFkYzZjNmFkYmRjNmFkYzZjNmFkYmRjNmFkYzZjNmFkYmRjNmFkYzZj NmFkYmRjNmFkYzZjNmFkYmRjNmFkYzZjZWFkYmRjNmFkYzZjNmFkYmRjNmFkYzZjZWFkYmRjNmI1 YzZjZWFkYmRjNg0KYjVjNmNlYWRjNmM2YjVjNmNlYWRiZGM2YjVjNmNlYWRiZGM2YWRjNmM2YWRi ZGM2YWRjNmM2YWRiZGJkYWRjNmM2YWRiZGJkYjVjNmM2YjVjNmJkYjVjNmM2YjViZGJkYjVjNmM2 YjViZGJkYjViZGJkYjViZGI1YmRjNmM2YmQNCmM2YzZiZGNlY2ViZGNlY2VjNmQ2ZDZjNmQ2ZDZj ZWQ2ZGVjZWQ2ZGVkNmU3ZTdkNmU3ZTdkZWVmZWZkZWU3ZWZlN2VmZjdlN2VmZWZlN2Y3ZjdlN2Vm ZjdlN2Y3ZjdlN2VmZjdlN2Y3ZjdmN2ZmZmZlZmY3ZjdlN2Y3ZjdmN2ZmDQpmZmFkYjVhZDEwMTgx MDI5MzEzMTQyNGE1MjI5Mzk0YTM5NTI2YjYzODQ5YzhjYWRkNjk0YjVkZTk0YmRlZjljYzZmNzk0 YmRmNzk0YmRmNzljYzZmZjk0YmRmNzljYzZmNzk0YmRmNzk0YzZmNzk0YmRlZjk0YmRlZjhjYmRl Nw0KOTRjNmVmOTRiZGVmOTRiZGVmOGNiNWU3OGNiNWU3ODRhZGRlN2JhZGU3N2JhZGRlODRhZGU3 N2JhZGRlODRhZGRlN2JhNWRlODRhZGRlN2JhNWQ2N2I5Y2Q2NzM5Y2NlNzM5Y2Q2NjM5NGNlNjM5 NGNlNWE4Y2M2NjM5NGNlNWENCjhjYzY1YThjYzY0MjczYjU0MjczYjUzOTczYjU0MjczYmQzOTZi YjUzOTZiYjUzOTZiYWQzOTZiYWQzOTYzYTU0MjZiYWQzOTYzOWM0MjYzOWMzOTVhOGMzMTUyODQy OTQyNmIyMTM5NTIxODI5MzkxMDIxMzEwODEwMjExMDE4DQoyMTEwMTAxODE4MTAxODEwMDgwODE4 MTAxMDE4MTAxMDEwMTAxMDA4MDgwODEwMjEyMTdiOGM5NGE1YmRiZDljYjViNWFkYmRjNmFkYmRj NmFkYzZjZWFkYmRjNmFkYmRjNmE1YjViZGE1YjVjNjljYjViZDljYWRiZDk0YTViNQ0KOGNhNWI1 ODQ5Y2FkODQ5Y2FkN2I4Y2E1NzM4NDljNjM3Yjk0NWE3Mzk0NWE3MzhjNWE3MzhjNTI2YjhjNWE3 MzhjNTI2Yjg0NWE3MzhjNTI2Yjg0NTI2YjhjNTI2Yjg0NTI2YjhjNTI2Yjg0NTI2Yjg0NGE2Mzg0 NTI2Yjg0NGENCjYzN2I1MjYzODQ0YTYzN2I1MjYzODQ0YTYzN2I1MjYzN2I0YTVhNzM1MjYzN2I1 MjYzNzM1MjYzN2I1MjVhNzM1MjYzNzM1MjVhNzM1MjYzNzM1MjVhNmI1YTYzNzM1MjVhNmI1YTYz NjM1MjVhNWE1YTYzNjM1MjVhNWE1MjVhDQo1YTUyNTI1MjUyNWE1YTRhNTI1MmFkYmRjNmFkYzZj NmFkYmRjNmFkYzZjNmFkYmRjNmFkYzZjNmFkYmRjNmFkYzZjNmFkYmRjNmFkYzZjNmFkYmRjNmFk YzZjNmFkYmRjNmFkYzZjNmFkYmRjNmFkYzZjNmFkYmRjNmI1YzZjZQ0KYWRiZGM2YWRjNmM2YWRj NmM2YjVjNmNlYWRiZGM2YjVjNmNlYWRjNmM2YjVjNmNlYWRiZGM2YWRjNmM2YWRiZGM2YWRjNmM2 YWRiZGM2YWRiZGM2YWRiZGJkYWRjNmM2YWRiZGJkYWRjNmJkYWRiZGJkYjVjNmM2YWRiZGJkYjUN CmM2YmRiNWM2YmRiZGM2YzZiNWM2YmRiZGM2YmRiNWJkYmRiZGJkYmRiNWJkYjViZGM2YzZiZGM2 Y2VjNmNlZDZjNmNlZDZjZWQ2ZGVjZWQ2ZGVkNmRlZTdkNmRlZTdkZWU3ZWZkZWVmZWZlN2VmZjdk ZWVmZWZlN2Y3ZjdlN2Y3DQpmN2VmZjdmZmU3ZjdmN2VmZjdmZmRlZTdlZmZmZmZmZmU3ZWZlZmY3 ZmZmZmVmZjdmN2I1YmRiZDA4MTAxMDMxMzkzOTMxNDI0MjI5Mzk0YTI5Mzk1MjUyNmI4NDdiOWNj Njk0YjVlNzhjYjVlNzljYzZmZjk0YmRmNzljYzZmNw0KOTRiZGY3OWNjNmY3OTRiZGY3OWNjNmY3 OWNjNmY3OWNjZWZmOTRiZGVmOGNiZGVmODRiNWU3OGNiZGU3ODRiNWRlODRiNWRlN2JhNWQ2N2Jh NWQ2NzNhNWQ2NzNhNWQ2NzNhNWQ2NzNhNWQ2NzNhNWQ2NzNhNWQ2NzNhNWQ2NzMNCmE1ZDY2Mzlj Y2U2YjljY2U2Mzk0Y2U2Mzk0Y2U1MjhjYmQ1MjhjYmQ0YTg0YmQ1MjhjYzY0YTg0YmQ0YTdiYmQz OTZiYjUzOTZiYjUzMTZiYWQzOTZiYjUzMTZiYWQzOTZiYjUzOTZiYWQzOTYzYTUzMTYzOWMzOTYz OWMzMTVhDQo5NDM5NWE5NDMxNTI4NDI5NGE3MzE4MzE0YTE4MjkzMTA4MTAyMTEwMTgyMTE4MTgy MTE4MTAxODEwMDgwODEwMDgwODEwMDgwODIxMTgxODEwMTAxMDA4MDgwODE4MjEyMTg0OTQ5NDk0 YWRhZGE1YmRiZGE1YmRiZGE1YmRjNg0KYTViZGJkYWRiZGM2YTViZGJkYTViZGJkOWNiNWI1OWNi NWI1OTRhZGI1OTRhZGI1OGM5Y2FkOGM5Y2FkN2I5NGE1N2I4Y2E1NjM3Yjk0NjM3Mzk0NWE2Yjhj NWE3MzhjNTI2YjhjNWE2YjhjNTI2Yjg0NTI2YjhjNTI2Yjg0NTINCjZiODQ1MjZiODQ1MjZiOGM1 MjYzODQ1MjZiODQ0YTYzODQ1MjZiODQ0YTYzN2I1MjYzODQ0YTYzN2I1MjYzODQ0YTVhN2I0YTYz N2I0YTVhN2I1MjYzN2I0YTVhNzM1MjYzNzM0YTVhNzM1MjYzNzM0YTVhNmI1MjYzNzM1MjVhDQo2 YjUyNWE2YjRhNWE2MzUyNWE2YjUyNWE1YTVhNjM1YTUyNWE1YTUyNWE1YTUyNTI1MjUyNWE1MjRh NTI1MjRhNTI1MmI1YzZjZWFkYzZjNmI1YzZjZWFkYzZjNmI1YzZjZWFkYzZjNmI1YzZjZWFkYzZj NmI1YzZjZWFkYzZjNg0KYjVjNmNlYWRjNmM2YjVjNmNlYWRjNmM2YjVjNmNlYWRjNmM2YjVjNmNl YWRjNmM2YjVjNmNlYWRjNmM2YjVjNmNlYjVjNmNlYjVjNmNlYjVjNmNlYjVjZWNlYjVjNmNlYjVj NmNlYWRjNmM2YjVjNmNlYWRjNmM2YjVjNmNlYWQNCmM2YzZiNWM2YzZhZGM2YzZiNWM2YzZhZGJk YmRiNWM2YzZiNWM2YmRiNWM2YzZiNWJkYmRiZGM2YzZiNWM2YzZiZGM2YzZiNWJkYmRiZGM2YmRi NWJkYmRiZGM2YmRiZGM2YmRjNmNlY2ViZGNlY2VjNmQ2ZDZjNmQ2ZDZjZWRlDQpkZWNlZGVkZWQ2 ZTdlN2Q2ZTdlN2U3ZWZmN2RlZWZlZmU3ZjdmN2U3ZWZmN2VmZjdmZmU3ZjdmN2VmZjdmZmU3Zjdm N2U3ZjdmZmY3ZmZmZmVmZWZmN2Y3ZjdmZmY3ZmZmN2FkYjViNTA4MTAxMDI5MzEzMTMxNDI0MjMx NDI0YQ0KMzk0YTVhNGE2Mzg0N2I5Y2JkOTRiZGU3OWNjNmY3OWNiZGY3OWNjNmY3OWNjNmY3YTVj ZWZmOWNjNmY3OWNjNmY3OTRiZGVmOTRiZGY3OTRiZGVmOWNjNmY3OGNiZGU3ODRiNWU3N2JhZGRl N2JhZGRlN2JhNWQ2N2JhZGRlN2INCmFkZGU3YmI1ZGU3M2FkZGU3YmFkZGU3M2E1ZDY3M2FkZGU2 YmE1ZDY2YmE1ZDY2YjljZDY2YjljZDY2MzljY2U2MzljZDY1YTk0Y2U1YTk0Y2U1MjhjYmQ1Mjhj YzY1MjhjYzY0YTdiYmQzOTczYjUzOTczYjUzMTZiYWQzOTZiDQpiNTMxNmJhZDM5NmJhZDMxNmJh ZDRhN2JiZDM5NmJhNTM5NjNhNTM5NjM5YzM5NWE5NDM5NWE5NDM5NWE5NDMxNGE3YjIxMzk1MjE4 MjkzMTEwMTgyOTEwMTgyMTE4MTgyMTE4MTAxODE4MTAxMDEwMDgwODE4MTAxODE4MTgxOA0KMTgx ODE4MDgxMDEwMjEyOTI5ODQ5NDk0YTViNWI1OWNiNWI1YTViZGM2YTViZGJkYWRjNmM2YTViZGM2 YWRjNmM2YTViZGJkYTViNWJkOWNhZGI1OWNiNWI1OTRhZGI1OTRhNWFkODQ5Y2FkODQ5Y2FkNzM4 Y2E1NmI4NDljNWENCjczOGM1YTczOTQ1YTczOGM1YTczOGM1MjZiOGM1YTczOGM1MjZiODQ1YTZi OGM1MjZiODQ1YTZiOGM1MjZiODQ1MjZiOGM1MjYzODQ1MjZiODQ1MjYzODQ1MjZiODQ0YTYzODQ1 MjYzODQ0YTYzN2I1MjYzN2I0YTYzN2I1MjYzDQo3YjRhNjM3YjUyNjM3YjRhNjM3MzUyNjM3MzUy NjM3MzUyNjM3MzUyNWE2YjUyNjM3MzUyNWE2YjUyNWE2YjUyNWE2MzVhNjM2MzUyNWE1YTVhNjM1 YTUyNWE1YTUyNWE1YTUyNTI1MjUyNTI1MjRhNTI1MmFkYzZjNmI1YzZjZQ0KYWRjNmM2YjVjNmNl YWRjNmM2YjVjNmNlYWRjNmM2YjVjNmNlYWRjNmM2YjVjNmNlYWRjNmM2YjVjNmNlYWRjNmM2YjVj NmNlYWRjNmM2YjVjNmNlYWRjNmM2YjVjNmNlYWRjNmM2YjVjNmNlYWRjNmM2YjVjNmNlYjVjNmNl YjUNCmM2Y2ViNWM2Y2ViNWNlY2ViNWM2Y2ViNWNlY2VhZGM2YzZiNWM2Y2VhZGM2YzZiNWM2Y2Vh ZGJkYzZhZGM2YzZhZGM2YmRiNWM2YzZhZGJkYmRiNWM2YzZiNWM2YmRiNWM2YzZiNWM2YmRiZGM2 YzZiZGM2YmRiZGM2YmRiNWJkDQpiNWI1YmRiZGI1YmRiZGJkYzZjNmJkYzZjZWM2Y2VkNmM2Y2Vk NmNlZDZkZWM2ZDZkNmNlZGVkZWQ2ZGVlN2RlZTdlZmRlZTdlZmRlZWZlZmRlZWZlZmU3ZjdmN2U3 ZWZmN2U3ZjdmN2U3ZjdmN2VmZjdmZmVmZjdmZmU3ZWZmNw0KZTdlZmY3ZjdmZmZmZWZmN2Y3YjVi ZGJkMTAxODEwMjkzMTMxMjEzMTMxMzE0MjRhMzE0MjUyMzk1MjZiNWE3YjljOGNhZGNlOTRiZGU3 YTVjNmY3OTRiZGVmOWNjNmY3OTRiZGY3OTRiZGY3OGNiNWU3OGNiNWVmOGNiNWVmOTQNCmM2Zjc4 NGI1ZTc4NGI1ZTc3YmFkZGU4NGFkZTc3M2E1ZDY3M2E1ZDY3MzljZDY3YmE1ZGU3YmE1ZGU3YmFk ZGU3M2E1ZGU3YmFkZGU3M2E1ZDY3M2E1ZDY2YjljZDY2YjljZDY2Mzk0Y2U2MzljZDY2Mzk0Y2U2 Mzk0ZDY1MjhjDQpjNjUyOGNjNjUyODRjNjUyOGNjNjQyNzNiNTQyNzNiNTM5NmJiNTM5NzNiNTM5 NmJhZDM5NmJiNTM5NmJhZDM5NmJhZDRhNzNiNTQyNmJhZDM5NjNhNTM5NjM5YzMxNTI4YzM5NjM5 NDM5NWE5NDM5NWE4NDIxMzE0YTE4MjkzOQ0KMDgxODIxMTAxODIxMTAxMDE4MTgxMDE4MTAwODEw MTAwODEwMTgxMDEwMTgxMDEwMTAxMDEwMTAxODEwMTgyOTI5N2I5NDk0OWNiNWI1OWNiNWI1OWNi NWJkYTViZGJkYTViZGJkYWRjNmM2YTViZGJkYTViZGJkOWNiNWI1YTUNCmI1YjU5NGFkYjU5NGFk YjU4YzljYWQ4NDljYWQ3Yjk0YTU3MzhjYTU2MzdiOTQ2MzdiOTQ1MjZiOGM1YTczOGM1MjZiOGM1 YTczOGM1MjZiODQ1MjZiOGM1MjZiODQ1MjZiOGM1MjZiODQ1MjZiODQ1MjYzODQ1MjZiODQ0YTYz DQo4NDUyNjM4NDRhNjM3YjUyNjM4NDRhNjM3YjRhNjM3YjRhNjM3YjUyNjM3YjRhNWE3MzUyNjM3 YjRhNWE3MzUyNjM3YjRhNWE2YjUyNjM3MzUyNWE2YjUyNjM3MzUyNWE2YjUyNWE2YjRhNWE2YjUy NWE2YjUyNWE1YTUyNWE1YQ0KNTI1YTVhNTI1YTVhNTI1MjUyNTI1MjUyNGE1MjUyNGE1MjUyYjVj NmNlYWRjNmM2YjVjNmNlYjVjNmNlYjVjNmNlYWRjNmM2YjVjNmNlYjVjNmNlYjVjNmNlYWRjNmM2 YjVjNmNlYjVjNmNlYjVjNmNlYWRjNmM2YjVjNmNlYjUNCmM2Y2ViNWNlY2ViNWM2Y2ViNWNlY2Vi NWM2Y2ViNWNlY2ViNWM2Y2ViZGNlZDZiNWM2Y2ViZGNlZDZiNWM2Y2ViZGNlZDZiNWM2Y2ViNWNl Y2ViNWM2Y2ViNWNlY2ViNWM2YzZiNWM2Y2VhZGM2YzZiNWM2YzZiNWM2YzZiNWM2DQpjNmI1YzZj NmJkYzZjNmI1YzZjNmJkYzZjNmI1YzZjNmJkYzZjNmI1YzZiZGJkYzZiZGI1YmRiZGJkYzZiZGJk YzZiZGJkY2VjZWJkY2VjZWM2ZDZkNmM2ZDZkNmNlZGVkZWNlZGVkZWQ2ZTdlN2Q2ZTdlN2RlZWZl ZmRlZTdlZg0KZTdlZmY3ZTdlZmY3ZTdmN2Y3ZTdlZmY3ZWZmN2ZmZTdmN2Y3ZjdmZmZmZTdlZmY3 ZjdmZmZmZWZmZmZmZjdmZmY3Y2VkNmNlMzk0MjM5MjEyOTI5MjkzMTMxMzEzOTQyMjkzOTRhMjEz MTRhMzk1MjZiNWE3Mzk0ODRhNWM2OWMNCmJkZTc4NGE1ZDY3YmE1ZDY4NGFkZTc4Y2I1ZTc4Y2I1 ZWY4Y2I1ZTc4Y2I1ZTc4NGI1ZTc3YmFkZGU3MzljZDY3MzljZDY2Yjk0Y2U2Yjk0Y2U2MzhjYzY2 YjljY2U3MzljZDY3MzljZDY2YjljZDY3M2E1ZGU3MzljZDY3M2E1DQpkZTZiOWNkNjZiOWNkNjZi OWNkNjZiOWNkNjYzOTRkNjZiOWNkNjYzOTRjZTVhOTRjZTUyOGNjNjVhOGNjZTUyODRjNjRhN2Ji ZDRhN2JiZDRhN2JiZDQyNzNiZDQyN2JiZDM5NzNiNTQyNzNiNTM5NmJhZDRhN2JiZDQyNmJhZA0K NDI2YmE1MzE1YTk0MzE1MjhjMzk1YTk0NDI2MzljMzk1MjdiMjkzOTUyMTgyOTMxMTAyMTI5MDgx MDE4MTAxMDE4MTAxMDEwMTgxMDEwMTAwODEwMjExODE4MTAxMDEwMjEyMTIxMDgxMDEwMjEyOTMx NzM4NDhjYTViZGJkOWMNCmI1YjVhNWJkYmRhNWJkYmRhZGM2YzZhNWJkYzZhZGM2YzZhNWJkYmRh NWJkYmQ5Y2I1YjU5Y2I1YjU5NGE1YWQ5NGE1YWQ4NDljYWQ4NDk0YWQ3MzhjOWM2Yjg0OWM2Mzdi OTQ1YTczOGM1YTZiOGM1YTczOGM1YTZiOGM1YTczDQo4YzUyNmI4NDVhNmI4YzUyNmI4NDVhNmI4 YzUyNmI4NDUyNmI4YzUyNmI4NDUyNmI4NDRhNjM4NDUyNmI4NDRhNjM4NDUyNjM4NDRhNjM3YjUy NjM4NDRhNjM3YjUyNjM3YjRhNjM3MzUyNjM3YjUyNjM3MzUyNjM3MzRhNWE3Mw0KNTI2MzczNTI1 YTZiNTI2MzZiNTI1YTZiNTI2MzZiNTI1YTYzNWE2MzYzNTI1YTVhNWE2MzYzNTI1YTVhNTI1YTVh NGE1MjUyNTI1YTUyNGE1MjUyYWRjNmM2YjVjNmNlYWRjNmM2YjVjNmNlYWRjNmM2YjVjNmNlYWRj NmM2YjUNCmM2Y2VhZGM2YzZiNWM2Y2VhZGM2YzZiNWM2Y2VhZGM2YzZiNWM2Y2VhZGM2YzZiNWM2 Y2ViNWM2Y2ViNWNlY2ViNWM2Y2ViNWNlY2ViNWM2Y2ViNWNlY2ViNWM2Y2ViNWNlY2ViNWM2Y2Vi NWNlY2ViNWM2Y2ViNWM2Y2VhZGM2DQpjNmI1YzZjZWFkYzZjNmI1YzZjNmFkYzZjNmI1YzZjNmFk YzZiZGI1YzZjNmI1YzZjNmI1YzZjNmI1YzZiZGI1YzZjNmI1YzZiZGJkYzZjNmI1YzZiZGJkYzZi ZGI1YmRiZGJkYmRiZGI1YmRiNWJkYzZjNmJkYzZjZWM2Y2VkNg0KYmRjZWNlYzZkNmQ2YzZkNmQ2 Y2VkZWRlY2VkZWRlZGVlN2VmZGVlN2VmZGVlZmVmZGVlN2VmZTdlZmY3ZTdlZmY3ZTdmN2Y3ZTdl ZmY3ZTdmN2ZmZWZmN2ZmZWZmN2ZmZWZmN2ZmZWZmN2Y3ZWZmN2Y3ZTdlZmVmNjM2YjZiMjENCjI5 MjkyOTMxMzEyOTM5MzkyMTI5MzExODI5MzExODI5NDIyOTQyNWE1MjZiOGM4NGE1YzY1MjdiYTU1 YTdiYWQ1YTg0YjU2Yjk0YzY3YjljY2U3YmE1ZDY3Mzk0YzY2Yjk0YzY3MzljY2U2MzhjYzY1Mjdi YjU0YTczYWQ0YTczDQphNTUyN2JiNTVhODRiZDZiOTRjZTYzOGNjNjYzOGNjZTYzOGNjZTZiOTRk NjZiOTRjZTZiOTRkNjYzOGNjZTZiOTRjZTYzOTRjZTZiOTRkNjYzOGNjZTYzOGNjZTVhOGNjZTVh OGNjZTUyODRjNjUyODRjNjRhNzNiNTRhN2JiZA0KNDI3M2I1NDI3M2I1NDI3M2I1NDI3M2I1Mzk2 M2E1Mzk2M2E1NDI2YmFkNDI2YmFkMzk2MzljMzE1YTk0MzE1MjhjNDI2Mzk0NDI1YTk0Mzk1Mjdi MjEzMTRhMjEyOTM5MTAxODIxMDgxMDE4MDgwODEwMTgxMDE4MTAxMDEwMTANCjEwMTAxODEwMTAx MDEwMTAxMDE4MTgwODEwMTAyMTI5MzE3Mzg0ODQ5Y2I1YjVhNWI1YmQ5Y2I1YmRhNWJkYmRhNWJk YmRhZGJkYzZhNWJkYmRhNWJkYmQ5Y2I1YjVhNWI1YjU5Y2FkYjU5NGFkYjU4YzljYWQ4NDljYWQ3 Yjk0DQphNTczOGNhNTYzN2I5NDYzN2I5NDVhNmI4YzVhNzM4YzUyNmI4YzVhNmI4YzUyNmI4NDUy NmI4YzUyNmI4NDUyNmI4NDUyNmI4NDUyNmI4YzUyNjM4NDUyNmI4NDRhNjM4NDUyNmI4NDRhNjM3 YjUyNjM4NDRhNjM3YjUyNjM4NA0KNGE2MzdiNGE2MzdiNGE1YTczNTI2MzdiNGE1YTczNTI2Mzcz NGE1YTczNTI2MzczNGE1YTZiNTI2MzczNTI1YTZiNTI1YTZiNGE1YTYzNTI1YTZiNTI1YTVhNWE2 MzVhNTI1YTVhNTI1YTVhNTI1MjUyNTI1YTUyNGE1MjUyNGENCjUyNTJiNWM2Y2ViNWM2Y2ViNWM2 Y2VhZGM2YzZiNWM2Y2ViNWM2Y2ViNWM2Y2VhZGM2YzZiNWM2Y2ViNWM2Y2ViNWM2Y2VhZGM2YzZi NWM2Y2ViNWM2Y2ViNWM2Y2VhZGM2YzZiNWNlY2ViNWM2Y2ViNWNlY2ViNWM2Y2ViZGNlDQpkNmI1 Y2VjZWJkY2VkNmI1YzZjZWI1Y2VjZWI1YzZjZWI1Y2VjZWI1YzZjZWI1Y2VjZWI1YzZjZWI1YzZj ZWFkYzZjNmI1YzZjZWFkYzZjNmI1YzZjNmI1YzZjNmI1YzZjNmI1YzZjNmJkYzZjNmI1YzZjNmJk YzZjNmI1YzZjNg0KYmRjNmM2YjViZGJkYmRjNmJkYjViZGJkYmRjNmJkYmRjNmJkYmRjZWNlYmRj ZWNlYzZkNmQ2YzZkNmQ2Y2VkZWRlY2VkZWRlZDZlN2U3ZDZlN2U3ZGVlZmVmZGVlZmVmZTdlZmY3 ZTdlZmY3ZTdmN2Y3ZTdmN2Y3ZWZmN2ZmZTcNCmY3ZjdlN2Y3ZmZlZmY3ZmZlZmY3ZmZlN2VmZjdl ZmY3ZjdlZmY3ZjdhNWFkYWQzMTM5MzkyOTMxMzEyOTMxMzEyOTMxMzkyMTI5MzEyMTI5MzkxMDIx MzkzMTQyNWE1MjZiODQ1MjczOTQ0MjYzOGMzMTUyODQzMTUyN2I0MjYzDQo4YzRhNzM5YzVhN2Jh ZDVhN2JhZDVhN2JhZDRhNzNhNTRhNzNhNTRhNzNhNTUyNzNhZDRhNzNhNTUyNzNhZDRhNzNhZDYz ODRiZDVhODRiZDZiOGNjNjZiOGNjZTczOTRkNjZiOTRjZTZiOTRjZTYzOGNjNjZiOTRjZTYzOGNj Ng0KNjM4NGM2NWE4NGJkNWE4NGM2NTI3YmJkNWE3YmJkNTI3YmJkNTI3YmI1NGE3M2I1NGE3M2I1 NDI3M2FkNGE3M2I1NDI2YmFkMzk2YmFkMzk2M2E1NDI2YmE1Mzk2MzljMzk2MzljMzE1YThjMzk1 YThjNDI2Mzk0NDI2Mzk0MzENCjRhNzMyMTMxNDIyMTI5MzExODIxMjkwODEwMTAxMDEwMTgxMDEw MTAxODEwMTgxMDEwMTAxODE4MTgxMDEwMTAxODE4MTgwMDA4MDgzOTRhNGE3YjhjOGNhNWI1YjVh NWJkYmRhNWJkYmRhNWJkYmRhZGM2YzZhNWJkYmRhZGM2DQpjNmE1YmRiZGE1YmRiZDljYjViNWE1 YjViZDk0YWRiNThjYTVhZDg0OWNhNTg0OTRhZDczOGM5YzZiODQ5YzYzN2I5NDVhNzM5NDVhNzM4 YzVhNzM4YzUyNmI4YzVhNzM4YzUyNmI4NDVhNmI4YzUyNmI4NDVhNmI4YzUyNmI4NA0KNTI2Yjhj NTI2Mzg0NTI2Yjg0NTI2Mzg0NTI2Yjg0NGE2Mzg0NTI2Mzg0NGE2MzdiNTI2MzdiNGE2MzdiNTI2 MzdiNGE2MzdiNTI2MzdiNGE2MzczNTI2MzczNTI2MzczNTI2MzczNTI1YTZiNTI2MzczNTI1YTZi NTI1YTZiNTINCjVhNjM1YTYzNjM1MjVhNWE1YTYzNWE1MjVhNWE1MjVhNWE1MjUyNTI1MjUyNTI0 YTUyNTJhZGM2YzZiNWM2Y2ViNWM2Y2ViNWM2Y2VhZGM2YzZiNWM2Y2ViNWM2Y2ViNWM2Y2VhZGM2 YzZiNWM2Y2ViNWM2Y2ViNWM2Y2VhZGM2DQpjNmI1YzZjZWI1YzZjZWI1YzZjZWI1YzZjZWI1YzZj ZWI1YzZjZWI1Y2VjZWI1YzZjZWI1Y2VjZWI1YzZjZWI1Y2VjZWI1YzZjZWI1YzZjZWI1YzZjZWI1 YzZjZWFkYzZjNmI1YzZjZWFkYzZjNmI1YzZjNmFkYmRjNmFkYzZjNg0KYWRjNmJkYjVjNmM2YWRi ZGJkYjVjNmM2YjVjNmJkYjVjNmM2YjVjNmJkYmRjNmM2YmRjNmJkYmRjNmJkYjViZGI1YjViZGJk YjViZGJkYmRjNmM2YmRjNmM2YmRjZWNlYmRjZWNlYzZkNmQ2YzZkNmQ2Y2VkZWRlZDZkZWU3ZGUN CmU3ZWZkZWU3ZWZkZWVmZWZkZWVmZWZlN2VmZjdlN2VmZjdlN2Y3ZjdlN2VmZjdlN2Y3ZmZkZWVm ZjdlZmZmZmZkZWVmZjdlZmY3ZmZlN2VmZWZlN2Y3ZWZkNmRlZDY1YTYzNjMxODIxMjEyOTMxMzEy OTMxMzEyOTMxMzEyMTI5DQozMTIxMjkzOTIxMjk0MjMxNDI1YTM5NTI3MzMxNGE2YjE4MzE1MjEw MzE0YTEwMjk1MjI5NDI2YjM5NTI3YjRhNmI4YzM5NTI3YjM5NTI4NDM5NWE4NDRhNmI5NDUyNmI5 YzRhNjM5NDM5NTI4NDMxNTI4NDQyNjM5NDRhNmJhNQ0KNTI3M2E1NWE3YmI1NWE3YmI1NjM4NGJk NjM4NGI1NjM4NGJkNWE3YmI1NTI3YmI1NGE3M2FkNGE3M2FkNGE2YmE1NGE3M2FkNGE2YmE1NGE2 YmFkNDI2YmE1NDI2YmE1NDI2YmE1NGE2YmE1NDI2YmE1NDI2YmE1Mzk2MzljMzkNCjYzOWMzMTUy OTQzMTVhOTQzMTUyOGMzMTUyODQyOTRhN2I0MjVhOGM0MjUyODQzMTQyNmIxODI5MzkyMTI5MzEx MDE4MjExMDEwMTgwODA4MTAxODEwMTgxODEwMTAxODEwMTAxMDEwMTAxODE4MTgxMDEwMTAwMDA4 MDg1MjYzDQo2Mzk0YTVhNTljYjViNWE1YmRiZDljYjViNWE1YmRiZGE1YmRiZGFkYzZjNmE1YmRi ZGE1YmRiZGE1YjViNWE1YjViZDljYWRiNTk0YWRiNThjOWNhZDg0OWNhZDdiOGNhNTczOGNhNTYz N2I5NDYzN2I5NDUyNmI4YzVhNzM4Yw0KNTI2YjhjNWE3MzhjNTI2Yjg0NTI2YjhjNTI2Yjg0NTI2 YjhjNTI2Yjg0NTI2Yjg0NTI2Mzg0NTI2Yjg0NGE2Mzg0NTI2Mzg0NGE2MzdiNTI2Mzg0NGE2Mzdi NGE2MzdiNGE2MzdiNTI2MzdiNGE1YTczNTI2MzdiNGE1YTczNTINCjYzN2I0YTVhNmI1MjYzNzM1 MjVhNmI1MjYzNzM1MjVhNmI1MjVhNmI0YTVhNmI1MjVhNmI1MjVhNWE1MjVhNWE1MjVhNWE1MjVh NWE1MjUyNTI1MjUyNTI0YTUyNTI0YTUyNTJiNWNlY2ViNWM2Y2ViZGNlZDZiNWM2Y2ViNWNlDQpj ZWI1YzZjZWJkY2VkNmI1YzZjZWI1Y2VjZWI1YzZjZWJkY2VkNmI1YzZjZWI1Y2VjZWI1YzZjZWJk Y2VkNmI1YzZjZWI1Y2VjZWI1YzZjZWI1Y2VjZWI1YzZjZWI1Y2VjZWI1YzZjZWJkY2VkNmI1YzZj ZWI1Y2VjZWI1YzZjZQ0KYjVjZWNlYjVjNmNlYjVjZWNlYjVjNmNlYjVjNmNlYjVjNmM2YjVjNmM2 YWRjNmM2YjVjNmM2YjVjNmM2YjVjNmM2YjVjNmM2YmRjNmM2YjVjNmM2YmRjNmM2YjVjNmM2YmRj NmM2YjVjNmJkYmRjNmJkYjViZGJkYmRjNmJkYmQNCmM2YmRiZGNlY2ViZGNlY2VjNmQ2ZDZjNmQ2 ZDZjZWQ2ZGVjZWQ2ZGVkNmU3ZTdkNmU3ZTdkZWVmZWZkZWVmZWZlN2VmZjdlN2VmZjdlN2Y3Zjdl N2Y3ZjdlZmY3ZmZlN2Y3ZmZlN2Y3ZmZlZmZmZmZkZWVmZjdlZmZmZmZlZmY3DQpmN2RlZWZlN2Y3 ZmZmZjdiODQ4NDE4MjExODI5MjkyOTI5MzEzMTIxMjkyOTI5MzEzOTMxMzk0MjMxMzk0MjI5MzE0 MjIxMzE0MjE4MzE0MjI5Mzk1MjIxMzk0YTIxMzk1MjIxMzk1MjI5Mzk1YTI5Mzk1YTM5NTI3MzI5 NDI2Mw0KMjkzOTYzMjkzOTYzMzk0YTczMzE0YTczMzk0YTczMzE0MjZiMjk0MjczMjk0YTczMzk1 YTg0NDI2MzhjNTI2YjljNTI2YjljNTI3M2E1NTI2YjljNTI3M2E1NGE2YjljNDI2MzljMzk1YTk0 NDI2Mzk0NDI2Mzk0NDI2Mzk0MzkNCjYzOTQ0MjYzOTQzOTYzOTQ0MjYzOTQzOTYzOTQ0MjYzOWMz OTYzOTQ0MjYzOWMzOTVhOTQzMTUyODQyOTRhODQzMTUyODQyOTQyN2IyOTQyNzMzOTUyN2I0MjUy ODQyOTM5NjMyMTI5MzkxODI5MjkxODIxMjEwODEwMTAxMDEwDQoxMDEwMTAxMDE4MTgxODEwMTAx MDE4MTgxODE4MTgxODEwMTgxODAwMDgwODczN2I4NGE1YjViNWE1YmRiZGE1YjViZGE1YmRiZDlj YmRiZGFkYzZjNmE1YmRjNmFkYzZjNmE1YmRiZGE1YmRiZGE1YjViNWE1YjViZDk0YWRiNQ0KOTRh NWFkODQ5Y2E1N2I5NGE1NzM4YzljNmI4NDljNjM3Yjk0NWE3MzhjNWE2YjhjNWE3MzhjNWE2Yjhj NWE3MzhjNTI2Yjg0NWE2YjhjNTI2Yjg0NWE2YjhjNTI2Yjg0NTI2YjhjNTI2Yjg0NTI2Yjg0NGE2 Mzg0NTI2Yjg0NGENCjYzODQ1MjYzODQ0YTYzN2I1MjYzODQ0YTYzN2I1MjYzN2I0YTYzNzM1MjYz N2I1MjYzNzM1MjYzNzM0YTVhNzM1MjYzNzM1MjVhNmI1MjYzNmI1MjVhNmI1MjYzNmI1MjVhNjM1 YTYzNjM1MjVhNWE1YTYzNjM1MjVhNWE1MjVhDQo1YTRhNTI1MjUyNTI1YTRhNTI1MmI1YzZjZWI1 YzZjZWFkYzZjNmI1YzZjZWI1YzZjZWI1YzZjZWFkYzZjNmI1YzZjZWFkYzZjNmI1YzZjZWFkYzZj NmI1YzZjZWI1YzZjZWI1Y2VjZWI1YzZjZWI1YzZjZWI1YzZjZWI1Y2VjZQ0KYjVjNmNlYjVjNmNl YjVjNmNlYjVjZWNlYjVjNmNlYjVjNmNlYjVjNmNlYjVjZWNlYjVjNmNlYjVjNmNlYjVjNmNlYjVj NmNlYWRjNmM2YjVjNmNlYWRjNmM2YjVjNmM2YWRiZGJkYjVjNmM2YjVjNmJkYjVjNmM2YjVjNmJk YmQNCmM2YzZiNWM2YmRiNWM2YzZiNWJkYmRiNWJkYmRiNWJkYmRiZGM2YmRiNWJkYjViZGM2YmRi ZGM2YzZiZGNlY2ViZGNlY2VjNmQ2ZDZjNmQ2ZDZjZWRlZGVjZWRlZGVkZWU3ZWZkZWU3ZWZkZWVm ZWZkZWU3ZWZlN2VmZjdlN2VmDQpmN2U3ZjdmN2U3ZWZmN2U3ZjdmZmRlZjdmN2U3ZjdmZmRlZjdm N2U3ZmZmZmVmZjdmN2VmZmZmN2U3ZWZlN2U3ZWZlNzQyNGE0YTIxMjkyMTIxMjkyMTMxMzEzMTI5 MjkyOTMxMzEzOTI5MjkzMTI5MzEzOTI5MzE0MjI5MzEzOQ0KMTgyOTMxMjEyOTMxMjkzMTQyMzE0 MjRhMjkzMTQyMjEyOTM5MTgyOTM5MjkzMTRhMjEzMTRhMjEyOTQyMTgyOTQyMjkzMTRhMjEyOTRh MTgyOTRhMTgyOTRhMTgzMTUyMTgzMTUyMjEzOTVhMjE0MjYzMzE0YTczMzk1MjdiNDINCjVhODQz OTUyN2IzOTVhN2IzMTUyNzMzOTUyN2IyOTRhNzMzMTRhNzMyOTRhNzMzMTUyN2IzOTUyN2IzOTUy ODQzMTRhN2IzMTUyN2IyOTRhN2IzMTUyODQzMTUyODQzOTVhOGMyOTRhN2IzMTUyN2IyOTQyNmIy MTM5NjMyMTM5DQo2MzMxNGE3MzMxNDI2YjMxMzk1YTEwMTgyOTE4MTgyMTEwMTAxODEwMTgxODEw MTAxMDEwMTAxMDE4MTAxMDIxMjEyMTE4MTgxODE4MTgxODAwMDAwMDE4MjkyMTdiODQ4Yzk0YTVh NWE1YmRiZDljYjViNTljYjViZGE1YmRiZA0KYTViZGJkYWRjNmM2YTViZGJkYTViZGJkYTViNWI1 YTViNWJkOWNhZGI1OTRhZGI1OGM5Y2FkODQ5Y2FkN2I5NGE1NzM4Y2E1NjM3Yjk0NjM3Yjk0NWE2 YjhjNWE3MzhjNTI2YjhjNWE2YjhjNTI2Yjg0NTI2YjhjNTI2Yjg0NTINCjZiOGM1MjZiODQ1MjZi OGM1MjYzODQ1MjZiODQ0YTYzODQ1MjZiODQ0YTYzN2I1MjYzODQ0YTYzN2I1MjYzODQ0YTYzN2I0 YTYzN2I0YTYzNzM1MjYzN2I0YTVhNzM1MjYzNzM1MjVhNzM1MjYzNzM1MjVhNmI1MjYzNzM1MjVh DQo2YjUyNjM2YjUyNWE2YjUyNWE2YjUyNWE1YTUyNWE2MzUyNWE1YTUyNWE1YTUyNTI1YTUyNWE1 YTRhNTI1MjRhNTI1MmI1Y2VjZWI1YzZjZWI1Y2VjZWI1YzZjZWI1Y2VjZWI1YzZjZWI1Y2VjZWI1 YzZjZWI1Y2VjZWI1YzZjZQ0KYjVjZWNlYjVjNmNlYjVjZWNlYjVjNmNlYjVjZWNlYjVjNmNlYjVj ZWNlYjVjNmNlYjVjZWNlYjVjNmNlYjVjZWNlYjVjNmNlYjVjZWNlYjVjNmNlYjVjZWNlYjVjNmNl YjVjZWNlYjVjNmNlYjVjZWNlYjVjNmNlYjVjNmNlYjUNCmM2YzZiNWM2Y2VhZGM2YzZiNWM2YzZh ZGM2YzZiNWM2YzZiNWM2YzZiZGM2YzZiNWM2YzZiZGM2YzZiNWM2YmRiZGM2YmRiNWJkYmRiZGM2 YmRiNWJkYmRiZGM2YmRiNWJkYmRiZGNlY2ViZGNlY2VjNmNlZDZjNmNlZDZjZWRlDQpkZWNlZGVk ZWQ2ZTdlN2Q2ZTdlN2RlZWZlZmRlZWZlZmU3ZWZmN2U3ZWZmN2U3ZjdmN2U3ZjdmN2VmZjdmZmU3 ZjdmN2U3ZjdmZmRlZjdmZmU3ZjdmZmU3ZjdmN2VmZmZmZmVmZjdmN2U3ZjdmN2U3ZWZlNzhjOTQ4 YzE4MjExOA0KMjkzMTMxMTgyMTE4MzEzOTM5MjkzMTMxMzEzMTM5MzEzMTMxNDI0YTRhMzkzOTM5 MzEzMTM5MjkyOTMxMzEzMTM5MzEzOTQyMzk0MjRhMzk0MjRhMzkzOTRhMjkzMTQyMjkyOTM5MjEy MTM5MjEyOTM5MjEyMTM5MjEyMTM5MTgNCjIxMzExODI5NDIxMDI5MzkxODI5NDIxMDI5NDIyMTMx NGEyMTM5NGEyOTQyNWEyOTQyNWEzMTRhNjMyOTQyNWEzMTRhNjMyOTQyNWEyOTQyNjMyOTQyNWEz MTRhNjMzMTRhNjMzMTRhNmIzMTRhNmIzMTRhNzMyOTQyNmIyOTQyDQo2YjIxNDI2YjMxNGE3MzMx NGE3MzM5NTI3YjMxNGE3MzMxNGE2YjIxMzk1YTI5NDI2MzMxNDI2MzMxNDI2MzI5MzE0YTE4MjEy OTE4MTgxODE4MTgxODE4MTgxODE4MTgxODEwMTAxMDE4MTgxODE4MjExODEwMTgxMDE4MTgxOA0K MDAwMDAwMjEyOTI5OGM5YzljOTRhZGFkOWNiNWI1OWNiNWJkYTViZGJkYTViZGJkYWRjNmM2YWRi ZGM2YWRjNmM2YTViZGJkYTViZGJkYTViNWJkYTViNWJkOTRhZGI1OTRhNWI1ODQ5Y2FkODQ5Y2Fk NzM4Y2E1NmI4NDljNjMNCjdiOTQ1YTczOTQ1YTczOGM1YTczOGM1MjZiOGM1YTczOGM1MjZiODQ1 YTZiOGM1MjZiODQ1YTZiOGM1MjZiODQ1MjZiOGM1MjYzODQ1MjZiODQ1MjYzODQ1MjZiODQ0YTYz N2I1MjYzODQ0YTYzN2I1MjYzN2I0YTYzN2I1MjYzDQo3YjRhNjM3YjUyNjM3YjRhNjM3MzUyNjM3 MzUyNjM3MzUyNjM3MzUyNWE2YjVhNjM3MzUyNWE2YjUyNjM2YjUyNWE2MzUyNWE2MzUyNWE1YTVh NWE2MzUyNWE1YTUyNWE1YTUyNTI1YTUyNTI1YTRhNTI1MmFkYzZjNmI1YzZjZQ0KYjVjNmNlYjVj NmNlYWRjNmM2YjVjNmNlYjVjNmNlYjVjNmNlYjVjNmNlYjVjNmNlYjVjNmNlYjVjZWNlYjVjNmNl YjVjZWNlYjVjNmNlYjVjZWNlYjVjNmNlYjVjZWNlYjVjNmNlYjVjZWNlYjVjNmNlYjVjZWNlYjVj NmNlYjUNCmNlY2ViNWM2Y2ViNWNlY2ViNWM2Y2ViNWNlY2VhZGM2YzZiNWM2Y2ViNWM2Y2ViNWM2 Y2VhZGM2YzZiNWM2YzZhZGM2YzZiNWM2YzZhZGJkYmRiNWM2YzZiNWM2YmRiZGM2YzZiNWM2YmRi NWM2YzZiNWJkYmRiNWM2YmRiNWJkDQpiNWJkYmRiZGI1YmRiZGJkYzZiZGI1YzZjNmJkY2VjZWJk Y2VjZWM2ZDZkNmM2ZDZkNmNlZGVkZWQ2ZGVlN2RlZTdlZmRlZTdlZmRlZWZlZmRlZWZlZmU3ZWZm N2U3ZWZmN2U3ZjdmN2U3ZWZmN2U3ZjdmN2RlZjdmN2RlZjdmZg0KZGVmN2Y3ZTdmN2ZmZTdmN2Y3 ZWZmZmY3ZTdmN2VmZTdmN2VmYzZjZWM2NWE2MzVhMTAxODE4MzEzOTMxMjEyMTIxNDIzOTQyMjky OTI5MzkzMTM5MzkzOTM5MzkzOTMxMzEzMTI5MzEzMTMxMjkyOTI5MjkyOTI5MzEzMTMxNGENCjRh NGEzOTM5MzkyOTI5MzExODE4MjEyMTI5MzEyMTI5MzEyMTIxMjkxODE4MjkyMTI5MzExMDE4Mjkx MDIxMjkxMDIxMjkxODIxMzExMDIxMzExODI5MzExODIxMzExODI5MzkxODI5MzkxODI5NDIxODI5 MzkxODMxNDIxODI5DQozOTE4MzE0MjE4MzE0MjIxMzk0YTE4MzE0MjIxMzk1MjIxMzk1MjIxMzk1 MjEwMjk0MjE4Mjk0YTE4MzE1MjI5NDI1YTMxNDI2MzMxNGE2YjI5Mzk1YTI5Mzk1MjIxMzE0YTMx Mzk1MjI5MzE0YTIxMjk0MjE4MTgyMTE4MTgyMQ0KMTgxODE4MjEyMTIxMTgxODEwMTgxODEwMTgx ODEwMjEyMTE4MTAxMDA4MTgyMTIxMDAwODA4NDI0YTRhOTRhNWE1YTViNWI1OGNhNWE1YTViZGJk OWNiNWJkYTViZGJkYTViZGM2YWRjNmM2YTViZGJkYTViZGJkYTViNWJkYTUNCmJkYmQ5Y2FkYjU5 NGFkYjU4Y2E1YWQ4NDljYWQ3Yjk0YTU3MzhjYTU2Yjg0OWM2MzdiOTQ1YTZiOGM1YTczOGM1MjZi OGM1YTZiOGM1MjZiODQ1MjZiOGM1MjZiODQ1MjZiOGM1MjYzODQ1MjZiODQ1MjYzODQ1MjZiODQ0 YTYzDQo4NDUyNjM4NDRhNjM3YjUyNjM4NDRhNjM3YjRhNjM3YjRhNjM3YjUyNjM3YjRhNWE3MzRh NjM3YjRhNWE3MzUyNjM3MzRhNWE3MzUyNjM3MzUyNWE2YjUyNjM3MzUyNWE2YjUyNWE2YjUyNWE2 YjUyNjM2YjUyNWE1YTUyNWE2Mw0KNTI1YTVhNTI1YTVhNTI1MjVhNTI1MjVhNGE1MjUyNGE1MjUy YjVjZWNlYjVjNmNlYjVjZWNlYjVjNmNlYjVjZWNlYjVjNmNlYjVjZWNlYjVjNmNlYjVjZWNlYjVj NmNlYmRjZWQ2YjVjNmNlYmRjZWQ2YjVjNmNlYmRjZWQ2YjUNCmNlY2ViNWNlY2ViNWM2Y2ViZGNl ZDZiNWM2Y2ViNWNlY2ViNWM2Y2ViZGNlZDZiNWM2Y2ViNWNlY2ViNWM2Y2ViZGNlZDZiNWM2Y2Vi NWNlY2ViNWM2Y2ViNWNlY2ViNWM2Y2ViNWM2Y2VhZGM2YzZiNWM2YzZiNWM2YzZiNWM2DQpjNmI1 YzZjNmJkYzZjNmI1YzZjNmJkYzZjNmI1YzZiZGJkYzZjNmI1YmRiZGJkYzZiZGI1YmRiZGJkYzZi ZGI1YzZiZGJkY2VjZWJkYzZjZWM2ZDZkNmM2ZDZkNmNlZDZkZWNlZGVkZWQ2ZTdlN2Q2ZTdlN2Rl ZWZlZmRlZTdlZg0KZTdlZmY3ZTdlZmY3ZTdmN2Y3ZTdlZmY3ZWZmN2ZmZTdmN2Y3ZTdmN2ZmZGVm N2Y3ZTdmZmZmZTdmN2Y3ZTdmZmZmZTdmN2Y3ZWZmZmZmZWZmZmY3ZTdmN2VmYjViZGJkMzEzOTM5 MzEzOTM5MjkyOTI5MzkzOTM5MzkzMTM5MzENCjMxMzEzMTMxMzEyOTI5MjEzMTMxMjkzOTM5MzEz OTMxMzEyOTIxMjEzMTI5MjkzOTMxMzEzOTM5MzkzMTI5MjkyOTI5MjkzMTMxMzEzMTMxMzEyOTI5 MjkyOTI5MjkyMTIxMjkyMTIxMjkxODIxMjkyMTI5MjkxODIxMjkyMTI5DQozMTE4MjEyOTIxMjkz MTE4MjEyOTE4MjkzMTE4MjEzMTE4MjkzMTE4MjEzMTE4MjEzMTEwMjEyOTE4MjEzMTEwMjEzMTE4 MjkzMTEwMjEzMTE4MjkzOTEwMjkzOTEwMjEzOTEwMjEzOTE4Mjk0MjE4Mjk0MjI5Mzk1MjI5Mzk1 Mg0KMjkzOTUyMjEzMTQyMjEzMTQyMjEzMTQyMjEyOTM5MTgyMTI5MTgyMTIxMTgxODE4MjEyMTIx MjEyMTIxMjEyMTE4MTgxODEwMjEyMTE4MTgyMTE4MTgyMTIxMTAxODE4MTgyMTIxNmI3MzczOWNh ZGFkYTViNWJkOTRhZGFkOWMNCmI1YmRhNWJkYmRhNWJkYmRhZGM2YzZhZGM2YzZhZGM2YzZhNWJk YmRhZGJkYmRhNWI1YmRhNWI1YmQ5NGFkYjU5NGFkYjU4NDljYWQ4NDljYWQ3MzhjYTU2Yjg0OWM2 MzdiOTQ1YTczOTQ1YTZiOGM1YTczOGM1MjZiOGM1YTZiDQo4YzUyNmI4NDVhNmI4YzUyNmI4NDUy NmI4YzUyNmI4NDUyNmI4YzUyNjM4NDUyNmI4NDRhNjM4NDUyNmI4NDRhNjM4NDUyNjM4NDRhNjM3 YjUyNjM3YjRhNjM3YjUyNjM3YjRhNWE3MzUyNjM3YjRhNjM3MzUyNjM3MzRhNWE3Mw0KNTI2Mzcz NTI1YTZiNTI2MzZiNTI1YTZiNTI2MzZiNTI1YTZiNTI1YTYzNTI1YTVhNWE1YTYzNTI1YTVhNTI1 YTVhNGE1MjUyNTI1MjVhNGE1MjUyYjVjNmNlYjVjNmNlYWRjNmM2YjVjNmNlYjVjNmNlYjVjNmNl YWRjNmM2YjUNCmM2Y2ViNWM2Y2ViNWNlY2ViNWM2Y2ViNWNlY2ViNWM2Y2ViNWNlY2ViNWM2Y2Vi NWNlY2ViNWM2Y2ViNWNlY2ViNWM2Y2ViNWNlY2ViNWM2Y2ViNWNlY2ViNWM2Y2ViNWNlY2ViNWM2 Y2ViNWNlY2ViNWM2Y2ViNWNlY2ViNWM2DQpjZWI1Y2VjZWI1YzZjZWI1YzZjZWFkYzZjNmI1YzZj NmFkYzZiZGI1YzZjNmI1YzZiZGI1YzZjNmI1YmRiZGI1YzZjNmI1YzZiZGI1YzZjNmI1YmRiZGI1 YmRiZGI1YmRiZGJkYzZiZGI1YmRiNWJkYzZiZGJkYzZjNmJkY2VjZQ0KYmRjZWNlYzZkNmQ2YzZk NmQ2Y2VkZWRlY2VkZWRlZGVlN2VmZGVlN2VmZGVlZmVmZGVlN2VmZTdlZmY3ZTdlZmY3ZTdmN2Y3 ZTdlZmY3ZTdmN2Y3ZGVmN2Y3ZTdmN2ZmZGVmN2Y3ZTdmN2Y3ZGVmN2Y3ZTdmZmY3ZTdmN2Y3ZWYN CmZmZmZlZmZmZmZkZWVmZWY4Yzk0OTQxMDE4MTgzMTMxMzkyOTI5MjkyOTI5MzEzMTMxMzEzMTI5 MjkzMTI5MjkyOTI5MjEzOTM5MzEzOTMxMzEyOTI5MjEyMTIxMTgzMTMxMjkzMTMxMzE0MjQyNDI0 MjQyNDIzOTQyMzkzMTMxDQozMTMxMzEzMTIxMjEyMTE4MTgxODE4MjEyMTIxMjEyMTE4MTgyMTIx MjEyMTIxMjEyMTIxMjkyOTIxMjEyOTIxMjEyOTIxMjEyOTIxMjkzMTIxMjEyOTIxMjkyOTE4MjEy OTE4MjEyOTEwMTgyMTE4MjEyOTEwMTgyMTEwMjEyMQ0KMTAxODIxMTAyMTI5MTAyMTI5MTgyMTMx MTAyMTMxMTAyMTMxMTgyOTM5MjEzMTQyMTgyOTM5MjEyOTM5MjEyOTMxMjEyOTMxMTgyMTI5MTgx ODIxMTAxODE4MTgxODE4MTgxODE4MjEyMTIxMjEyMTE4MjEyMTE4MTgxODE4MjENCjI5MjExODIx MjExMDE4MTAzMTQyMzk4YzljOWM4YzljYTVhNWI1YmQ5Y2FkYjU5Y2FkYjVhNWJkYmRhNWM2YzZh ZGJkYzZhZGM2YzZhZGJkYmRhZGJkYzZhNWI1YmRhNWJkYmQ5Y2I1YmQ5Y2FkYjU4Y2E1YWQ4Yzlj YWQ3Yjk0DQphNTdiOTRhNTZiODQ5YzYzN2I5NDVhNmI4YzVhNzM4YzUyNmI4YzVhNmI4YzUyNmI4 NDUyNmI4YzUyNmI4NDUyNmI4YzUyNjM4NDUyNmI4NDRhNjM4NDUyNmI4NDRhNjM4NDUyNjM4NDRh NjM3YjRhNjM4NDRhNjM3YjRhNjM3Yg0KNGE1YTdiNGE2MzdiNGE1YTczNGE2MzdiNGE1YTczNGE2 MzczNGE1YTczNTI2MzczNGE1YTZiNTI1YTZiNTI1YTZiNTI1YTZiNGE1YTYzNTI1YTZiNTI1YTVh NTI1YTYzNTI1MjVhNTI1YTVhNTI1MjVhNTI1MjVhNGE0YTUyNGENCjUyNTJiNWNlY2ViNWM2Y2Vi NWNlY2ViNWM2Y2ViNWNlY2ViNWM2Y2ViNWNlY2ViNWM2Y2ViNWNlY2ViNWM2Y2ViNWNlY2ViNWM2 Y2ViZGNlZDZiNWM2Y2ViZGNlZDZiNWM2Y2ViZGNlZDZiNWNlY2ViZGNlZDZiNWM2Y2ViZGNlDQpk NmI1Y2VjZWJkY2VkNmI1YzZjZWJkY2VkNmI1Y2VjZWJkY2VkNmI1YzZjZWJkY2VkNmI1YzZjZWI1 Y2VjZWI1YzZjZWI1Y2VjZWI1YzZjNmI1YzZjNmFkYzZjNmI1YzZjNmI1YzZjNmI1YzZjNmI1YzZi ZGJkYzZjNmI1YzZiZA0KYmRjNmJkYjViZGJkYmRjNmJkYjViZGJkYmRjNmJkYjViZGJkYmRjZWNl YmRjZWNlYzZjZWQ2YzZjZWQ2Y2VkZWRlY2VkZWRlZDZlN2U3ZDZlN2U3ZGVlZmVmZGVlZmVmZTdl ZmY3ZTdlZmY3ZTdmN2Y3ZTdmN2Y3ZWZmN2ZmZTcNCmY3ZjdlN2Y3ZmZkZWY3ZjdlN2ZmZmZkZWY3 ZjdlN2ZmZjdkZWY3ZjdlN2ZmZjdlN2ZmZjdmN2ZmZmZlN2VmZWZkZWU3ZTcyOTMxMzEyMTI5Mjkz MTMxMzkxODE4MTgzOTM5MzkzOTM5MzkzMTI5MjkyOTI5MjkyOTI5MjkzMTMxDQozMTI5MjkyMTI5 MjkyOTI5MjkyOTMxMzEyOTM5NDIzOTRhNGE0YTM5NDIzOTM5NDIzOTM5MzkzOTMxMzEzMTE4MjEy MTIxMjEyMTE4MTgxODIxMTgxODE4MTgxODIxMjEyMTIxMjEyMTIxMjEyMTE4MTgxODIxMjEyMTIx MjEyMQ0KMjEyMTI5MTgyMTIxMjEyMTI5MTgxODIxMTgyMTIxMTgxODIxMTgyMTIxMTAxODE4MTAx ODE4MTAxODIxMTgyOTI5MTgyMTI5MTgyMTI5MTAxODI5MjEyOTMxMTgyMTI5MjEyOTMxMTgyMTI5 MjEyOTI5MjEyMTI5MTgyMTIxMTgNCjE4MTgxODE4MTgxODEwMTAyMTIxMTgyMTIxMjEyOTI5Mjky MTIxMjEyMTI5MjEyMTI5MjExODIxMjExMDE4MTg1YTZiNjM5NGE1YTU4Y2E1YTU5Y2I1YjVhNWJk YmQ5Y2FkYjVhZGJkYzZhNWJkYzZhZGM2Y2VhZGM2YzZiNWM2DQpjNmFkYmRiZGFkYmRjNmE1YmRi ZGE1YmRiZDljYWRiNTk0YWRiNTg0OWNhZDg0OWNhZDdiOTRhNTZiODQ5YzYzN2I5NDVhNzM5NDVh NzM4YzVhNzM4YzUyNmI4YzVhNzM4YzUyNmI4NDVhNmI4YzUyNmI4NDUyNmI4YzUyNmI4NA0KNTI2 Yjg0NGE2Mzg0NTI2Yjg0NGE2Mzg0NTI2Mzg0NGE2MzdiNTI2Mzg0NGE2MzdiNTI2MzdiNGE1YTdi NTI2MzdiNGE1YTczNTI2MzczNGE1YTczNTI2MzczNGE1YTczNTI2MzczNTI1YTZiNTI2MzZiNTI1 YTZiNTI1YTZiNTINCjVhNjM1MjVhNjM1MjVhNWE1MjVhNjM1MjUyNWE1MjVhNWE0YTUyNWE1MjUy NWE0YTRhNTJhZGM2YzZiNWM2Y2ViNWM2Y2ViNWM2Y2VhZGM2YzZiNWM2Y2ViNWM2Y2ViNWM2Y2Vh ZGM2YzZiNWM2Y2ViNWM2Y2ViNWNlY2ViNWM2DQpjZWI1YzZjZWI1YzZjZWI1Y2VjZWI1YzZjZWI1 Y2VjZWI1YzZjZWJkY2VkNmI1YzZjZWI1Y2VjZWI1YzZjZWJkY2VkNmI1YzZjZWI1Y2VjZWI1YzZj ZWI1Y2VjZWI1YzZjZWI1Y2VjZWI1YzZjZWI1Y2VjZWFkYzZjNmI1YzZjNg0KYjVjNmM2YjVjNmM2 YWRiZGJkYjVjNmM2YjViZGJkYjVjNmM2YjVjNmJkYjVjNmM2YjViZGJkYjVjNmJkYjViZGI1YmRi ZGJkYjViZGJkYmRjNmJkYjVjNmM2YmRjZWNlYmRjZWNlYzZkNmQ2YzZkNmQ2Y2VkZWRlZDZkZWU3 ZGUNCmU3ZWZkZWU3ZWZkZWVmZWZkZWVmZWZlN2VmZjdlN2VmZjdlN2Y3ZjdlN2VmZjdlN2Y3Zjdk ZWVmZWZkZWY3ZjdkZWY3ZjdlN2ZmZmZkZWY3ZWZkZWY3ZjdkZWY3ZjdlN2ZmZjdlN2Y3ZjdlN2Y3 ZjdlZmY3Zjc5Y2E1YWQyMTI5DQoyOTM5NDI0YTE4MTgyMTMxMzEzOTMxMjkzMTMxMjkzMTI5MjEy OTI5MjEyOTIxMjEyMTIxMjEyMTIxMjEyMTI5MjkyOTE4MjEyMTI5MjkyOTI5MzEzMTMxMzkzOTMx MzkzOTM5NDI0MjMxMzkzOTMxMzkzMTIxMjEyMTIxMjEyMQ0KMTgxODE4MjExODIxMjExODE4Mjky MTIxMjExODE4MjExODE4MTAxMDEwMTgxODE4MTgxODE4MTgxODIxMTgxODE4MTgxODE4MTgxMDE4 MTgxODIxMTAxODEwMTgxODE4MTAxODE4MTgyMTIxMTAxODE4MTgyMTIxMTAxODIxMTANCjE4MjEx MDE4MjExMDIxMjExMDE4MjExODIxMjExMDE4MTgxMDE4MTgxMDEwMTAxMDEwMTAwODA4MDgxMDEw MTAxODE4MTAyOTI5MjEyOTI5MjEyOTI5MjEyMTI5MjEyOTMxMjkxMDE4MTAzMTQyMzk3YjhjOGM5 NGE1OWM5NGE1DQphNTljYWRiNTljYWRiNWE1YmRiZGE1YmRiZGFkYzZjNmFkYzZjNmI1YzZjZWFk YmRjNmFkYmRjNmE1YmRiZGFkYmRiZDljYjViZDljYjViZDk0YTVhZDhjYTViNTg0OTRhZDdiOTRh NTZiODQ5YzYzN2I5NDVhNmI4YzVhNzM4Yw0KNTI2YjhjNWE2YjhjNTI2Yjg0NTI2YjhjNTI2Yjg0 NTI2YjhjNTI2Mzg0NTI2Yjg0NGE2Mzg0NTI2Yjg0NGE2MzdiNGE2Mzg0NGE2MzdiNGE2Mzg0NGE1 YTdiNGE2MzdiNGE1YTdiNGE2MzdiNGE1YTczNGE2MzczNGE1YTczNTINCjYzNzM0YTVhNmI1MjYz NzM0YTVhNmI1MjYzNzM0YTVhNmI1MjVhNmI0YTVhNjM1MjVhNmI0YTUyNWE1MjVhNWE1MjUyNWE1 MjVhNWE0YTUyNTI1MjUyNWE0YTRhNTI0YTUyNTJiNWNlY2ViNWM2Y2ViNWNlY2ViNWM2Y2ViNWNl DQpjZWI1YzZjZWI1Y2VjZWI1YzZjZWI1YzZjZWI1YzZjZWI1Y2VjZWI1YzZjZWI1Y2VjZWI1YzZj ZWI1Y2VjZWI1YzZjZWJkY2VkNmI1Y2VjZWJkY2VkNmI1Y2VjZWJkY2VkNmI1Y2VjZWJkY2VkNmI1 Y2VjZWJkY2VkNmI1YzZjZQ0KYmRjZWQ2YjVjZWNlYjVjZWNlYjVjNmNlYmRjZWQ2YjVjNmNlYjVj ZWNlYjVjNmM2YjVjZWNlYjVjNmM2YjVjNmM2YjViZGM2YjVjNmM2YjVjNmM2YmRjNmM2YjViZGJk YmRjNmM2YjViZGJkYmRiZGJkYjViZGJkYmRjNmM2YjUNCmJkYmRiZGNlY2ViZGNlY2VjNmQ2ZDZj NmQ2ZDZjZWQ2ZGVjZWRlZGVkNmU3ZTdkNmU3ZTdkZWVmZWZkZWVmZWZlN2VmZjdkZWVmZjdlN2Y3 ZjdlN2Y3ZjdlZmY3ZmZlN2Y3ZjdkZWY3ZjdkZWY3ZjdlN2ZmZmZlN2Y3ZjdlN2Y3DQpmN2RlZjdl ZmU3ZjdmN2U3ZjdmN2U3ZjdmN2U3ZWZlZmY3ZmZmZmVmZjdmNzYzNmI3MzE4MjEyOTRhNTI1YTE4 MjEyMTI5MzEzMTMxMzEzMTMxMzEzOTI5MjkyOTI5MjkyOTIxMjEyOTI5MjkzMTIxMjkyOTI5MzEz MTE4MjEyMQ0KMjEyOTIxMjkzMTMxMzk0MjM5MzEzOTMxMzEzOTM5MzEzOTM5MzEzMTMxMjkyOTI5 MjkyOTI5MjkyMTIxMjkyOTI5MjkyMTIxMjkyMTIxMjExODE4MjExODE4MTgxODE4MjEyMTIxMjEx ODIxMjEyMTIxMTgxODE4MTgxODIxMTgNCjE4MTgxODE4MTgxODE4MTAyMTIxMjExODIxMTgxODIx MTgxMDE4MTgxMDE4MTgxMDE4MTgxMDE4MjExMDEwMTgxMDE4MTgxMDEwMTgxMDE4MTgwODA4MDgw ODEwMDgwODA4MDgwODA4MDgxMDA4MDgyMTE4MTgyOTI5MjEzMTMxDQoyOTI5MjkyOTI5MzEyOTI5 MzEyOTE4MjEyMTUyNjM2M2E1YWRhZDg0OTQ5NGE1YjViZDljYWRhZDk0YTVhZGFkYmRjNmFkYzZj NmFkYmRjNmI1Y2VjZWI1YzZjNmI1YzZjNmFkYmRiZGFkYmRjNmE1YmRiZGE1YmRiZDljYWRiNQ0K OTRhZGI1OGNhNWFkODQ5Y2FkN2I5NGE1NzM4YzljNjM3Yjk0NWE3MzhjNWE2YjhjNWE3MzhjNTI2 YjhjNWE2YjhjNTI2YjhjNWE2YjhjNTI2YjhjNTI2YjhjNTI2Mzg0NTI2YjhjNTI2Mzg0NTI2Yjg0 NGE2MzdiNTI2Mzg0NGENCjYzN2I0YTYzN2I0YTYzN2I0YTYzN2I0YTYzNzM0YTYzN2I0YTVhNzM1 MjYzN2I0YTVhNzM1MjYzNzM0YTVhNzM1MjYzNzM1MjVhNmI1MjYzNzM0YTVhNmI1MjVhNmI1MjVh NmI1MjVhNjM1MjVhNWE1MjVhNjM0YTUyNWE1MjVhDQo1YTRhNTI1MjRhNTI1YTRhNGE1MmFkYzZj ZWI1YzZjZWFkYzZjZWI1YzZjZWFkYzZjZWI1YzZjZWFkYzZjZWI1YzZjZWFkYzZjZWI1YzZjZWFk YzZjZWI1YzZjZWI1YzZjZWI1Y2VjZWI1YzZjZWI1YzZjZWI1YzZjZWI1Y2VkNg0KYjVjNmNlYjVj ZWNlYjVjNmNlYjVjZWQ2YjVjNmNlYjVjZWNlYjVjNmNlYjVjZWQ2YjVjNmNlYjVjNmNlYjVjNmNl YjVjNmNlYWRjNmM2YjVjNmNlYWRiZGM2YjVjNmNlYWRiZGM2YWRiZGM2YWRiZGM2YjViZGM2YWRi ZGJkYjUNCmJkYzZiNWJkYzZiNWM2YzZhZGJkYmRiNWJkYmRhZGI1YjViNWJkYmRiNWJkYmRiZGM2 YzZiNWM2YzZiZGNlZDZiZGNlY2ViZGNlZDZiZGNlZDZjNmQ2ZGVjNmQ2ZGVjZWRlZTdkNmU3ZTdk NmU3ZWZkNmU3ZWZkZWVmZWZkZWU3DQplZmRlZWZmN2RlZTdlZmRlZWZlZmRlZWZlZmU3ZjdmN2Rl ZWZlZmU3ZjdmN2RlZWZmN2U3ZjdmN2RlZWZmN2U3ZjdmN2Y3ZmZmZmU3ZWZmN2RlZTdlZmVmZjdm ZmJkYzZjNjRhNTI1YTEwMTgyMTM5NDI0YTI5MjkyOTMxMzEzMQ0KMzkzMTM5MzkzOTM5MjEyMTIx MTgxODE4MTgxODE4MjkyOTI5MjkyOTI5MjkyOTI5MjEyMTIxMjEyOTI5MjkyOTI5MzEzOTMxMzEz OTM5Mzk0MjQyMzEzMTMxMzEzMTMxMjkyOTI5MjkyOTI5MjEyMTIxMjEyMTIxMTgxODE4MTgNCjIx MjEyMTIxMjExODE4MTgxMDEwMTAxMDEwMTAwODEwMTAxMDEwMTAxMDEwMTAxODE4MTgxMDE4MTAx ODE4MTgxMDE4MTAxODE4MTgxMDEwMTAxMDE4MTgwODEwMTAwODEwMTAxMDEwMTgxMDEwMTAwODEw MDgwODEwMTAwODA4DQowODA4MDgwODAwMDAwMDAwMDgwODA4MDgwODA4MDgwODAwMDAwMDE4MTgx ODM5NDI0MjM5NDI0MjIxMjkyOTI5MzEzMTRhNTI1MjdiOGM4YzljYWRhZDljYWRhZDk0YTVhNTlj YjViNTljYjViNTljYjViNWFkYmRiZGFkYzZjNg0KYWRjNmM2YjVjNmM2YjVjNmM2YjVjNmM2YWRi ZGJkYWRiZGJkYWRiNWJkYTViNWJkOTRhNWI1OTRhNWFkODQ5NGFkN2I5NGE1NmI4NDk0NjM3Yjk0 NWE3MzhjNWE3MzhjNTI2Yjg0NTI2YjhjNTI2Yjg0NTI2YjhjNTI2Mzg0NTINCjYzOGM0YTYzODQ1 MjYzOGM0YTYzODQ1MjYzODQ0YTYzODQ0YTYzODQ0YTVhN2I0YTYzN2I0YTYzN2I0YTYzN2I0MjVh NzM0YTYzNzM0MjVhNzM0YTYzNzM0MjVhNzM0YTVhNzM0YTVhNmI0YTVhNzM0YTVhNmI0YTVhNmI0 YTVhDQo2YjRhNWE2YjRhNTI2YjRhNWE2YjRhNWE2MzUyNWE2MzRhNTI1YTUyNWE2MzRhNTI1YTRh NTI1YTQyNGE1MjRhNTI1MmI1YzZjZWFkYzZjZWI1YzZjZWFkYzZjNmI1YzZjZWFkYzZjZWI1YzZj ZWFkYzZjNmI1Y2VjZWI1YzZjZQ0KYjVjNmNlYjVjNmNlYjVjZWQ2YjVjNmNlYjVjZWQ2YjVjNmNl YjVjZWQ2YjVjNmNlYjVjZWQ2YjVjNmNlYjVjZWQ2YjVjNmNlYjVjZWQ2YjVjNmNlYjVjZWNlYjVj NmNlYjVjNmNlYWRjNmNlYjVjNmNlYWRjNmNlYjVjNmNlYWQNCmJkYzZiNWM2Y2VhZGJkYzZhZGJk YzZhZGJkYzZhZGJkYzZhZGJkYzZiNWJkYzZhZGJkYzZiNWM2YzZiNWJkYzZiNWJkYzZhZGI1YmRi NWJkYmRiNWJkYmRiZGJkYzZiNWJkYzZiZGM2Y2ViNWM2Y2ViZGNlZDZiZGNlZDZjNmQ2DQpkZWM2 ZDZkZWNlZGVkZWNlZGVkZWQ2ZTdlZmQ2ZTdlN2Q2ZTdlZmQ2ZTdlZmRlZWZmN2RlZWZlZmRlZWZm N2Q2ZTdlZmU3ZWZmN2RlZWZlZmU3ZWZmN2RlZWZlZmU3ZWZmN2RlZWZlZmU3ZWZmN2RlZWZlZmRl ZTdlZmU3ZWZmNw0KZWZmN2ZmZTdmN2Y3ZGVlZmVmOWNhZGFkNTI1YTYzMTgyMTIxNDI0MjQyMzkz OTM5MzEyOTI5MjEyMTIxMzkzOTM5NDI0MjQyMzkzOTM5MTgxODE4MjEyOTI5MjEyMTIxMjkyOTI5 MjEyOTI5MjkzMTMxMjkzMTI5MjkzMTMxMjkNCjMxMzEyOTI5MjkyMTI5MjEyMTIxMjExODIxMTgx ODIxMjExODE4MTgxODIxMjExODE4MTgxODE4MTgxMDE4MTAxODE4MTgxODE4MTgxODIxMjExMDEw MTAwODEwMTAwODA4MDgxODE4MTgxODE4MTgxODE4MTgxODE4MTgxODE4DQoxODE4MTgxODE4MTgx ODEwMTAxMDEwMTAxMDA4MTAwODEwMTAxMDA4MTAxMDA4MTAxMDAwMDgwMDAwMDgwMDAwMDAwMDAw MDAwMDAwMDAwMDEwMTAxMDE4MjEyMTMxMzEzMTI5MzEzMTMxMzkzOTQyNGE0YTdiOGM4Yzk0YTVh NQ0KYTViNWI1OTRhNWFkOTRhZGFkOWNiNWI1YTViZGM2YTViZGJkYWRjNmM2YjVjNmM2YjVjNmM2 YjVjNmM2YmRjZWNlYjVjNmM2YjVjNmM2YWRiZGJkYjViZGM2YTViNWJkOWNhZGI1OGNhNWFkOGM5 Y2FkN2I5NGE1NzM4NDljNjMNCjdiOTQ2MzczOTQ1YTczOGM1YTZiOGM1MjZiOGM1YTZiOGM1MjZi OGM1MjZiOGM1MjYzOGM1MjZiOGM1MjYzOGM1MjYzOGM0YTYzODQ1MjYzODQ0YTYzN2I0YTYzODQ0 YTYzN2I0YTYzN2I0MjYzNzM0YTYzN2I0MjVhNzM0YTYzDQo3YjQyNWE3MzRhNjM3MzRhNWE3MzRh NjM3MzRhNWE3MzUyNjM3MzRhNWE2YjUyNWE3MzRhNWE2YjRhNWE2YjRhNWE2YjUyNWE2YjRhNWE2 MzUyNWE2MzRhNTI1YTRhNTI2MzQyNTI1YTRhNTI1YTQyNGE1MmFkYmRjNmFkYmRjNg0KYWRiZGM2 YWRjNmM2YWRiZGM2YWRiZGM2YWRiZGM2YWRjNmM2YWRiZGM2YWRjNmNlYWRiZGM2YjVjNmNlYWRi ZGM2YjVjNmNlYWRjNmM2YjVjNmNlYWRiZGM2YjVjNmNlYWRjNmM2YjVjNmNlYWRiZGM2YjVjNmNl YWRjNmM2YjUNCmM2Y2VhZGJkYzZhZGM2YzZhZGJkYzZhZGM2YzZhNWJkYzZhZGJkYzZhNWJkYzZh ZGJkYzZhNWI1YmRhZGJkYzZhNWI1YmRhNWJkYzZhNWI1YmRhZGJkYmRhNWI1YmRhZGJkYzZhZGJk YmRiNWJkYzZhZGI1YmRhZGJkYmRhZGI1DQpiNWFkYmRiZGI1YjViZGI1YmRiZGFkYmRjNmI1YzZj ZWI1YzZjZWJkY2VkNmJkY2VjZWM2ZDZkNmM2ZDZkZWNlZGVlN2NlZGVkZWNlZGVlN2NlZGVlN2Q2 ZTdlZmQ2ZTdlN2Q2ZTdlZmQ2ZTdlZmQ2ZTdlZmQ2ZTdlN2RlZTdlZg0KZDZlN2U3ZGVlN2VmZDZl N2U3ZGVlN2VmZGVlN2VmZGVlZmVmZDZkZWU3ZTdlZmY3ZTdlZmY3ZDZlN2U3ZDZlN2U3ZGVlZmVm OWNhZGFkNGE1MjUyMjEyOTI5MjkzMTMxMzEzMTMxMzkzOTM5MzkzOTM5MzkzOTM5MjkzMTMxMjEN CjIxMjEyMTIxMjEyMTIxMjEyMTIxMjEyMTIxMjEyMTIxMjEyMTIxMjEyMTIxMjEyMTIxMjEyOTI5 MjkyOTMxMzEyOTI5MjkyOTI5MjkyMTIxMjEyMTI5MjkyMTIxMjEyMTI5MjkxMDE4MTgxODE4MTgx MDE4MTgxODE4MTgwODEwDQoxMDA4MDgwODA4MDgwODEwMTAxMDA4MDgwODEwMTAxMDEwMTAxMDE4 MTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDA4MDgwODA4MDgwODA4MDgwODA4MTAxMDAwMDgw MDAwMDAwMDAwMDAwMDAwMDgwODAwMDAwMDAwMDAwMA0KMDgwODA4MjEyMTIxMjEyOTIxMzk0MjQy NWE2MzYzN2I4NDg0OTRhNWE1OWNhZGFkOTRhNWE1OGNhNWE1OGM5Y2E1OTRhZGFkOWNiNWI1YWRi ZGM2YWRiZGJkYjVjNmM2YjVjNmM2YmRjZWNlYjVjNmM2YjVjNmM2YjViZGJkYjUNCmJkYzZhZGI1 YmRhNWI1YmQ5Y2FkYjU5NGE1YjU4NDk0YTU3Yjk0YTU2Yjg0OTQ2MzdiOTQ1YTczOGM1YTczOGM1 MjZiOGM1MjZiOGM1MjYzODQ1MjZiOGM1MjYzOGM1MjYzOGM0YTYzODQ1MjYzOGM0YTYzODQ1MjYz ODQ0YTVhDQo3YjRhNjM3YjRhNWE3YjRhNjM3YjQyNWE3MzRhNjM3YjQyNWE3MzRhNjM3MzQyNWE3 MzRhNWE3MzRhNWE3MzRhNWE3MzRhNWE2YjRhNWE3MzRhNWE2YjRhNWE2YjRhNTI2YjRhNWE2YjRh NTI2YjRhNWE2YjRhNTI1YTRhNWE2Mw0KNGE1MjVhNGE1MjVhNDI0YTUyNGE1MjVhNDI0YTUyNDI0 YTUyYWRiZGM2YTViZGM2YWRiZGM2YWRiZGM2YWRiZGM2YTViZGM2YWRiZGM2YWRiZGM2YWRiZGM2 YTViZGM2YWRiZGM2YWRiZGM2YWRiZGM2YWRiZGM2YWRjNmM2YWQNCmJkYzZhZGJkYzZhNWJkYzZh ZGJkYzZhZGJkYzZhZGJkYzZhNWJkYzZhZGJkYzZhZGJkYzZhZGJkYzZhNWJkYzZhZGJkYzZhNWJk YzZhZGJkYzZhNWI1YmRhZGJkYzZhNWI1YmRhNWJkYzZhNWI1YmRhNWJkYzZhNWI1YmRhNWI1DQpi ZGE1YjViZGE1YmRiZGE1YjViZGFkYmRjNmFkYjViZGFkYmRiZGFkYjViNWFkYjViZGFkYjViNWFk YmRiZGFkYjViZGI1YmRjNmFkYmRjNmI1YzZjZWI1YzZjZWJkY2VkNmJkY2VkNmM2ZDZkZWM2ZDZk ZWNlZGVkZWM2ZDZkZQ0KY2VkZWU3Y2VkZWU3ZDZlN2U3Y2VkZWU3ZDZlN2VmZDZkZWU3ZDZlN2U3 ZDZkZWU3ZGVlN2VmZDZlN2U3ZDZlN2U3ZDZlN2U3ZGVlN2VmZDZlN2U3ZTdlZmY3ZDZlN2U3ZGVl N2VmY2VkZWRlY2VkZWRlZGVlN2VmZDZlN2U3YTUNCmI1YjU1YTVhNWEzMTM5MzkyOTMxMzEzMTM5 MzkzOTQyNDIyMTI5MjkyOTI5MjkzMTMxMzEzMTMxMzEyOTI5MjkyMTI5MjkxODE4MTgxODE4MTgx ODE4MTgyMTIxMjEyMTIxMjEyOTI5MjkyMTIxMjEyOTI5MjkyMTIxMjEyMTIxDQoyMTE4MTgxODE4 MTgxODEwMTAxMDIxMjEyMTE4MjEyMTIxMjEyMTE4MTgxODE4MTgxODA4MDgwODE4MTgxODE4MTgx ODEwMDgwODA4MDgwODEwMTAxMDEwMTAxMDE4MTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDA4 MDgwOA0KMDgwODA4MDAwMDAwMDAwODA4MDAwMDAwMDgwODA4MDgwODA4MDgwODA4MDAwMDAwMTgx ODE4MjkzMTMxNDI0MjQyNjM2YjZiOTQ5YzljOWNhNWE1OTRhNWE1OGM5YzljOTRhNWE1OGNhNWE1 OTRhZGFkOTRhZGFkOWNiNWI1YTUNCmJkYmRiNWM2YzZiNWM2YzZiZGNlY2ViZGNlYzZiZGNlY2Vi NWM2YzZiZGM2YzZiNWJkYzZiNWJkYzZhNWI1YmQ5Y2FkYjU5NGE1YWQ4YzljYWQ3Yjk0YTU3Mzhj OWM2MzdiOTQ2MzczOGM1YTZiOGM1YTZiOGM1MjZiOGM1MjZiDQo4YzUyNmI4YzUyNmI4YzUyNjM4 YzUyNjM4YzRhNjM4NDUyNjM4YzRhNjM4NDUyNjM4NDRhNjM3YjRhNjM4NDRhNjM3YjRhNjM3YjRh NWE3MzRhNjM3YjRhNWE3MzRhNjM3MzRhNWE3MzRhNjM3MzRhNWE3MzUyNWE3MzRhNWE2Yg0KNTI1 YTczNGE1YTZiNTI1YTZiNGE1YTZiNTI1YTZiNGE1YTZiNTI1YTYzNGE1MjVhNTI1YTYzNGE1MjVh NGE1MjVhNDI0YTUyNGE1MjVhNDI0YTUyYTViNWJkYTViZGM2YTViNWJkYTViZGM2YTViNWJkYTVi ZGM2YTViNWJkYTUNCmJkYzZhNWI1YmRhNWJkYmRhNWI1YmRhNWJkYmRhNWI1YmRhNWJkYzZhNWI1 YmRhNWJkYzZhNWI1YmRhNWJkYzZhNWI1YmRhNWJkYmRhNWI1YmRhNWJkYzZhNWI1YmRhNWJkYmRh NWI1YmRhNWJkYzZhNWI1YmRhNWJkYmRhNWI1DQpiZGE1YjViZDljYjViZGE1YjViZDljYjViZDlj YjViZDljYjViNTljYjViZDljYjViNWE1YjViZDljYWRiNWE1YjViZGE1YjViNWE1YjViZGE1YWRi NWE1YjViNWE1YWRhZGE1YjViNWE1YWRhZGE1YjViNWE1YjViZGFkYmRiZA0KYWRiZGJkYjViZGM2 YjViZGM2YmRjNmNlYmRjNmNlYzZjZWQ2YzZjZWQ2YzZkNmRlYzZkNmQ2Y2VkNmRlYzZkNmRlY2Vk ZWU3Y2VkNmRlY2VkZWU3Y2VkZWRlZDZkZWU3Y2VkZWRlZDZkZWU3Y2VkZWRlZDZkZWU3Y2VkZWRl ZDYNCmRlZTdkNmRlZTdjNmQ2ZDZjZWRlZGVkZWU3ZWZjZWQ2ZGVjZWRlZGVkNmRlZTdkNmRlZGVj NmNlY2U3MzdiN2IyMTI5MjkyMTIxMjEyOTMxMzEzMTM5MzEyOTI5MjkzMTMxMzEzMTMxMzEzMTMx MzEyMTIxMjEyMTIxMjExODE4DQoxODIxMTgxODE4MTgxODIxMjEyMTE4MTgxODIxMjEyMTIxMTgx ODIxMjEyMTE4MTgxODE4MTgxODEwMDgwODA4MDgwODE4MTgxODIxMjEyMTI5MjEyMTI5MjkyOTIx MjEyMTE4MTgxODEwMTAxMDE4MTAxMDEwMTAxMDE4MTAxMA0KMTAxMDEwMTgxODE4MTgxMDEwMTgx ODE4MTAxMDEwMTAxMDEwMTAxMDEwMDgwODA4MDAwMDAwMDAwODA4MDgwODA4MDgwODA4MDAwMDAw MDgwODA4MDAwMDAwMTAxMDEwMzkzOTM5NjM2YjYzNmI3MzczODQ4YzhjOTQ5YzljOGMNCjljOWM4 Yzk0OTQ4YzljOWM4YzljOWM5Y2FkYWQ5NGFkYWQ5Y2FkYWQ5Y2FkYjVhZGJkYmRhZGJkYmRiNWM2 YzZiNWM2YzZiZGNlY2ViZGM2YzZiZGM2YzZiNWJkYzZiNWM2YzZhZGJkYmRhZGI1YmQ5Y2FkYjU5 NGE1YjU4YzljDQphZDg0OTRhNTZiODQ5NDYzN2I5NDVhNzM4YzVhNzM4YzUyNjM4NDUyNmI4YzUy NjM4NDUyNmI4YzRhNjM4NDUyNjM4YzRhNjM4NDUyNjM4YzRhNjM4NDRhNjM4NDRhNWE3YjRhNjM3 YjQyNWE3YjRhNjM3YjQyNWE3MzRhNjM3Yg0KNDI1YTczNGE1YTczNGE1YTczNGE1YTczNGE1YTZi NGE1YTczNGE1YTZiNGE1YTczNGE1YTZiNTI1YTZiNGE1MjZiNTI1YTZiNGE1MjYzNTI1YTZiNGE1 MjVhNTI1YTYzNGE1MjVhNGE1MjVhNGE1MjUyNGE1MjUyNDI0YTRhNDINCjRhNTJhNWI1YmRhNWI1 YmRhNWI1YmQ5Y2I1YmRhNWI1YmRhNWI1YmRhNWI1YmQ5Y2I1YmRhNWJkYmRhNWI1YmRhNWI1YmRh NWI1YmRhNWJkYzZhNWI1YmRhNWJkYzZhNWI1YmRhNWJkYzZhNWI1YmRhNWJkYmRhNWI1YmRhNWJk DQpjNmE1YjViZGE1YmRiZGE1YjViZGE1YmRiZGE1YjViZGE1YjViZDljYjViZGE1YjViZDljYjVi ZGE1YjViZDljYjViNTljYjViZDljYjViNTljYjViNTk0YWRiNTljYjViNTk0YWRiNTljYjViNTlj YWRiNWE1YjViNTljYWRiNQ0KYTViNWI1OWNhZGFkYTVhZGI1OWNhZGFkYTVhZGFkOWNhZGFkYTVi NWJkYTViNWI1YWRiNWJkYWRiNWJkYjViZGM2YjViZGM2YmRjZWNlYmRjZWNlYzZjZWQ2YmRjZWQ2 YzZkNmQ2YzZjZWQ2Y2VkNmRlYzZkNmRlY2VkNmRlYzYNCmQ2ZGVjZWRlZGVjZWQ2ZGVjZWRlZGVj ZWQ2ZGVjZWRlZGVjZWRlZGVjZWRlZGVjZWQ2ZGVjZWRlZGVjNmQ2ZDZjZWRlZGVkNmRlZTdjZWRl ZGVjZWQ2ZGVjZWRlZGVjNmQ2ZDZkNmU3ZTdiNWM2YmQ4NDhjOGM0YTUyNTIzMTM5DQozOTI5MzEz MTI5MzEzMTI5MzEzMTI5MzEzMTI5MjkyOTMxMzEzMTI5MjkyOTMxMjkyOTIxMjEyMTIxMjEyMTE4 MTgxODI5MjEyMTIxMjEyMTI5MjkyOTI5MjEyMTI5MjkyOTIxMjEyMTIxMjEyMTE4MTgxODE4MTgx ODE4MTAxMA0KMjExODE4MjExODE4MjExODE4MTAxMDEwMTAxMDEwMTAxMDEwMTgxMDEwMTAxMDEw MTgxMDE4MTgxMDEwMTgxODE4MTgxMDEwMTgxODE4MTAxMDEwMTAxMDEwMDgwODA4MDgwODA4MDgx MDEwMTgxODE4MTAxMDEwMDgwODA4MDANCjAwMDAwMDA4MDAyMTI5Mjk3MzdiNzM5YzljOWM5Y2E1 YTU5NDljOWM5NDljOWM4NDhjOGM5NDljOWM4YzljOWM5NGE1YTU5NGE1YWQ5Y2FkYWQ5NGFkYWRh NWI1YmRhZGJkYmRiNWM2YzZiNWM2YzZiZGNlY2ViZGM2YzZjNmNlDQpjZWJkYzZjNmJkYzZjZWI1 YzZjNmI1YmRjNmE1YjViZDljYWRiNTk0YTVhZDhjYTVhZDdiOTRhNTczOGM5YzYzN2I5NDVhNzM4 YzVhNmI4YzVhNmI4YzUyNjM4NDUyNmI4YzUyNmI4YzUyNmI4YzRhNjM4NDUyNjM4YzRhNjM4NA0K NTI2MzhjNGE2Mzg0NTI2Mzg0NGE2MzdiNGE2MzdiNGE1YTdiNGE2MzdiNGE1YTczNGE2MzdiNGE1 YTczNTI2MzczNGE1YTczNTI1YTczNGE1YTczNTI1YTczNGE1YTZiNTI1YTZiNGE1YTZiNTI1YTZi NTI1MjZiNTI1YTZiNGENCjUyNjM1MjVhNjM1MjVhNWE1MjVhNWE0YTUyNWE1MjUyNWE0YTUyNTI0 YTUyNTI0MjRhNGE5NGFkYjU5Y2FkYjU5Y2FkYjU5Y2FkYjU5NGFkYjU5Y2FkYjU5Y2FkYjU5Y2Fk YjU5Y2FkYjU5Y2FkYjU5Y2FkYjU5Y2I1YjU5Y2FkDQpiNTljYjViNTljYWRiNTljYjViZDljYWRi NTljYjViZDljYWRiNTljYjViZDljYWRiNTljYjViZDljYWRiNTljYjViZDljYWRiNTljYjViZDlj YWRiNTljYjViNTk0YWRiNTljYWRiNTk0YWRiNTljYWRiNTk0YWRhZDk0YWRiNQ0KOGNhNWFkOTRh ZGI1OGNhNWFkOTRhZGFkOTRhNWFkOTRhZGI1OTRhZGFkOWNhZGFkOTRhNWFkOWNhZGFkOTRhNWE1 OTRhNWFkOTRhNWE1OWNhNWFkOTRhNWFkOWNhZGI1OWNhZGI1YTViNWJkYTViNWJkYWRiZGM2YjVi ZGM2YmQNCmM2Y2ViNWM2Y2ViZGNlY2ViZGNlY2VjNmNlZDZiZGNlZDZjNmQ2ZDZiZGNlZDZjNmQ2 ZDZjNmNlZDZjNmQ2ZDZjNmNlZDZjZWQ2ZGVjNmNlZDZjZWQ2ZGVjNmQ2ZDZjZWQ2ZGVjNmQ2ZDZj ZWRlZGVjNmNlZDZiZGNlY2VjNmNlDQpkNmNlZDZkZWM2Y2VkNmM2ZDZkNmFkYmRiZGNlZGVkZWNl ZGVkZWE1YjViNTYzNzM3MzQyNGE0YTMxMzkzOTMxMzkzOTI5MjkyOTMxMzEzMTMxMzEzMTM5Mzkz OTMxMzEzMTMxMjkyOTI5MjEyMTIxMjEyMTIxMTgxODIxMjEyMQ0KMTgxODE4MTgxODE4MTgxMDEw MTgxODE4MTAxMDEwMTgxODE4MTAxMDEwMTAxMDEwMDgwODA4MTAwODA4MDgwODA4MDgwODA4MDgw ODA4MTgxMDEwMDgwODA4MTAwODA4MTAwODA4MTgxMDEwMTAxMDEwMTgxMDEwMTAxMDEwMTgNCjEw MTAwODA4MDgxMDEwMTAwODA4MDgxMDEwMTAwODA4MDgwODA4MDgwMDA4MDgwODA4MDgxMDEwMTA1 YTYzNWE5NDljOWNhZGI1YjVhNWFkYTU5Y2E1OWM4Yzk0OTQ4YzljOWM4Yzk0OTQ4YzljOWM5NGE1 OWM5NGE1YTU4Y2E1DQphNTljYWRhZDljYjViNWFkYmRiZGI1YmRiZGJkYzZjNmJkYzZjNmM2Y2Vj ZWJkYzZjNmJkY2VjZWJkYzZjNmJkYzZjNmFkYmRiZGFkYjViZDljYWRiNTk0YTViNTg0OWNhZDdi OTRhNTZiODQ5YzZiODQ5NDUyNmI4NDVhNzM4Yw0KNTI2Mzg0NTI2YjhjNTI2Mzg0NTI2YjhjNGE2 Mzg0NTI2MzhjNGE1YTg0NTI2Mzg0NGE2Mzg0NGE2Mzg0NGE1YTdiNGE2MzdiNDI1YTdiNGE2Mzdi NDI1YTczNGE1YTczNGE1YTczNGE1YTczNGE1YTZiNGE1YTczNGE1YTZiNGENCjVhNzM0YTUyNmI1 MjVhNmI0YTVhNmI1MjVhNmI0YTUyNjM1MjVhNmI0YTUyNjM1MjVhNmI0YTUyNWE1MjUyNWE0YTUy NWE0YTUyNWE0YTRhNTI0YTUyNTI0MjRhNGE0YTRhNTI5Y2FkYjU5NGFkYWQ5Y2FkYjU5NGFkYjU5 Y2FkDQpiNTk0YWRhZDljYWRiNTk0YWRiNTk0YWRiNTk0YTVhZDljYWRiNTk0YWRhZDljYWRiNTk0 YTVhZDljYWRiNTk0YWRiNTljYWRiNTk0YWRiNTljYWRiNTk0YWRiNTljYWRiNTk0YWRiNTljYWRi NTk0YWRiNTljYjViNTljYWRiNQ0KOWNiNWI1OWNhZGI1OWNhZGI1OTRhZGFkOWNhZGI1OTRhZGFk OTRhZGI1OGNhNWFkOGNhZGFkOGNhNWFkOGNhNWFkOGNhNWFkOTRhZGFkOGNhNWFkOWNhZGFkOTRh NWFkOWNhZGFkOTRhNWFkOWNhNWFkOTRhNWE1OWNhNWFkOTQNCmE1YTU5Y2FkYWQ5Y2E1YWRhNWI1 YjVhNWFkYjVhZGI1YmRhZGI1YmRiNWM2YzZiNWM2Y2ViZGNlY2ViNWM2Y2ViZGNlZDZiZGNlZDZj NmNlZDZiZGNlZDZjNmQ2ZDZiZGNlZDZjNmQ2ZDZjNmNlZDZjNmQ2ZDZjNmNlZDZjNmQ2DQpkNmM2 Y2VkNmM2ZDZkNmM2Y2VkNmM2Y2VkNmNlZDZkZWM2Y2VkNmJkY2VjZWNlZGVkZWM2Y2VkNmJkY2Vj ZWNlZDZkNmNlZGVkZWJkZDZjZWM2ZDZkNmNlZDZkNmM2Y2VjZThjOWM5YzVhNjM2MzI5MzEzMTM5 NDIzOTMxMzkzOQ0KMzkzOTM5MzkzOTM5MzkzOTM5MzEzMTMxMzkzMTMxMzEyOTI5MzEyOTI5MjEy MTIxMjEyMTIxMTgxMDEwMTAxMDEwMTAxMDEwMTgxODE4MTgxMDEwMTAxMDEwMTAwODA4MTgxMDEw MTgxODE4MTgxODE4MTAxMDEwMTAxMDEwMTANCjA4MDgxMDA4MDgxMDA4MDgxODEwMTAxMDEwMTAx ODE4MTgxODE4MTgyMTE4MTgxODE4MTgxODE4MTgxMDEwMTAxMDEwMTAwODA4MDgwMDAwMDAwMDAw MDAwODEwMTAxMDE4MTg2MzZiNmI5NDljOWNiNWI1YjU5Y2E1YTU5Y2E1DQphNThjOTQ5NDhjOWM5 NDk0YTU5YzhjOWM5Yzk0OWM5YzljYWRhZDk0YTVhNTljYjViNWE1YjViZGFkYmRiZGE1YjViNWI1 YzZjNmI1YzZjNmM2Y2VjZWM2Y2VjZWM2Y2VjZWJkYzZjNmM2Y2VjZWJkYzZjNmI1YmRjNmE1YjVi ZA0KYTViNWJkOTRhNWI1OGNhNWFkN2I5NGE1NzM4YzljNjM3Yjk0NWE3MzhjNTI2Yjg0NWE2Yjhj NTI2Yjg0NTI2YjhjNTI2Mzg0NTI2YjhjNGE2Mzg0NTI2MzhjNGE2Mzg0NTI2MzhjNGE2Mzg0NGE2 Mzg0NGE1YTdiNGE2MzdiNGENCjYzN2I0YTYzN2I0YTVhNzM1MjYzN2I0YTVhNzM1MjVhNzM0YTVh NzM1MjVhNzM0YTVhNzM1MjVhNzM0YTVhNmI1MjVhNzM1MjVhNmI1MjVhNmI0YTUyNmI1MjVhNmI1 MjUyNjM0YTUyNWE0YTUyNWE1MjUyNWE0YTUyNTI0YTUyDQo1MjQyNGE0YTRhNGE1MjQyNGE0YThj YTVhZDk0YTVhZDhjYTVhZDk0YTVhZDhjYTVhZDk0YTVhZDhjYTVhZDk0YTVhZDhjOWNhNTk0YTVh ZDhjOWNhNTk0YTVhZDhjYTVhNTk0YTVhZDhjYTVhNTk0YTVhZDhjYTVhZDk0YTVhZA0KOGNhNWE1 OTRhNWFkOGNhNWFkOTRhNWFkOGNhNWE1OTRhNWFkOGNhNWFkOTRhNWFkOGNhNWE1OTRhNWFkOGM5 Y2E1OGNhNWFkOGM5Y2E1OGNhNWE1ODQ5Y2E1ODRhNWE1ODQ5Y2E1ODQ5Y2E1ODQ5Y2E1OGNhNWE1 ODQ5Y2E1OGMNCmE1YTU5NGE1YTU5NGE1YWQ4YzljYTU5NGE1YTU4YzljYTU5NGE1YTU4YzljOWM5 NGE1YTU5NGE1YTU5Y2E1YWQ5Y2E1YWRhNWFkYjVhNWFkYjVhZGI1YmRhZGI1YmRiNWJkYzZiNWM2 YzZiZGM2Y2ViNWM2Y2ViZGNlY2ViZGM2DQpjZWM2Y2VkNmJkYzZjZWJkY2VkNmJkY2VjZWM2Y2Vk NmJkY2VjZWM2Y2VkNmM2Y2VkNmM2ZDZkNmM2Y2VkNmM2ZDZkNmM2Y2VkNmM2ZDZkNmM2Y2VkNmM2 ZDZkNmM2Y2VkNmM2ZDZkNmM2Y2VkNmM2ZDZkNmI1YzZjNmM2ZDZkNg0KYmRkNmNlYzZkNmNlYzZk NmQ2Y2VkNmQ2YTVhZGFkN2I4NDg0Mzk0MjQyMjkzMTMxMTgyMTIxMjkyOTI5MzEzMTMxMzEzMTMx MjkyOTI5MjkyMTIxMjkyOTI5MjkyOTI5MjkyOTI5MzEyOTI5MjkyOTI5MjkyOTI5MTgxODE4MTgN CjEwMTAxMDEwMTAxODEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAwODA4MDgwODA4MDgxMDEw MTAxMDEwMTAxMDEwMTAxODE4MTgxODE4MTgyMTIxMjExODE4MTgxODE4MTgxMDE4MTgwODA4MDgw MDAwMDAwMDAwMDAwODEwDQoxMDMxMzkzOTZiNmI2YjljOWM5Y2FkYjViNWI1YjViNWE1YWRhZGE1 YWRhNTljYTVhNTk0YTU5YzhjOTQ5NDhjOTQ5NDhjOWM5Yzk0YTU5Yzk0YTU5Yzk0YWRhNTk0YWRh ZGE1YjViNWE1YjViNWFkYmRiZGI1YmRiZGJkYzZjNg0KYmRjNmM2YzZjZWNlYzZjNmNlYzZjZWNl YmRiZGM2YmRjNmM2YjViZGM2YWRiZGM2OWNhZGI1OTRhNWI1OGM5Y2FkODQ5NGE1NmI4NDljNmI3 Yjk0NWE3MzhjNWE3MzhjNTI2Mzg0NTI2YjhjNTI2Mzg0NTI2YjhjNGE2Mzg0NTINCjYzOGM0YTVh ODQ0YTYzODQ0YTVhODQ0YTYzODQ0YTVhN2I0YTYzN2I0MjVhN2I0YTYzN2I0YTVhNzM0YTYzNzM0 YTVhNzM0YTVhNzM0YTVhNmI0YTVhNzM0YTUyNmI0YTVhNmI0YTUyNmI0YTVhNmI0YTUyNjM1MjUy NmI0YTUyDQo2MzUyNTI2YjRhNGE2MzRhNTI2MzRhNTI1YTRhNTI1YTQyNGE1MjQyNTI1MjQyNGE0 YTQyNGE0YTM5NDI0MjQyNDI0YThjYTVhZDhjOWNhNThjYTVhZDhjOWNhNThjYTVhZDhjOWNhNThj YTVhZDhjOWNhNThjYTVhZDhjOWNhNQ0KOGNhNWFkOGM5Y2E1OTRhNWFkOGNhNWE1OTRhNWFkOGM5 Y2E1OTRhNWFkOTRhNWFkOTRhNWFkOGNhNWFkOTRhNWFkOTRhNWFkOTRhNWFkOGNhNWFkOTRhZGFk OTRhNWFkOTRhNWFkOGNhNWFkOTRhNWFkOGNhNWE1OGNhNWFkOGMNCjljYTU4Y2E1YWQ4NDljYTU4 NGE1YTU4NDljYTU4Y2E1YWQ4YzljYTU4Y2E1YWQ4Y2E1YTU5NGFkYWQ5NGE1YTU5NGE1YWQ4Y2E1 YTU5NGE1YTU5NGE1YTU5NGE1YTU5NDljYTU5Y2E1YWQ5Y2E1YWQ5Y2FkYjU5Y2FkYjVhNWI1DQpi ZGE1YjViZGI1YmRjNmI1YmRjNmJkYzZjZWI1YzZjZWJkYzZjZWJkYzZjZWJkY2VkNmJkY2VjZWM2 Y2VkNmJkY2VjZWM2ZDZkNmM2Y2VkNmM2ZDZkNmM2Y2VkNmM2ZDZkNmM2Y2VkNmM2ZDZkNmM2Y2Vk NmM2ZDZkNmM2ZDZkNg0KYzZkNmQ2YzZjZWQ2Y2VkNmRlYzZkNmQ2Y2VkNmRlYzZkNmQ2YmRkNmQ2 YmRkNmQ2YzZkNmQ2YmRjZWNlY2VkNmQ2Y2VkZWRlY2VkNmQ2YjViZGJkOTQ5YzljNzM3YjdiNTI1 MjUyMzEzOTM5MzEzMTMxMjkyOTI5MzEzMTMxMzENCjMxMzEzMTMxMzEyOTI5MjkyOTI5MjkyMTIx MjEyOTI5MjkyMTIxMjEyMTE4MTgxMDEwMTAyOTIxMjExODE4MTgxODE4MTgxMDEwMTAxMDA4MDgw ODA4MDgwODA4MDgwODA4MDgxMDEwMTAxMDEwMTAxODE4MTgxODE4MTgyMTIxDQoyMTIxMjEyMTIx MjEyMTE4MjEyMTA4MDgwODE4MTgxODMxMzkzOTUyNWE1YTg0OGM4Y2E1YWRhZGI1YmRiZGI1YmRi NWI1YmRiZGFkYmRiNWFkYmRiNWE1YWRhZGE1YWRhZDk0YTU5Yzk0YTU5YzhjOWM5NDk0OWM5Yzk0 OWM5Yw0KOTRhNWE1OTRhNWE1OWNhZGFkOWNiNWFkYWRiZGJkYWRiZGJkYmRjNmM2YmRjNmM2YzZj ZWNlYzZjZWNlY2VjZWNlYzZjNmM2YmRjNmM2YmRiZGM2YmRjNmNlYWRiNWJkYTViNWJkOTRhNWI1 OTRhNWI1N2I5NGE1NzM4YzljNjMNCjdiOTQ1YTczOGM1MjZiOGM1MjZiOGM1MjYzODQ1MjZiOGM1 MjZiOGM1MjYzOGM0YTYzODQ1MjYzOGM0YTYzODQ0YTYzODQ0YTVhN2I0YTYzODQ0YTVhN2I0YTYz N2I0YTVhNzM0YTYzN2I0YTVhNzM1MjYzN2I0YTVhNzM1MjVhDQo3MzRhNWE3MzRhNWE3MzRhNTI2 YjUyNWE3MzRhNWE2YjUyNWE2YjRhNTI2YjUyNWE2YjRhNTI2MzRhNTI2YjRhNTI2MzRhNTI1YTQy NTI1YTRhNTI1YTQyNGE1MjQyNGE1MjQyNDI0YTQyNGE0YTM5NDI0Mjg0OWM5YzhjOWNhNQ0KODQ5 Y2E1OGM5Y2E1ODQ5YzljOGM5Y2E1ODQ5Y2E1OGM5Y2E1ODQ5Y2E1OGM5Y2E1OGM5Y2E1OGNhNWE1 OGM5Y2E1OGM5Y2E1OGM5Y2E1OGNhNWFkOGM5Y2E1OTRhNWFkOGNhNWE1OTRhNWFkOGM5Y2E1OTRh NWFkOGNhNWE1OTQNCmE1YWQ4Y2E1YTU5NGE1YWQ4Y2E1YTU5NGE1YWQ4YzljYTU4Y2E1YWQ4Yzlj YTU4Y2E1YWQ4NDljYTU4Y2E1YTU4NDljYTU4Y2E1YTU4NDljYTU4Y2E1YTU4YzljYTU5NGE1YWQ5 NGE1YTU5NGE1YWQ5NGE1YTU5NGE1YTU5NDljDQphNTk0YTVhNTk0OWNhNTljYTVhNTk0OWNhNTlj YTVhZDljYTVhZGE1YWRiNWE1YWRiNWFkYjViZGFkYjViZGI1YmRjNmI1YmRjNmI1YzZjZWI1YzZj NmJkYzZjZWJkYzZjZWJkY2VjZWJkYzZjZWJkY2VkNmJkY2VjZWM2Y2VkNg0KYmRjZWNlYzZkNmQ2 YzZjZWQ2YzZkNmQ2YzZjZWQ2YzZkNmQ2YzZjZWQ2YzZkNmQ2YzZkNmQ2Y2VkNmRlYzZjZWQ2Y2Vk NmRlYzZkNmQ2YzZkNmRlYzZkNmQ2YzZkZWQ2YzZkNmQ2YzZkNmNlYmRjZWNlY2VkNmQ2Y2VkZWQ2 ZDYNCmRlZGVjNmNlY2VhZGI1YjU4Yzk0OTQ3MzczNzM1MjUyNTIzOTQyNDIyOTMxMzEyOTMxMzEy MTIxMjEyMTIxMjExODE4MTgxODE4MTgxODE4MTgyMTIxMjExODE4MTgxMDEwMTAwMDAwMDAxMDEw MTAxODE4MTgxODIxMjExODE4DQoxODE4MTgxODEwMTAxMDE4MTgxODA4MDgwODE4MTgxODIxMjEy MTI5MjkyOTE4MTgxODEwMTAxMDAwMDgwODAwMDgwODIxMjkyOTZiNzM2YmE1YWRhNWJkYzZiZGI1 YmRiZGJkY2VjNmM2Y2VjZWM2Y2VjZWI1YmRiNWI1YmRiNQ0KYWRiNWI1YWRiNWI1OWNhZGE1OWNh NWE1OTQ5YzljOTRhNTljOGM5Yzk0OTRhNTljOTRhNTljOWNhZGE1OTRhNWE1YTViNWI1YTViNWI1 YjViZGJkYjViZGJkYmRjNmM2YzZjNmM2Y2VjZWNlYzZjNmM2YzZjNmM2YmRiZGM2YmQNCmM2YzZi NWJkYzZhZGJkYzY5Y2FkYjU5NGFkYjU4YzljYWQ3Yjk0YTU2Yjg0OWM2Yjg0OTQ1MjZiODQ1YTZi OGM1MjYzODQ1MjZiOGM1MjYzODQ1MjZiOGM0YTYzODQ1MjYzOGM0YTVhODQ0YTYzODQ0YTVhODQ0 YTYzODQ0MjVhDQo3YjRhNjM3YjQyNWE3YjRhNjM3YjRhNWE3MzRhNjM3MzRhNWE3MzRhNWE3MzRh NWE2YjRhNWE3MzRhNTI2YjRhNWE3MzRhNTI2YjRhNWE2YjRhNTI2YjUyNWE2YjRhNTI2MzRhNTI2 MzQyNGE2MzRhNTI2MzQyNGE1YTQyNTI1YQ0KNDI0YTUyNDI0YTUyMzk0MjRhMzk0MjRhMzk0MjRh Mzk0MjRhOGM5Y2E1OGM5Y2E1OGNhNWE1OGM5Y2E1OGM5Y2E1OGM5Y2E1OGNhNWE1OGM5Y2E1OGNh NWFkOGM5Y2E1OGNhNWFkOGM5Y2E1OGNhNWFkOGM5Y2E1OTRhNWFkOGMNCmE1YTU5NGE1YWQ4Y2E1 YTU5NGE1YWQ4Y2E1YWQ5NGE1YWQ4Y2E1YTU5NGE1YWQ4Y2E1YWQ5NGE1YWQ4Y2E1YWQ5NGE1YWQ4 Y2E1YWQ5NGE1YWQ4YzljYTU5NGE1YWQ4YzljYTU4Y2E1YWQ4NDljYTU4Y2E1YWQ4YzljYTU4Y2E1 DQphNThjOWNhNTk0YTVhZDk0YTVhNTk0YWRhZDk0YTVhNTljYTVhZDk0YTVhNTk0YTVhNTk0YTVh NTljYTVhZDk0YTVhNTljYTVhZDljYTVhZGE1YWRiNWE1YWRiNWFkYjViZGFkYjViZGI1YmRjNmI1 YmRjNmJkYzZjZWI1YzZjZQ0KYmRjZWQ2YmRjZWNlYzZjZWQ2YmRjZWQ2YzZjZWQ2YmRjZWQ2YzZk NmQ2YzZjZWQ2Y2VkNmRlYzZkNmQ2Y2VkNmRlYzZkNmQ2Y2VkNmRlYzZkNmQ2Y2VkNmRlY2VkNmRl Y2VkZWRlY2VkNmRlY2VkZWRlY2VkNmRlY2VkZWRlY2UNCmRlZGVjZWRlZGVjNmRlZDZjZWRlZGVj ZWRlZDZjZWRlZDZjNmQ2ZDZjZWRlZDZjZWRlZGVjNmQ2ZDZiZGNlYzZiNWM2YzZhNWFkYWQ5NDlj OTQ2YjczNzM0YTUyNTIzMTM5MzkzMTMxMzEyMTI5MjkxODIxMjExMDE4MTgxODIxDQoxODEwMTgx MDA4MTAxMDAwMDAwMDA4MTAxMDEwMTgxMDIxMjEyMTE4MjEyMTE4MjExODEwMTAxMDEwMTgxODEw MTAxMDA4MTAxMDEwMTgxODIxMjkyOTI5MzEzMTM5NDI0MjRhNTI1MjczN2I3Yjg0OGM4Y2FkYjVi NWI1YzZiZA0KYzZkNmNlYmRjZWNlYmRjZWNlYmRjZWM2YmRjNmM2YTViNWFkYmRjNmJkYjVjNmJk YjVjNmJkYWRiNWI1YTViNWFkOWNhZGE1OWNhZGE1OTRhNTljOTRhNTljOTQ5YzljOWNhNWE1OWNh NWE1OWNhZGFkOWNhZGFkYWRiZGJkYjUNCmJkYmRiZGJkYzZiZGJkYzZjNmNlY2VjNmNlY2VjNmNl Y2ViZGM2YzZjNmM2Y2ViZGJkYzZiZGM2YzZhZGI1YmRhNWI1YmQ5NGE1YjU4Y2E1YjU3Yjk0YTU3 MzhjYTU2Yjg0OTQ1YTczOGM1MjZiODQ1YTZiOGM1MjZiODQ1MjZiDQo4YzUyNjM4NDUyNmI4YzRh NjM4NDUyNjM4YzRhNjM4NDUyNjM4YzRhNjM4NDRhNjM4NDRhNWE3YjRhNjM3YjQyNWE3MzRhNjM3 YjRhNWE3MzRhNjM3YjRhNWE3MzRhNWE3MzRhNWE2YjRhNWE3MzRhNWE2YjRhNWE2YjRhNTI2Yg0K NTI1YTZiNGE1MjZiNGE1MjZiNDI1MjYzNGE1MjYzNDI0YTVhNGE1MjVhNDI0YTUyNDI1MjVhNDI0 YTUyNDI0YTUyMzk0MjRhMzk0MjRhMzk0MjRhOGM5Y2E1OGNhNWFkOGM5Y2E1OGNhNWE1OGM5Y2E1 OGNhNWFkOGM5Y2E1OGMNCmE1YTU4YzljYTU4Y2E1YTU4YzljYTU4YzljYTU4YzljYTU4Y2E1YWQ4 YzljYTU4Y2E1YWQ4YzljYTU5NGE1YWQ4YzljYTU4Y2E1YWQ4YzljYTU5NGE1YWQ4YzljYTU4Y2E1 YWQ4Y2E1YTU5NGE1YWQ4YzljYTU4Y2E1YWQ4YzljDQphNTk0YTVhZDhjOWNhNThjYTVhZDhjOWNh NThjYTVhZDhjOWNhNThjOWNhNThjOWNhNThjYTVhZDhjOWNhNTk0YTVhZDk0YTVhNTljYTVhZDk0 YTVhNTljYTVhNTk0YTVhNTljYTVhNTk0OWNhNTljYTVhNTljYTVhZGE1YWRiNQ0KYTVhZGI1YWRi NWJkYWRiNWJkYjViZGM2YjViZGM2YmRjNmNlYmRjNmNlYzZjZWQ2YmRjZWQ2YzZjZWQ2YzZjZWQ2 Y2VkNmRlYzZjZWQ2Y2VkNmRlYzZkNmQ2Y2VkNmRlYzZkNmQ2Y2VkNmRlY2VkNmRlY2VkZWRlY2Vk NmRlY2UNCmRlZGVjZWRlZGVkNmRlZTdjZWQ2ZGVkNmRlZTdjZWRlZGVkNmRlZTdjZWRlZGVkNmRl ZTdjZWRlZGVjZWRlZGVjZWRlZGVkNmU3ZTdkNmU3ZTdkNmU3ZTdjZWRlZGVkNmU3ZTdjZWRlZGVj ZWRlZDZiZGNlY2ViZGM2YzZiNWJkDQpiZGE1YjVhZDhjOTQ5NDdiODQ4NDUyNWE1YTRhNTI1MjM5 NDIzOTMxMzkzOTI5MzEzMTIxMjkyOTA4MTAxMDAwMDAwMDAwMDAwMDAwMDgwODAwMDAwMDAwMDAw MDAwMDAwMDA4MTAxMDE4MTgxODI5MzEzMTM5NDI0MjYzNmI2Mw0KOGM5NDk0YWRiNWI1YmRjNmJk YmRjNmM2YjVjNmM2YmRjNmM2ZDZlN2U3Y2VkZWQ2YmRjZWM2YmRjZWM2YmRjNmM2YmRjZWNlYmRj NmM2YmRjZWNlYjVjNmJkYmRjNmJkYjViZGI1YWRiZGI1YTViNWFkYTVhZGFkOTRhNTljOTQNCmE1 OWM5NDljOWM5NGE1OWM5NGE1OWM5Y2E1YTU5Y2E1YTVhNWI1YWRhNWI1YjViNWJkYmRiNWJkYmRj NmM2YzZjNmM2YzZjZWNlY2VjNmM2YzZjNmM2YzZiZGJkYzZiZGJkYzZiNWJkYzZhZGI1YzY5Y2Fk YjU5NGE1YjU4YzljDQphZDg0OWNhZDZiODQ5YzZiODQ5NDVhNzM4YzVhNzM4YzUyNjM4NDUyNmI4 YzUyNjM4NDUyNmI4YzRhNjM4NDUyNjM4YzRhNjM4NDUyNjM4YzRhNWE4NDRhNjM4NDRhNWE3YjRh NjM3YjQyNWE3MzQyNWE3MzQyNWE3MzRhNWE3Mw0KNDI1YTczNGE1YTczNDI1YTZiNGE1YTczNDI1 MjZiNGE1YTczNDI1MjZiNGE1YTZiNDI1MjYzNGE1MjYzNDI1MjYzNDI1MjYzNDI0YTVhNDI0YTVh Mzk0YTUyMzk0YTVhMzk0MjUyMzk0MjUyMzE0MjRhMzk0MjRhMzEzOTQyMzENCjM5NDI5NGE1YWQ4 Y2E1YTU5NGE1YWQ4YzljYTU5NGE1YWQ4Y2E1YTU5NGE1YWQ4YzljYTU4Y2E1YWQ4YzljYTU4Y2E1 YWQ4YzljYTU5NGE1YWQ4Y2E1YTU5NGE1YWQ4YzljYTU5NGFkYjU5NGE1YWQ5NGFkYWQ5NGE1YWQ5 NGFkDQpiNTk0YTVhZDk0YWRhZDk0YTVhZDk0YWRiNTk0YTVhZDk0YWRhZDk0YTVhZDk0YWRiNTk0 YTVhZDk0YWRhZDk0YTVhZDk0YWRhZDk0YTVhZDk0YTVhZDhjYTVhZDk0YTVhZDk0YTVhZDljYWRh ZDk0YTVhZDljYWRhZDljYTVhZA0KOWNhZGFkOWNhNWFkYTVhZGFkOWNhNWFkYTVhZGFkOWNhNWFk YWRiNWJkYTViNWJkYWRiZGJkYWRiNWJkYjVjNmM2YjVjNmM2YmRjZWQ2YmRjZWQ2Y2VkNmRlY2Vk NmRlY2VkNmRlY2VkNmRlZDZkZWU3Y2VkZWU3ZDZkZWU3Y2UNCmRlZGVkNmRlZTdkNmRlZTdkNmRl ZTdkNmRlZTdkNmU3ZTdkNmRlZTdkNmU3ZTdkNmRlZTdkZWU3ZWZkNmU3ZTdkZWU3ZWZkNmU3ZTdk ZWU3ZWZkNmU3ZTdkZWU3ZWZkNmU3ZTdkZWVmZWZkNmU3ZTdkNmU3ZTdkNmU3ZTdkZWVmDQplZmQ2 ZTdlN2RlZWZlN2RlZTdlN2U3ZjdlZmRlZTdlN2Q2ZTdkZWNlZDZkNmQ2ZTdkZWQ2ZGVkZWNlZGVk ZWJkY2VjZWNlZDZkNmM2Y2VjZWJkYzZjNmI1YmRiZGI1YmRiZGE1YWRhZDljYTU5YzhjOTQ4YzZi NzM2YjYzNmI2Yg0KNmI3MzczNzM3YjdiODQ4YzhjOTQ5YzljYWRiNWI1YjViZGJkZDZkZWRlZDZk ZWRlZGVlN2U3Y2VkZWRlY2VkNmQ2YzZjZWNlY2VkNmQ2Y2VkNmQ2YzZkNmQ2YzZkNmQ2Y2VkZWRl Y2VkZWRlYzZkNmQ2YjVjZWM2YzZkNmQ2Y2UNCmRlZGViZGNlYzZiZGNlYzZiZGM2YmRiNWJkYjVh ZGJkYjVhNWI1YWQ5Y2FkYTU5Y2E1YTU5Y2E1YTU5NGE1YTU5Y2E1YTU5NGE1YTU5Y2FkYWQ5Y2Fk YWRhZGJkYjVhZGJkYmRiZGJkYzZiZGJkYzZjZWNlY2VjZWM2Y2VjZWNlDQpjZWM2YzZjNmJkYzZj NmJkYmRjNmJkYmRjNmFkYjViZGE1YWRiZDk0YTViNTk0YTViNTdiOTRhNTczOGNhNTZiODQ5NDVh NzM4YzUyNmI4YzUyNmI4YzUyNjM4NDUyNmI4YzUyNmI4YzUyNjM4YzRhNjM4NDUyNjM4YzRhNjM4 NA0KNTI2MzhjNGE2Mzg0NGE2Mzg0NGE1YTdiNGE2MzdiNDI1YTczNDI1YTczNDI1YTczNDI1YTcz NDI1YTZiNGE1YTczNDI1YTZiNGE1YTczNDI1YTZiNGE1YTZiNDI1MjZiNGE1YTZiNDI1MjYzNGE1 MjZiNDI0YTYzNDI1MjYzMzkNCjRhNWEzOTRhNWEzOTQyNTIzOTQyNTIzMTQyNGEzMTQyNTIzMTM5 NGEzMTM5NGEyOTM5NDI4Y2E1YTU5NGE1YWQ4Y2E1YWQ5NGE1YWQ4Y2E1YTU5NGE1YWQ4Y2E1YWQ5 NGE1YWQ4Y2E1YWQ5NGE1YWQ4Y2E1YWQ5NGE1YWQ4Y2E1DQphZDk0YTVhZDk0YTVhZDk0YWRhZDk0 YTVhZDljYWRiNTk0YWRhZDljYWRiNTk0YTVhZDljYWRiNTk0YWRhZDljYWRiNTk0YWRhZDljYWRi NTk0YWRiNTljYWRiNTk0YWRhZDljYWRiNTk0YWRiNTljYWRiNTk0YTVhZDljYWRiNQ0KOTRhNWFk OWNhZGI1OTRhNWFkOWNhZGI1OWNhZGFkYTVhZGI1OWNhZGFkYTVhZGI1OWNhZGFkYTVhZGI1YTVh NWFkYTVhZGFkYTVhZGFkYTVhZGI1YWRiNWJkYWRiZGM2YjViZGM2YjVjNmNlYjViZGM2YmRjZWNl YzZjZWQ2Y2UNCmQ2ZGVjZWQ2ZGVjZWRlZTdjZWRlZGVkNmRlZTdkNmRlZTdkNmRlZTdkNmRlZTdk NmU3ZWZkNmRlZTdkZWU3ZWZkNmU3ZTdkZWU3ZWZkNmU3ZTdkZWU3ZWZkZWU3ZWZkZWVmZWZkNmU3 ZTdkZWU3ZWZkZWU3ZWZkZWVmZWZkZWU3DQplZmRlZWZlZmRlZTdlZmRlZWZlZmRlZWZlZmU3Zjdl ZmRlZWZlZmRlZWZlZmQ2ZTdlN2RlZTdlN2Q2ZTdlN2RlZTdlN2RlZWZlN2U3ZjdlZmRlZWZlZmRl ZWZlZmRlZWZlZmU3ZjdmN2RlZWZlZmRlZTdlN2U3ZWZlZmU3ZWZlZg0KZGVlZmU3ZTdlZmVmZTdl ZmVmZTdmN2VmZGVlZmU3ZGVlN2U3Y2VkZWQ2ZDZlN2RlZGVlN2U3ZTdlZmVmZGVlZmU3ZTdlZmVm ZGVlZmU3ZTdlZmVmYzZkNmQ2Y2VkZWQ2Y2VkZWRlZDZlN2U3ZDZkZWRlZDZlN2U3ZDZlN2U3ZDYN CmU3ZTdjZWRlZGVjZWRlZDZjNmQ2Y2VjNmRlZDZjZWRlZGVjZWU3ZTdiZGQ2Y2ViNWM2YzZiZGNl YzZiZGNlYzZiNWM2YmRiNWM2YmRhZGJkYjVhNWI1YWQ5Y2FkYTVhNWFkYWQ5NGE1OWM5Y2E1YTU5 NGE1YTU5Y2FkYTU5NGE1DQphNTljYWRhZGE1YjVhZGI1YmRiZGI1YjViZGM2YzZjNmM2YzZjNmNl Y2VjZWM2YzZjNmM2YzZjNmJkYmRjNmJkYzZjNmI1YmRiZGFkYjViZDljYWRiNTljYWRiNTg0OWNh ZDg0OWNhZDczOGM5YzZiODQ5YzUyNmI4NDVhNmI4Yw0KNTI2Mzg0NTI2YjhjNTI2Mzg0NTI2Yjhj NGE2Mzg0NTI2MzhjNGE2Mzg0NTI2MzhjNGE2Mzg0NGE2Mzg0NDI1YTdiNGE1YTdiNDI1YTczNDI1 YTczMzk1MjZiNDI1YTczMzk1MjZiNDI1YTczMzk1MjZiNDI1YTZiNDI1MjZiNDINCjVhNmI0MjUy NjM0MjUyNmI0MjUyNjM0YTVhNmI0MjUyNjM0MjUyNjM0MjRhNjM0MjUyNjMzOTRhNWEzOTRhNWEz MTQyNTIzOTQyNTIzMTM5NGEzMTQyNGEyOTM5NGEzMTQyNGE5NGFkYjU5NGE1YWQ5Y2FkYjU5NGE1 YWQ5NGFkDQpiNTk0YTVhZDljYWRiNTk0YTVhZDljYWRiNTk0YWRiNTljYWRiNTljYWRiNTljYWRi NTljYWRiNTljYjViNTljYWRiNTljYjViZDljYWRiNWE1YjViZDljYWRiNTljYjViZDljYWRiNWE1 YjViZDljYWRiNTljYjViZDljYWRiNQ0KYTViNWJkOWNiNWI1YTViNWJkOWNhZGI1YTViNWJkOWNi NWJkYTViNWJkOWNhZGI1YTViNWJkOWNhZGI1YTViNWJkOWNhZGI1YWRiNWJkYTViNWI1YTViNWI1 YTVhZGI1YWRiNWI1YTVhZGI1YWRiNWI1YTVhZGI1YWRiNWI1YWQNCmI1YjViNWJkYzZiNWJkYzZi ZGM2Y2ViZGM2Y2ViZGNlZDZjNmNlZDZjZWQ2ZGVjZWQ2ZGVkNmRlZTdkNmRlZTdkNmU3ZWZkNmRl ZTdkZWU3ZWZkNmU3ZTdkZWU3ZWZkZWU3ZWZkZWVmZWZkZWU3ZWZkZWVmZWZkZWVmZWZlN2VmDQpm N2RlZWZlZmU3ZWZmN2RlZWZlZmU3ZWZmN2RlZWZlZmU3ZWZmN2RlZWZlZmU3ZWZmN2RlZWZlZmU3 ZjdmN2U3ZWZlZmRlZWZlZmU3ZjdlZmVmZmZmZmU3ZjdlZmU3ZWZlZmU3ZWZlZmU3ZjdmN2U3ZWZl ZmRlZWZlZmU3ZjdlZg0KZTdmN2Y3ZGVlZmVmZGVlZmVmZGVlZmVmZGVmN2VmZGVlZmU3ZTdmN2Vm ZGVlZmVmZTdlZmVmZGVlZmU3ZTdlZmVmZTdlZmVmZWZmN2Y3ZTdmN2VmZWZmN2Y3ZTdlZmVmZTdl ZmVmZGVlZmU3ZTdlZmVmZGVlN2U3ZGVlN2U3ZDYNCmU3ZGVlN2VmZWZkZWU3ZTdkZWU3ZTdkNmU3 ZTdkZWU3ZTdkNmU3ZTdkZWVmZTdkNmU3ZTdjNmRlZDZkNmVmZTdkZWY3ZWZjZWRlZGViZGQ2ZDZj NmQ2ZDZjZWU3ZGVjNmRlZDZjNmQ2Y2ViZGNlYzZjNmNlYzZiNWM2YmRiNWM2DQpiZGFkYjVhZGFk YjViNWE1YWRhZDljYWRhNTljYTVhNTljYWRhNTk0YTVhNTljYWRhNTljYWRhZGFkYjViNWFkYmRi NWJkYmRjNmJkYmRjNmNlY2VjZWNlY2VjZWNlY2VjZWM2YzZjNmM2YzZjNmJkYmRjNmJkYmRjNmFk YjViZA0KYTViNWJkOTRhNWI1OGNhNWI1N2I5NGE1NzM4Y2E1NmI4NDljNWE3MzhjNTI2Yjg0NWE2 YjhjNTI2Yjg0NTI2YjhjNTI2Mzg0NTI2YjhjNGE2Mzg0NTI2MzhjNGE2Mzg0NTI2MzhjNGE2Mzg0 NGE2Mzg0NDI1YTdiNGE2MzdiNDINCjVhNzM0MjVhNzMzOTVhNmI0MjVhNzMzOTUyNmI0MjVhNmIz OTUyNmI0MjVhNzM0MjUyNmI0MjVhNmI0MjUyNmI0YTVhNmI0YTVhNmI0YTVhNmI0MjUyNjM0YTUy NmI0MjUyNjM0MjUyNjM0MjUyNjM0MjUyNjMzOTRhNWEzOTRhNWEzMTQyNTIzOTRhNTIzMTQyNTIw YzAwMDAwMDQwMDkyOTAwYWEwMDAwMDAwMDAwMDAwMDdlMDBjODAwMDAwMDAwMDAwNDAwMDAwMDI3 MDFmZmZmMDMwMDAwMDAwMDAwfX19e1xydGxjaFxmY3MxIFxhZjMxNTA2XGFmczE4IA0KXGx0cmNo XGZjczAgXGZzMThcY2YxOVxjaHNoZG5nMFxjaGNmcGF0MFxjaGNicGF0OFxpbnNyc2lkMjI0Mjkx MlxjaGFycnNpZDEwNzYxNDcyIA0KXHBhciB9e1xydGxjaFxmY3MxIFxhZjMxNTA2IFxsdHJjaFxm Y3MwIFxiXGNmMThcY2hzaGRuZzBcY2hjZnBhdDBcY2hjYnBhdDhcaW5zcnNpZDIyNDI5MTJcY2hh cnJzaWQxMzc5MjUzMyBcaGljaFxhZjMxNTA2XGRiY2hcYWYzMTUwNVxsb2NoXGYzMTUwNiBSQkkg R292ZXJub3IgUmFnaHVyYW0gUmFqYW59e1xydGxjaFxmY3MxIFxhZjMxNTA2IFxsdHJjaFxmY3Mw IA0KXGJcY2YxOFxjaHNoZG5nMFxjaGNmcGF0MFxjaGNicGF0OFxpbnNyc2lkMTA3NjE0NzJcY2hh cnJzaWQxMzc5MjUzMyAufXtccnRsY2hcZmNzMSBcYWYzMTUwNiBcbHRyY2hcZmNzMCBcYlxjZjE4 XGNoc2hkbmcwXGNoY2ZwYXQwXGNoY2JwYXQ4XGluc3JzaWQyMjQyOTEyXGNoYXJyc2lkMTM3OTI1 MzMgXGhpY2hcYWYzMTUwNlxkYmNoXGFmMzE1MDVcbG9jaFxmMzE1MDYgIH17XHJ0bGNoXGZjczEg XGFmMzE1MDZcYWZzMTggXGx0cmNoXGZjczAgDQpcZnMxOFxjZjE1XGxhbmcxMDMzXGxhbmdmZTE2 MzkzXGxhbmducDEwMzNcaW5zcnNpZDE0Njk1NTY0XGNoYXJyc2lkMTA3NjE0NzIgXGhpY2hcYWYz MTUwNlxkYmNoXGFmMzE1MDVcbG9jaFxmMzE1MDYgVGhlIGluZm9yXGhpY2hcYWYzMTUwNlxkYmNo XGFmMzE1MDVcbG9jaFxmMzE1MDYgDQptYXRpb24gY29udGFpbmVkIGluIHRoaXMgZS1tYWlsIGFu ZCBhbnkgYXR0YWNobWVudHMgdGhlcmUgdG8gKCJlLW1haWwiKSBpcyBzZW50IGJ5IHRoZSBSZXNl cnZlIEJhbmsgb2YgSW5kaWEgKFJCSSkgYW5kIGlzIGludGVuZGVkIHRvIGJlIGNvbmZpZGVudGlh bCBhbmQgZm9yIHRoZSB1c2Ugb2Ygb25seSB0aGUgaW5kaXZpZHVhbCBvciBlbnRpdHkgbmFtZWQg YWJvdmUuIFRoZSBpbmZvcm1hdGlvbiBtYXkgYmUgcHJvdGVjdGVkIGJ5IGZlZGVyYWwNClxoaWNo XGFmMzE1MDZcZGJjaFxhZjMxNTA1XGxvY2hcZjMxNTA2ICBcaGljaFxhZjMxNTA2XGRiY2hcYWYz MTUwNVxsb2NoXGYzMTUwNiANCmFuZCBzdGF0ZSBwcml2YWN5IGFuZCBkaXNjbG9zdXJlcyBhY3Rz IG9yIG90aGVyIGxlZ2FsIHJ1bGVzLiBJZiB0aGUgcmVhZGVyIG9mIHRoaXMgbWVzc2FnZSBpcyBu b3QgdGhlIGludGVuZGVkIHJlY2lwaWVudCwgeW91IGFyZSBub3RpZmllZCB0aGF0IHJldGVudGlv biwgZGlzc2VtaW5hdGlvbiwgZGlzdHJpYnV0aW9uIG9yIGNvcHlpbmcgb2YgdGhpcyBlLW1haWwg aXMgc3RyaWN0bHkgcHJvaGliaXRlZC59e1xydGxjaFxmY3MxIFxhZjMxNTA2IA0KXGx0cmNoXGZj czAgXGJcY2YxOFxjaHNoZG5nMFxjaGNmcGF0MFxjaGNicGF0OFxpbnNyc2lkMTQ2OTU1NjRcY2hh cnJzaWQxMzc5MjUzMyANClxwYXIgfVxwYXJkIFxsdHJwYXJccWwgXGxpMFxyaTBcc2EyMDBcc2wy NzZcc2xtdWx0MVxub3dpZGN0bHBhclx3cmFwZGVmYXVsdFxmYWF1dG9ccmluMFxsaW4wXGl0YXAw IHtccnRsY2hcZmNzMSBcYWYzMTUwNlxhZnMxOCBcbHRyY2hcZmNzMCBcZnMxOFxsYW5nOVxsYW5n ZmUxNjM5M1xsYW5nbnA5XGluc3JzaWQxNDY5NTU2NFxjaGFycnNpZDEwNzYxNDcyIA0KXHBhciB9 e1wqXHRoZW1lZGF0YSA1MDRiMDMwNDE0MDAwNjAwMDgwMDAwMDAyMTAwODI4YWJjMTNmYTAwMDAw MDFjMDIwMDAwMTMwMDAwMDA1YjQzNmY2ZTc0NjU2ZTc0NWY1NDc5NzA2NTczNWQyZTc4NmQ2Y2Fj OTFjYjZhYzMzMDEwNDVmNzg1ZmU4M2QwYjZkOA0KNzJiYTI4YTVkOGNlYTI0OTc3N2QyY2QyMGYx OGU0YjEyZDZhOGY4NDM0MDljOWRmNzdlY2I4NTBiYTA4MmQ3NDIzMTA2MmNlOTk3YjU1YWU4ZmUz YTAwZTE4OTNmMzU0ZTk1NTVlNjg4NTY0N2RlM2E4YWJmNGZiZWUyOWJiZDcNCjJhMzE1MDAzODMy N2FjZjQwOTkzNWVkN2Q3NTdlNWVlMTQzMDI5OTlhNjU0ZTk5ZTM5M2MxODkzNmM4ZjIzYTRkYzA3 MjQ3OTY5N2QxYzgxZTUxYTNiMTNjMDdlNDA4N2U2YjYyOGVlOGNmNWM0NDg5Y2YxYzRkMDc1Zjky YTBiDQo0NGQ3YTA3YTgzYzgyZjMwOGFjN2IwYTBmMGZiZjkwYzI0ODA5ODBiNThhYmM3MzM2MTVh YTJkMjEwYzJlMDJjYjA0NDMwMDc2YTdlZTgzM2RmYjZjZTYyZTNlZDdlMTQ2OTNlODMxN2Q4Y2Qw NDMzYmY1YzYwZjUzZmVhMmZlNw0KMDY1YmQ4MGZhY2I2NDdlOWUyNWM3ZmM0MjFmZDJkZGI1MjZi MmU5MzczZmVkNGJiOTAyZTE4MmU5N2I3YjQ2MWU2YmZhZDNmMDEwMDAwZmZmZjAzMDA1MDRiMDMw NDE0MDAwNjAwMDgwMDAwMDAyMTAwYTVkNmE3ZTdjMDAwMDANCjAwMzYwMTAwMDAwYjAwMDAwMDVm NzI2NTZjNzMyZjJlNzI2NTZjNzM4NDhmY2Y2YWMzMzAwYzg3ZWY4NWJkODNkMTdkNTFkMmMzMTgy NTc2MmZhNTkwNDMyZmEzN2QwMGUxMjg3ZjY4MjIxYmRiMWJlYmRiNGZjNzA2MGFiYjA4DQo4NGE0 ZWZmN2E5M2RmZWFlOGJmOWUxOTRlNzIwMTY5YWFhMDZjM2UyNDMzZmNiNjhlMTc2M2RiZjdmODJj OTg1YTRhNzI1MDg1Yjc4NzA4NmEzN2JkYmI1NWZiYzUwZDFhMzNjY2QzMTFiYTU0OGI2MzA5NTEy MGY4OGQ5NGZiYw0KNTJhZTQyNjRkMWM5MTBkMjRhNDVkYjM0NjIyNDdmYTc5MTcxNWZkNzFmOTg5 ZTE5ZTAzNjRjZDNmNTE2NTJkNzM3NjBhZThmYThjOWZmYjNjMzMwY2M5ZTRmYzE3ZmFmMmNlNTQ1 MDQ2ZTM3OTQ0YzY5ZTQ2MmExYTgyZmUzNTMNCmJkOTBhODY1YWFkNDFlZDBiNWI4ZjlkNmZkMDEw MDAwZmZmZjAzMDA1MDRiMDMwNDE0MDAwNjAwMDgwMDAwMDAyMTAwNmI3OTk2MTY4MzAwMDAwMDhh MDAwMDAwMWMwMDAwMDA3NDY4NjU2ZDY1MmY3NDY4NjU2ZDY1MmY3NDY4DQo2NTZkNjU0ZDYxNmU2 MTY3NjU3MjJlNzg2ZDZjMGNjYzRkMGFjMzIwMTA0MGUxN2RhMTc3OTBkOTM3NjNiYjI4NDU2MmIy Y2JhZWJiZjYwMDQzOWMxYTQxYzdhMGQyOWZkYmQ3ZTVlMzgzMzdjZWRmMTRkNTliNGIwZDU5MmM5 Yw0KMDcwZDhhNjVjZDJlODhiN2YwN2MyY2E3MWJhOGRhNDgxY2M1MmM2Y2UxYzcxNWU2ZTk3ODE4 YzliNDhkMTNkZjQ5Yzg3MzUxN2QyM2Q1OTA4NWFkYjVkZDIwZDZiNTJiZDUyMWVmMmNkZDVlYjky NDZhM2Q4YjQ3NTdlOGQzZjcNCjI5ZTI0NWViMmIyNjBhMDIzOGZkMDEwMDAwZmZmZjAzMDA1MDRi MDMwNDE0MDAwNjAwMDgwMDAwMDAyMTAwMzBkZDQzMjlhODA2MDAwMGE0MWIwMDAwMTYwMDAwMDA3 NDY4NjU2ZDY1MmY3NDY4NjU2ZDY1MmY3NDY4NjU2ZDY1DQozMTJlNzg2ZDZjZWM1OTRmNmZkYjM2 MTRiZjBmZDg3NzIwNzQ2ZjYzMjc3NjFhMDc3NThhZDhiMTliMmQ0ZDFiYzQ2ZTg3MWU2OTg5OTZk ODUwYTI0MGQyNDk3ZDFiZGFlMzgwMDFjM2JhNjE4NzE1ZDg2ZDg3NjE1YjgxMTZkOA0KYTVmYjM0 ZDkzYTZjMWRkMGFmYjA0NzUyOTJjNTU4NWU5MjM2ZDg4YWFkM2UyNDEyZjllM2ZiZmYxZTFmYTlh YmQ3ZWVjNzBjMWQxMjIxMjk0ZmRhNWVmZDcyY2Q0MzI0ZjE3OTQwOTNiMGVkZGQxZWY2MmZhZDc5 NDgyYTljMDQNCjk4ZjE4NGI0YmQyOTkxZGViNThkZjdkZmJiOGFkNzU1NDQ2MjgyNjA3ZDIyZDc3 MWRiOGI5NDRhZDc5Nzk2YTQwZmMzNTg1ZWU2Mjk0OTYwNmVjYzQ1OGMxNWJjOGE3MDI5MTBmODA4 ZThjNjZjNjliOTU2NWI1ZDhhMzE0ZDNjDQo5NGUwMThjOGRlMWE4ZmE5NGZkMDUwOTNmNDM2NzJl MjNkMDZhZjg5OTI3YWMwNjc2MmEwNDkxMzY3ODVjMTA2MDc3NThkOTA1M2Q5NjUwMjFkNjJkNmY2 ODA0ZmMwOGY4NmU0YmVmMjEwYzM1MmMxNDRkYmFiOTk5ZmI3YjQ3MQ0KNzUwOWFmNjc4Yjk4NWFi MGI2YjRhZTZmN2VkOWJhNmM0MTcwYjA2Yzc4OGE3MDU0MzBhZGY3MWJhZDJiNWIwNTdkMDM2MDZh MWVkN2ViZjViYWJkN2E0MWNmMDBiMGVmODNhNjU2OTYzMmNkNDY3ZmFkZGVjOTY5OTY0MGY2NzEN CjllNzZiN2Q2YWMzNTVjN2M4OWZlY2E5Y2NjYWQ0ZWE3ZDM2YzY1YjI1OGEyMDY2NDFmMWI3M2Y4 YjVkYTZhNjM3M2Q5YzExYjkwYzUzN2U3ZjA4ZGNlNjZiN2JiZWFlMDBkYzhlMjU3ZTdmMGZkMmJh ZGQ1ODY4YjM3YTA4OGQxDQplNDYwMGVhZDFkZGFlZjY3ZDQwYmM4OThiM2VkNGFmODFhYzBkNzZh MTk3Yzg2ODI2ODI4YTI0YmIzMThmMzQ0MmQ4YWI1MThkZmUzYTIwZjAwMGQ2NDU4ZDEwNGE5Njk0 YWM2ZDg4NzI4ZWVlMjc4MjQyOGQ2MGNmMDNhYzFhNQ0KMTkzYmU0Y2JiOTIxY2QwYjQ5NWZkMDU0 YjViZDBmNTMwYzE5MzFhM2Y3ZWFmOWY3YWY5ZTNmNDVjNzBmOWUxZDNmZjhlOWY4ZTFjM2UzMDcz ZjVhNDJjZWFhNmQ5Yzg0ZTU1NTJmYmZmZGVjY2ZjNzFmYTMzZjllN2VmM2YyZDENCjE3ZDU3ODU5 YzZmZmZhYzMyN2JmZmNmYzc5MzUxMGQyNjcyNmNlOGIyZjlmZmNmNmVjYzk4YmFmM2VmZGZkYmI0 NzE1ZjA0ZDgxNDc2NWY4OTBjNjQ0YTI5YmU0MDhlZGYzMTgxNDMzNTY3MTI1MjcyMzcxYmUxNWMz MDhkM2YyDQo4YWNkMjQ5NDM4YzE5YTRiMDVmZDllOGExY2Y0Y2QyOTY2OTk3NzFjMzkzYWM0YjVl MDFkMDFlNWEzMGE3ODdkNzJjZjExNzgxMDg5ODlhMjE1OWM3N2EyZDgwMWVlNzJjZTNhNWM1NDVh NjE0N2YzMmE5OTc5Mzg0OWMyNmFlNg0KNjI1MmM2ZWQ2MzdjNThjNWJiOGIxM2M3YmZiZDQ5MGE3 NTMzMGY0YjQ3ZjE2ZTQ0MWMzMWY3MTg0ZTE0MGU0OTQyMTRkMjczZmM4MDkwMGFlZGVlNTJlYWQ4 NzU5N2ZhODI0YjNlNTZlODJlNDUxZDRjMmI0ZDMyYTQyMzI3OWENCjY2OGJiNjY5MGM3ZTk5NTZl OTBjZmU3NjZjYjM3YjA3NzUzOGFiZDI3YThiMWNiYTQ4YzgwYWNjMmE4NDFmMTJlNjk4ZjEzYTll MjgxYzU3OTExY2UyOTg5NTBkN2UwM2FiYTg0YWM4YzE1NGY4NjU1YzRmMmFmMDc0NDgxODQ3DQpi ZDgwNDg1OWI1ZTY5NjAwN2Q0YjRlZGZjMTUwYjEyYWRkYmVjYmE2YjE4YjE0OGExZTU0ZDFiYzgx MzkyZjIzYjdmODQxMzdjMjcxNWE4NTFkZDAyNDJhNjMzZjkwMDcxMGEyMThlZDcxNTUwNWRmZTU2 ZTg2ZTg3N2YwMDM0ZQ0KMTZiYWZiMGUyNThlYmI0ZmFmMDZiNzY5ZTg4ODM0MGIxMDNkMzMxMTE1 YmViYzRlYjgxM2JmODMyOTFiNjM2MjRhMGQxNDc1YTc1NmM3MzRmOWJiYzJjZDI4NTQ2ZWNiZTFl MjBhMzc5NGNhMTc1ZjNmYWU5MGZiNmQyZGQ5OWINCmIwN2I1NWU1Y2NmNjg5NDJiZDA4NzdiMjNj NzdiOTA4ZThkYjVmOWRiN2YwMjRkOTIzOTAxMGYzNWJkNGJiZTJmY2FlMzg3YmZmZjllMmJjMjg5 ZjJmYmUyNGNmYWEzMDE0NjhkZDhiZDg0NmRiYjRkZGYxYzJhZTdiNGMxOTFiDQphODI5MjMzN2E0 NjliYzI1ZWMzZDQxMWYwNmY1M2E3M2UyMjRjNTI5MmM4ZGUwNTE2NzMyMzA3MDcwYTFjMDY2MGQx MjVjN2Q0NDU1MzQ4ODcwMGE0ZDdiZGRkMzQ0NDI5OTkxMGUyNTRhYjk4NGMzYTIxOWFlYTRhZGYx ZDBmOA0KMmI3YmQ0NmNlYTQzODhhZDFjMTJhYjVkMWVkOGUxMTUzZDljOWYzNTBhMzI0NmFhZDAx YzY4NzM0NjJiOWFjMDU5OTlhZDVjYzk4ODgyNmVhZmMzYWNhZTg1M2EzM2I3YmExMWNkMTQ0NTg3 NWJhMWIyMzZiMTM5OTQ4M2M5MGINCmQ1NjBiMGIwMjYzNDM1MDg1YTIxYjBmMjJhOWNmOTM1NmIz OGVjNjA0NjAyNmQ3N2ViYTNkYzJkYzYwYjE3ZTkyMjE5ZTE4MDY0M2VkMjdhY2ZmYmE4NmU5Yzk0 YzdjYTljMjI1YTBmMWIwY2ZhZTA3ODhhZDU0YWRjNWE5YWVjDQoxYjcwM2I4YjkzY2FlYzFhMGJk OGU1ZGU3YjEzMmZlNTExM2NmMzEyNTAzYjk5OGUyYzI5MjcyNzRiZDA1MWRiNmIzNTk3OWIxZWYy NzFkYWY2YzY3MDRlODZjNzM4MDVhZjRiZGQ0NzYyMTZjMjY1OTNhZjg0MGRmYjUzOTNkOQ0KNjRm OWNjOWJhZDVjMzEzNzA5ZWE3MGY1NjFlZDNlYTdiMDUzMDc1MjIxZDUxNjk2OTEwZDBkMzM5NTg1 MDA0YjM0MjcyYmZmNzIxM2NjN2E1MTBhNTQ1NGEzYjM0OWIxYjIwNmMxZjBhZjQ5MDE3Njc0NWQ0 YmM2NjNlMmFiYjINCmIzNGIyM2RhNzZmNjM1MmJhNTdjYTI4ODE4NDRjMTExMWFiMTg5ZDhjN2Uw N2UxZGFhYTA0ZjQwMjU1Yzc3OTg4YWEwNWZlMDZlNGU1YmRiNGNiOWM1Mzk0YmJhZjI4ZDk4YzFk OTcxY2NkMjA4NjdlNTU2YTc2ODllYzkxNjZlDQowYTUyMjE4Mzc5MmI4OTA3YmE1NWNhNmU5NDNi YmYyYTI2ZTUyZjQ4OTU3MjE4ZmZjZjU0ZDFmYjA5ZGMzZWFjMDRkYTAzM2U1YzBkMGI4Yzc0YTZi NDNkMmU1NGM0YTEwYWE1MTFmNWZiMDIxYTA3NTMzYjIwNWFlMDdlMTdhNg0KMjFhOGUwODJkYWZj MTdlNDUwZmZiNzM5Njc2OTk4YjQ4NjQzYTRkYWE3MjExMjE0ZjYyMzE1MDk0MmY2YTAyYzk5ZTgz Yjg1NTgzZGRiYmIyYzQ5OTYxMTMyMTE1NTEyNTdhNjU2ZWMxMTM5MjQ2Y2E4NmJlMGFhZGVkYjNk MTQNCjQxYTg5YjZhOTI5NTAxODMzYjE5N2ZlZTdiOTY0MWEzNTAzNzM5ZTU3YzczMmE1OWIxZjdk YTFjZjhhNzNiMWY5YmNjYTA5NDViODc0ZDQzOTNkYmJmMTBiMTY4MGY2NmJiYWE1ZDZmOTZlNzdi NmY1OTExM2QzMTZiYjMxYTc5DQo1NjAwYjNkMjU2ZDBjYWQyZmUzNTQ1MzhlNzU2NmIyYmQ2OWNj NmNiY2Q1YzM4ZjBlMmJjYzYzMDU4MzQ0NDI5ZGMyMTIxZmQwN2Y2M2YyYTdjNjZiZjc2ZTgwZDc1 YzhmN2ExYjYyMmY4NzhhMTg5NDFkODQwNTQ1ZmIyOGQwNw0KZDIwNWQyMGU4ZWEwNzFiMjgzMzY5 ODM0Mjk2YmRhYWM3NWQyNTZjYjM3ZWIwYmVlNzQwYmJlMjc4Y2FkMjUzYjhiYmZjZjY5ZWNhMjM5 NzNkOTM5Yjk3ODkxYzZjZTJjZWNkOGRhOGUyZDM0MzU3OGY2NjQ4YWMyZDAzODNmYzgNCjE4Yzc5 OGNmNjRlNTJmNTk3Yzc0MGYxY2JkMDVkZjBjMjY0YzQ5MTM0Y2YwOWQ0YTYwZThhMTA3MjYwZjIw ZjkyZDQ3YjM3NGUzMmYwMDAwMDBmZmZmMDMwMDUwNGIwMzA0MTQwMDA2MDAwODAwMDAwMDIxMDAw ZGQxOTA5ZmI2DQowMDAwMDAxYjAxMDAwMDI3MDAwMDAwNzQ2ODY1NmQ2NTJmNzQ2ODY1NmQ2NTJm NWY3MjY1NmM3MzJmNzQ2ODY1NmQ2NTRkNjE2ZTYxNjc2NTcyMmU3ODZkNmMyZTcyNjU2YzczODQ4 ZjRkMGFjMjMwMTQ4NGY3ODI3NzA4NmY2Zg0KZDNiYTEwOTEyNmRkODhkMGFkZDQwMzg0ZTQzNTBk MzYzZjI0NTFlY2VkMGRhZTJjMDgyZTg3NjFiZTk5NjliYjk3OWRjOTEzNjMzMmRlMzE2OGFhMWEw ODNhZTk5NTcxOWFjMTZkYjhlYzhlNDA1MjE2NGU4OWQ5M2I2NGIwNjANCjgyOGU2ZjM3ZWQxNTY3 OTE0YjI4NGQyNjI0NTIyODJlMzE5ODcyMGUyNzRhOTM5Y2QwOGE1NGY5ODBhZTM4YTM4ZjU2ZTQy MmEzYTY0MWM4YmJkMDQ4Zjc3NTdkYTBmMTliMDE3Y2M1MjRiZDYyMTA3YmQ1MDAxOTk2NTA5YWZm DQpiM2ZkMzgxYTg5NjcyZjFmMTY1ZGZlNTE0MTczZDk4NTA1MjhhMmM2Y2NlMDIzOWJhYTRjMDRj YTViYmFiYWM0ZGYwMDAwMDBmZmZmMDMwMDUwNGIwMTAyMmQwMDE0MDAwNjAwMDgwMDAwMDAyMTAw ODI4YWJjMTNmYTAwMDAwMA0KMWMwMjAwMDAxMzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw MDAwMDA1YjQzNmY2ZTc0NjU2ZTc0NWY1NDc5NzA2NTczNWQyZTc4NmQ2YzUwNGIwMTAyMmQwMDE0 MDAwNjAwMDgwMDAwMDAyMTAwYTVkNmE3ZTdjMDAwMDANCjAwMzYwMTAwMDAwYjAwMDAwMDAwMDAw MDAwMDAwMDAwMDAwMDAwMmIwMTAwMDA1ZjcyNjU2YzczMmYyZTcyNjU2YzczNTA0YjAxMDIyZDAw MTQwMDA2MDAwODAwMDAwMDIxMDA2Yjc5OTYxNjgzMDAwMDAwOGEwMDAwMDAxYzAwDQowMDAwMDAw MDAwMDAwMDAwMDAwMDAwMDAxNDAyMDAwMDc0Njg2NTZkNjUyZjc0Njg2NTZkNjUyZjc0Njg2NTZk NjU0ZDYxNmU2MTY3NjU3MjJlNzg2ZDZjNTA0YjAxMDIyZDAwMTQwMDA2MDAwODAwMDAwMDIxMDAz MGRkNDMyOQ0KYTgwNjAwMDBhNDFiMDAwMDE2MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBkMTAy MDAwMDc0Njg2NTZkNjUyZjc0Njg2NTZkNjUyZjc0Njg2NTZkNjUzMTJlNzg2ZDZjNTA0YjAxMDIy ZDAwMTQwMDA2MDAwODAwMDAwMDIxMDANCjBkZDE5MDlmYjYwMDAwMDAxYjAxMDAwMDI3MDAwMDAw MDAwMDAwMDAwMDAwMDAwMDAwMDBhZDA5MDAwMDc0Njg2NTZkNjUyZjc0Njg2NTZkNjUyZjVmNzI2 NTZjNzMyZjc0Njg2NTZkNjU0ZDYxNmU2MTY3NjU3MjJlNzg2ZDZjMmU3MjY1NmM3MzUwNGIwNTA2 MDAwMDAwMDAwNTAwMDUwMDVkMDEwMDAwYTgwYTAwMDAwMDAwfQ0Ke1wqXGNvbG9yc2NoZW1lbWFw cGluZyAzYzNmNzg2ZDZjMjA3NjY1NzI3MzY5NmY2ZTNkMjIzMTJlMzAyMjIwNjU2ZTYzNmY2NDY5 NmU2NzNkMjI1NTU0NDYyZDM4MjIyMDczNzQ2MTZlNjQ2MTZjNmY2ZTY1M2QyMjc5NjU3MzIyM2Yz ZTBkMGEzYzYxM2E2MzZjNzI0ZA0KNjE3MDIwNzg2ZDZjNmU3MzNhNjEzZDIyNjg3NDc0NzAzYTJm MmY3MzYzNjg2NTZkNjE3MzJlNmY3MDY1NmU3ODZkNmM2NjZmNzI2ZDYxNzQ3MzJlNmY3MjY3MmY2 NDcyNjE3NzY5NmU2NzZkNmMyZjMyMzAzMDM2MmY2ZDYxNjkNCjZlMjIyMDYyNjczMTNkMjI2Yzc0 MzEyMjIwNzQ3ODMxM2QyMjY0NmIzMTIyMjA2MjY3MzIzZDIyNmM3NDMyMjIyMDc0NzgzMjNkMjI2 NDZiMzIyMjIwNjE2MzYzNjU2ZTc0MzEzZDIyNjE2MzYzNjU2ZTc0MzEyMjIwNjE2MzYzDQo2NTZl NzQzMjNkMjI2MTYzNjM2NTZlNzQzMjIyMjA2MTYzNjM2NTZlNzQzMzNkMjI2MTYzNjM2NTZlNzQz MzIyMjA2MTYzNjM2NTZlNzQzNDNkMjI2MTYzNjM2NTZlNzQzNDIyMjA2MTYzNjM2NTZlNzQzNTNk MjI2MTYzNjM2NTZlNzQzNTIyMjA2MTYzNjM2NTZlNzQzNjNkMjI2MTYzNjM2NTZlNzQzNjIyMjA2 ODZjNjk2ZTZiM2QyMjY4NmM2OTZlNmIyMjIwNjY2ZjZjNDg2YzY5NmU2YjNkMjI2NjZmNmM0ODZj Njk2ZTZiMjIyZjNlfQ0Ke1wqXGxhdGVudHN0eWxlc1xsc2RzdGltYXgyNjdcbHNkbG9ja2VkZGVm MFxsc2RzZW1paGlkZGVuZGVmMVxsc2R1bmhpZGV1c2VkZGVmMVxsc2RxZm9ybWF0ZGVmMFxsc2Rw cmlvcml0eWRlZjk5e1xsc2Rsb2NrZWRleGNlcHQgXGxzZHNlbWloaWRkZW4wIFxsc2R1bmhpZGV1 c2VkMCBcbHNkcWZvcm1hdDEgXGxzZHByaW9yaXR5MCBcbHNkbG9ja2VkMCBOb3JtYWw7DQpcbHNk c2VtaWhpZGRlbjAgXGxzZHVuaGlkZXVzZWQwIFxsc2RxZm9ybWF0MSBcbHNkcHJpb3JpdHk5IFxs c2Rsb2NrZWQwIGhlYWRpbmcgMTtcbHNkcWZvcm1hdDEgXGxzZHByaW9yaXR5OSBcbHNkbG9ja2Vk MCBoZWFkaW5nIDI7XGxzZHFmb3JtYXQxIFxsc2Rwcmlvcml0eTkgXGxzZGxvY2tlZDAgaGVhZGlu ZyAzO1xsc2RxZm9ybWF0MSBcbHNkcHJpb3JpdHk5IFxsc2Rsb2NrZWQwIGhlYWRpbmcgNDsNClxs c2RxZm9ybWF0MSBcbHNkcHJpb3JpdHk5IFxsc2Rsb2NrZWQwIGhlYWRpbmcgNTtcbHNkcWZvcm1h dDEgXGxzZHByaW9yaXR5OSBcbHNkbG9ja2VkMCBoZWFkaW5nIDY7XGxzZHFmb3JtYXQxIFxsc2Rw cmlvcml0eTkgXGxzZGxvY2tlZDAgaGVhZGluZyA3O1xsc2RxZm9ybWF0MSBcbHNkcHJpb3JpdHk5 IFxsc2Rsb2NrZWQwIGhlYWRpbmcgODtcbHNkcWZvcm1hdDEgXGxzZHByaW9yaXR5OSBcbHNkbG9j a2VkMCBoZWFkaW5nIDk7DQpcbHNkcHJpb3JpdHkzOSBcbHNkbG9ja2VkMCB0b2MgMTtcbHNkcHJp b3JpdHkzOSBcbHNkbG9ja2VkMCB0b2MgMjtcbHNkcHJpb3JpdHkzOSBcbHNkbG9ja2VkMCB0b2Mg MztcbHNkcHJpb3JpdHkzOSBcbHNkbG9ja2VkMCB0b2MgNDtcbHNkcHJpb3JpdHkzOSBcbHNkbG9j a2VkMCB0b2MgNTtcbHNkcHJpb3JpdHkzOSBcbHNkbG9ja2VkMCB0b2MgNjtcbHNkcHJpb3JpdHkz OSBcbHNkbG9ja2VkMCB0b2MgNzsNClxsc2Rwcmlvcml0eTM5IFxsc2Rsb2NrZWQwIHRvYyA4O1xs c2Rwcmlvcml0eTM5IFxsc2Rsb2NrZWQwIHRvYyA5O1xsc2RxZm9ybWF0MSBcbHNkcHJpb3JpdHkz NSBcbHNkbG9ja2VkMCBjYXB0aW9uO1xsc2RzZW1paGlkZGVuMCBcbHNkdW5oaWRldXNlZDAgXGxz ZHFmb3JtYXQxIFxsc2Rwcmlvcml0eTEwIFxsc2Rsb2NrZWQwIFRpdGxlO1xsc2Rwcmlvcml0eTEg XGxzZGxvY2tlZDAgRGVmYXVsdCBQYXJhZ3JhcGggRm9udDsNClxsc2RzZW1paGlkZGVuMCBcbHNk dW5oaWRldXNlZDAgXGxzZHFmb3JtYXQxIFxsc2Rwcmlvcml0eTExIFxsc2Rsb2NrZWQwIFN1YnRp dGxlO1xsc2RzZW1paGlkZGVuMCBcbHNkdW5oaWRldXNlZDAgXGxzZHFmb3JtYXQxIFxsc2Rwcmlv cml0eTIyIFxsc2Rsb2NrZWQwIFN0cm9uZztcbHNkc2VtaWhpZGRlbjAgXGxzZHVuaGlkZXVzZWQw IFxsc2RxZm9ybWF0MSBcbHNkcHJpb3JpdHkyMCBcbHNkbG9ja2VkMCBFbXBoYXNpczsNClxsc2Rz ZW1paGlkZGVuMCBcbHNkdW5oaWRldXNlZDAgXGxzZHByaW9yaXR5NTkgXGxzZGxvY2tlZDAgVGFi bGUgR3JpZDtcbHNkdW5oaWRldXNlZDAgXGxzZGxvY2tlZDAgUGxhY2Vob2xkZXIgVGV4dDtcbHNk c2VtaWhpZGRlbjAgXGxzZHVuaGlkZXVzZWQwIFxsc2RxZm9ybWF0MSBcbHNkcHJpb3JpdHkxIFxs c2Rsb2NrZWQwIE5vIFNwYWNpbmc7DQpcbHNkc2VtaWhpZGRlbjAgXGxzZHVuaGlkZXVzZWQwIFxs c2Rwcmlvcml0eTYwIFxsc2Rsb2NrZWQwIExpZ2h0IFNoYWRpbmc7XGxzZHNlbWloaWRkZW4wIFxs c2R1bmhpZGV1c2VkMCBcbHNkcHJpb3JpdHk2MSBcbHNkbG9ja2VkMCBMaWdodCBMaXN0O1xsc2Rz ZW1paGlkZGVuMCBcbHNkdW5oaWRldXNlZDAgXGxzZHByaW9yaXR5NjIgXGxzZGxvY2tlZDAgTGln aHQgR3JpZDsNClxsc2RzZW1paGlkZGVuMCBcbHNkdW5oaWRldXNlZDAgXGxzZHByaW9yaXR5NjMg XGxzZGxvY2tlZDAgTWVkaXVtIFNoYWRpbmcgMTtcbHNkc2VtaWhpZGRlbjAgXGxzZHVuaGlkZXVz ZWQwIFxsc2Rwcmlvcml0eTY0IFxsc2Rsb2NrZWQwIE1lZGl1bSBTaGFkaW5nIDI7XGxzZHNlbWlo aWRkZW4wIFxsc2R1bmhpZGV1c2VkMCBcbHNkcHJpb3JpdHk2NSBcbHNkbG9ja2VkMCBNZWRpdW0g TGlzdCAxOw0KXGxzZHNlbWloaWRkZW4wIFxsc2R1bmhpZGV1c2VkMCBcbHNkcHJpb3JpdHk2NiBc bHNkbG9ja2VkMCBNZWRpdW0gTGlzdCAyO1xsc2RzZW1paGlkZGVuMCBcbHNkdW5oaWRldXNlZDAg XGxzZHByaW9yaXR5NjcgXGxzZGxvY2tlZDAgTWVkaXVtIEdyaWQgMTtcbHNkc2VtaWhpZGRlbjAg XGxzZHVuaGlkZXVzZWQwIFxsc2Rwcmlvcml0eTY4IFxsc2Rsb2NrZWQwIE1lZGl1bSBHcmlkIDI7 DQpcbHNkc2VtaWhpZGRlbjAgXGxzZHVuaGlkZXVzZWQwIFxsc2Rwcmlvcml0eTY5IFxsc2Rsb2Nr ZWQwIE1lZGl1bSBHcmlkIDM7XGxzZHNlbWloaWRkZW4wIFxsc2R1bmhpZGV1c2VkMCBcbHNkcHJp b3JpdHk3MCBcbHNkbG9ja2VkMCBEYXJrIExpc3Q7XGxzZHNlbWloaWRkZW4wIFxsc2R1bmhpZGV1 c2VkMCBcbHNkcHJpb3JpdHk3MSBcbHNkbG9ja2VkMCBDb2xvcmZ1bCBTaGFkaW5nOw0KXGxzZHNl bWloaWRkZW4wIFxsc2R1bmhpZGV1c2VkMCBcbHNkcHJpb3JpdHk3MiBcbHNkbG9ja2VkMCBDb2xv cmZ1bCBMaXN0O1xsc2RzZW1paGlkZGVuMCBcbHNkdW5oaWRldXNlZDAgXGxzZHByaW9yaXR5NzMg XGxzZGxvY2tlZDAgQ29sb3JmdWwgR3JpZDtcbHNkc2VtaWhpZGRlbjAgXGxzZHVuaGlkZXVzZWQw IFxsc2Rwcmlvcml0eTYwIFxsc2Rsb2NrZWQwIExpZ2h0IFNoYWRpbmcgQWNjZW50IDE7DQpcbHNk c2VtaWhpZGRlbjAgXGxzZHVuaGlkZXVzZWQwIFxsc2Rwcmlvcml0eTYxIFxsc2Rsb2NrZWQwIExp Z2h0IExpc3QgQWNjZW50IDE7XGxzZHNlbWloaWRkZW4wIFxsc2R1bmhpZGV1c2VkMCBcbHNkcHJp b3JpdHk2MiBcbHNkbG9ja2VkMCBMaWdodCBHcmlkIEFjY2VudCAxO1xsc2RzZW1paGlkZGVuMCBc bHNkdW5oaWRldXNlZDAgXGxzZHByaW9yaXR5NjMgXGxzZGxvY2tlZDAgTWVkaXVtIFNoYWRpbmcg MSBBY2NlbnQgMTsNClxsc2RzZW1paGlkZGVuMCBcbHNkdW5oaWRldXNlZDAgXGxzZHByaW9yaXR5 NjQgXGxzZGxvY2tlZDAgTWVkaXVtIFNoYWRpbmcgMiBBY2NlbnQgMTtcbHNkc2VtaWhpZGRlbjAg XGxzZHVuaGlkZXVzZWQwIFxsc2Rwcmlvcml0eTY1IFxsc2Rsb2NrZWQwIE1lZGl1bSBMaXN0IDEg QWNjZW50IDE7XGxzZHVuaGlkZXVzZWQwIFxsc2Rsb2NrZWQwIFJldmlzaW9uOw0KXGxzZHNlbWlo aWRkZW4wIFxsc2R1bmhpZGV1c2VkMCBcbHNkcWZvcm1hdDEgXGxzZHByaW9yaXR5MzQgXGxzZGxv Y2tlZDAgTGlzdCBQYXJhZ3JhcGg7XGxzZHNlbWloaWRkZW4wIFxsc2R1bmhpZGV1c2VkMCBcbHNk cWZvcm1hdDEgXGxzZHByaW9yaXR5MjkgXGxzZGxvY2tlZDAgUXVvdGU7XGxzZHNlbWloaWRkZW4w IFxsc2R1bmhpZGV1c2VkMCBcbHNkcWZvcm1hdDEgXGxzZHByaW9yaXR5MzAgXGxzZGxvY2tlZDAg SW50ZW5zZSBRdW90ZTsNClxsc2RzZW1paGlkZGVuMCBcbHNkdW5oaWRldXNlZDAgXGxzZHByaW9y aXR5NjYgXGxzZGxvY2tlZDAgTWVkaXVtIExpc3QgMiBBY2NlbnQgMTtcbHNkc2VtaWhpZGRlbjAg XGxzZHVuaGlkZXVzZWQwIFxsc2Rwcmlvcml0eTY3IFxsc2Rsb2NrZWQwIE1lZGl1bSBHcmlkIDEg QWNjZW50IDE7XGxzZHNlbWloaWRkZW4wIFxsc2R1bmhpZGV1c2VkMCBcbHNkcHJpb3JpdHk2OCBc bHNkbG9ja2VkMCBNZWRpdW0gR3JpZCAyIEFjY2VudCAxOw0KXGxzZHNlbWloaWRkZW4wIFxsc2R1 bmhpZGV1c2VkMCBcbHNkcHJpb3JpdHk2OSBcbHNkbG9ja2VkMCBNZWRpdW0gR3JpZCAzIEFjY2Vu dCAxO1xsc2RzZW1paGlkZGVuMCBcbHNkdW5oaWRldXNlZDAgXGxzZHByaW9yaXR5NzAgXGxzZGxv Y2tlZDAgRGFyayBMaXN0IEFjY2VudCAxO1xsc2RzZW1paGlkZGVuMCBcbHNkdW5oaWRldXNlZDAg XGxzZHByaW9yaXR5NzEgXGxzZGxvY2tlZDAgQ29sb3JmdWwgU2hhZGluZyBBY2NlbnQgMTsNClxs c2RzZW1paGlkZGVuMCBcbHNkdW5oaWRldXNlZDAgXGxzZHByaW9yaXR5NzIgXGxzZGxvY2tlZDAg Q29sb3JmdWwgTGlzdCBBY2NlbnQgMTtcbHNkc2VtaWhpZGRlbjAgXGxzZHVuaGlkZXVzZWQwIFxs c2Rwcmlvcml0eTczIFxsc2Rsb2NrZWQwIENvbG9yZnVsIEdyaWQgQWNjZW50IDE7XGxzZHNlbWlo aWRkZW4wIFxsc2R1bmhpZGV1c2VkMCBcbHNkcHJpb3JpdHk2MCBcbHNkbG9ja2VkMCBMaWdodCBT aGFkaW5nIEFjY2VudCAyOw0KXGxzZHNlbWloaWRkZW4wIFxsc2R1bmhpZGV1c2VkMCBcbHNkcHJp b3JpdHk2MSBcbHNkbG9ja2VkMCBMaWdodCBMaXN0IEFjY2VudCAyO1xsc2RzZW1paGlkZGVuMCBc bHNkdW5oaWRldXNlZDAgXGxzZHByaW9yaXR5NjIgXGxzZGxvY2tlZDAgTGlnaHQgR3JpZCBBY2Nl bnQgMjtcbHNkc2VtaWhpZGRlbjAgXGxzZHVuaGlkZXVzZWQwIFxsc2Rwcmlvcml0eTYzIFxsc2Rs b2NrZWQwIE1lZGl1bSBTaGFkaW5nIDEgQWNjZW50IDI7DQpcbHNkc2VtaWhpZGRlbjAgXGxzZHVu aGlkZXVzZWQwIFxsc2Rwcmlvcml0eTY0IFxsc2Rsb2NrZWQwIE1lZGl1bSBTaGFkaW5nIDIgQWNj ZW50IDI7XGxzZHNlbWloaWRkZW4wIFxsc2R1bmhpZGV1c2VkMCBcbHNkcHJpb3JpdHk2NSBcbHNk bG9ja2VkMCBNZWRpdW0gTGlzdCAxIEFjY2VudCAyO1xsc2RzZW1paGlkZGVuMCBcbHNkdW5oaWRl dXNlZDAgXGxzZHByaW9yaXR5NjYgXGxzZGxvY2tlZDAgTWVkaXVtIExpc3QgMiBBY2NlbnQgMjsN Clxsc2RzZW1paGlkZGVuMCBcbHNkdW5oaWRldXNlZDAgXGxzZHByaW9yaXR5NjcgXGxzZGxvY2tl ZDAgTWVkaXVtIEdyaWQgMSBBY2NlbnQgMjtcbHNkc2VtaWhpZGRlbjAgXGxzZHVuaGlkZXVzZWQw IFxsc2Rwcmlvcml0eTY4IFxsc2Rsb2NrZWQwIE1lZGl1bSBHcmlkIDIgQWNjZW50IDI7XGxzZHNl bWloaWRkZW4wIFxsc2R1bmhpZGV1c2VkMCBcbHNkcHJpb3JpdHk2OSBcbHNkbG9ja2VkMCBNZWRp dW0gR3JpZCAzIEFjY2VudCAyOw0KXGxzZHNlbWloaWRkZW4wIFxsc2R1bmhpZGV1c2VkMCBcbHNk cHJpb3JpdHk3MCBcbHNkbG9ja2VkMCBEYXJrIExpc3QgQWNjZW50IDI7XGxzZHNlbWloaWRkZW4w IFxsc2R1bmhpZGV1c2VkMCBcbHNkcHJpb3JpdHk3MSBcbHNkbG9ja2VkMCBDb2xvcmZ1bCBTaGFk aW5nIEFjY2VudCAyO1xsc2RzZW1paGlkZGVuMCBcbHNkdW5oaWRldXNlZDAgXGxzZHByaW9yaXR5 NzIgXGxzZGxvY2tlZDAgQ29sb3JmdWwgTGlzdCBBY2NlbnQgMjsNClxsc2RzZW1paGlkZGVuMCBc bHNkdW5oaWRldXNlZDAgXGxzZHByaW9yaXR5NzMgXGxzZGxvY2tlZDAgQ29sb3JmdWwgR3JpZCBB Y2NlbnQgMjtcbHNkc2VtaWhpZGRlbjAgXGxzZHVuaGlkZXVzZWQwIFxsc2Rwcmlvcml0eTYwIFxs c2Rsb2NrZWQwIExpZ2h0IFNoYWRpbmcgQWNjZW50IDM7XGxzZHNlbWloaWRkZW4wIFxsc2R1bmhp ZGV1c2VkMCBcbHNkcHJpb3JpdHk2MSBcbHNkbG9ja2VkMCBMaWdodCBMaXN0IEFjY2VudCAzOw0K XGxzZHNlbWloaWRkZW4wIFxsc2R1bmhpZGV1c2VkMCBcbHNkcHJpb3JpdHk2MiBcbHNkbG9ja2Vk MCBMaWdodCBHcmlkIEFjY2VudCAzO1xsc2RzZW1paGlkZGVuMCBcbHNkdW5oaWRldXNlZDAgXGxz ZHByaW9yaXR5NjMgXGxzZGxvY2tlZDAgTWVkaXVtIFNoYWRpbmcgMSBBY2NlbnQgMztcbHNkc2Vt aWhpZGRlbjAgXGxzZHVuaGlkZXVzZWQwIFxsc2Rwcmlvcml0eTY0IFxsc2Rsb2NrZWQwIE1lZGl1 bSBTaGFkaW5nIDIgQWNjZW50IDM7DQpcbHNkc2VtaWhpZGRlbjAgXGxzZHVuaGlkZXVzZWQwIFxs c2Rwcmlvcml0eTY1IFxsc2Rsb2NrZWQwIE1lZGl1bSBMaXN0IDEgQWNjZW50IDM7XGxzZHNlbWlo aWRkZW4wIFxsc2R1bmhpZGV1c2VkMCBcbHNkcHJpb3JpdHk2NiBcbHNkbG9ja2VkMCBNZWRpdW0g TGlzdCAyIEFjY2VudCAzO1xsc2RzZW1paGlkZGVuMCBcbHNkdW5oaWRldXNlZDAgXGxzZHByaW9y aXR5NjcgXGxzZGxvY2tlZDAgTWVkaXVtIEdyaWQgMSBBY2NlbnQgMzsNClxsc2RzZW1paGlkZGVu MCBcbHNkdW5oaWRldXNlZDAgXGxzZHByaW9yaXR5NjggXGxzZGxvY2tlZDAgTWVkaXVtIEdyaWQg MiBBY2NlbnQgMztcbHNkc2VtaWhpZGRlbjAgXGxzZHVuaGlkZXVzZWQwIFxsc2Rwcmlvcml0eTY5 IFxsc2Rsb2NrZWQwIE1lZGl1bSBHcmlkIDMgQWNjZW50IDM7XGxzZHNlbWloaWRkZW4wIFxsc2R1 bmhpZGV1c2VkMCBcbHNkcHJpb3JpdHk3MCBcbHNkbG9ja2VkMCBEYXJrIExpc3QgQWNjZW50IDM7 DQpcbHNkc2VtaWhpZGRlbjAgXGxzZHVuaGlkZXVzZWQwIFxsc2Rwcmlvcml0eTcxIFxsc2Rsb2Nr ZWQwIENvbG9yZnVsIFNoYWRpbmcgQWNjZW50IDM7XGxzZHNlbWloaWRkZW4wIFxsc2R1bmhpZGV1 c2VkMCBcbHNkcHJpb3JpdHk3MiBcbHNkbG9ja2VkMCBDb2xvcmZ1bCBMaXN0IEFjY2VudCAzO1xs c2RzZW1paGlkZGVuMCBcbHNkdW5oaWRldXNlZDAgXGxzZHByaW9yaXR5NzMgXGxzZGxvY2tlZDAg Q29sb3JmdWwgR3JpZCBBY2NlbnQgMzsNClxsc2RzZW1paGlkZGVuMCBcbHNkdW5oaWRldXNlZDAg XGxzZHByaW9yaXR5NjAgXGxzZGxvY2tlZDAgTGlnaHQgU2hhZGluZyBBY2NlbnQgNDtcbHNkc2Vt aWhpZGRlbjAgXGxzZHVuaGlkZXVzZWQwIFxsc2Rwcmlvcml0eTYxIFxsc2Rsb2NrZWQwIExpZ2h0 IExpc3QgQWNjZW50IDQ7XGxzZHNlbWloaWRkZW4wIFxsc2R1bmhpZGV1c2VkMCBcbHNkcHJpb3Jp dHk2MiBcbHNkbG9ja2VkMCBMaWdodCBHcmlkIEFjY2VudCA0Ow0KXGxzZHNlbWloaWRkZW4wIFxs c2R1bmhpZGV1c2VkMCBcbHNkcHJpb3JpdHk2MyBcbHNkbG9ja2VkMCBNZWRpdW0gU2hhZGluZyAx IEFjY2VudCA0O1xsc2RzZW1paGlkZGVuMCBcbHNkdW5oaWRldXNlZDAgXGxzZHByaW9yaXR5NjQg XGxzZGxvY2tlZDAgTWVkaXVtIFNoYWRpbmcgMiBBY2NlbnQgNDtcbHNkc2VtaWhpZGRlbjAgXGxz ZHVuaGlkZXVzZWQwIFxsc2Rwcmlvcml0eTY1IFxsc2Rsb2NrZWQwIE1lZGl1bSBMaXN0IDEgQWNj ZW50IDQ7DQpcbHNkc2VtaWhpZGRlbjAgXGxzZHVuaGlkZXVzZWQwIFxsc2Rwcmlvcml0eTY2IFxs c2Rsb2NrZWQwIE1lZGl1bSBMaXN0IDIgQWNjZW50IDQ7XGxzZHNlbWloaWRkZW4wIFxsc2R1bmhp ZGV1c2VkMCBcbHNkcHJpb3JpdHk2NyBcbHNkbG9ja2VkMCBNZWRpdW0gR3JpZCAxIEFjY2VudCA0 O1xsc2RzZW1paGlkZGVuMCBcbHNkdW5oaWRldXNlZDAgXGxzZHByaW9yaXR5NjggXGxzZGxvY2tl ZDAgTWVkaXVtIEdyaWQgMiBBY2NlbnQgNDsNClxsc2RzZW1paGlkZGVuMCBcbHNkdW5oaWRldXNl ZDAgXGxzZHByaW9yaXR5NjkgXGxzZGxvY2tlZDAgTWVkaXVtIEdyaWQgMyBBY2NlbnQgNDtcbHNk c2VtaWhpZGRlbjAgXGxzZHVuaGlkZXVzZWQwIFxsc2Rwcmlvcml0eTcwIFxsc2Rsb2NrZWQwIERh cmsgTGlzdCBBY2NlbnQgNDtcbHNkc2VtaWhpZGRlbjAgXGxzZHVuaGlkZXVzZWQwIFxsc2Rwcmlv cml0eTcxIFxsc2Rsb2NrZWQwIENvbG9yZnVsIFNoYWRpbmcgQWNjZW50IDQ7DQpcbHNkc2VtaWhp ZGRlbjAgXGxzZHVuaGlkZXVzZWQwIFxsc2Rwcmlvcml0eTcyIFxsc2Rsb2NrZWQwIENvbG9yZnVs IExpc3QgQWNjZW50IDQ7XGxzZHNlbWloaWRkZW4wIFxsc2R1bmhpZGV1c2VkMCBcbHNkcHJpb3Jp dHk3MyBcbHNkbG9ja2VkMCBDb2xvcmZ1bCBHcmlkIEFjY2VudCA0O1xsc2RzZW1paGlkZGVuMCBc bHNkdW5oaWRldXNlZDAgXGxzZHByaW9yaXR5NjAgXGxzZGxvY2tlZDAgTGlnaHQgU2hhZGluZyBB Y2NlbnQgNTsNClxsc2RzZW1paGlkZGVuMCBcbHNkdW5oaWRldXNlZDAgXGxzZHByaW9yaXR5NjEg XGxzZGxvY2tlZDAgTGlnaHQgTGlzdCBBY2NlbnQgNTtcbHNkc2VtaWhpZGRlbjAgXGxzZHVuaGlk ZXVzZWQwIFxsc2Rwcmlvcml0eTYyIFxsc2Rsb2NrZWQwIExpZ2h0IEdyaWQgQWNjZW50IDU7XGxz ZHNlbWloaWRkZW4wIFxsc2R1bmhpZGV1c2VkMCBcbHNkcHJpb3JpdHk2MyBcbHNkbG9ja2VkMCBN ZWRpdW0gU2hhZGluZyAxIEFjY2VudCA1Ow0KXGxzZHNlbWloaWRkZW4wIFxsc2R1bmhpZGV1c2Vk MCBcbHNkcHJpb3JpdHk2NCBcbHNkbG9ja2VkMCBNZWRpdW0gU2hhZGluZyAyIEFjY2VudCA1O1xs c2RzZW1paGlkZGVuMCBcbHNkdW5oaWRldXNlZDAgXGxzZHByaW9yaXR5NjUgXGxzZGxvY2tlZDAg TWVkaXVtIExpc3QgMSBBY2NlbnQgNTtcbHNkc2VtaWhpZGRlbjAgXGxzZHVuaGlkZXVzZWQwIFxs c2Rwcmlvcml0eTY2IFxsc2Rsb2NrZWQwIE1lZGl1bSBMaXN0IDIgQWNjZW50IDU7DQpcbHNkc2Vt aWhpZGRlbjAgXGxzZHVuaGlkZXVzZWQwIFxsc2Rwcmlvcml0eTY3IFxsc2Rsb2NrZWQwIE1lZGl1 bSBHcmlkIDEgQWNjZW50IDU7XGxzZHNlbWloaWRkZW4wIFxsc2R1bmhpZGV1c2VkMCBcbHNkcHJp b3JpdHk2OCBcbHNkbG9ja2VkMCBNZWRpdW0gR3JpZCAyIEFjY2VudCA1O1xsc2RzZW1paGlkZGVu MCBcbHNkdW5oaWRldXNlZDAgXGxzZHByaW9yaXR5NjkgXGxzZGxvY2tlZDAgTWVkaXVtIEdyaWQg MyBBY2NlbnQgNTsNClxsc2RzZW1paGlkZGVuMCBcbHNkdW5oaWRldXNlZDAgXGxzZHByaW9yaXR5 NzAgXGxzZGxvY2tlZDAgRGFyayBMaXN0IEFjY2VudCA1O1xsc2RzZW1paGlkZGVuMCBcbHNkdW5o aWRldXNlZDAgXGxzZHByaW9yaXR5NzEgXGxzZGxvY2tlZDAgQ29sb3JmdWwgU2hhZGluZyBBY2Nl bnQgNTtcbHNkc2VtaWhpZGRlbjAgXGxzZHVuaGlkZXVzZWQwIFxsc2Rwcmlvcml0eTcyIFxsc2Rs b2NrZWQwIENvbG9yZnVsIExpc3QgQWNjZW50IDU7DQpcbHNkc2VtaWhpZGRlbjAgXGxzZHVuaGlk ZXVzZWQwIFxsc2Rwcmlvcml0eTczIFxsc2Rsb2NrZWQwIENvbG9yZnVsIEdyaWQgQWNjZW50IDU7 XGxzZHNlbWloaWRkZW4wIFxsc2R1bmhpZGV1c2VkMCBcbHNkcHJpb3JpdHk2MCBcbHNkbG9ja2Vk MCBMaWdodCBTaGFkaW5nIEFjY2VudCA2O1xsc2RzZW1paGlkZGVuMCBcbHNkdW5oaWRldXNlZDAg XGxzZHByaW9yaXR5NjEgXGxzZGxvY2tlZDAgTGlnaHQgTGlzdCBBY2NlbnQgNjsNClxsc2RzZW1p aGlkZGVuMCBcbHNkdW5oaWRldXNlZDAgXGxzZHByaW9yaXR5NjIgXGxzZGxvY2tlZDAgTGlnaHQg R3JpZCBBY2NlbnQgNjtcbHNkc2VtaWhpZGRlbjAgXGxzZHVuaGlkZXVzZWQwIFxsc2Rwcmlvcml0 eTYzIFxsc2Rsb2NrZWQwIE1lZGl1bSBTaGFkaW5nIDEgQWNjZW50IDY7XGxzZHNlbWloaWRkZW4w IFxsc2R1bmhpZGV1c2VkMCBcbHNkcHJpb3JpdHk2NCBcbHNkbG9ja2VkMCBNZWRpdW0gU2hhZGlu ZyAyIEFjY2VudCA2Ow0KXGxzZHNlbWloaWRkZW4wIFxsc2R1bmhpZGV1c2VkMCBcbHNkcHJpb3Jp dHk2NSBcbHNkbG9ja2VkMCBNZWRpdW0gTGlzdCAxIEFjY2VudCA2O1xsc2RzZW1paGlkZGVuMCBc bHNkdW5oaWRldXNlZDAgXGxzZHByaW9yaXR5NjYgXGxzZGxvY2tlZDAgTWVkaXVtIExpc3QgMiBB Y2NlbnQgNjtcbHNkc2VtaWhpZGRlbjAgXGxzZHVuaGlkZXVzZWQwIFxsc2Rwcmlvcml0eTY3IFxs c2Rsb2NrZWQwIE1lZGl1bSBHcmlkIDEgQWNjZW50IDY7DQpcbHNkc2VtaWhpZGRlbjAgXGxzZHVu aGlkZXVzZWQwIFxsc2Rwcmlvcml0eTY4IFxsc2Rsb2NrZWQwIE1lZGl1bSBHcmlkIDIgQWNjZW50 IDY7XGxzZHNlbWloaWRkZW4wIFxsc2R1bmhpZGV1c2VkMCBcbHNkcHJpb3JpdHk2OSBcbHNkbG9j a2VkMCBNZWRpdW0gR3JpZCAzIEFjY2VudCA2O1xsc2RzZW1paGlkZGVuMCBcbHNkdW5oaWRldXNl ZDAgXGxzZHByaW9yaXR5NzAgXGxzZGxvY2tlZDAgRGFyayBMaXN0IEFjY2VudCA2Ow0KXGxzZHNl bWloaWRkZW4wIFxsc2R1bmhpZGV1c2VkMCBcbHNkcHJpb3JpdHk3MSBcbHNkbG9ja2VkMCBDb2xv cmZ1bCBTaGFkaW5nIEFjY2VudCA2O1xsc2RzZW1paGlkZGVuMCBcbHNkdW5oaWRldXNlZDAgXGxz ZHByaW9yaXR5NzIgXGxzZGxvY2tlZDAgQ29sb3JmdWwgTGlzdCBBY2NlbnQgNjtcbHNkc2VtaWhp ZGRlbjAgXGxzZHVuaGlkZXVzZWQwIFxsc2Rwcmlvcml0eTczIFxsc2Rsb2NrZWQwIENvbG9yZnVs IEdyaWQgQWNjZW50IDY7DQpcbHNkc2VtaWhpZGRlbjAgXGxzZHVuaGlkZXVzZWQwIFxsc2RxZm9y bWF0MSBcbHNkcHJpb3JpdHkxOSBcbHNkbG9ja2VkMCBTdWJ0bGUgRW1waGFzaXM7XGxzZHNlbWlo aWRkZW4wIFxsc2R1bmhpZGV1c2VkMCBcbHNkcWZvcm1hdDEgXGxzZHByaW9yaXR5MjEgXGxzZGxv Y2tlZDAgSW50ZW5zZSBFbXBoYXNpczsNClxsc2RzZW1paGlkZGVuMCBcbHNkdW5oaWRldXNlZDAg XGxzZHFmb3JtYXQxIFxsc2Rwcmlvcml0eTMxIFxsc2Rsb2NrZWQwIFN1YnRsZSBSZWZlcmVuY2U7 XGxzZHNlbWloaWRkZW4wIFxsc2R1bmhpZGV1c2VkMCBcbHNkcWZvcm1hdDEgXGxzZHByaW9yaXR5 MzIgXGxzZGxvY2tlZDAgSW50ZW5zZSBSZWZlcmVuY2U7DQpcbHNkc2VtaWhpZGRlbjAgXGxzZHVu aGlkZXVzZWQwIFxsc2RxZm9ybWF0MSBcbHNkcHJpb3JpdHkzMyBcbHNkbG9ja2VkMCBCb29rIFRp dGxlO1xsc2Rwcmlvcml0eTM3IFxsc2Rsb2NrZWQwIEJpYmxpb2dyYXBoeTtcbHNkcWZvcm1hdDEg XGxzZHByaW9yaXR5MzkgXGxzZGxvY2tlZDAgVE9DIEhlYWRpbmc7fX17XCpcZGF0YXN0b3JlIDAx MDUwMDAwMDIwMDAwMDAxODAwMDAwMA0KNGQ3Mzc4NmQ2YzMyMmU1MzQxNTg1ODRkNGM1MjY1NjE2 NDY1NzIyZTM1MmUzMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDYwMDAwDQpkMGNmMTFlMGExYjExYWUx MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAzZTAwMDMwMGZlZmYwOTAwMDYwMDAwMDAw MDAwMDAwMDAwMDAwMDAwMDEwMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDAxMDAwMDBmZWZmZmZmZjAw MDAwMDAwZmVmZmZmZmYwMDAwMDAwMDAwMDAwMDAwZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmYNCmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZg0KZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmDQpmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYNCmZmZmZmZmZmZmZmZmZmZmZmZGZmZmZmZmZl ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZg0K ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmDQpmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYNCmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmZg0KZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmY1MjAw NmYwMDZmMDA3NDAwMjAwMDQ1MDA2ZTAwNzQwMDcyMDA3OTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw MDAwMDAwMDAwMDE2MDAwNTAwZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZWM2OWQ5ODg4YjhiM2Q0 Yzg1OWVhZjZjZDE1OGJlMGYwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDIzDQpmY2NlZmZhNGNm MDFmZWZmZmZmZjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwZmZmZmZmZmZm ZmZmZmZmZmZmZmZmZmZmMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw MDAwMDAwMDAwMDAwMDANCjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw MDAwMDAwMDAwMDAwMDAwMDAwMDAwZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmMDAwMDAwMDAwMDAw MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMA0KMDAwMDAwMDAwMDAwMDAw MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwZmZmZmZm ZmZmZmZmZmZmZmZmZmZmZmZmMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw MDAwMDAwMDAwDQowMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw MDAwMTA1MDAwMDAwMDAwMDAwfX0= --===============2021110225==-- From sandeen@sandeen.net Sat Aug 2 11:37: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 C1AB57F54 for ; Sat, 2 Aug 2014 11:37:13 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id A145A304043 for ; Sat, 2 Aug 2014 09:37:10 -0700 (PDT) X-ASG-Debug-ID: 1406997427-04cb6c555ce7290001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id 7SwzCDNHx1lWKZGM for ; Sat, 02 Aug 2014 09:37:08 -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 9BC89612F31A; Sat, 2 Aug 2014 11:37:07 -0500 (CDT) Message-ID: <53DD13B5.5050000@sandeen.net> Date: Sat, 02 Aug 2014 11:37:09 -0500 From: Eric Sandeen MIME-Version: 1.0 To: Eric Sandeen , xfs-oss Subject: Re: [PATCH] xfs: avoid double free on xlog_recover_commit_trans error References: <53DBAE0B.6020000@redhat.com> X-ASG-Orig-Subj: Re: [PATCH] xfs: avoid double free on xlog_recover_commit_trans error In-Reply-To: <53DBAE0B.6020000@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: 1406997427 X-Barracuda-URL: http://192.48.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.60 X-Barracuda-Spam-Status: No, SCORE=2.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MV0249, MARKETING_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.8062 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words 2.00 BSF_SC0_MV0249 Custom rule MV0249 On 8/1/14, 10:11 AM, Eric Sandeen wrote: > xlog_recover_process_data() frees the transaction on > any error out of the oh_flags switch statement, but > in the XLOG_COMMIT_TRANS / xlog_recover_commit_trans() case, > the transaction has already been freed in > xlog_recover_commit_trans() before the error is returned. > > Avoid this by only freeing the transaction in > xlog_recover_commit_trans() if no error will be returned. > > (Coverity spotted this) Ok, I see that Mark already sent this (thanks Mark, sorry for not seeing / remembering) and he was scolded for not thinking hard enough about the problem. I guess I'm not thinking hard enough either... Sorry 'bout that. -Eric > Signed-off-by: Eric Sandeen > --- > > diff --git a/fs/xfs/xfs_log_recover.c b/fs/xfs/xfs_log_recover.c > index 981af0f..e634ffd 100644 > --- a/fs/xfs/xfs_log_recover.c > +++ b/fs/xfs/xfs_log_recover.c > @@ -3514,9 +3514,11 @@ out: > if (!list_empty(&done_list)) > list_splice_init(&done_list, &trans->r_itemq); > > - xlog_recover_free_trans(trans); > - > error2 = xfs_buf_delwri_submit(&buffer_list); > + /* caller will free trans on error */ > + if (!error && !error2) > + xlog_recover_free_trans(trans); > + > return error ? error : error2; > } > > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs > From info@rockpoolitdecisionmakers.com Sat Aug 2 18:56: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_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 2DEDF7F51 for ; Sat, 2 Aug 2014 18:56:51 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id A11A4AC006 for ; Sat, 2 Aug 2014 16:56:50 -0700 (PDT) X-ASG-Debug-ID: 1407023804-04cbb02d84f9fc0001-NocioJ Received: from outmail148064.authsmtp.co.uk (outmail148064.authsmtp.co.uk [62.13.148.64]) by cuda.sgi.com with ESMTP id 4tpj1OiGRwkEcgKA for ; Sat, 02 Aug 2014 16:56:45 -0700 (PDT) X-Barracuda-Envelope-From: info@rockpoolitdecisionmakers.com X-Barracuda-Apparent-Source-IP: 62.13.148.64 Received: from punt18.authsmtp.com (punt18.authsmtp.com [62.13.128.225]) by punt14.authsmtp.com (8.14.2/8.14.2) with ESMTP id s72NuiXD022174 for ; Sun, 3 Aug 2014 00:56:44 +0100 (BST) Received: from mail-c237.authsmtp.com (mail-c237.authsmtp.com [62.13.128.237]) by punt18.authsmtp.com (8.14.2/8.14.2/) with ESMTP id s72NuibO066844 for ; Sun, 3 Aug 2014 00:56:44 +0100 (BST) Received: from 176-227-133-86.ip.skylogicnet.com (176-227-133-86.ip.skylogicnet.com [176.227.133.86]) (authenticated bits=0) by mail.authsmtp.com (8.14.2/8.14.2/) with ESMTP id s72NtxWH058978 for ; Sun, 3 Aug 2014 00:56:40 +0100 (BST) Message-Id: <201408022356.s72NtxWH058978@mail.authsmtp.com> From: "IT Decision Makers Database" Subject: IT Decision Makers Database To: "xfs" X-ASG-Orig-Subj: IT Decision Makers Database Content-Type: multipart/alternative; boundary="KSHBoy5NhWpNPXt=_F5DZ9HCoiT2trWnD0" MIME-Version: 1.0 Organization: IT Decision Makers Database Date: Sun, 3 Aug 2014 00:56:40 +0100 X-Server-Quench: a6f750ef-1aa0-11e4-9f74-002590a135d3 X-AuthReport-Spam: If SPAM / abuse - report it at: http://www.authsmtp.com/abuse X-AuthRoute: OCd1ZgoWBVZUSgod IjkDByxYTgIhJwFA DBQCNgpdJl8AVglL KQBRKV9FIFMHbVZC QHhIDA1KAwIsF2N2 dHsUOhpfYktKTwVq Wk1PSFZQWgRvBwID BBkAUxpxaQ1AZ3xz ekYsHXdZIgAyEj59 R0ZdEmVIYGZkYC5O VhZfcgMBJh5LL05F d1F+AXcQaDMAYmdg R1Vubmg4ZG4CJH9D Yz1FAV8ZQF0KGTh0 YhkBEC80VWEMWyw5 JgcrQmFr X-Authentic-SMTP: 61633636323336.1024:706 X-AuthFastPath: 0 (Was 255) X-AuthVirus-Status: No virus detected - but ensure you scan with your own anti-virus system. X-Barracuda-Connect: outmail148064.authsmtp.co.uk[62.13.148.64] X-Barracuda-Start-Time: 1407023804 X-Barracuda-URL: http://192.48.176.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.8070 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 --KSHBoy5NhWpNPXt=_F5DZ9HCoiT2trWnD0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Content-Disposition: inline =EF=BB=BFIT Decision Makers Database Our IT Decision Makers Database is completely new to the market place = and is exclusively owned and researched. Containing 23,000 IT Decision Makers this database is the most robust = and information packed solution for marketing to UK IT Decision Makers= available. This database is extremely accurate and completely up to date as of Ju= ly 2014. Information included: Company Name, Full Address, Decision Maker Name,= Job Title, Business Description, Turnover, Number of Employees and De= cision Maker Email Address. The database is opted in at decision maker level to receive relevant t= hird party marketing communication via email, telephone, fax or direct= mail.=20 This database is currently reduced on our website to =C2=A3399 instead= of the usual =C2=A3599. This will remain in place for the first five= purchases after which normal pricing will resume. Website: rockpoolmarketing (dot) com You can contact us on 0113 871 5004 or reply to this email. We also h= ave live chat on our website. Many thanks Rockpool Marketing Unsubscribe by email --KSHBoy5NhWpNPXt=_F5DZ9HCoiT2trWnD0 Content-Type: text/html; charset="utf-8" Content-Transfer-Encoding: quoted-printable Content-Disposition: inline =EF=BB=BF<= HEAD>

IT De= cision Makers Database

Our I= T Decision Makers Database is completely new to the market place and i= s exclusively owned and researched.

Containing 23,000 IT Decision Makers this database is the = most robust and information packed solution for marketing to UK IT Dec= ision Makers available.

Th= is database is extremely accurate and completely up to date as of July= 2014.

Information include= d: Company Name, Full Address, Decision Maker Name, Job Title, Busines= s Description, Turnover, Number of Employees and Decision Maker Email = Address.

The database is o= pted in at decision maker level to receive relevant third party market= ing communication via email, telephone, fax or direct mail. 

This database is currently reduced on our website to =C2=A3399 inste= ad of the usual =C2=A3599.  This will remain in place for the first five purchases after which= normal pricing will resume.

Website: rockpoolmarketing (dot) com

You can contact us on 0113 871 5004 or reply to this email.  We also have live chat on our w= ebsite.

Many thanks

Rockpool Marketing

Unsubscribe by email

--KSHBoy5NhWpNPXt=_F5DZ9HCoiT2trWnD0-- From david@fromorbit.com Sat Aug 2 19:09: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 (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id EFC867F53 for ; Sat, 2 Aug 2014 19:09:50 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id C1ACC8F8037 for ; Sat, 2 Aug 2014 17:09:47 -0700 (PDT) X-ASG-Debug-ID: 1407024584-04bdf03d43107190001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id b4oA7o4Vb8SC7Y0n for ; Sat, 02 Aug 2014 17:09: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: AmsJAIB93VN5LKl0PGdsb2JhbABagw1SV65EDAEBAQEBAQadPIFdhW8BgQUXBQEBAQE4NoN8BwEBBScTHCMQCAMVAgEJJQ8FJQMHDA4ThUmCeA7GLhcYhWSHQIFDTQeESwWcBYt8jEMrLwGBBA Received: from ppp121-44-169-116.lns20.syd7.internode.on.net (HELO dastard) ([121.44.169.116]) by ipmail05.adl6.internode.on.net with ESMTP; 03 Aug 2014 09:37:07 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1XDjKL-0005RT-KT; Sun, 03 Aug 2014 10:07:05 +1000 Date: Sun, 3 Aug 2014 10:07:05 +1000 From: Dave Chinner To: Jeff Liu Cc: "xfs@oss.sgi.com" Subject: Re: [PATCH v3 00/10] xfs_ioc_bulkstat code refactoring and consolidation Message-ID: <20140803000705.GU20518@dastard> X-ASG-Orig-Subj: Re: [PATCH v3 00/10] xfs_ioc_bulkstat code refactoring and consolidation References: <538D92B6.5050402@oracle.com> <20140729232748.GI26465@dastard> <53D9F67F.9060609@oracle.com> <53DB2F08.2090703@oracle.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <53DB2F08.2090703@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: 1407024585 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.8070 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Fri, Aug 01, 2014 at 02:09:12PM +0800, Jeff Liu wrote: > > On 07/31/2014 15:55 PM, Jeff Liu wrote: > > Hi Dave, > > > > On 07/30/2014 07:27 AM, Dave Chinner wrote: > >> On Tue, Jun 03, 2014 at 05:17:42PM +0800, Jeff Liu wrote: > >>> Hi folk, > >>> > >>> This is the revised patches for xfs_ioc_bulkstat consolidation and code > >>> refactoring. As per Christoph's comments, I'm not include the per AG > >>> inumber patch in this series given that I don't actually introduce the > >>> relevant inumbers interface now. Similar to that reason, I also dropped > >>> the per AG bulkstat patch, it would be included in parallel quota check > >>> series. > >>> > >>> > >>> v3->v2: > >>> - one major bug fix is at xfs_bulkstat_ag_ichunk() regarding the user buffer > >>> pointer operations, it should be defined as a pointer-to-pointer since it > >>> would be updated inside xfs_bulkstat_ag_ichunk(). > >>> > >>> - separate xfs_inumber consolidate patch into two patches, the first one > >>> fix the formater function return value and consolidate the codes, another > >>> one does the actual logic changes for better error handling. > >>> > >>> - Add a separate patch to get rid of the redundant user buffer count > >>> checks at xfs_bulkstat() > >>> > >>> - fixed agino calculation issue at xfs_bulkstat_grab_ichunk(). > >>> > >>> v2: http://oss.sgi.com/archives/xfs/2014-04/msg00554.html > >>> v1: http://oss.sgi.com/archives/xfs/2013-12/msg00901.html > >>> > >>> > >>> Any comments are welcome! > >> > >> Hi Jeff, I ported this to the current dev tree based on the > >> xfs-libxfs-restructure branch, and I keep seeing fsstress failing > >> with memory corruption after random bulkstat ioctls. I see regular > >> failures with generic/013, generic/068, xfs/167 and the other > >> fstress tests also randomly fail. The typical failure is glibc > >> detected memory heap corruption on freeing the bulkstat structure > >> after the ioctl: > >> > >> generic/068 42s ...*** Error in `./ltp/fsstress': double free or corruption (!prev): 0x00007f0224000b70 *** > >> ======= Backtrace: ========= > > > > Sorry for my late response and thanks for help porting this patch series. > > > > Now I can reproduce this issue frequently with generic/013, will try to fix > > it ASAP. > > Hi Dave, > > Could you please check the patch below for this issue? > > > From: Jie Liu > Subject: xfs: always updating acp elements at xfs_bulkstat_ag_ichunk > > After processing the inodes in chunk, we should always updating the > last inode number and the left user buffer info no matter anything > wrong while formatting an inode to the user buffer. Otherwise, the > related info might be updated improperly at xfs_bulkstat() for the > next round of inode processing. > > Signed-off-by: Jie Liu > --- > fs/xfs/xfs_itable.c | 8 +++----- > 1 file changed, 3 insertions(+), 5 deletions(-) > > diff --git a/fs/xfs/xfs_itable.c b/fs/xfs/xfs_itable.c > index 9959a05..f71be9c 100644 > --- a/fs/xfs/xfs_itable.c > +++ b/fs/xfs/xfs_itable.c > @@ -328,11 +328,9 @@ xfs_bulkstat_ag_ichunk( > lastino = ino; > } > > - if (!error) { > - acp->ac_lastino = lastino; > - acp->ac_ubleft = ubleft; > - acp->ac_ubelem = ubelem; > - } > + acp->ac_lastino = lastino; > + acp->ac_ubleft = ubleft; > + acp->ac_ubelem = ubelem; Yes, that looks like it fixes the issues I'm seeing here. I'll fold this into the patch that introduces this code (the last patch, if I'm not mistaken) so we don't have a point in a bisection where bulkstat is busted. I'll run it through some more testing and if everything goes well I'll push it into for-next early in the week. Thanks for the quick turn-around and finding the problem for me, Jeff! Cheers, Dave. -- Dave Chinner david@fromorbit.com From ben@decadent.org.uk Sat Aug 2 19:50: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 B16497F54 for ; Sat, 2 Aug 2014 19:50:06 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 908F98F8037 for ; Sat, 2 Aug 2014 17:50:06 -0700 (PDT) X-ASG-Debug-ID: 1407026999-04cb6c555cf5f70001-NocioJ Received: from shadbolt.e.decadent.org.uk (shadbolt.e.decadent.org.uk [88.96.1.126]) by cuda.sgi.com with ESMTP id RsmMfJegyMMssfIG (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO) for ; Sat, 02 Aug 2014 17:50:00 -0700 (PDT) X-Barracuda-Envelope-From: ben@decadent.org.uk X-Barracuda-Apparent-Source-IP: 88.96.1.126 Received: from deadeye.wl.decadent.org.uk ([192.168.4.249] helo=deadeye) by shadbolt.decadent.org.uk with esmtps (TLS1.2:RSA_AES_128_CBC_SHA1:128) (Exim 4.80) (envelope-from ) id 1XDjzp-0005Se-TH; Sun, 03 Aug 2014 01:49:57 +0100 Received: from ben by deadeye with local (Exim 4.83) (envelope-from ) id 1XDjzk-0001UY-N9; Sun, 03 Aug 2014 01:49:52 +0100 Message-ID: <1407026987.30258.60.camel@deadeye.wl.decadent.org.uk> Subject: Re: [PATCH][v3.2.y] xfs: really fix the cursor leak in xfs_alloc_ag_vextent_near From: Ben Hutchings X-ASG-Orig-Subj: Re: [PATCH][v3.2.y] xfs: really fix the cursor leak in xfs_alloc_ag_vextent_near To: Joseph Salisbury Cc: david@fromorbit.com, xfs@oss.sgi.com, "stable@vger.kernel.org" , linux-kernel@vger.kernel.org Date: Sun, 03 Aug 2014 01:49:47 +0100 In-Reply-To: <53D91CBC.1000901@canonical.com> References: <53D91CBC.1000901@canonical.com> Content-Type: multipart/signed; micalg="pgp-sha512"; protocol="application/pgp-signature"; boundary="=-2k+LEOsAS2On6GRrQsko" X-Mailer: Evolution 3.12.2-1+b1 Mime-Version: 1.0 X-SA-Exim-Connect-IP: 192.168.4.249 X-SA-Exim-Mail-From: ben@decadent.org.uk X-SA-Exim-Scanned: No (on shadbolt.decadent.org.uk); SAEximRunCond expanded to false X-Barracuda-Connect: shadbolt.e.decadent.org.uk[88.96.1.126] X-Barracuda-Start-Time: 1407027000 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.8071 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- --=-2k+LEOsAS2On6GRrQsko Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable On Wed, 2014-07-30 at 12:26 -0400, Joseph Salisbury wrote: > Hello, > =20 > Please consider including mainline commit > e3a746f5aab71f2dd0a83116772922fb37ae29d6 in the next v3.2.y release. It > was included in the mainline tree as of v3.5. It has been tested and > confirmed > to resolve http://bugs.launchpad.net/bugs/1327360 . >=20 >=20 > commit e3a746f5aab71f2dd0a83116772922fb37ae29d6 > Author: Dave Chinner > Date: Thu Jul 12 07:40:42 2012 +1000 >=20 > xfs: really fix the cursor leak in xfs_alloc_ag_vextent_near I assume I'm supposed to apply this first: commit 76d095388b040229ea1aad7dea45be0cfa20f589 Author: Dave Chinner Date: Tue Jun 12 14:20:26 2012 +1000 xfs: fix allocbt cursor leak in xfs_alloc_ag_vextent_near So I've queued up both of these. Ben. --=20 Ben Hutchings Kids! Bringing about Armageddon can be dangerous. Do not attempt it in your own home. - Terry Pratchett and Neil Gaiman, `Good Omens' --=-2k+LEOsAS2On6GRrQsko Content-Type: application/pgp-signature; name="signature.asc" Content-Description: This is a digitally signed message part -----BEGIN PGP SIGNATURE----- Version: GnuPG v2 iQIVAwUAU92HMOe/yOyVhhEJAQrDUg/+N1dtGeuhxC+v5li/Ah4UMK+fVIeUGQ0k K62Mhb8o0zEm7ZxK6DK7ky+AeMBCesve50FiuiMXFyJyeL+GT+TMrkLcHKN4Ia1H UlshiZGx68QSU/rL9eAGK/0hwDyfPdWod7rXsNcvZqo11C3lOuoQhrslSfwuVb6L /e/2eypLmJ47rPIBTMz2AZZLzuZDBHPdd0fK4Kw2FHJw7F7wbJ30Vbpz7EEXZ1V5 Ds4q4dKfOrC/jaQlJO0SbiFC7wvpAmg/dUAU5xLE6SoY0uZDZiqssYpqB4SigUFf TyxnMKRQ3tc1zDk5vWiMOppKP27SbKHQKd+Od+IVwJBy92+rMLBgj6CuC0QLuVC2 i+x5uXjQ/Oeo6eXVOzT+caAqJ5gnn/k9HN/l3p1imyLovFb62a5dukcpNPapp+FR V4/j1sTmfXIeGnI+yH693AMy8d5wNgeH4Bqakukr7fEcXOY1Zx11lzqPC3HTQnWI KkYtHw8VtgXTTdELVcBRphNvAnAsV7aKCiLucQgxkaPvkoDDB3lNalkSdC1WO18b vR48vNNXL27lJBHoto1MHhJ8BazSI+1Y016gaiql81vX7FO0YkpfiEJMBaIWhymG cuagIXjKkp/RrnjGH8mL3PcDHq0RqDq1zm/BjAznZZsErPMl/Ol0ylP4xv1Y3Kvq pwFdY5d/0rE= =GPx1 -----END PGP SIGNATURE----- --=-2k+LEOsAS2On6GRrQsko-- From root@krios.tbi.univie.ac.at Sat Aug 2 23: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 (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 2ADAB7F59 for ; Sat, 2 Aug 2014 23:25:12 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id BD0DCAC002 for ; Sat, 2 Aug 2014 21:25:08 -0700 (PDT) X-ASG-Debug-ID: 1407039906-04cb6c555efa380001-NocioJ Received: from krios.tbi.univie.ac.at (krios.tbi.univie.ac.at [131.130.44.60]) by cuda.sgi.com with ESMTP id zAv7KamBdG26bYOd for ; Sat, 02 Aug 2014 21:25:06 -0700 (PDT) X-Barracuda-Envelope-From: root@krios.tbi.univie.ac.at X-Barracuda-Apparent-Source-IP: 131.130.44.60 Received: by krios.tbi.univie.ac.at (Postfix) id 53F915EFD3; Sun, 3 Aug 2014 06:25:03 +0200 (CEST) Delivered-To: root@krios.tbi.univie.ac.at Received: by krios.tbi.univie.ac.at (Postfix, from userid 0) id 488B35F456; Sun, 3 Aug 2014 06:25:03 +0200 (CEST) From: root@krios.tbi.univie.ac.at (Cron Daemon) To: root@krios.tbi.univie.ac.at Subject: Cron test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily ) Content-Type: text/plain; charset=UTF-8 X-ASG-Orig-Subj: Cron test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily ) X-Cron-Env: X-Cron-Env: X-Cron-Env: X-Cron-Env: Message-Id: <20140803042503.488B35F456@krios.tbi.univie.ac.at> Date: Sun, 3 Aug 2014 06:25:03 +0200 (CEST) X-Barracuda-Connect: krios.tbi.univie.ac.at[131.130.44.60] X-Barracuda-Start-Time: 1407039906 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.70 X-Barracuda-Spam-Status: No, SCORE=0.70 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, BSF_SC0_SA_TO_FROM_ADDR_MATCH, PR0N_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.8074 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) 0.50 BSF_SC0_SA_TO_FROM_ADDR_MATCH Sender Address Matches Recipient Address /etc/cron.daily/logrotate: error: error opening /home/git/gitlab/log/application.log: Permission denied error: error opening /home/git/gitlab/log/githost.log: Permission denied error: error opening /home/git/gitlab/log/production.log: Permission denied error: error opening /home/git/gitlab/log/satellites.log: Permission denied error: error opening /home/git/gitlab/log/sidekiq.log: Permission denied error: error opening /home/git/gitlab/log/unicorn.stderr.log: Permission denied error: error opening /home/git/gitlab/log/unicorn.stdout.log: Permission denied error: error opening /home/git/gitlab-shell/gitlab-shell.log: Permission denied run-parts: /etc/cron.daily/logrotate exited with return code 1 From webmaster@dev102.magizz.com Sun Aug 3 01:12: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=2.7 required=5.0 tests=GUARANTEED_100_PERCENT, HTML_MESSAGE,RCVD_NUMERIC_HELO,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 3F57D7F5D for ; Sun, 3 Aug 2014 01:12:12 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 1D237304032 for ; Sat, 2 Aug 2014 23:12:12 -0700 (PDT) X-ASG-Debug-ID: 1407046326-04cbb02d84101540001-NocioJ Received: from vps.magizz.com (vps.magizz.com [162.251.83.157]) by cuda.sgi.com with ESMTP id 8khk8Hh7CaUC9sJp (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Sat, 02 Aug 2014 23:12:06 -0700 (PDT) X-Barracuda-Envelope-From: webmaster@dev102.magizz.com X-Barracuda-Apparent-Source-IP: 162.251.83.157 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=dev102.magizz.com; s=default; h=Content-Type:MIME-Version:List-Owner:List-Subscribe:List-Unsubscribe:List-Help:Message-ID:Reply-To:From:Date:Subject:To; bh=0seqdvgsiOCc+tCqdfagxqbl8tXrOuGXD6FFFPxx0yw=; b=JWVB/kN45Jx2bpK1lD8AugUfhAtxHLeaji5vEISqIhnxdKqJAYy3Km9KY1NRl0g2BDScGyQ7liF2iBsdUhX0Sby9pcHKN9aJxn/53ur0OTZZ8vPirsa7n79f49JBsVzM5PJ64bZjWlXVfHCEN0T9hSCqqiP9JC76PcIBM+VCYyM=; Received: from dev102magizz by vps.magizz.com with local (Exim 4.82) (envelope-from ) id 1XDp1c-00059k-8e for xfs@oss.sgi.com; Sun, 03 Aug 2014 10:12:08 +0400 To: xfs@oss.sgi.com Subject: Looking for an iPhone !! Your search ends here X-PHP-Script: dev102.magizz.com/mailz/admin/index.php for 116.203.3.153 X-ASG-Orig-Subj: Looking for an iPhone !! Your search ends here Received: from 116.203.3.153 [116.203.3.153] by dev102.magizz.com with HTTP; Sun, 03 Aug 2014 05:02:08 +0000 Date: Sun, 3 Aug 2014 06:12:08 +0000 From: Offer Limited Reply-To: Offer Limited Message-ID: <1ce7a6282235e4b6c0f35717903536b6@dev102.magizz.com> X-Priority: 3 X-Mailer: PHPMailer 5.2.5 (https://github.com/Synchro/PHPMailer/) X-phpList-version: 3.0.6 X-MessageID: 6 X-ListMember: xfs@oss.sgi.com Precedence: bulk Bounces-To: webmaster@dev102.magizz.com List-Help: List-Unsubscribe: List-Subscribe: List-Owner: MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="b1_1ce7a6282235e4b6c0f35717903536b6" X-AntiAbuse: This header was added to track abuse, please include it with any abuse report X-AntiAbuse: Primary Hostname - vps.magizz.com X-AntiAbuse: Original Domain - oss.sgi.com X-AntiAbuse: Originator/Caller UID/GID - [503 514] / [47 12] X-AntiAbuse: Sender Address Domain - dev102.magizz.com X-Get-Message-Sender-Via: vps.magizz.com: authenticated_id: dev102magizz/from_h X-Barracuda-Connect: vps.magizz.com[162.251.83.157] X-Barracuda-Start-Time: 1407046326 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.22 X-Barracuda-Spam-Status: No, SCORE=2.22 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED, GUARANTEED_100_PERCENT, HTML_MESSAGE, RCVD_NUMERIC_HELO, RCVD_NUMERIC_HELO_2 X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.8076 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.96 GUARANTEED_100_PERCENT BODY: One hundred percent guaranteed 0.00 RCVD_NUMERIC_HELO Received: contains an IP address used for HELO -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 0.00 HTML_MESSAGE BODY: HTML included in message 1.25 RCVD_NUMERIC_HELO_2 Received: contains an IP address used for HELO --b1_1ce7a6282235e4b6c0f35717903536b6 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable Dear User, Good News for You The Smart Phone, you dreamt of always, can be yours now=20 With a single click you can claim your dream phone today Click and claim the brand new *Apple iPhone 5 * Click and claim the brand new *Samsung Galaxy Grand 2* Click and claim the brand new *Samsung Galaxy S5* Offer Valid Only for a Limited Period. So Hurry up and Claim it! These Amazing Gifts for you are 100% guaranteed. If you miss, you'll miss =E2=80=98big' -- This message was sent to xfs@oss.sgi.com by swati@dev102.magizz.com To forward this message, please do not use the forward button of your email application, because this message was made specifically for you only. Instead use the forward page=0A in our newsletter system. To change your details and to choose which lists to be subscribed to, visit your personal preferences page=0A Or you can opt-out completely=0A from all future mailings. =20 amj --b1_1ce7a6282235e4b6c0f35717903536b6 Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: quoted-printable =0A =0A

 Dear User,


Good News for You


The Smart Phone, you dreamt of always, can be your= s now 


With a si= ngle click you can claim your dream phone today

 

Click and claim the brand new Apple iPhone 5


Click and claim the brand new Samsung Galaxy Grand 2


Click and claim the brand new Samsung Galaxy S5

 

Offer Valid Only for a Limited Period. So Hurry up= and Claim it!


These Amazing Gifts for you are 100% guaranteed. I= f you miss, you’ll miss ‘big’



-- =20

This message was sent to xfs@oss.sgi.com by swati@dev102.magizz.co= m

To forward this message, please do not use the forward button of y= our email application, because this message was made specifically for you o= nly. Instead use the forward page in our newsletter system.
To change your details and to choose which lists to be subscribed to,= visit your personal preferences page
Or you can opt-out completely from all future mailings.

=0Aamj --b1_1ce7a6282235e4b6c0f35717903536b6-- From dgc@oss.sgi.com Sun Aug 3 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=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 B66437F47; Sun, 3 Aug 2014 20:25:56 -0500 (CDT) From: xfs@oss.sgi.com To: xfs@oss.sgi.com Subject: [XFS updates] XFS development tree branch, xfs-bulkstat-refactor, created. xfs-for-linus-3.16-rc1-13116-g1e773c4 X-Git-Refname: refs/heads/xfs-bulkstat-refactor X-Git-Reftype: branch X-Git-Oldrev: 0000000000000000000000000000000000000000 X-Git-Newrev: 1e773c4989d2dfe08332b4c18f7e1d7ad633015c Message-Id: <20140804012556.B66437F47@oss.sgi.com> Date: Sun, 3 Aug 2014 20:25:56 -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-bulkstat-refactor has been created at 1e773c4989d2dfe08332b4c18f7e1d7ad633015c (commit) - Log ----------------------------------------------------------------- commit 1e773c4989d2dfe08332b4c18f7e1d7ad633015c Author: Jie Liu Date: Mon Aug 4 11:22:31 2014 +1000 xfs: introduce xfs_bulkstat_ag_ichunk Introduce xfs_bulkstat_ag_ichunk() to process inodes in chunk with a pointer to a formatter function that will iget the inode and fill in the appropriate structure. Refactor xfs_bulkstat() with it. Signed-off-by: Jie Liu Reviewed-by: Dave Chinner Signed-off-by: Dave Chinner ----------------------------------------------------------------------- hooks/post-receive -- XFS development tree From dgc@oss.sgi.com Sun Aug 3 20:26: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=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 436A07F54; Sun, 3 Aug 2014 20:26:38 -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.16-rc5-36-g61cd578 X-Git-Refname: refs/heads/for-next X-Git-Reftype: branch X-Git-Oldrev: c3dd0d14e34aa901af41b1737dd5e78c60e71ef2 X-Git-Newrev: 61cd57814b16d1e76e0ec53259c9cb255ef789a4 Message-Id: <20140804012638.436A07F54@oss.sgi.com> Date: Sun, 3 Aug 2014 20:26:38 -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 61cd578 Merge branch 'xfs-bulkstat-refactor' into for-next 1e773c4 xfs: introduce xfs_bulkstat_ag_ichunk f3d1e58 xfs: introduce xfs_bulkstat_grab_ichunk 4b8fdfe xfs: introduce xfs_bulkstat_ichunk_ra d4c2734 xfs: fix error handling at xfs_bulkstat 296dfd7 xfs: remove redundant user buffer count checks at xfs_bulkstat c7cb51d xfs: fix error handling at xfs_inumbers 549fa00 xfs: consolidate xfs_inumbers d716f8e xfs: remove xfs_bulkstat_single 8fe6577 xfs: remove redundant stat assignment in xfs_bulkstat_one_int from c3dd0d14e34aa901af41b1737dd5e78c60e71ef2 (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 61cd57814b16d1e76e0ec53259c9cb255ef789a4 Merge: c3dd0d1 1e773c4 Author: Dave Chinner Date: Mon Aug 4 11:24:57 2014 +1000 Merge branch 'xfs-bulkstat-refactor' into for-next ----------------------------------------------------------------------- Summary of changes: fs/xfs/xfs_ioctl.c | 4 +- fs/xfs/xfs_ioctl32.c | 2 +- fs/xfs/xfs_itable.c | 569 ++++++++++++++++++++++++--------------------------- fs/xfs/xfs_itable.h | 23 ++- 4 files changed, 283 insertions(+), 315 deletions(-) hooks/post-receive -- XFS development tree From david@fromorbit.com Sun Aug 3 21:20: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 B6CBF7F55 for ; Sun, 3 Aug 2014 21:20:14 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id A478C8F8040 for ; Sun, 3 Aug 2014 19:20:11 -0700 (PDT) X-ASG-Debug-ID: 1407118808-04cbb02d83118d50001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id HLSjFeOMLWEkwEz8 for ; Sun, 03 Aug 2014 19:20: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: AmULALHs3lN5LKl0PGdsb2JhbABbgw2BKYInhQinJQEBAQEBAQalCAGBFBcFAQEBATg2hAQBBTocIxAIAw4KCSUPBSUDBxoTiEHFehcYhWSJUAeESwWcBYt8jEMrLw Received: from ppp121-44-169-116.lns20.syd7.internode.on.net (HELO dastard) ([121.44.169.116]) by ipmail05.adl6.internode.on.net with ESMTP; 04 Aug 2014 11:50:07 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1XE7sb-00088y-Vz; Mon, 04 Aug 2014 12:20:06 +1000 Date: Mon, 4 Aug 2014 12:20:05 +1000 From: Dave Chinner To: Christoph Hellwig Cc: Eric Sandeen , xfs-oss Subject: Re: Is jdm_delete_filehandle part of a public API? Message-ID: <20140804022005.GV20518@dastard> X-ASG-Orig-Subj: Re: Is jdm_delete_filehandle part of a public API? References: <53D7DA7F.2040706@redhat.com> <20140801135305.GA31894@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140801135305.GA31894@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: 1407118808 X-Barracuda-URL: http://192.48.176.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.8100 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Fri, Aug 01, 2014 at 06:53:05AM -0700, Christoph Hellwig wrote: > Talking about libhandle: this one has been a bit bitrotted. Maybe it's > a good time to move everything over to the kernel by handle syscalls > and deprecated it? First you need to make the kernel by-handle interfaces handle the sae functionality as the XFS by-handle ioctls. 1. O_NOCMTIME doesn't exist, and so there's no way to do invisible IO on files. 2. Can we construct VFs filehandles in userspace from bulkstat information (dump, xfs_fsr and others rely on this capability)? 3. The kernel by-handle interfaces cannot manipulate attributes at all (i.e. attr-list, attr-multi functionality). So until the VFS by-handle interfaces can do these things, we can't change libhandle over to use the newer kernel interfaces. I'm also pretty sure the incompatible handle format would mean big problems if someone were to be storing file handles in userspace and they upgrade their version of libhandle. i.e. such a library implementation change is not forwards or backwards compatible with existing applications, but bumping the major shared library version should solve that problem. However, these are all solvable problems. It's definitely a low priority for me to do this, but if you want to do it patches will definitely be accepted ;) Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Sun Aug 3 22:20: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 (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 911387F5E for ; Sun, 3 Aug 2014 22:20:24 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 7FE69304048 for ; Sun, 3 Aug 2014 20:20:24 -0700 (PDT) X-ASG-Debug-ID: 1407122418-04cb6c555c112ce0001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id dIwKTPnzHuuZ4zEZ for ; Sun, 03 Aug 2014 20:20:19 -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: Ap8IAPf63lN5LKl0PGdsb2JhbABbgw2BKYInrC4BAQEBAQalCAGBFRcFAQEBATg2hAQBBScTHCMQCBEHDCUPBSUDBxoTiEHFchcYhWSJRQsHhEsFnAWLfIxDKy8 Received: from ppp121-44-169-116.lns20.syd7.internode.on.net (HELO dastard) ([121.44.169.116]) by ipmail05.adl6.internode.on.net with ESMTP; 04 Aug 2014 12:50:18 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1XE8oq-0008Gc-VZ; Mon, 04 Aug 2014 13:20:17 +1000 Date: Mon, 4 Aug 2014 13:20:16 +1000 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com Subject: [PATCH 3/6 V2] xfs: kill VN_DIRTY() Message-ID: <20140804032016.GW20518@dastard> X-ASG-Orig-Subj: [PATCH 3/6 V2] xfs: kill VN_DIRTY() References: <1406791995-14723-1-git-send-email-david@fromorbit.com> <1406791995-14723-4-git-send-email-david@fromorbit.com> <20140731171302.GA22173@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140731171302.GA22173@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: 1407122419 X-Barracuda-URL: http://192.48.176.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.8101 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner Only one user and the use of a dirty page cache check is redundant, so just get rid of it. Signed-off-by: Dave Chinner --- fs/xfs/xfs_inode.c | 2 +- fs/xfs/xfs_vnode.h | 2 -- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c index 1a5e068..fea3c92 100644 --- a/fs/xfs/xfs_inode.c +++ b/fs/xfs/xfs_inode.c @@ -1635,7 +1635,7 @@ xfs_release( truncated = xfs_iflags_test_and_clear(ip, XFS_ITRUNCATED); if (truncated) { xfs_iflags_clear(ip, XFS_IDIRTY_RELEASE); - if (VN_DIRTY(VFS_I(ip)) && ip->i_delayed_blks > 0) { + if (ip->i_delayed_blks > 0) { error = filemap_flush(VFS_I(ip)->i_mapping); if (error) return error; diff --git a/fs/xfs/xfs_vnode.h b/fs/xfs/xfs_vnode.h index e8a7738..07b475a 100644 --- a/fs/xfs/xfs_vnode.h +++ b/fs/xfs/xfs_vnode.h @@ -39,8 +39,6 @@ struct attrlist_cursor_kern; */ #define VN_MAPPED(vp) mapping_mapped(vp->i_mapping) #define VN_CACHED(vp) (vp->i_mapping->nrpages) -#define VN_DIRTY(vp) mapping_tagged(vp->i_mapping, \ - PAGECACHE_TAG_DIRTY) #endif /* __XFS_VNODE_H__ */ From dgc@oss.sgi.com Sun Aug 3 23:05: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=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 630237F63; Sun, 3 Aug 2014 23:05:17 -0500 (CDT) From: xfs@oss.sgi.com To: xfs@oss.sgi.com Subject: [XFS updates] XFS development tree branch, xfs-sysfs-support, updated. xfs-for-linus-3.16-rc5-14-g6eee897 X-Git-Refname: refs/heads/xfs-sysfs-support X-Git-Reftype: branch X-Git-Oldrev: a087481811bed920eb5eedbb5574b915881adbea X-Git-Newrev: 6eee8972cc1799d3dde3f1e699abf286ed3adbaf Message-Id: <20140804040517.630237F63@oss.sgi.com> Date: Sun, 3 Aug 2014 23:05: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, xfs-sysfs-support has been updated 6eee897 xfs: fix coccinelle warnings from a087481811bed920eb5eedbb5574b915881adbea (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 6eee8972cc1799d3dde3f1e699abf286ed3adbaf Author: kbuild test robot Date: Mon Aug 4 13:49:40 2014 +1000 xfs: fix coccinelle warnings Removes unneeded semicolon, introduced by commit a70a4fa5 ("xfs: fix a couple error sequence jumps in xfs_mountfs"): fs/xfs/xfs_mount.c:858:24-25: Unneeded semicolon Generated by: scripts/coccinelle/misc/semicolon.cocci Signed-off-by: Fengguang Wu Reviewed-by: Brian Foster Signed-off-by: Dave Chinner ----------------------------------------------------------------------- Summary of changes: fs/xfs/xfs_mount.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) hooks/post-receive -- XFS development tree From dgc@oss.sgi.com Sun Aug 3 23:05: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=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 2CFF27F6A; Sun, 3 Aug 2014 23:05:45 -0500 (CDT) From: xfs@oss.sgi.com To: xfs@oss.sgi.com Subject: [XFS updates] XFS development tree branch, xfs-misc-fixes-3.17-2, created. xfs-for-linus-3.16-rc1-13119-g4ef897a X-Git-Refname: refs/heads/xfs-misc-fixes-3.17-2 X-Git-Reftype: branch X-Git-Oldrev: 0000000000000000000000000000000000000000 X-Git-Newrev: 4ef897a27543b513351262881660147366c042a1 Message-Id: <20140804040545.2CFF27F6A@oss.sgi.com> Date: Sun, 3 Aug 2014 23:05:43 -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-3.17-2 has been created at 4ef897a27543b513351262881660147366c042a1 (commit) - Log ----------------------------------------------------------------- commit 4ef897a27543b513351262881660147366c042a1 Author: Dave Chinner Date: Mon Aug 4 13:44:08 2014 +1000 xfs: flush both inodes in xfs_swap_extents We need to treat both inodes identically from a page cache point of view when prepareing them for extent swapping. We don't do this right now - we assume that one of the inodes empty, because that's what xfs_fsr currently does. Remove this assumption from the code. While factoring out the flushing and related checks, move the transactions reservation to immeidately after the flushes so that we don't need to pick up and then drop the ilock to do the transaction reservation. There are no issues with aborting the transaction it if the checks fail before we join the inodes to the transaction and dirty them, so this is a safe change to make. Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig Signed-off-by: Dave Chinner commit 812176832169c77b4bacddd01edc3e55340263fd Author: Dave Chinner Date: Mon Aug 4 13:29:32 2014 +1000 xfs: fix swapext ilock deadlock xfs_swap_extents() holds the ilock over a call to filemap_write_and_wait(), which can then try to write data and take the ilock. That causes a self-deadlock. Fix the deadlock and clean up the code by separating the locking appropriately. Add a lockflags variable to track what locks we are holding as we gain and drop them and cleanup the error handling to always use "out_unlock" with the lockflags variable. Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig Signed-off-by: Dave Chinner commit b92cc59f69537f26d5a42e4171ccc864ae4d9383 Author: Dave Chinner Date: Mon Aug 4 13:28:20 2014 +1000 xfs: kill xfs_vnode.h Move the IO flag definitions to xfs_inode.h and kill the header file as it is now empty. Removing the xfs_vnode.h file showed up an implicit header include path: xfs_linux.h -> xfs_vnode.h -> xfs_fs.h And so every xfs header file has been inplicitly been including xfs_fs.h where it is needed or not. Hence the removal of xfs_vnode.h causes all sorts of build issues because BBTOB() and friends are no longer automatically included in the build. This also gets fixed. Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig Signed-off-by: Dave Chinner commit dd8c38bab0d88615e0bdf013e6de3d4345f8cda2 Author: Dave Chinner Date: Mon Aug 4 13:23:35 2014 +1000 xfs: kill VN_MAPPED Only one user, no longer needed. Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig Signed-off-by: Dave Chinner commit 2667c6f935d979cea1ab7fa58568fd0fd725525f Author: Dave Chinner Date: Mon Aug 4 13:23:15 2014 +1000 xfs: kill VN_CACHED Only has 2 users, has outlived it's usefulness. Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig Signed-off-by: Dave Chinner commit eac152b4742ec5f1ed04d73d699ae2be3607d56b Author: Dave Chinner Date: Mon Aug 4 13:22:49 2014 +1000 xfs: kill VN_DIRTY() Only one user of the macro and the dirty mapping check is redundant so just get rid of it. Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig Signed-off-by: Dave Chinner commit ad3714b82c631a34724da09a7daa53afcab952fa Author: Dave Chinner Date: Mon Aug 4 12:59:31 2014 +1000 xfs: dquot recovery needs verifiers dquot recovery should add verifiers to the dquot buffers that it recovers changes into. Unfortunately, it doesn't attached the verifiers to the buffers in a consistent manner. For example, xlog_recover_dquot_pass2() reads dquot buffers without a verifier and then writes it without ever having attached a verifier to the buffer. Further, dquot buffer recovery may write a dquot buffer that has not been modified, or indeed, shoul dbe written because quotas are not enabled and hence changes to the buffer were not replayed. In this case, we again write buffers without verifiers attached because that doesn't happen until after the buffer changes have been replayed. Signed-off-by: Dave Chinner Reviewed-by: Brian Foster Signed-off-by: Dave Chinner commit 5fd364fee81a7888af806e42ed8a91c845894f2d Author: Dave Chinner Date: Mon Aug 4 12:43:26 2014 +1000 xfs: quotacheck leaves dquot buffers without verifiers When running xfs/305, I noticed that quotacheck was flushing dquot buffers that did not have the xfs_dquot_buf_ops verifiers attached: XFS (vdb): _xfs_buf_ioapply: no ops on block 0x1dc8/0x1dc8 ffff880052489000: 44 51 01 04 00 00 65 b8 00 00 00 00 00 00 00 00 DQ....e......... ffff880052489010: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ ffff880052489020: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ ffff880052489030: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ CPU: 1 PID: 2376 Comm: mount Not tainted 3.16.0-rc2-dgc+ #306 Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS Bochs 01/01/2011 ffff88006fe38000 ffff88004a0ffae8 ffffffff81cf1cca 0000000000000001 ffff88004a0ffb88 ffffffff814d50ca 000010004a0ffc70 0000000000000000 ffff88006be56dc4 0000000000000021 0000000000001dc8 ffff88007c773d80 Call Trace: [] dump_stack+0x45/0x56 [] _xfs_buf_ioapply+0x3ca/0x3d0 [] ? wake_up_state+0x20/0x20 [] ? xfs_bdstrat_cb+0x55/0xb0 [] xfs_buf_iorequest+0x6b/0xd0 [] xfs_bdstrat_cb+0x55/0xb0 [] __xfs_buf_delwri_submit+0x15b/0x220 [] ? xfs_buf_delwri_submit+0x30/0x90 [] xfs_buf_delwri_submit+0x30/0x90 [] xfs_qm_quotacheck+0x17d/0x3c0 [] xfs_qm_mount_quotas+0x151/0x1e0 [] xfs_mountfs+0x56c/0x7d0 [] xfs_fs_fill_super+0x2c2/0x340 [] mount_bdev+0x194/0x1d0 [] ? xfs_finish_flags+0x170/0x170 [] xfs_fs_mount+0x15/0x20 [] mount_fs+0x39/0x1b0 [] vfs_kern_mount+0x67/0x120 [] do_mount+0x23e/0xad0 [] ? __get_free_pages+0xe/0x50 [] ? copy_mount_options+0x36/0x150 [] SyS_mount+0x83/0xc0 [] tracesys+0xdd/0xe2 This was caused by dquot buffer readahead not attaching a verifier structure to the buffer when readahead was issued, resulting in the followup read of the buffer finding a valid buffer and so not attaching new verifiers to the buffer as part of the read. Also, when a verifier failure occurs, we then read the buffer without verifiers. Attach the verifiers manually after this read so that if the buffer is then written it will be verified that the corruption has been repaired. Further, when flushing a dquot we don't ask for a verifier when reading in the dquot buffer the dquot belongs to. Most of the time this isn't an issue because the buffer is still cached, but when it is not cached it will result in writing the dquot buffer without having the verfier attached. Signed-off-by: Dave Chinner Reviewed-by: Brian Foster Reviewed-by: Christoph Hellwig Signed-off-by: Dave Chinner commit 67dc288c21064b31a98a53dc64f6b9714b819fd6 Author: Dave Chinner Date: Mon Aug 4 12:43:06 2014 +1000 xfs: ensure verifiers are attached to recovered buffers Crash testing of CRC enabled filesystems has resulted in a number of reports of bad CRCs being detected after the filesystem was mounted. Errors such as the following were being seen: XFS (sdb3): Mounting V5 Filesystem XFS (sdb3): Starting recovery (logdev: internal) XFS (sdb3): Metadata CRC error detected at xfs_agf_read_verify+0x5a/0x100 [xfs], block 0x1 XFS (sdb3): Unmount and run xfs_repair XFS (sdb3): First 64 bytes of corrupted metadata buffer: ffff880136ffd600: 58 41 47 46 00 00 00 01 00 00 00 00 00 0f aa 40 XAGF...........@ ffff880136ffd610: 00 02 6d 53 00 02 77 f8 00 00 00 00 00 00 00 01 ..mS..w......... ffff880136ffd620: 00 00 00 01 00 00 00 00 00 00 00 00 00 00 00 03 ................ ffff880136ffd630: 00 00 00 04 00 08 81 d0 00 08 81 a7 00 00 00 00 ................ XFS (sdb3): metadata I/O error: block 0x1 ("xfs_trans_read_buf_map") error 74 numblks 1 The errors were typically being seen in AGF, AGI and their related btree block buffers some time after log recovery had run. Often it wasn't until later subsequent mounts that the problem was discovered. The common symptom was a buffer with the correct contents, but a CRC and an LSN that matched an older version of the contents. Some debug added to _xfs_buf_ioapply() indicated that buffers were being written without verifiers attached to them from log recovery, and Jan Kara isolated the cause to log recovery readahead an dit's interactions with buffers that had a more recent LSN on disk than the transaction being recovered. In this case, the buffer did not get a verifier attached, and os when the second phase of log recovery ran and recovered EFIs and unlinked inodes, the buffers were modified and written without the verifier running. Hence they had up to date contents, but stale LSNs and CRCs. Fix it by attaching verifiers to buffers we skip due to future LSN values so they don't escape into the buffer cache without the correct verifier attached. This patch is based on analysis and a patch from Jan Kara. cc: Reported-by: Jan Kara Reported-by: Fanael Linithien Reported-by: Grozdan Signed-off-by: Dave Chinner Reviewed-by: Brian Foster Reviewed-by: Christoph Hellwig Signed-off-by: Dave Chinner commit 400b9d88757c0bfbdfa97014e090ec40a31c1282 Author: Dave Chinner Date: Mon Aug 4 12:42:40 2014 +1000 xfs: catch buffers written without verifiers attached We recently had a bug where buffers were slipping through log recovery without any verifier attached to them. This was resulting in on-disk CRC mismatches for valid data. Add some warning code to catch this occurrence so that we catch such bugs during development rather than not being aware they exist. Note that we cannot do this verification unconditionally as non-CRC filesystems don't always attach verifiers to the buffers being written. e.g. during log recovery we cannot identify all the different types of buffers correctly on non-CRC filesystems, so we can't attach the correct verifiers in all cases and so we don't attach any. Hence we don't want on non-CRC filesystems to avoid spamming the logs with false indications. Signed-off-by: Dave Chinner Reviewed-by: Brian Foster Reviewed-by: Christoph Hellwig Signed-off-by: Dave Chinner commit 5ef828c4152726f56751c78ea844f08d2b2a4fa3 Author: Eric Sandeen Date: Mon Aug 4 11:35:44 2014 +1000 xfs: avoid false quotacheck after unclean shutdown The commit 83e782e xfs: Remove incore use of XFS_OQUOTA_ENFD and XFS_OQUOTA_CHKD added a new function xfs_sb_quota_from_disk() which swaps on-disk XFS_OQUOTA_* flags for in-core XFS_GQUOTA_* and XFS_PQUOTA_* flags after the superblock is read. However, if log recovery is required, the superblock is read again, and the modified in-core flags are re-read from disk, so we have XFS_OQUOTA_* flags in memory again. This causes the XFS_QM_NEED_QUOTACHECK() test to be true, because the XFS_OQUOTA_CHKD is still set, and not XFS_GQUOTA_CHKD or XFS_PQUOTA_CHKD. Change xfs_sb_from_disk to call xfs_sb_quota_from disk and always convert the disk flags to in-memory flags. Add a lower-level function which can be called with "false" to not convert the flags, so that the sb verifier can verify exactly what was on disk, per Brian Foster's suggestion. Reported-by: Cyril B. Signed-off-by: Eric Sandeen commit eedf32bfcace7d8e20cc66757d74fc68f3439ff7 Author: Brian Foster Date: Mon Aug 4 11:35:35 2014 +1000 xfs: fix rounding error of fiemap length parameter The offset and length parameters are converted from bytes to basic blocks by xfs_vn_fiemap(). The BTOBB() converter rounds the value up to the nearest basic block. This leads to unexpected behavior when unaligned offsets are provided to FIEMAP. Fix the conversions of byte values to block values to cover the provided offsets. Round down the start offset to the nearest basic block. Calculate the end offset based on the provided values, round up and calculate length based on the start block offset. Reported-by: Chandan Rajendra Signed-off-by: Brian Foster Reviewed-by: Dave Chinner Signed-off-by: Dave Chinner ----------------------------------------------------------------------- hooks/post-receive -- XFS development tree From dgc@oss.sgi.com Sun Aug 3 23:10: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=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 28EF97F6F; Sun, 3 Aug 2014 23:10:14 -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.16-rc5-50-g645f985 X-Git-Refname: refs/heads/for-next X-Git-Reftype: branch X-Git-Oldrev: 61cd57814b16d1e76e0ec53259c9cb255ef789a4 X-Git-Newrev: 645f9857213476407d8ed1b59619fdff7128d3e6 Message-Id: <20140804041014.28EF97F6F@oss.sgi.com> Date: Sun, 3 Aug 2014 23:10:13 -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 61cd57814b16d1e76e0ec53259c9cb255ef789a4 (commit) discards c3dd0d14e34aa901af41b1737dd5e78c60e71ef2 (commit) discards 05e7126eaeca45586282176cdbacf75730182e26 (commit) 645f985 Merge branch 'xfs-misc-fixes-3.17-2' into for-next b076d87 Merge branch 'xfs-bulkstat-refactor' into for-next 4d7eece Merge branch 'xfs-misc-fixes-3.17-1' into for-next e0ac6d4 Merge branch 'xfs-quota-eofblocks-scan' into for-next 6eee897 xfs: fix coccinelle warnings 4ef897a xfs: flush both inodes in xfs_swap_extents 8121768 xfs: fix swapext ilock deadlock b92cc59 xfs: kill xfs_vnode.h dd8c38b xfs: kill VN_MAPPED 2667c6f xfs: kill VN_CACHED eac152b xfs: kill VN_DIRTY() ad3714b xfs: dquot recovery needs verifiers 5fd364f xfs: quotacheck leaves dquot buffers without verifiers 67dc288 xfs: ensure verifiers are attached to recovered buffers 400b9d8 xfs: catch buffers written without verifiers attached 5ef828c xfs: avoid false quotacheck after unclean shutdown eedf32b xfs: fix rounding error of fiemap length parameter from 61cd57814b16d1e76e0ec53259c9cb255ef789a4 (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 645f9857213476407d8ed1b59619fdff7128d3e6 Merge: b076d87 4ef897a Author: Dave Chinner Date: Mon Aug 4 13:55:27 2014 +1000 Merge branch 'xfs-misc-fixes-3.17-2' into for-next commit b076d8720d793cde04b75b4941b8774e209649b4 Merge: 4d7eece 1e773c4 Author: Dave Chinner Date: Mon Aug 4 13:54:46 2014 +1000 Merge branch 'xfs-bulkstat-refactor' into for-next commit 4d7eece2c0dad832c5f224629eba3cced3f2d6cd Merge: e0ac6d4 d5cf09b Author: Dave Chinner Date: Mon Aug 4 13:54:14 2014 +1000 Merge branch 'xfs-misc-fixes-3.17-1' into for-next commit e0ac6d45bc52065d388b5aa153b58233af25a429 Merge: 6eee897 f074051 Author: Dave Chinner Date: Mon Aug 4 13:53:47 2014 +1000 Merge branch 'xfs-quota-eofblocks-scan' into for-next ----------------------------------------------------------------------- Summary of changes: fs/xfs/libxfs/xfs_sb.c | 24 ++++++++++-- fs/xfs/xfs_bmap_util.c | 100 +++++++++++++++++++++++------------------------ fs/xfs/xfs_buf.c | 14 +++++++ fs/xfs/xfs_dquot.c | 3 +- fs/xfs/xfs_file.c | 10 ++--- fs/xfs/xfs_inode.c | 2 +- fs/xfs/xfs_inode.h | 10 +++++ fs/xfs/xfs_ioctl.c | 6 +-- fs/xfs/xfs_ioctl32.c | 3 +- fs/xfs/xfs_iops.c | 4 +- fs/xfs/xfs_linux.h | 2 +- fs/xfs/xfs_log.c | 8 +++- fs/xfs/xfs_log_recover.c | 95 +++++++++++++++++++++++++------------------- fs/xfs/xfs_mount.c | 3 +- fs/xfs/xfs_qm.c | 8 +++- fs/xfs/xfs_vnode.h | 46 ---------------------- 16 files changed, 176 insertions(+), 162 deletions(-) delete mode 100644 fs/xfs/xfs_vnode.h hooks/post-receive -- XFS development tree From david@fromorbit.com Mon Aug 4 02:34: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 530DA7F56 for ; Mon, 4 Aug 2014 02:34:53 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 4155B30404E for ; Mon, 4 Aug 2014 00:34:50 -0700 (PDT) X-ASG-Debug-ID: 1407137687-04cb6c555c119160001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id HrkCsRADCv69B2Rg for ; Mon, 04 Aug 2014 00:34:47 -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: Ap8IAAE331N5LKl0PGdsb2JhbABbgw2BKYInrDUBAQEBAQalCAGBFhcFAQEBATg2hAMBAQUnExwjEAgDDgcDCSUPBSUDBxoTiEHEXhcYhWSJA00HhEsFnAWYPysvgQU Received: from ppp121-44-169-116.lns20.syd7.internode.on.net (HELO dastard) ([121.44.169.116]) by ipmail06.adl6.internode.on.net with ESMTP; 04 Aug 2014 17:04:45 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1XECn5-0000a3-Cl; Mon, 04 Aug 2014 17:34:43 +1000 Date: Mon, 4 Aug 2014 17:34:43 +1000 From: Dave Chinner To: Brian Foster Cc: xfs@oss.sgi.com Subject: Re: [PATCH 1/6] xfs: remove bitfield based superblock updates Message-ID: <20140804073443.GX20518@dastard> X-ASG-Orig-Subj: Re: [PATCH 1/6] xfs: remove bitfield based superblock updates References: <1406791995-14723-1-git-send-email-david@fromorbit.com> <1406791995-14723-2-git-send-email-david@fromorbit.com> <20140801143751.GB3582@laptop.bfoster> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140801143751.GB3582@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: 1407137687 X-Barracuda-URL: http://192.48.176.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.8105 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Fri, Aug 01, 2014 at 10:37:51AM -0400, Brian Foster wrote: > On Thu, Jul 31, 2014 at 05:33:10PM +1000, Dave Chinner wrote: > > From: Dave Chinner > > > > When we log changes to the superblock, we first have to write them > > to the on-disk buffer, and then log that. Right now we have a > > complex bitfield based arrangement to only write the modified field > > to the buffer before we log it. > > > > This used to be necessary as a performance optimisation because we > > logged the superblock buffer in every extent or inode allocation or > > freeing, and so performance was extremely important. We haven't done > > this for years, however, ever since the lazy superblock counters > > pulled the superblock logging out of the transaction commit > > fast path. > > > > Hence we have a bunch of complexity that is not necessary that makes > > writing the in-core superblock to disk much more complex than it > > needs to be. We only need to log the superblock now during > > management operations (e.g. during mount, unmount or quota control > > operations) so it is not a performance critical path anymore. > > > > As such, remove the complex field based logging mechanism and > > replace it with a simple conversion function similar to what we use > > for all other on-disk structures. > > > > This means we always log the entirity of the superblock, but again > > because we rarely modify the superblock this is not an issue for log > > bandwidth or CPU time. Indeed, if we do log the superblock > > frequently, delayed logging will minimise the impact of this > > overhead. ... > > @@ -447,125 +384,119 @@ xfs_sb_from_disk( > > to->sb_lsn = be64_to_cpu(from->sb_lsn); > > } > > > > -static inline void > > +static void > > xfs_sb_quota_to_disk( > > - xfs_dsb_t *to, > > - xfs_sb_t *from, > > - __int64_t *fields) > > + struct xfs_dsb *to, > > + struct xfs_sb *from) > > { > > __uint16_t qflags = from->sb_qflags; > > > > + to->sb_uquotino = cpu_to_be64(from->sb_uquotino); > > + if (xfs_sb_version_has_pquotino(from)) { > > + to->sb_qflags = be16_to_cpu(from->sb_qflags); > > + to->sb_gquotino = cpu_to_be64(from->sb_gquotino); > > + to->sb_pquotino = cpu_to_be64(from->sb_pquotino); > > + return; > > + } > > + > > Ok, so we're inheriting the quota conversion from xfs_sb_to_disk() > unconditionally (as opposed to previously being solely a has_pquotino() > fixup function). Right - that's one of the problems with this function - it modifies some fields and modifies flags for other code to do the right thing. It's kinda confusing to split it up like that rather than have all the quota translation in one place. > > > /* > > - * We need to do these manipilations only if we are working > > - * with an older version of on-disk superblock. > > + * The in-core version of sb_qflags do not have XFS_OQUOTA_* > > + * flags, whereas the on-disk version does. So, convert incore > > + * XFS_{PG}QUOTA_* flags to on-disk XFS_OQUOTA_* flags. > > */ > > - if (xfs_sb_version_has_pquotino(from)) > > - return; > > + qflags &= ~(XFS_PQUOTA_ENFD | XFS_PQUOTA_CHKD | > > + XFS_GQUOTA_ENFD | XFS_GQUOTA_CHKD); > > > > - if (*fields & XFS_SB_QFLAGS) { > > - /* > > - * The in-core version of sb_qflags do not have > > - * XFS_OQUOTA_* flags, whereas the on-disk version > > - * does. So, convert incore XFS_{PG}QUOTA_* flags > > - * to on-disk XFS_OQUOTA_* flags. > > - */ > > - qflags &= ~(XFS_PQUOTA_ENFD | XFS_PQUOTA_CHKD | > > - XFS_GQUOTA_ENFD | XFS_GQUOTA_CHKD); > > - > > - if (from->sb_qflags & > > - (XFS_PQUOTA_ENFD | XFS_GQUOTA_ENFD)) > > - qflags |= XFS_OQUOTA_ENFD; > > - if (from->sb_qflags & > > - (XFS_PQUOTA_CHKD | XFS_GQUOTA_CHKD)) > > - qflags |= XFS_OQUOTA_CHKD; > > - to->sb_qflags = cpu_to_be16(qflags); > > - *fields &= ~XFS_SB_QFLAGS; > > - } > > + if (from->sb_qflags & > > + (XFS_PQUOTA_ENFD | XFS_GQUOTA_ENFD)) > > + qflags |= XFS_OQUOTA_ENFD; > > + if (from->sb_qflags & > > + (XFS_PQUOTA_CHKD | XFS_GQUOTA_CHKD)) > > + qflags |= XFS_OQUOTA_CHKD; > > + to->sb_qflags = cpu_to_be16(qflags); > > > > /* > > - * GQUOTINO and PQUOTINO cannot be used together in versions of > > - * superblock that do not have pquotino. from->sb_flags tells us which > > - * quota is active and should be copied to disk. If neither are active, > > - * make sure we write NULLFSINO to the sb_gquotino field as a quota > > - * inode value of "0" is invalid when the XFS_SB_VERSION_QUOTA feature > > - * bit is set. > > + * GQUOTINO and PQUOTINO cannot be used together in versions > > + * of superblock that do not have pquotino. from->sb_flags > > + * tells us which quota is active and should be copied to > > + * disk. If neither are active, we should NULL the inode. > > * > > - * Note that we don't need to handle the sb_uquotino or sb_pquotino here > > - * as they do not require any translation. Hence the main sb field loop > > - * will write them appropriately from the in-core superblock. > > + * In all cases, the separate pquotino must remain 0 because it > > + * it beyond the "end" of the valid non-pquotino superblock. > > */ > > - if ((*fields & XFS_SB_GQUOTINO) && > > - (from->sb_qflags & XFS_GQUOTA_ACCT)) > > + if (from->sb_qflags & XFS_GQUOTA_ACCT) > > to->sb_gquotino = cpu_to_be64(from->sb_gquotino); > > - else if ((*fields & XFS_SB_PQUOTINO) && > > - (from->sb_qflags & XFS_PQUOTA_ACCT)) > > + else if (from->sb_qflags & XFS_PQUOTA_ACCT) > > to->sb_gquotino = cpu_to_be64(from->sb_pquotino); > > - else { > > - /* > > - * We can't rely on just the fields being logged to tell us > > - * that it is safe to write NULLFSINO - we should only do that > > - * if quotas are not actually enabled. Hence only write > > - * NULLFSINO if both in-core quota inodes are NULL. > > - */ > > - if (from->sb_gquotino == NULLFSINO && > > - from->sb_pquotino == NULLFSINO) > > - to->sb_gquotino = cpu_to_be64(NULLFSINO); > > - } > > + else > > + to->sb_gquotino = cpu_to_be64(NULLFSINO); > > I'll ask since I'm not 100% on the backwards compatibility fixup here... > but this else condition is effectively the same logic as the previous > NULLFSINO checks due to the *QUOTA_ACCT flags checks, yes? If so, the > rest looks fine: *nod*. The in-core NULLFSINO checks were required because we couldn't trust either the superblock quota flags or the modified fields mask to tell us if we needed to convert the gquotino field from zero to NULLFSINO. >From a compatibility POV on older kernels, if usr quota is turned on but not grp/prj then the expected the value iof sb_gquotino is NULLFSINO. If quota is turned off, then either 0 or NULLFSINO are valid values. IOWs, the logic in the absence of the logging field bitmask is much, much simpler: if we don't write a real inode number to the field because quotas are not on then just write NULLFSINO. Clear as mud, huh? Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Mon Aug 4 03:09: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 6848F7F5E for ; Mon, 4 Aug 2014 03:09:44 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id EC3B0AC001 for ; Mon, 4 Aug 2014 01:09:40 -0700 (PDT) X-ASG-Debug-ID: 1407139774-04cbb02d86121540001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id iy1k4AoHao75XYwd for ; Mon, 04 Aug 2014 01:09:35 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.145 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: Ap8IADo/31N5LKl0PGdsb2JhbABRCoMNgSmCJ6w2AQEBAQEGpQgBgRYXBQEBAQE4NoQDAQEEAScTHCMFCwgDDgcDCSUPBSUDBxoTiDoHxEMXGIVkiHQPTQeESwWcBZg/Ky+BBQ Received: from ppp121-44-169-116.lns20.syd7.internode.on.net (HELO dastard) ([121.44.169.116]) by ipmail06.adl6.internode.on.net with ESMTP; 04 Aug 2014 17:39:33 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1XEDKk-0000ek-Jc; Mon, 04 Aug 2014 18:09:30 +1000 Date: Mon, 4 Aug 2014 18:09:30 +1000 From: Dave Chinner To: Brian Foster Cc: xfs@oss.sgi.com Subject: Re: [PATCH 2/6] xfs: consolidate superblock logging functions Message-ID: <20140804080930.GY20518@dastard> X-ASG-Orig-Subj: Re: [PATCH 2/6] xfs: consolidate superblock logging functions References: <1406791995-14723-1-git-send-email-david@fromorbit.com> <1406791995-14723-3-git-send-email-david@fromorbit.com> <20140801143929.GC3582@laptop.bfoster> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140801143929.GC3582@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: 1407139774 X-Barracuda-URL: http://192.48.176.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.8106 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Fri, Aug 01, 2014 at 10:39:29AM -0400, Brian Foster wrote: > On Thu, Jul 31, 2014 at 05:33:11PM +1000, Dave Chinner wrote: > > From: Dave Chinner > > > > We now have several superblock loggin functions that are identical > > except for the transaction reservation and whether it shoul dbe a > > synchronous transaction or not. Consolidate these all into a single > > function, a single reserveration and a sync flag and call it > > xfs_sync_sb(). > > > > Also, xfs_mod_sb() is not really a modification function - it's the > > operation of logging the superblock buffer. hence change the name of > > it to reflect this. > > > > Note that we have to change the mp->m_update_flags that are passed > > around at mount time to a boolean simply to indicate a superblock > > update is needed. ..... > > + > > +/* > > + * xfs_sync_sb > > + * > > + * Sync the superblock to disk. > > + * > > + * Note this code can be called during the process of freezing, so > > + * we may need to use the transaction allocator which does not > > + * block when the transaction subsystem is in its frozen state. > > + */ > > +int > > +xfs_sync_sb( > > + struct xfs_mount *mp, > > + bool wait) > > +{ > > + struct xfs_trans *tp; > > + int error; > > + > > + tp = _xfs_trans_alloc(mp, XFS_TRANS_SB_CHANGE, KM_SLEEP); > > We're converting some previous calls of xfs_trans_alloc() to the > _xfs_trans_alloc() variant. The only difference is the dropped call to > sb_start_intwrite() and I see that technically we handle that with the > xfs_fs_writeable() check. Writing a change to the superblock is not something that normal operations do. They are something that is typically done as a standalone management operation, and hence the xfs_fs_writeable() check is usually enough. So, the callers are: xfs_fs_log_dummy -> occurs during freeze _xfs_trans_alloc -> no change and xfs_log_sbcount -> occurs during freeze, unmount _xfs_trans_alloc -> no change and xfs_mount_reset_sbqflags -> called only in mount path xfs_fs_writable -> was just a RO check _xfs_trans_alloc -> was xfs_trans_alloc and xfs_mount_log_sb -> called only in mount path _xfs_trans_alloc -> was xfs_trans_alloc and xfs_qm_write_sb_changes -> quota on/off syscalls _xfs_trans_alloc -> was xfs_trans_alloc So the first 4 are effectively unchanged - there can be no racing freeze while we are in the mount path, so the change from xfs_trans_alloc to _xfs_trans_alloc makes no difference at all. Similarly, the change from an open-coded RO check to xfs_fs_writable() makes no difference, either. It's only the last function - xfs_qm_write_sb_changes() - where there is a difference. However, let's walk all the way back up the stack to the syscall quotactl(): sys_quotactl quotactl_block() if (quotactl_cmd_write()) get_super_thawed() which will only proceed with an unfrozen superblock, and it holds the sb->s_umount lock in read mode across the quotactl operation. Hence it will prevent the filesystem from being frozen during quota on/off operations. Hence we don't need or want freeze accounting on those operations because they need to complete before a freeze can be started. > Unless I misunderstand, the sb_start_inwrite() call is what will > block us on internal transaction allocs once the fs is already > frozen. It seems a little dicey to me to offer up this single > helper without much indication that a frozen check might be a > requirement, particularly since this is expected to be built into > the transaction infrastructure. Right, but none of the callers actually are run in a situation where they should block on freezes, either complete or in progress. i.e. there is no requirement for freeze checks - there is the opposite: requirements to avoid freeze checks so the code doesn't deadlock. > How would we expect a new caller to identify that? Same as we always do: by code review. > Even the current xfs_fs_writable() check seems like it might be > unnecessary, given some brief testing. I don't hit the mount path at all > on a frozen fs. xfs_fs_writable() checks more than whether the filesystem is frozen. ;) > I'm not sure of the mechanics behind that, but I'm > guessing some kind of reference remains on the sb of a frozen fs and a > subsequent umount/mount is purely namespace magic. Point being... this > appears to be implicit and confusing. IMO, using an _xfs_sync_sb() > variant that allocates a nonblocking tp if one isn't provided as a > parameter (for example) and using that only in the contexts we know it's > Ok to avoid freeze interaction issues might be more clear. Well, it was pretty clear to me that the code paths were free of freeze interactions. Looking at this - especially the quota on/off paths - I guess it's not as obvious as I thought it was... :/ Cheers, Dave. -- Dave Chinner david@fromorbit.com From alex@zadarastorage.com Mon Aug 4 06:00: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 084AE7F61 for ; Mon, 4 Aug 2014 06:00:17 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 9917AAC002 for ; Mon, 4 Aug 2014 04:00:13 -0700 (PDT) X-ASG-Debug-ID: 1407150009-04bdf03d4513e2c0001-NocioJ Received: from mail-wi0-f177.google.com (mail-wi0-f177.google.com [209.85.212.177]) by cuda.sgi.com with ESMTP id 9RjgfqnkWOJzKPrb (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Mon, 04 Aug 2014 04:00:10 -0700 (PDT) X-Barracuda-Envelope-From: alex@zadarastorage.com X-Barracuda-Apparent-Source-IP: 209.85.212.177 Received: by mail-wi0-f177.google.com with SMTP id ho1so4802532wib.4 for ; Mon, 04 Aug 2014 04:00:08 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:message-id:from:to:references:in-reply-to :subject:date:mime-version:content-type:content-transfer-encoding :importance; bh=mK3uSX5vJv87v0dEL4SL0NTa1WkycH9lxhDlrS5Fc7o=; b=bz+5lO9ToundgVp7BFM609BorjXaSSU1mu2G1Gj13RERzvf95CxUOm+6yMNjV7L85F FBC827lmmJIeDBZjqmpD38CiHi3h6+rB17bCqrKxEBKBLUteZtp+wcRcSYD7BX5trlbJ xrjnNQAcExQciNf2eHx+2fNG0ioKMfX9olH/e4PS7hCHTAqQJAuCDgwmCi5tz4dUEXYf LlXCuWpxFj1Q5fer4liRBARtG+1SAfQlcavXx9Rc4I6c3/4l5hxlQmVujIDu05o9pZLc YdiOvDNmWOLPXp1seAoLnGlPRP1TQEEb3Ic/S12H9tOqBMK5wHGf8sf1BHPYdOCarvu2 zJkg== X-Gm-Message-State: ALoCoQkeoOZHt9MwoB9L6z2mvYAo8pWgXA4PV1F6/pxKgorw0Mxf6wkPN45dtd0BQ59i0Qnv32w/ X-Received: by 10.180.210.167 with SMTP id mv7mr29234058wic.72.1407150007359; Mon, 04 Aug 2014 04:00:07 -0700 (PDT) Received: from alyakaslap ([212.143.144.103]) by mx.google.com with ESMTPSA id ex2sm39638660wic.24.2014.08.04.04.00.06 for (version=TLSv1 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Mon, 04 Aug 2014 04:00:06 -0700 (PDT) Message-ID: <9D3CBECB663B4A77B7EF74B67973310A@alyakaslap> From: "Alex Lyakas" To: References: <20131219105513.GZ31386@dastard> <8155F3F9D6094F40B4DA71BD561D2DE8@alyakaslap> <20131226230018.GJ20579@dastard> <20140113030230.GF3469@dastard> <20140113204314.GJ3469@dastard> <20140115014503.GQ3469@dastard> <20140119231745.GF18112@dastard> <4B2A412C75324EE9880358513C069476@alyakaslap> In-Reply-To: <4B2A412C75324EE9880358513C069476@alyakaslap> Subject: use-after-free on log replay failure Date: Mon, 4 Aug 2014 14:00:05 +0300 X-ASG-Orig-Subj: use-after-free on log replay failure MIME-Version: 1.0 Content-Type: text/plain; format=flowed; charset="iso-8859-1"; reply-type=response Content-Transfer-Encoding: 7bit X-Priority: 3 X-MSMail-Priority: Normal Importance: Normal X-Mailer: Microsoft Windows Live Mail 15.4.3555.308 X-MimeOLE: Produced By Microsoft MimeOLE V15.4.3555.308 X-Barracuda-Connect: mail-wi0-f177.google.com[209.85.212.177] X-Barracuda-Start-Time: 1407150009 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=MARKETING_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.8109 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words Greetings, we had a log replay failure due to some errors that the underlying block device returned: [49133.801406] XFS (dm-95): metadata I/O error: block 0x270e8c180 ("xlog_recover_iodone") error 28 numblks 16 [49133.802495] XFS (dm-95): log mount/recovery failed: error 28 [49133.802644] XFS (dm-95): log mount failed and then kernel panicked [1]. Looking at the code, when xfs_mountfs() fails, xfs_fs_fill_super() goes and cleans up and eventually frees the "xfs_mount" structure. But then xfs_buf_iodone_work() can still be delivered through "xfslogd_workqueue", which is static and not per-XFS. But this callback has a pointer to "xfs_mount", and may try to access it as in [1]. Does this analysis sound correct? Kernel is 3.8.13, but looking at the XFS master branch, it might have the same issue. Should we flush this static workqueue before unmounting? Thanks, Alex. [1] [49133.804546] general protection fault: 0000 [#1] SMP [49133.808033] xcbc rmd160 crypto_null af_key xfrm_algo scsi_dh cirrus psmouse ttm drm_kms_helper serio_raw drm i2c_piix4 sysimgblt virtio_balloon sysfillrect syscopyarea nfsd(OF) kvm nfs_acl auth_rpcgss nfs fscache microcode lockd mac_hid sunrpc lp parport floppy ixgbevf(OF) [49133.808033] CPU 2 [49133.808033] Pid: 2907, comm: kworker/2:1H Tainted: GF W O 3.8.13-030813-generic #201305111843 Bochs Bochs [49133.808033] RIP: 0010:[] [] strnlen+0xb/0x30 [49133.808033] RSP: 0018:ffff8801e31c5b08 EFLAGS: 00010086 [49133.808033] RAX: 0000000000000000 RBX: ffffffff81e4e527 RCX: 0000000000000000 [49133.808033] RDX: 640000450008cf9d RSI: ffffffffffffffff RDI: 640000450008cf9d [49133.808033] RBP: ffff8801e31c5b08 R08: 000000000000ffff R09: 000000000000ffff [49133.808033] R10: 0000000000000000 R11: 0000000000000ffe R12: 640000450008cf9d [49133.808033] R13: ffffffff81e4e900 R14: 0000000000000000 R15: 000000000000ffff [49133.808033] FS: 0000000000000000(0000) GS:ffff88021fd00000(0000) knlGS:0000000000000000 [49133.808033] CS: 0010 DS: 0000 ES: 0000 CR0: 000000008005003b [49133.808033] CR2: 00007fa4a91abd80 CR3: 000000020e783000 CR4: 00000000000006e0 [49133.808033] DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000 [49133.808033] DR3: 0000000000000000 DR6: 00000000ffff0ff0 DR7: 0000000000000400 [49133.808033] Process kworker/2:1H (pid: 2907, threadinfo ffff8801e31c4000, task ffff8802124f45c0) [49133.808033] Stack: [49133.808033] ffff8801e31c5b48 ffffffff81359d8e ffff8801e31c5b28 ffffffff81e4e527 [49133.808033] ffffffffa0636a1e ffff8801e31c5c80 ffffffffa0636a1e ffffffff81e4e900 [49133.808033] ffff8801e31c5bc8 ffffffff8135af89 ffff8801e31c5bc8 ffffffff8105a4e7 [49133.808033] Call Trace: [49133.808033] [] string.isra.4+0x3e/0xd0 [49133.808033] [] vsnprintf+0x219/0x640 [49133.808033] [] ? msg_print_text+0xb7/0x1b0 [49133.808033] [] vscnprintf+0x11/0x30 [49133.808033] [] vprintk_emit+0xc1/0x490 [49133.808033] [] ? vprintk_emit+0x170/0x490 [49133.808033] [] printk+0x61/0x63 [49133.808033] [] __xfs_printk+0x31/0x50 [xfs] [49133.808033] [] xfs_notice+0x53/0x60 [xfs] [49133.808033] [] xfs_do_force_shutdown+0xf5/0x180 [xfs] [49133.808033] [] ? xlog_recover_iodone+0x48/0x70 [xfs] [49133.808033] [] xlog_recover_iodone+0x48/0x70 [xfs] [49133.808033] [] xfs_buf_iodone_work+0x4d/0xa0 [xfs] [49133.808033] [] process_one_work+0x141/0x490 [49133.808033] [] worker_thread+0x168/0x400 [49133.808033] [] ? manage_workers+0x120/0x120 [49133.808033] [] kthread+0xc0/0xd0 [49133.808033] [] ? flush_kthread_worker+0xb0/0xb0 [49133.808033] [] ret_from_fork+0x7c/0xb0 [49133.808033] [] ? flush_kthread_worker+0xb0/0xb0 From bfoster@redhat.com Mon Aug 4 07:48: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 (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id AD2427F66 for ; Mon, 4 Aug 2014 07:48:48 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 93C468F8049 for ; Mon, 4 Aug 2014 05:48:48 -0700 (PDT) X-ASG-Debug-ID: 1407156526-04cb6c555d128d70001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id HlzneBr0z5w9knMj (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 04 Aug 2014 05:48:47 -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 s74Cmcmh001004 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Mon, 4 Aug 2014 08:48: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 s74Cmb9G017902; Mon, 4 Aug 2014 08:48:38 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id E325012577C; Mon, 4 Aug 2014 08:48:36 -0400 (EDT) Date: Mon, 4 Aug 2014 08:48:36 -0400 From: Brian Foster To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 2/6] xfs: consolidate superblock logging functions Message-ID: <20140804124836.GA4049@bfoster.bfoster> X-ASG-Orig-Subj: Re: [PATCH 2/6] xfs: consolidate superblock logging functions References: <1406791995-14723-1-git-send-email-david@fromorbit.com> <1406791995-14723-3-git-send-email-david@fromorbit.com> <20140801143929.GC3582@laptop.bfoster> <20140804080930.GY20518@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140804080930.GY20518@dastard> User-Agent: Mutt/1.5.23 (2014-03-12) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.27 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1407156527 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Mon, Aug 04, 2014 at 06:09:30PM +1000, Dave Chinner wrote: > On Fri, Aug 01, 2014 at 10:39:29AM -0400, Brian Foster wrote: > > On Thu, Jul 31, 2014 at 05:33:11PM +1000, Dave Chinner wrote: > > > From: Dave Chinner > > > > > > We now have several superblock loggin functions that are identical > > > except for the transaction reservation and whether it shoul dbe a > > > synchronous transaction or not. Consolidate these all into a single > > > function, a single reserveration and a sync flag and call it > > > xfs_sync_sb(). > > > > > > Also, xfs_mod_sb() is not really a modification function - it's the > > > operation of logging the superblock buffer. hence change the name of > > > it to reflect this. > > > > > > Note that we have to change the mp->m_update_flags that are passed > > > around at mount time to a boolean simply to indicate a superblock > > > update is needed. > ..... > > > + > > > +/* > > > + * xfs_sync_sb > > > + * > > > + * Sync the superblock to disk. > > > + * > > > + * Note this code can be called during the process of freezing, so > > > + * we may need to use the transaction allocator which does not > > > + * block when the transaction subsystem is in its frozen state. > > > + */ > > > +int > > > +xfs_sync_sb( > > > + struct xfs_mount *mp, > > > + bool wait) > > > +{ > > > + struct xfs_trans *tp; > > > + int error; > > > + > > > + tp = _xfs_trans_alloc(mp, XFS_TRANS_SB_CHANGE, KM_SLEEP); > > > > We're converting some previous calls of xfs_trans_alloc() to the > > _xfs_trans_alloc() variant. The only difference is the dropped call to > > sb_start_intwrite() and I see that technically we handle that with the > > xfs_fs_writeable() check. > > Writing a change to the superblock is not something that normal > operations do. They are something that is typically done as a > standalone management operation, and hence the xfs_fs_writeable() > check is usually enough. > Fair point, an sb modification is something that should stand out. I think the characteristic of the new api is somewhat subtle, however. > So, the callers are: > > xfs_fs_log_dummy -> occurs during freeze > _xfs_trans_alloc -> no change > > and > xfs_log_sbcount -> occurs during freeze, unmount > _xfs_trans_alloc -> no change > > and > xfs_mount_reset_sbqflags -> called only in mount path > xfs_fs_writable -> was just a RO check > _xfs_trans_alloc -> was xfs_trans_alloc > > and > xfs_mount_log_sb -> called only in mount path > _xfs_trans_alloc -> was xfs_trans_alloc > > and > xfs_qm_write_sb_changes -> quota on/off syscalls > _xfs_trans_alloc -> was xfs_trans_alloc > > So the first 4 are effectively unchanged - there can be no racing > freeze while we are in the mount path, so the change from > xfs_trans_alloc to _xfs_trans_alloc makes no difference at all. > Similarly, the change from an open-coded RO check to > xfs_fs_writable() makes no difference, either. > Indeed, there wasn't anything technically wrong with the changes that I could identify. > It's only the last function - xfs_qm_write_sb_changes() - where > there is a difference. However, let's walk all the way back up the > stack to the syscall quotactl(): > > sys_quotactl > quotactl_block() > if (quotactl_cmd_write()) > get_super_thawed() > > which will only proceed with an unfrozen superblock, and it holds > the sb->s_umount lock in read mode across the quotactl operation. > Hence it will prevent the filesystem from being frozen during quota > on/off operations. Hence we don't need or want freeze accounting on > those operations because they need to complete before a freeze can > be started. > I didn't catch that one though. > > Unless I misunderstand, the sb_start_inwrite() call is what will > > block us on internal transaction allocs once the fs is already > > frozen. It seems a little dicey to me to offer up this single > > helper without much indication that a frozen check might be a > > requirement, particularly since this is expected to be built into > > the transaction infrastructure. > > Right, but none of the callers actually are run in a situation where > they should block on freezes, either complete or in progress. i.e. > there is no requirement for freeze checks - there is the opposite: > requirements to avoid freeze checks so the code doesn't deadlock. > Sure, but the codepaths with that requirement were previously explicitly and exclusively using _xfs_trans_alloc(). > > How would we expect a new caller to identify that? > > Same as we always do: by code review. > Fair enough, but what happens if^Wwhen something is missed? :) I think that means we can potentially modify a frozen fs. I'd feel better if we had a BUG_ON() or assert at the very least, but the obvious problem is the couple of contexts we have where we explicitly make a modification as part of the freeze sequence. > > Even the current xfs_fs_writable() check seems like it might be > > unnecessary, given some brief testing. I don't hit the mount path at all > > on a frozen fs. > > xfs_fs_writable() checks more than whether the filesystem is > frozen. ;) > Sure, so there's a new shutdown check before the xfs_trans_commit() that would fail anyways due to already having a shutdown check. ;) > > I'm not sure of the mechanics behind that, but I'm > > guessing some kind of reference remains on the sb of a frozen fs and a > > subsequent umount/mount is purely namespace magic. Point being... this > > appears to be implicit and confusing. IMO, using an _xfs_sync_sb() > > variant that allocates a nonblocking tp if one isn't provided as a > > parameter (for example) and using that only in the contexts we know it's > > Ok to avoid freeze interaction issues might be more clear. > > Well, it was pretty clear to me that the code paths were free of > freeze interactions. Looking at this - especially the quota on/off > paths - I guess it's not as obvious as I thought it was... :/ > My point was more geared towards future use. E.g., we have frozen fs management built into transaction management, which is nice and clean and easy to understand. We have a couple freeze path contexts that require to jump around that interface, which is also fairly straightforward. That is code that probably shouldn't have to change that much, and if it does, chances are you're dealing with some kind of freeze issue and have that context in mind. Now we have a generic superblock logging/sync mechanism that is built on top of the shortcut that's been built in for freeze. Technically that's Ok because sb modifications are special and rare (or already handle freeze blocking), but freeze management just isn't quite as contained as it used to be. An API change probably isn't necessary since it appears that the other uses are all "don't cares" as far as freeze context goes, but IMO the comment ("we may need to use the transaction allocator that doesn't block") could be made a little more explicit and point out that callers are responsible for freeze management. A bug_on() or assert would help, but looking again it appears we already have a warn_on() in _xfs_trans_alloc() that I suspect handles the freeze phases correctly. I didn't notice that before and that should be sufficiently noisy if something is amiss. :) Brian > Cheers, > > Dave. > -- > Dave Chinner > david@fromorbit.com > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From BATV+adb65c0d132a6d6529a6+3998+infradead.org+hch@bombadil.srs.infradead.org Mon Aug 4 08:14: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 (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 586747F69 for ; Mon, 4 Aug 2014 08:14:43 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 38A308F8039 for ; Mon, 4 Aug 2014 06:14:40 -0700 (PDT) X-ASG-Debug-ID: 1407158078-04cb6c555d12a1c0001-NocioJ Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.9]) by cuda.sgi.com with ESMTP id kG9V2ZJmREGGEN7H (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 04 Aug 2014 06:14:38 -0700 (PDT) X-Barracuda-Envelope-From: BATV+adb65c0d132a6d6529a6+3998+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 1XEI61-000639-RJ; Mon, 04 Aug 2014 13:14:37 +0000 Date: Mon, 4 Aug 2014 06:14:37 -0700 From: Christoph Hellwig To: Dave Chinner Cc: Christoph Hellwig , xfs@oss.sgi.com Subject: Re: [PATCH 3/6 V2] xfs: kill VN_DIRTY() Message-ID: <20140804131437.GA22365@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 3/6 V2] xfs: kill VN_DIRTY() References: <1406791995-14723-1-git-send-email-david@fromorbit.com> <1406791995-14723-4-git-send-email-david@fromorbit.com> <20140731171302.GA22173@infradead.org> <20140804032016.GW20518@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140804032016.GW20518@dastard> User-Agent: Mutt/1.5.23 (2014-03-12) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: bombadil.infradead.org[198.137.202.9] X-Barracuda-Start-Time: 1407158078 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.8111 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Mon, Aug 04, 2014 at 01:20:16PM +1000, Dave Chinner wrote: > From: Dave Chinner > > Only one user and the use of a dirty page cache check is redundant, > so just get rid of it. > > Signed-off-by: Dave Chinner Looks good, Reviewed-by: Christoph Hellwig From bfoster@redhat.com Mon Aug 4 09:13: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 238147F6C for ; Mon, 4 Aug 2014 09:13:06 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id DB8868F8049 for ; Mon, 4 Aug 2014 07:13:05 -0700 (PDT) X-ASG-Debug-ID: 1407161581-04bdf03d44149f70001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 6RgcKx8faAKFXGpw (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 04 Aug 2014 07:13: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 s74ECxAY005250 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Mon, 4 Aug 2014 10:13:00 -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 s74ECwaZ024818; Mon, 4 Aug 2014 10:12:59 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id DF62E12577C; Mon, 4 Aug 2014 10:12:57 -0400 (EDT) Date: Mon, 4 Aug 2014 10:12:57 -0400 From: Brian Foster To: Alex Lyakas Cc: xfs@oss.sgi.com Subject: Re: use-after-free on log replay failure Message-ID: <20140804141257.GB4049@bfoster.bfoster> X-ASG-Orig-Subj: Re: use-after-free on log replay failure References: <20140113030230.GF3469@dastard> <20140113204314.GJ3469@dastard> <20140115014503.GQ3469@dastard> <20140119231745.GF18112@dastard> <4B2A412C75324EE9880358513C069476@alyakaslap> <9D3CBECB663B4A77B7EF74B67973310A@alyakaslap> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <9D3CBECB663B4A77B7EF74B67973310A@alyakaslap> User-Agent: Mutt/1.5.23 (2014-03-12) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1407161581 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Mon, Aug 04, 2014 at 02:00:05PM +0300, Alex Lyakas wrote: > Greetings, > > we had a log replay failure due to some errors that the underlying block > device returned: > [49133.801406] XFS (dm-95): metadata I/O error: block 0x270e8c180 > ("xlog_recover_iodone") error 28 numblks 16 > [49133.802495] XFS (dm-95): log mount/recovery failed: error 28 > [49133.802644] XFS (dm-95): log mount failed > > and then kernel panicked [1]. > > Looking at the code, when xfs_mountfs() fails, xfs_fs_fill_super() goes and > cleans up and eventually frees the "xfs_mount" structure. But then > xfs_buf_iodone_work() can still be delivered through "xfslogd_workqueue", > which is static and not per-XFS. But this callback has a pointer to > "xfs_mount", and may try to access it as in [1]. Does this analysis sound > correct? Kernel is 3.8.13, but looking at the XFS master branch, it might > have the same issue. > Seems possible... we call xfs_buf_delwri_submit() via log recovery which does an xfs_buf_iowait() on each buffer for synchronous I/O. xfs_buf_iowait() doesn't wait on b_iowait if b_error is set, however. In the callback side, xfs_buf_ioerror() is called before the _xfs_buf_ioend() sequence that calls into the workqueue. Perhaps the error can be detected by the iowait before the xfslogd_workqueue job can run..? > Should we flush this static workqueue before unmounting? > It's not totally clear that fixes the problem since we set b_error on the buffer before we even schedule on the workqueue. Perhaps it depends on the nature of the race. Another option could be to not use the wq on error, but that may or may not be ideal for other contexts besides log recovery. It looks like the bio code always returns error via the callback and the xlog_recover_iodone() handler does call back into ioend, presumably to do the io completion. It might not be appropriate to remove the b_error bypass in xfs_buf_iowait() as we have ioerror() callers on the buffer that can occur before I/O submission, but I wonder if it could be made conditional for this particular case. That would be an interesting experiment at least to see if it fixes this problem. Brian > Thanks, > Alex. > > > [1] > [49133.804546] general protection fault: 0000 [#1] SMP > [49133.808033] xcbc rmd160 crypto_null af_key xfrm_algo scsi_dh cirrus > psmouse ttm drm_kms_helper serio_raw drm i2c_piix4 sysimgblt virtio_balloon > sysfillrect syscopyarea nfsd(OF) kvm nfs_acl auth_rpcgss nfs fscache > microcode lockd mac_hid sunrpc lp parport floppy ixgbevf(OF) > [49133.808033] CPU 2 > [49133.808033] Pid: 2907, comm: kworker/2:1H Tainted: GF W O > 3.8.13-030813-generic #201305111843 Bochs Bochs > [49133.808033] RIP: 0010:[] [] > strnlen+0xb/0x30 > [49133.808033] RSP: 0018:ffff8801e31c5b08 EFLAGS: 00010086 > [49133.808033] RAX: 0000000000000000 RBX: ffffffff81e4e527 RCX: > 0000000000000000 > [49133.808033] RDX: 640000450008cf9d RSI: ffffffffffffffff RDI: > 640000450008cf9d > [49133.808033] RBP: ffff8801e31c5b08 R08: 000000000000ffff R09: > 000000000000ffff > [49133.808033] R10: 0000000000000000 R11: 0000000000000ffe R12: > 640000450008cf9d > [49133.808033] R13: ffffffff81e4e900 R14: 0000000000000000 R15: > 000000000000ffff > [49133.808033] FS: 0000000000000000(0000) GS:ffff88021fd00000(0000) > knlGS:0000000000000000 > [49133.808033] CS: 0010 DS: 0000 ES: 0000 CR0: 000000008005003b > [49133.808033] CR2: 00007fa4a91abd80 CR3: 000000020e783000 CR4: > 00000000000006e0 > [49133.808033] DR0: 0000000000000000 DR1: 0000000000000000 DR2: > 0000000000000000 > [49133.808033] DR3: 0000000000000000 DR6: 00000000ffff0ff0 DR7: > 0000000000000400 > [49133.808033] Process kworker/2:1H (pid: 2907, threadinfo ffff8801e31c4000, > task ffff8802124f45c0) > [49133.808033] Stack: > [49133.808033] ffff8801e31c5b48 ffffffff81359d8e ffff8801e31c5b28 > ffffffff81e4e527 > [49133.808033] ffffffffa0636a1e ffff8801e31c5c80 ffffffffa0636a1e > ffffffff81e4e900 > [49133.808033] ffff8801e31c5bc8 ffffffff8135af89 ffff8801e31c5bc8 > ffffffff8105a4e7 > [49133.808033] Call Trace: > [49133.808033] [] string.isra.4+0x3e/0xd0 > [49133.808033] [] vsnprintf+0x219/0x640 > [49133.808033] [] ? msg_print_text+0xb7/0x1b0 > [49133.808033] [] vscnprintf+0x11/0x30 > [49133.808033] [] vprintk_emit+0xc1/0x490 > [49133.808033] [] ? vprintk_emit+0x170/0x490 > [49133.808033] [] printk+0x61/0x63 > [49133.808033] [] __xfs_printk+0x31/0x50 [xfs] > [49133.808033] [] xfs_notice+0x53/0x60 [xfs] > [49133.808033] [] xfs_do_force_shutdown+0xf5/0x180 [xfs] > [49133.808033] [] ? xlog_recover_iodone+0x48/0x70 [xfs] > [49133.808033] [] xlog_recover_iodone+0x48/0x70 [xfs] > [49133.808033] [] xfs_buf_iodone_work+0x4d/0xa0 [xfs] > [49133.808033] [] process_one_work+0x141/0x490 > [49133.808033] [] worker_thread+0x168/0x400 > [49133.808033] [] ? manage_workers+0x120/0x120 > [49133.808033] [] kthread+0xc0/0xd0 > [49133.808033] [] ? flush_kthread_worker+0xb0/0xb0 > [49133.808033] [] ret_from_fork+0x7c/0xb0 > [49133.808033] [] ? flush_kthread_worker+0xb0/0xb0 > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From sandeen@sandeen.net Mon Aug 4 13:15: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 129AD7F72 for ; Mon, 4 Aug 2014 13:15:08 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id B2604AC001 for ; Mon, 4 Aug 2014 11:15:04 -0700 (PDT) X-ASG-Debug-ID: 1407176101-04bdf03d42159c10001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id ygt97VPfceuLy4Lb for ; Mon, 04 Aug 2014 11:15:02 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1 with cipher DHE-RSA-AES128-SHA (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 5491C6539281; Mon, 4 Aug 2014 13:15:01 -0500 (CDT) Message-ID: <53DFCDA4.9000605@sandeen.net> Date: Mon, 04 Aug 2014 13:15:00 -0500 From: Eric Sandeen MIME-Version: 1.0 To: Alex Lyakas , Dave Chinner CC: xfs@oss.sgi.com Subject: Re: xfs_growfs_data_private memory leak References: <20131226230018.GJ20579@dastard> <20140113030230.GF3469@dastard> <20140113204314.GJ3469@dastard> <20140115014503.GQ3469@dastard> <20140119231745.GF18112@dastard> <4B2A412C75324EE9880358513C069476@alyakaslap> <20140701215626.GE9508@dastard> X-ASG-Orig-Subj: Re: xfs_growfs_data_private memory leak In-Reply-To: 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: 1407176102 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.8117 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 7/2/14, 7:27 AM, Alex Lyakas wrote: > Hi Dave, > Thank you for your comments. > > I realize that secondary superblocks are needed mostly for repairing s/mostly/only/ > a broken filesystem. However, I don't see that they get updated > regularly, i.e., during normal operation they don't seem to get > updated at all. I put a print in xfs_sb_write_verify, and it gets > called only with: bp->b_bn==XFS_SB_DADDR. See the comments above verify_sb(): not everything is validated, so not everything needs to be constantly updated. It's just the basic fs geometry, not counters, etc. /* * verify a superblock -- does not verify root inode # * can only check that geometry info is internally * consistent. because of growfs, that's no guarantee * of correctness (e.g. geometry may have changed) * * fields verified or consistency checked: * * sb_magicnum * * sb_versionnum * * sb_inprogress * * sb_blocksize (as a group) * sb_blocklog * * geometry info - sb_dblocks (as a group) * sb_agcount * sb_agblocks * sb_agblklog * * inode info - sb_inodesize (x-checked with geo info) * sb_inopblock * * sector size info - * sb_sectsize * sb_sectlog * sb_logsectsize * sb_logsectlog * * not checked here - * sb_rootino * sb_fname * sb_fpack * sb_logstart * sb_uuid * * ALL real-time fields * final 4 summary counters */ > So do I understand correctly (also from comments in > xfs_growfs_data_private), that it is safe to operate a filesystem > while having broken secondary superblocks? For me, it appears to > mount properly, and all the data seems to be there, but xfs_check > complains like: > bad sb magic # 0xc2a4baf2 in ag 6144 > bad sb version # 0x4b5d in ag 6144 > blocks 6144/65536..2192631388 out of range > blocks 6144/65536..2192631388 claimed by block 6144/0 > bad sb magic # 0xb20f3079 in ag 6145 > bad sb version # 0x6505 in ag 6145 > blocks 6145/65536..3530010017 out of range > blocks 6145/65536..3530010017 claimed by block 6145/0 > ... some of that looks more serious than "just" bad backup sb's. But the bad secondaries shouldn't cause runtime problems AFAIK. > Also, if secondary superblocks do not get updated regularly, and > there is no way to ask an operational XFS to update them, then during > repair we may not find a good secondary superblock. You seem to have 6144 (!) allocation groups; one would hope that a majority of those supers would be "good" and the others will be properly corrected by an xfs_repair. > As for the patch, I cannot post a patch against the upstream kernel, > because I am running an older kernel. Unfortunately, I cannot qualify > an upstream patch properly in a reasonable time. Is there a value in > posting a patch against 3.8.13? Otherwise, it's fine by me if > somebody else posts it and takes the credit. If the patch applies cleanly to both kernels, probably fine to go ahead and post it, with that caveat. -Eric > Thanks, > Alex. > > > > -----Original Message----- From: Dave Chinner > Sent: 02 July, 2014 12:56 AM > To: Alex Lyakas > Cc: xfs@oss.sgi.com > Subject: Re: xfs_growfs_data_private memory leak > > On Tue, Jul 01, 2014 at 06:06:38PM +0300, Alex Lyakas wrote: >> Greetings, >> >> It appears that if xfs_growfs_data_private fails during the "new AG >> headers" loop, it does not free all the per-AG structures for the >> new AGs. When XFS is unmounted later, they are not freed as well, >> because xfs_growfs_data_private did not update the "sb_agcount" >> field, so xfs_free_perag will not free them. This happens on 3.8.13, >> but looking at the latest master branch, it seems to have the same >> issue. >> >> Code like [1] in xfs_growfs_data, seems to fix the issue. > > Why not just do this in the appropriate error stack, like is > done inside xfs_initialize_perag() on error? > > for (i = oagcount; i < nagcount; i++) { > pag = radix_tree_delete(&mp->m_perag_tree, index); > kmem_free(pag); > } > > (though it might need RCU freeing) > > When you have a fix, can you send a proper patch with a sign-off on > it? > >> A follow-up question: if xfs_grows_data_private fails during the >> loop that updates all the secondary superblocks, what is the >> consequence? (I am aware that in the latest master branch, the loop >> is not broken on first error, but attempts to initialize whatever >> possible). When these secondary superblocks will get updated? Is >> there a way to force-update them? Otherwise, what can be the >> consequence of leaving them not updated? > > The consequence is documented in mainline tree - if we don't update > them all, then repair will do the wrong thing. Repair requires a > majority iof identical secondaries to determine if the primary is > correct or out of date. The old behaviour of not updating after the > first error meant that the majority were old superblocks and so at > some time in the future repair could decide your filesystem is > smaller than it really is and hence truncate away the grown section > of the filesystem. i.e. trigger catastrophic, unrecoverable data > loss. > > Hence it's far better to write every seconday we can than to leave > a majority in a bad state.... > > Cheers, > > Dave. From david@fromorbit.com Mon Aug 4 17:15: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 (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 452C77F74 for ; Mon, 4 Aug 2014 17:15:47 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 135BF30406B for ; Mon, 4 Aug 2014 15:15:46 -0700 (PDT) X-ASG-Debug-ID: 1407190541-04bdf03d451674c0001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id PMgBnv6BGYNecUfB for ; Mon, 04 Aug 2014 15:15: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: As8GANQE4FN5LKl0/2dsb2JhbABRCoMNgSmCJ6xRAQEBAQEGpQUBgRQXd4QDAQEEAScTHCMFCwgDDgcDCSUPBSUDIROIOgfEORcYhWSEA4RxD00HhEsFnAWUYINfKy+BBQ Received: from ppp121-44-169-116.lns20.syd7.internode.on.net (HELO dastard) ([121.44.169.116]) by ipmail07.adl2.internode.on.net with ESMTP; 05 Aug 2014 07:45:40 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1XEQXO-0002tl-NX; Tue, 05 Aug 2014 08:15:26 +1000 Date: Tue, 5 Aug 2014 08:15:26 +1000 From: Dave Chinner To: Brian Foster Cc: xfs@oss.sgi.com Subject: Re: [PATCH 2/6] xfs: consolidate superblock logging functions Message-ID: <20140804221526.GZ20518@dastard> X-ASG-Orig-Subj: Re: [PATCH 2/6] xfs: consolidate superblock logging functions References: <1406791995-14723-1-git-send-email-david@fromorbit.com> <1406791995-14723-3-git-send-email-david@fromorbit.com> <20140801143929.GC3582@laptop.bfoster> <20140804080930.GY20518@dastard> <20140804124836.GA4049@bfoster.bfoster> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140804124836.GA4049@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: 1407190541 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.8124 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Mon, Aug 04, 2014 at 08:48:36AM -0400, Brian Foster wrote: > On Mon, Aug 04, 2014 at 06:09:30PM +1000, Dave Chinner wrote: > > On Fri, Aug 01, 2014 at 10:39:29AM -0400, Brian Foster wrote: > > > On Thu, Jul 31, 2014 at 05:33:11PM +1000, Dave Chinner wrote: > > > > From: Dave Chinner > > > > > > > > We now have several superblock loggin functions that are identical > > > > except for the transaction reservation and whether it shoul dbe a > > > > synchronous transaction or not. Consolidate these all into a single > > > > function, a single reserveration and a sync flag and call it > > > > xfs_sync_sb(). > > > > > > > > Also, xfs_mod_sb() is not really a modification function - it's the > > > > operation of logging the superblock buffer. hence change the name of > > > > it to reflect this. > > > > > > > > Note that we have to change the mp->m_update_flags that are passed > > > > around at mount time to a boolean simply to indicate a superblock > > > > update is needed. > > ..... > > > > + > > > > +/* > > > > + * xfs_sync_sb > > > > + * > > > > + * Sync the superblock to disk. > > > > + * > > > > + * Note this code can be called during the process of freezing, so > > > > + * we may need to use the transaction allocator which does not > > > > + * block when the transaction subsystem is in its frozen state. > > > > + */ > > > > +int > > > > +xfs_sync_sb( > > > > + struct xfs_mount *mp, > > > > + bool wait) > > > > +{ > > > > + struct xfs_trans *tp; > > > > + int error; > > > > + > > > > + tp = _xfs_trans_alloc(mp, XFS_TRANS_SB_CHANGE, KM_SLEEP); > > > > > > We're converting some previous calls of xfs_trans_alloc() to the > > > _xfs_trans_alloc() variant. The only difference is the dropped call to > > > sb_start_intwrite() and I see that technically we handle that with the > > > xfs_fs_writeable() check. > > > > Writing a change to the superblock is not something that normal > > operations do. They are something that is typically done as a > > standalone management operation, and hence the xfs_fs_writeable() > > check is usually enough. > > > > Fair point, an sb modification is something that should stand out. I > think the characteristic of the new api is somewhat subtle, however. Which is why there's a comment explaining it. Is there anything I can add to that comment to make it clearer? > > > Unless I misunderstand, the sb_start_inwrite() call is what will > > > block us on internal transaction allocs once the fs is already > > > frozen. It seems a little dicey to me to offer up this single > > > helper without much indication that a frozen check might be a > > > requirement, particularly since this is expected to be built into > > > the transaction infrastructure. > > > > Right, but none of the callers actually are run in a situation where > > they should block on freezes, either complete or in progress. i.e. > > there is no requirement for freeze checks - there is the opposite: > > requirements to avoid freeze checks so the code doesn't deadlock. > > > > Sure, but the codepaths with that requirement were previously explicitly > and exclusively using _xfs_trans_alloc(). And they still are. It's just now explicit for a bunch more use cases that previously weren't.... > > > How would we expect a new caller to identify that? > > > > Same as we always do: by code review. > > > > Fair enough, but what happens if^Wwhen something is missed? :) I think > that means we can potentially modify a frozen fs. Sure, but that can happen if we make any number of mistakes..... > I'd feel better if we > had a BUG_ON() or assert at the very least, but the obvious problem is > the couple of contexts we have where we explicitly make a modification > as part of the freeze sequence. Yup, and that's why I put a comment there instead of trying to add asserts - there is no single freeze condition we can actually assert on because the code is called from non-freeze situations where the s_umount is held as well as situations where the freeze is in progress. I guess that the only thing we might see as common is that the s_umount is held in all these code paths, but I'm not sure that we should be looking at that lock this deep inside the XFS code... > > > Even the current xfs_fs_writable() check seems like it might be > > > unnecessary, given some brief testing. I don't hit the mount path at all > > > on a frozen fs. > > > > xfs_fs_writable() checks more than whether the filesystem is > > frozen. ;) > > > > Sure, so there's a new shutdown check before the xfs_trans_commit() that > would fail anyways due to already having a shutdown check. ;) There isn't any new check before a transaction commit in this patch. The only change involving xfs_fs_writeable() was this in xfs_mount_reset_sbqflags(): - if (mp->m_flags & XFS_MOUNT_RDONLY) + if (!xfs_fs_writable(mp)) I can revert that if you're really concerned about it.... > > > I'm not sure of the mechanics behind that, but I'm > > > guessing some kind of reference remains on the sb of a frozen fs and a > > > subsequent umount/mount is purely namespace magic. Point being... this > > > appears to be implicit and confusing. IMO, using an _xfs_sync_sb() > > > variant that allocates a nonblocking tp if one isn't provided as a > > > parameter (for example) and using that only in the contexts we know it's > > > Ok to avoid freeze interaction issues might be more clear. > > > > Well, it was pretty clear to me that the code paths were free of > > freeze interactions. Looking at this - especially the quota on/off > > paths - I guess it's not as obvious as I thought it was... :/ > > > > My point was more geared towards future use. E.g., we have frozen fs > management built into transaction management, which is nice and clean > and easy to understand. Actually, it's nowhere near as clean as you think. :/ e.g. did you know that the xfs_fs_writable() check in xfs_log_sbcount() is to prevent it from writing anything when unmounting a fully frozen filesystem? i.e. xfs_log_sbcount needs to succeed while a freeze is in progress, but fail when a freeze is fully complete? i.e. we *already have* micro-management of frozen state for superblock writes, even if it's not explicitly stated. Factoring the logging implementation does not change the fact we already have higher level management of freeze state and will continue to need it in the future. I realise that all the freeze complexities are not exactly obvious, so if there are new comments that would help please suggest what you'd like to see ;) Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Mon Aug 4 18:07: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 9F2257F76 for ; Mon, 4 Aug 2014 18:07:51 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 37D8AAC001 for ; Mon, 4 Aug 2014 16:07:48 -0700 (PDT) X-ASG-Debug-ID: 1407193665-04cbb02d851521b0001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id 2ekXUivm3HbVXq7W for ; Mon, 04 Aug 2014 16:07:45 -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: As4GAOYR4FN5LKl0/2dsb2JhbABbgw2BKYInrFEBAQEBAQalBQGBERd3hAQBBTocIxAIAxgJJQ8FJQMhE4hBxDsXGIVkiVAHgy+BHAWcBZRgg18rLw Received: from ppp121-44-169-116.lns20.syd7.internode.on.net (HELO dastard) ([121.44.169.116]) by ipmail07.adl2.internode.on.net with ESMTP; 05 Aug 2014 08:37:35 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1XERLd-00030P-D9; Tue, 05 Aug 2014 09:07:21 +1000 Date: Tue, 5 Aug 2014 09:07:21 +1000 From: Dave Chinner To: Alex Lyakas Cc: xfs@oss.sgi.com Subject: Re: use-after-free on log replay failure Message-ID: <20140804230721.GA20518@dastard> X-ASG-Orig-Subj: Re: use-after-free on log replay failure References: <20140113030230.GF3469@dastard> <20140113204314.GJ3469@dastard> <20140115014503.GQ3469@dastard> <20140119231745.GF18112@dastard> <4B2A412C75324EE9880358513C069476@alyakaslap> <9D3CBECB663B4A77B7EF74B67973310A@alyakaslap> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <9D3CBECB663B4A77B7EF74B67973310A@alyakaslap> 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: 1407193665 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=MARKETING_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.8126 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words On Mon, Aug 04, 2014 at 02:00:05PM +0300, Alex Lyakas wrote: > Greetings, > > we had a log replay failure due to some errors that the underlying > block device returned: > [49133.801406] XFS (dm-95): metadata I/O error: block 0x270e8c180 > ("xlog_recover_iodone") error 28 numblks 16 > [49133.802495] XFS (dm-95): log mount/recovery failed: error 28 > [49133.802644] XFS (dm-95): log mount failed #define ENOSPC 28 /* No space left on device */ You're getting an ENOSPC as a metadata IO error during log recovery? Thin provisioning problem, perhaps, and the error is occurring on submission rather than completion? If so: 8d6c121 xfs: fix buffer use after free on IO error Cheers, Dave. -- Dave Chinner david@fromorbit.com From bfoster@redhat.com Mon Aug 4 19:03: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 CAAE07F78 for ; Mon, 4 Aug 2014 19:03:45 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id B328F304053 for ; Mon, 4 Aug 2014 17:03:42 -0700 (PDT) X-ASG-Debug-ID: 1407197017-04cbb02d84153f60001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 9Dk1EakjXzbqKAPf (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 04 Aug 2014 17:03: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-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 s7503afs026274 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Mon, 4 Aug 2014 20:03:36 -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 s7503ZJ3001283; Mon, 4 Aug 2014 20:03:35 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id C671B12577C; Mon, 4 Aug 2014 20:03:33 -0400 (EDT) Date: Mon, 4 Aug 2014 20:03:33 -0400 From: Brian Foster To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 2/6] xfs: consolidate superblock logging functions Message-ID: <20140805000333.GA27760@bfoster.bfoster> X-ASG-Orig-Subj: Re: [PATCH 2/6] xfs: consolidate superblock logging functions References: <1406791995-14723-1-git-send-email-david@fromorbit.com> <1406791995-14723-3-git-send-email-david@fromorbit.com> <20140801143929.GC3582@laptop.bfoster> <20140804080930.GY20518@dastard> <20140804124836.GA4049@bfoster.bfoster> <20140804221526.GZ20518@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140804221526.GZ20518@dastard> User-Agent: Mutt/1.5.23 (2014-03-12) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1407197018 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Tue, Aug 05, 2014 at 08:15:26AM +1000, Dave Chinner wrote: > On Mon, Aug 04, 2014 at 08:48:36AM -0400, Brian Foster wrote: > > On Mon, Aug 04, 2014 at 06:09:30PM +1000, Dave Chinner wrote: > > > On Fri, Aug 01, 2014 at 10:39:29AM -0400, Brian Foster wrote: > > > > On Thu, Jul 31, 2014 at 05:33:11PM +1000, Dave Chinner wrote: > > > > > From: Dave Chinner > > > > > > > > > > We now have several superblock loggin functions that are identical > > > > > except for the transaction reservation and whether it shoul dbe a > > > > > synchronous transaction or not. Consolidate these all into a single > > > > > function, a single reserveration and a sync flag and call it > > > > > xfs_sync_sb(). > > > > > > > > > > Also, xfs_mod_sb() is not really a modification function - it's the > > > > > operation of logging the superblock buffer. hence change the name of > > > > > it to reflect this. > > > > > > > > > > Note that we have to change the mp->m_update_flags that are passed > > > > > around at mount time to a boolean simply to indicate a superblock > > > > > update is needed. > > > ..... > > > > > + > > > > > +/* > > > > > + * xfs_sync_sb > > > > > + * > > > > > + * Sync the superblock to disk. > > > > > + * > > > > > + * Note this code can be called during the process of freezing, so > > > > > + * we may need to use the transaction allocator which does not > > > > > + * block when the transaction subsystem is in its frozen state. > > > > > + */ > > > > > +int > > > > > +xfs_sync_sb( > > > > > + struct xfs_mount *mp, > > > > > + bool wait) > > > > > +{ > > > > > + struct xfs_trans *tp; > > > > > + int error; > > > > > + > > > > > + tp = _xfs_trans_alloc(mp, XFS_TRANS_SB_CHANGE, KM_SLEEP); > > > > > > > > We're converting some previous calls of xfs_trans_alloc() to the > > > > _xfs_trans_alloc() variant. The only difference is the dropped call to > > > > sb_start_intwrite() and I see that technically we handle that with the > > > > xfs_fs_writeable() check. > > > > > > Writing a change to the superblock is not something that normal > > > operations do. They are something that is typically done as a > > > standalone management operation, and hence the xfs_fs_writeable() > > > check is usually enough. > > > > > > > Fair point, an sb modification is something that should stand out. I > > think the characteristic of the new api is somewhat subtle, however. > > Which is why there's a comment explaining it. Is there anything I > can add to that comment to make it clearer? > I would change this: /* * ... * * Note this code can be called during the process of freezing, so * we may need to use the transaction allocator which does not * block when the transaction subsystem is in its frozen state. */ ... to something like: /* * ... * * Note that the caller is responsible for checking the frozen state of * the filesystem. This procedure uses the non-blocking transaction * allocator and thus will allow modifications to a frozen fs. This is * required because this code can be called during the process of * freezing where use of the high-level allocator would deadlock. */ > > > > Unless I misunderstand, the sb_start_inwrite() call is what will > > > > block us on internal transaction allocs once the fs is already > > > > frozen. It seems a little dicey to me to offer up this single > > > > helper without much indication that a frozen check might be a > > > > requirement, particularly since this is expected to be built into > > > > the transaction infrastructure. > > > > > > Right, but none of the callers actually are run in a situation where > > > they should block on freezes, either complete or in progress. i.e. > > > there is no requirement for freeze checks - there is the opposite: > > > requirements to avoid freeze checks so the code doesn't deadlock. > > > > > > > Sure, but the codepaths with that requirement were previously explicitly > > and exclusively using _xfs_trans_alloc(). > > And they still are. It's just now explicit for a bunch more use > cases that previously weren't.... > > > > > How would we expect a new caller to identify that? > > > > > > Same as we always do: by code review. > > > > > > > Fair enough, but what happens if^Wwhen something is missed? :) I think > > that means we can potentially modify a frozen fs. > > Sure, but that can happen if we make any number of mistakes..... > Indeed. My point was that we should add some kind of warning/bug/assert mechanism to catch a problem if at all possible. > > I'd feel better if we > > had a BUG_ON() or assert at the very least, but the obvious problem is > > the couple of contexts we have where we explicitly make a modification > > as part of the freeze sequence. > > Yup, and that's why I put a comment there instead of trying to add > asserts - there is no single freeze condition we can actually assert > on because the code is called from non-freeze situations where the > s_umount is held as well as situations where the freeze is in > progress. I guess that the only thing we might see as common is that > the s_umount is held in all these code paths, but I'm not sure that > we should be looking at that lock this deep inside the XFS code... > > > > > Even the current xfs_fs_writable() check seems like it might be > > > > unnecessary, given some brief testing. I don't hit the mount path at all > > > > on a frozen fs. > > > > > > xfs_fs_writable() checks more than whether the filesystem is > > > frozen. ;) > > > > > > > Sure, so there's a new shutdown check before the xfs_trans_commit() that > > would fail anyways due to already having a shutdown check. ;) > > There isn't any new check before a transaction commit in this patch. > The only change involving xfs_fs_writeable() was this in > xfs_mount_reset_sbqflags(): > > - if (mp->m_flags & XFS_MOUNT_RDONLY) > + if (!xfs_fs_writable(mp)) > > I can revert that if you're really concerned about it.... > Not really... I was commenting that the only real difference with this change is the shutdown check, and that clearly wasn't the intent behind the change, this being one of the paths that changed to use the non-blocking tp allocator. > > > > I'm not sure of the mechanics behind that, but I'm > > > > guessing some kind of reference remains on the sb of a frozen fs and a > > > > subsequent umount/mount is purely namespace magic. Point being... this > > > > appears to be implicit and confusing. IMO, using an _xfs_sync_sb() > > > > variant that allocates a nonblocking tp if one isn't provided as a > > > > parameter (for example) and using that only in the contexts we know it's > > > > Ok to avoid freeze interaction issues might be more clear. > > > > > > Well, it was pretty clear to me that the code paths were free of > > > freeze interactions. Looking at this - especially the quota on/off > > > paths - I guess it's not as obvious as I thought it was... :/ > > > > > > > My point was more geared towards future use. E.g., we have frozen fs > > management built into transaction management, which is nice and clean > > and easy to understand. > > Actually, it's nowhere near as clean as you think. :/ > > e.g. did you know that the xfs_fs_writable() check in > xfs_log_sbcount() is to prevent it from writing anything when > unmounting a fully frozen filesystem? i.e. xfs_log_sbcount needs to > succeed while a freeze is in progress, but fail when a freeze is > fully complete? > Hmm, so freeze_super() sets s_frozen to SB_FREEZE_FS before it calls into the fs. Given the xfs_fs_writable() logic, how is that going to differentiate a freezing fs from a frozen fs? It makes sense that this would avoid blocking on umount of a frozen fs, but it seems like we'd skip out just the same during the freeze sequence. Maybe I'm missing something... > i.e. we *already have* micro-management of frozen state for > superblock writes, even if it's not explicitly stated. > > Factoring the logging implementation does not change the fact we > already have higher level management of freeze state and will > continue to need it in the future. I realise that all the freeze > complexities are not exactly obvious, so if there are new comments > that would help please suggest what you'd like to see ;) > The comment suggestion above addresses my concern. The assert/bug/warning safety net I was looking for already exists down in _xfs_trans_alloc(): WARN_ON(mp->m_super->s_writers.frozen == SB_FREEZE_COMPLETE); ... which looks designed to acknowledge that we can/do use this interface while freezing, but never once frozen. Sorry for the noise, thanks. Brian > Cheers, > > Dave. > -- > Dave Chinner > david@fromorbit.com > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From billstuff2001@sbcglobal.net Mon Aug 4 19:26: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=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 2285D7F78 for ; Mon, 4 Aug 2014 19:26:02 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id C1AB5304059 for ; Mon, 4 Aug 2014 17:26:01 -0700 (PDT) X-ASG-Debug-ID: 1407198358-04bdf03d4216bc00001-NocioJ Received: from nm14-vm8.access.bullet.mail.gq1.yahoo.com (nm14-vm8.access.bullet.mail.gq1.yahoo.com [216.39.63.222]) by cuda.sgi.com with ESMTP id Ox124GkUZ59mmrIr (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 04 Aug 2014 17:25:59 -0700 (PDT) X-Barracuda-Envelope-From: billstuff2001@sbcglobal.net X-Barracuda-Apparent-Source-IP: 216.39.63.222 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sbcglobal.net; s=s2048; t=1407198358; bh=QLXbeOEL1NmrzL0rl/wCWVrgLix37psPYZ9jGU/GZC4=; h=Received:Received:Received:DKIM-Signature:X-Yahoo-Newman-Id:X-Yahoo-Newman-Property:X-YMail-OSG:X-Yahoo-SMTP:Message-ID:Date:From:User-Agent:MIME-Version:To:Subject:Content-Type:Content-Transfer-Encoding; b=kNDEC+/ho0R90UWZo+JtX7SYbykuWutcHOPp6ev1jBwN+4bFoGwfAX2xrJbX5lmyhCxnE+vECs3dp3xXnV9kaUjB8jxsjZqiz17j+STqxvYl1Ur4wkArVc3DD5r5HWu3FIg/zvWVQs0/UcB6FvsDuSeeJhC2wKndl4rjH3oDiZqmRaE6k82rVifZCocQqqQXZ/Pej8sdkx960ZwPBRkOeDusvm/4iOhoHdTPFhuYvZuoOiSs8AX4zJaeElectJcNWMK06a0RlVljYlEZmV5urIC+qqFIAGxMUnQ2vz0/Etr4Fa9E/Ui3Qbhmi5grvsaEZOUzEpvCYrCRI9G1SQTVPQ== DomainKey-Signature: a=rsa-sha1; q=dns; c=nofws; s=s2048; d=sbcglobal.net; b=RtYw0X8OEUh5w2OlqesnLo0wvtw4BoAAL2p1yJ6b5phNH17w/F2m1K/vasSq/UeL9awebdP7mT1JZ12ZouWlF2otLYSlaAyWJxNoXebwnyP+LS04EWrLow0v1d8OxFK++qWIOZlCELTq+Svu7s53jvUc98Velb7vsESTOG+Bg7neFPnbtN/ywwVIzObqybvg9dRlgHkxxLl5bf2ECHmY45oPRHMTDMAe4/Wp1BXV9iiziNxeg2tY5NtI/BrnlUoiqyRfR2ZcZpiVcU2yEWjc9YAQ+J6BEEsRZ82nv2lXto7+Iy3uO/3zIMJacKSj8hMfLIZ4OmBuFiBqJAYfu+o0FA==; Received: from [216.39.60.176] by nm14.access.bullet.mail.gq1.yahoo.com with NNFMP; 05 Aug 2014 00:25:58 -0000 Received: from [98.138.226.241] by tm12.access.bullet.mail.gq1.yahoo.com with NNFMP; 05 Aug 2014 00:25:58 -0000 Received: from [127.0.0.1] by smtp112.sbc.mail.ne1.yahoo.com with NNFMP; 05 Aug 2014 00:25:58 -0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sbcglobal.net; s=s1024; t=1407198358; bh=QLXbeOEL1NmrzL0rl/wCWVrgLix37psPYZ9jGU/GZC4=; h=X-Yahoo-Newman-Id:X-Yahoo-Newman-Property:X-YMail-OSG:X-Yahoo-SMTP:Message-ID:Date:From:User-Agent:MIME-Version:To:Subject:Content-Type:Content-Transfer-Encoding; b=WI6+fHzDK9Z4VF35+HrewYpQQ+Oc4irfc0d9FOycREZ3m/AHQld16MxKNiMP1FC/hCbztkybhzhz9sA5IWRKMXaurk7djNpnV0yqV4IVsUpot2KWgUtdgYILw8iqrxKKX5tKEDUPQ0oSrF/zkpAoPGqKB74RY4JEYJAPG9bGn5Q= X-Yahoo-Newman-Id: 186901.49965.bm@smtp112.sbc.mail.ne1.yahoo.com X-Yahoo-Newman-Property: ymail-3 X-YMail-OSG: NNHkWQAVM1nGUoXkGDNd9AWnOCZPIgH5_lCYldCgv20dyEC BNZ7dQSC_PcAD8HpDIuDGotP_EDNsme1mqaf4UkwQZP6sLoyxCn2xK_vePP_ QoKJLKPkJEDchsHoy3cvHHszDLz.N2UJwTS8XSxsce7I7Hm0YwFORp3CBBMK hb3ZpquAVSnx3vnDGdB4RK0Mz8V7EX86p16brvubiCxDCECXhYbPX0l962TG 9rZzTPmERkjvKwUnEAJHr7_1cPB3H0qiCJ0QhBIMXHPmm5KDkbg5A8ImbSyz SSAMsp61uE3y5O4HKJxIxtMMPnsrJamrkpQ5u.R5Xx9M4B3YpjW0om2Z3yYS 6vcBS4NA7JIITnREL3Ru4P3TVyJrT.ax90Vawrk39OSZD9S5a2n3sUNUxyfF fSUxS6SbOhoEeVWM.W1xQJdVyfmxwPLqN0L0FaotSTGnwas_btvxk_Zug6P5 wJPTIQ5mMm0M7EQuqhdgRUtqtZfwfwxX_W5j9SXMxhRsTPigdPuSQARUwWjY .qU0hmYaDQNDU.WgCKdNXkWTIxKwJWSpQC2Ptp13OOw.kEDbOe6nu X-Yahoo-SMTP: dV6Y3D2swBAl90UzsR1c1EUZ5QpNhk2oh3bumrVn95TC.A-- Message-ID: <53E02495.4080208@sbcglobal.net> Date: Mon, 04 Aug 2014 19:25:57 -0500 From: Bill User-Agent: Mozilla/5.0 (X11; Linux i686; rv:24.0) Gecko/20100101 Thunderbird/24.2.0 MIME-Version: 1.0 To: xfs@oss.sgi.com Subject: xfs hang in 3.14.15 Content-Type: text/plain; charset=ISO-8859-1; format=flowed X-ASG-Orig-Subj: xfs hang in 3.14.15 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: nm14-vm8.access.bullet.mail.gq1.yahoo.com[216.39.63.222] X-Barracuda-Start-Time: 1407198359 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.8126 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, I've been running a stress test on 3.14.15 and eventually my xfs filesystem hangs. Both 3.10.50 and 3.16 seem to work ok. The test is a continual loop building a kernel. Once it hangs, the machine needs to be hard reset. xfs_info shows this: meta-data=/dev/md3 isize=256 agcount=16, agsize=1627664 blks = sectsz=4096 attr=2 data = bsize=4096 blocks=26042624, imaxpct=25 = sunit=16 swidth=80 blks naming =version 2 bsize=4096 ascii-ci=0 log =internal bsize=4096 blocks=12716, version=2 = sectsz=4096 sunit=1 blks, lazy-count=1 realtime =none extsz=4096 blocks=0, rtextents=0 It's on a raid5, although I've gotten the hang on a regular single disk fs as well. md3 : active raid5 sda1[0] sdf1[5] sde1[4] sdd1[3] sdc1[2] sdb1[1] 104171200 blocks level 5, 64k chunk, algorithm 2 [6/6] [UUUUUU] bitmap: 0/5 pages [0KB], 2048KB chunk Here's the mount options: /dev/md3 on /mnt/md3 type xfs (rw,noatime,swalloc) Things usually run well for a while before hanging - in this instance it ran nearly 24 hours before it hung. A whole bunch of message info is below. Any idea what's happening here? Thanks Bill /var/log/messages shows this shortly after the hang: Aug 4 17:34:34 xplane kernel: kworker/u16:0 D 00000286 0 26574 2 0x00000000 Aug 4 17:34:34 xplane kernel: Workqueue: writeback bdi_writeback_workfn (flush-9:3) Aug 4 17:34:34 xplane kernel: kworker/0:1 D ea649638 0 17883 2 0x00000000 Aug 4 17:34:34 xplane kernel: Workqueue: xfs-log/md3 xfs_log_worker [xfs] Aug 4 17:34:34 xplane kernel: sh D 00000000 0 3237 3234 0x00000000 Aug 4 17:34:34 xplane kernel: mv D c1506cc8 0 17651 13354 0x00000000 Aug 4 17:34:34 xplane kernel: recordmcount D 00000000 0 17655 17580 0x00000000 Aug 4 17:34:34 xplane kernel: sh D 00001000 0 17677 17675 0x00000000 Aug 4 17:36:34 xplane kernel: kworker/u16:0 D 00000286 0 26574 2 0x00000000 Aug 4 17:36:34 xplane kernel: Workqueue: writeback bdi_writeback_workfn (flush-9:3) Aug 4 17:36:34 xplane kernel: kworker/0:1 D ea649638 0 17883 2 0x00000000 Aug 4 17:36:34 xplane kernel: Workqueue: xfs-log/md3 xfs_log_worker [xfs] Aug 4 17:36:34 xplane kernel: sh D 00000000 0 3237 3234 0x00000000 Aug 4 17:36:34 xplane kernel: mv D c1506cc8 0 17651 13354 0x00000000 and dmesg is here: INFO: task kworker/u16:0:26574 blocked for more than 120 seconds. Tainted: P O 3.14.15fe-dirty #1 "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message. kworker/u16:0 D 00000286 0 26574 2 0x00000000 Workqueue: writeback bdi_writeback_workfn (flush-9:3) ce385b84 00000046 df51bb30 00000286 f3e8a097 df51ba78 df51bb30 c1787600 c1787600 c16a5e40 d03a3160 00000065 ce385b64 f3e8b14f 00000004 f3ec8986 e65bccf8 ce385b80 c10f457e dcc9e740 e925e800 e92b2e00 000000fa e8593c00 Call Trace: [] ? xfs_trans_free+0x57/0x60 [xfs] [] ? xfs_trans_commit+0x12f/0x230 [xfs] [] ? xlog_space_left+0x26/0xa0 [xfs] [] ? kmem_cache_alloc+0xae/0x110 [] ? xlog_grant_push_ail+0xa1/0xc0 [xfs] [] schedule+0x23/0x60 [] xlog_grant_head_wait+0x75/0x130 [xfs] [] xlog_grant_head_check+0x72/0xc0 [xfs] [] xfs_log_reserve+0xbf/0x160 [xfs] [] xfs_trans_reserve+0x214/0x220 [xfs] [] xfs_setfilesize_trans_alloc.isra.7+0x38/0x90 [xfs] [] xfs_vm_writepage+0x465/0x580 [xfs] [] __writepage+0x10/0x40 [] ? mapping_tagged+0x20/0x20 [] write_cache_pages+0x170/0x3d0 [] ? mapping_tagged+0x20/0x20 [] ? blk_flush_plug_list+0x86/0x1b0 [] generic_writepages+0x33/0x60 [] xfs_vm_writepages+0x33/0x40 [xfs] [] do_writepages+0x1a/0x40 [] __writeback_single_inode+0x42/0x1f0 [] ? wake_up_bit+0x1c/0x20 [] writeback_sb_inodes+0x193/0x2e0 [] __writeback_inodes_wb+0x7c/0xb0 [] wb_writeback+0x1d2/0x270 [] bdi_writeback_workfn+0x20c/0x380 [] process_one_work+0x108/0x340 [] ? mod_timer+0xd5/0x180 [] worker_thread+0x101/0x330 [] ? manage_workers.isra.28+0x250/0x250 [] kthread+0xa1/0xc0 [] ret_from_kernel_thread+0x1b/0x28 [] ? kthread_create_on_node+0x110/0x110 INFO: task kworker/0:1:17883 blocked for more than 120 seconds. Tainted: P O 3.14.15fe-dirty #1 "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message. kworker/0:1 D ea649638 0 17883 2 0x00000000 Workqueue: xfs-log/md3 xfs_log_worker [xfs] e385be50 00000046 00000001 ea649638 ced77c5f 00004ed9 ea649638 c1787600 c1787600 e741b1a0 e0f872a0 e385be84 c106aaec 00000000 00000000 f3ec8986 e2c8bda8 e385be4c c10f457e 00000000 00000000 0000b40e 000000fa e8593c00 Call Trace: [] ? load_balance+0x16c/0x5b0 [] ? xlog_space_left+0x26/0xa0 [xfs] [] ? kmem_cache_alloc+0xae/0x110 [] ? xlog_grant_push_ail+0xa1/0xc0 [xfs] [] schedule+0x23/0x60 [] xlog_grant_head_wait+0x75/0x130 [xfs] [] xlog_grant_head_check+0x72/0xc0 [xfs] [] xfs_log_reserve+0xbf/0x160 [xfs] [] xfs_trans_reserve+0x214/0x220 [xfs] [] xfs_fs_log_dummy+0x34/0x80 [xfs] [] xfs_log_worker+0x3f/0x50 [xfs] [] process_one_work+0x108/0x340 [] ? destroy_worker+0x83/0xc0 [] ? manage_workers.isra.28+0x1a5/0x250 [] worker_thread+0x101/0x330 [] ? manage_workers.isra.28+0x250/0x250 [] kthread+0xa1/0xc0 [] ret_from_kernel_thread+0x1b/0x28 [] ? kthread_create_on_node+0x110/0x110 INFO: task sh:3237 blocked for more than 120 seconds. Tainted: P O 3.14.15fe-dirty #1 "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message. sh D 00000000 0 3237 3234 0x00000000 c094dd48 00000082 00000000 00000000 c094dd04 f3ec8b16 e8593e04 c1787600 c1787600 ea18f630 e741ad50 e8593c00 e8593e00 e8593c74 c094dd24 f3ec8986 c697c058 c094dd44 c10f457e c094dd2c c10379be ea81d180 000000fa e8593c00 Call Trace: [] ? xlog_grant_head_wake+0x56/0xc0 [xfs] [] ? xlog_space_left+0x26/0xa0 [xfs] [] ? kmem_cache_alloc+0xae/0x110 [] ? kmap_atomic_prot+0x3e/0xd0 [] ? xlog_grant_push_ail+0xa1/0xc0 [xfs] [] schedule+0x23/0x60 [] xlog_grant_head_wait+0x75/0x130 [xfs] [] xlog_grant_head_check+0x72/0xc0 [xfs] [] xfs_log_reserve+0xbf/0x160 [xfs] [] xfs_trans_reserve+0x214/0x220 [xfs] [] xfs_vn_update_time+0x58/0x150 [xfs] [] ? xfs_vn_getattr+0x200/0x200 [xfs] [] update_time+0x1e/0xa0 [] file_update_time+0x6b/0xa0 [] xfs_file_aio_write_checks+0x8d/0x140 [xfs] [] xfs_file_buffered_aio_write+0x68/0x180 [xfs] [] ? do_wp_page+0x2e5/0x740 [] xfs_file_aio_write+0xc9/0x180 [xfs] [] do_sync_write+0x57/0x90 [] ? do_sync_read+0x90/0x90 [] vfs_write+0x90/0x180 [] SyS_write+0x4c/0xb0 [] syscall_call+0x7/0x7 INFO: task mv:17651 blocked for more than 120 seconds. Tainted: P O 3.14.15fe-dirty #1 "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message. mv D c1506cc8 0 17651 13354 0x00000000 cfbabd0c 00000086 cfbabca0 c1506cc8 00000001 c16e4c74 00000003 c1787600 c1787600 ea15ed50 cace76b0 c106f28f 00000000 00000000 00000001 f3ec8986 c697c108 cfbabd08 c10f457e c14de398 00000000 ce29bd80 000000fa e8593c00 Call Trace: [] ? _raw_spin_unlock_bh+0x18/0x20 [] ? __wake_up+0x3f/0x50 [] ? xlog_space_left+0x26/0xa0 [xfs] [] ? kmem_cache_alloc+0xae/0x110 [] ? rpc_release_client+0x78/0x80 [] ? xlog_grant_push_ail+0xa1/0xc0 [xfs] [] schedule+0x23/0x60 [] xlog_grant_head_wait+0x75/0x130 [xfs] [] xlog_grant_head_check+0x72/0xc0 [xfs] [] xfs_log_reserve+0xbf/0x160 [xfs] [] xfs_trans_reserve+0x214/0x220 [xfs] [] xfs_rename+0xeb/0x5a0 [xfs] [] ? inode_permission+0x16/0x50 [] ? filldir64+0x44/0x110 [] xfs_vn_rename+0x8b/0xa0 [xfs] [] vfs_rename+0x4fe/0x510 [] ? lookup_dcache+0x24/0xa0 [] SyS_renameat+0x21e/0x340 [] ? __do_page_fault+0x28f/0x4d0 [] SyS_rename+0x2d/0x30 [] syscall_call+0x7/0x7 INFO: task recordmcount:17655 blocked for more than 120 seconds. Tainted: P O 3.14.15fe-dirty #1 "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message. recordmcount D 00000000 0 17655 17580 0x00000000 dbf57d48 00000086 00000000 00000000 c14e099e c5690160 e8593e04 c1787600 c1787600 e9989670 d01551e0 e8593c00 e8593e00 e8593c74 dbf57d24 f3ec8986 cf59aa38 dbf57d44 c10f457e cf72c73c 00000000 dbf57d2c 000000fa e8593c00 Call Trace: [] ? xprt_release+0x11e/0x250 [] ? xlog_space_left+0x26/0xa0 [xfs] [] ? kmem_cache_alloc+0xae/0x110 [] ? xlog_grant_push_ail+0xa1/0xc0 [xfs] [] schedule+0x23/0x60 [] xlog_grant_head_wait+0x75/0x130 [xfs] [] xlog_grant_head_check+0x72/0xc0 [xfs] [] xfs_log_reserve+0xbf/0x160 [xfs] [] xfs_trans_reserve+0x214/0x220 [xfs] [] xfs_vn_update_time+0x58/0x150 [xfs] [] ? xfs_vn_getattr+0x200/0x200 [xfs] [] update_time+0x1e/0xa0 [] file_update_time+0x6b/0xa0 [] xfs_file_aio_write_checks+0x8d/0x140 [xfs] [] xfs_file_buffered_aio_write+0x68/0x180 [xfs] [] xfs_file_aio_write+0xc9/0x180 [xfs] [] do_sync_write+0x57/0x90 [] ? do_sync_read+0x90/0x90 [] vfs_write+0x90/0x180 [] SyS_write+0x4c/0xb0 [] syscall_call+0x7/0x7 INFO: task sh:17677 blocked for more than 120 seconds. Tainted: P O 3.14.15fe-dirty #1 "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message. sh D 00001000 0 17677 17675 0x00000000 e3d73cd4 00000086 dc9e2420 00001000 e3d73c90 c1122497 f0bbcb20 c1787600 c1787600 c16a5e40 e91bbb40 00000287 00000001 00000288 e93b5400 f3ec8986 c63862a8 e3d73cd0 c10f457e e3d73cd0 c112259b 00001287 000000fa e8593c00 Call Trace: [] ? __block_commit_write.isra.18+0x67/0x90 [] ? xlog_space_left+0x26/0xa0 [xfs] [] ? kmem_cache_alloc+0xae/0x110 [] ? generic_write_end+0x7b/0xb0 [] ? xlog_grant_push_ail+0xa1/0xc0 [xfs] [] schedule+0x23/0x60 [] xlog_grant_head_wait+0x75/0x130 [xfs] [] xlog_grant_head_check+0x72/0xc0 [xfs] [] xfs_log_reserve+0xbf/0x160 [xfs] [] xfs_trans_reserve+0x214/0x220 [xfs] [] xfs_create+0x113/0x490 [xfs] [] xfs_vn_mknod+0x84/0xe0 [xfs] [] xfs_vn_create+0x1a/0x20 [xfs] [] vfs_create+0x9c/0xe0 [] do_last.isra.46+0x7aa/0xbf0 [] ? link_path_walk+0x1ed/0x6f0 [] ? kmem_cache_alloc+0xae/0x110 [] path_openat+0xac/0x590 [] ? handle_mm_fault+0x132/0x850 [] do_filp_open+0x31/0x80 [] do_sys_open+0x121/0x220 [] ? sigprocmask+0x67/0xb0 [] SyS_open+0x22/0x30 [] syscall_call+0x7/0x7 INFO: task kworker/u16:0:26574 blocked for more than 120 seconds. Tainted: P O 3.14.15fe-dirty #1 "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message. kworker/u16:0 D 00000286 0 26574 2 0x00000000 Workqueue: writeback bdi_writeback_workfn (flush-9:3) ce385b84 00000046 df51bb30 00000286 f3e8a097 df51ba78 df51bb30 c1787600 c1787600 c16a5e40 d03a3160 00000065 ce385b64 f3e8b14f 00000004 f3ec8986 e65bccf8 ce385b80 c10f457e dcc9e740 e925e800 e92b2e00 000000fa e8593c00 Call Trace: [] ? xfs_trans_free+0x57/0x60 [xfs] [] ? xfs_trans_commit+0x12f/0x230 [xfs] [] ? xlog_space_left+0x26/0xa0 [xfs] [] ? kmem_cache_alloc+0xae/0x110 [] ? xlog_grant_push_ail+0xa1/0xc0 [xfs] [] schedule+0x23/0x60 [] xlog_grant_head_wait+0x75/0x130 [xfs] [] xlog_grant_head_check+0x72/0xc0 [xfs] [] xfs_log_reserve+0xbf/0x160 [xfs] [] xfs_trans_reserve+0x214/0x220 [xfs] [] xfs_setfilesize_trans_alloc.isra.7+0x38/0x90 [xfs] [] xfs_vm_writepage+0x465/0x580 [xfs] [] __writepage+0x10/0x40 [] ? mapping_tagged+0x20/0x20 [] write_cache_pages+0x170/0x3d0 [] ? mapping_tagged+0x20/0x20 [] ? blk_flush_plug_list+0x86/0x1b0 [] generic_writepages+0x33/0x60 [] xfs_vm_writepages+0x33/0x40 [xfs] [] do_writepages+0x1a/0x40 [] __writeback_single_inode+0x42/0x1f0 [] ? wake_up_bit+0x1c/0x20 [] writeback_sb_inodes+0x193/0x2e0 [] __writeback_inodes_wb+0x7c/0xb0 [] wb_writeback+0x1d2/0x270 [] bdi_writeback_workfn+0x20c/0x380 [] process_one_work+0x108/0x340 [] ? mod_timer+0xd5/0x180 [] worker_thread+0x101/0x330 [] ? manage_workers.isra.28+0x250/0x250 [] kthread+0xa1/0xc0 [] ret_from_kernel_thread+0x1b/0x28 [] ? kthread_create_on_node+0x110/0x110 INFO: task kworker/0:1:17883 blocked for more than 120 seconds. Tainted: P O 3.14.15fe-dirty #1 "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message. kworker/0:1 D ea649638 0 17883 2 0x00000000 Workqueue: xfs-log/md3 xfs_log_worker [xfs] e385be50 00000046 00000001 ea649638 ced77c5f 00004ed9 ea649638 c1787600 c1787600 e741b1a0 e0f872a0 e385be84 c106aaec 00000000 00000000 f3ec8986 e2c8bda8 e385be4c c10f457e 00000000 00000000 0000b40e 000000fa e8593c00 Call Trace: [] ? load_balance+0x16c/0x5b0 [] ? xlog_space_left+0x26/0xa0 [xfs] [] ? kmem_cache_alloc+0xae/0x110 [] ? xlog_grant_push_ail+0xa1/0xc0 [xfs] [] schedule+0x23/0x60 [] xlog_grant_head_wait+0x75/0x130 [xfs] [] xlog_grant_head_check+0x72/0xc0 [xfs] [] xfs_log_reserve+0xbf/0x160 [xfs] [] xfs_trans_reserve+0x214/0x220 [xfs] [] xfs_fs_log_dummy+0x34/0x80 [xfs] [] xfs_log_worker+0x3f/0x50 [xfs] [] process_one_work+0x108/0x340 [] ? destroy_worker+0x83/0xc0 [] ? manage_workers.isra.28+0x1a5/0x250 [] worker_thread+0x101/0x330 [] ? manage_workers.isra.28+0x250/0x250 [] kthread+0xa1/0xc0 [] ret_from_kernel_thread+0x1b/0x28 [] ? kthread_create_on_node+0x110/0x110 INFO: task sh:3237 blocked for more than 120 seconds. Tainted: P O 3.14.15fe-dirty #1 "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message. sh D 00000000 0 3237 3234 0x00000000 c094dd48 00000082 00000000 00000000 c094dd04 f3ec8b16 e8593e04 c1787600 c1787600 ea18f630 e741ad50 e8593c00 e8593e00 e8593c74 c094dd24 f3ec8986 c697c058 c094dd44 c10f457e c094dd2c c10379be ea81d180 000000fa e8593c00 Call Trace: [] ? xlog_grant_head_wake+0x56/0xc0 [xfs] [] ? xlog_space_left+0x26/0xa0 [xfs] [] ? kmem_cache_alloc+0xae/0x110 [] ? kmap_atomic_prot+0x3e/0xd0 [] ? xlog_grant_push_ail+0xa1/0xc0 [xfs] [] schedule+0x23/0x60 [] xlog_grant_head_wait+0x75/0x130 [xfs] [] xlog_grant_head_check+0x72/0xc0 [xfs] [] xfs_log_reserve+0xbf/0x160 [xfs] [] xfs_trans_reserve+0x214/0x220 [xfs] [] xfs_vn_update_time+0x58/0x150 [xfs] [] ? xfs_vn_getattr+0x200/0x200 [xfs] [] update_time+0x1e/0xa0 [] file_update_time+0x6b/0xa0 [] xfs_file_aio_write_checks+0x8d/0x140 [xfs] [] xfs_file_buffered_aio_write+0x68/0x180 [xfs] [] ? do_wp_page+0x2e5/0x740 [] xfs_file_aio_write+0xc9/0x180 [xfs] [] do_sync_write+0x57/0x90 [] ? do_sync_read+0x90/0x90 [] vfs_write+0x90/0x180 [] SyS_write+0x4c/0xb0 [] syscall_call+0x7/0x7 INFO: task mv:17651 blocked for more than 120 seconds. Tainted: P O 3.14.15fe-dirty #1 "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message. mv D c1506cc8 0 17651 13354 0x00000000 cfbabd0c 00000086 cfbabca0 c1506cc8 00000001 c16e4c74 00000003 c1787600 c1787600 ea15ed50 cace76b0 c106f28f 00000000 00000000 00000001 f3ec8986 c697c108 cfbabd08 c10f457e c14de398 00000000 ce29bd80 000000fa e8593c00 Call Trace: [] ? _raw_spin_unlock_bh+0x18/0x20 [] ? __wake_up+0x3f/0x50 [] ? xlog_space_left+0x26/0xa0 [xfs] [] ? kmem_cache_alloc+0xae/0x110 [] ? rpc_release_client+0x78/0x80 [] ? xlog_grant_push_ail+0xa1/0xc0 [xfs] [] schedule+0x23/0x60 [] xlog_grant_head_wait+0x75/0x130 [xfs] [] xlog_grant_head_check+0x72/0xc0 [xfs] [] xfs_log_reserve+0xbf/0x160 [xfs] [] xfs_trans_reserve+0x214/0x220 [xfs] [] xfs_rename+0xeb/0x5a0 [xfs] [] ? inode_permission+0x16/0x50 [] ? filldir64+0x44/0x110 [] xfs_vn_rename+0x8b/0xa0 [xfs] [] vfs_rename+0x4fe/0x510 [] ? lookup_dcache+0x24/0xa0 [] SyS_renameat+0x21e/0x340 [] ? __do_page_fault+0x28f/0x4d0 [] SyS_rename+0x2d/0x30 [] syscall_call+0x7/0x7 From david@fromorbit.com Mon Aug 4 19: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 (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id BD56E7F78 for ; Mon, 4 Aug 2014 19:35:21 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 2B631AC002 for ; Mon, 4 Aug 2014 17:35:20 -0700 (PDT) X-ASG-Debug-ID: 1407198918-04cb6c555f14d1d0001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id 7Jqn6Td3xQ2rSYxc for ; Mon, 04 Aug 2014 17:35:18 -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: As8GAM8l4FN5LKl0/2dsb2JhbABbgw2BKYInrBIBAQEBAQalBQGBFBd3hAQBBTocIxAIAw4KCSUPBSUDIROIQcRLFxiFZIkDTQeDL4EcBZwFlGCDXysvgQU Received: from ppp121-44-169-116.lns20.syd7.internode.on.net (HELO dastard) ([121.44.169.116]) by ipmail07.adl2.internode.on.net with ESMTP; 05 Aug 2014 10:04:53 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1XESi8-0003Ah-Tl; Tue, 05 Aug 2014 10:34:40 +1000 Date: Tue, 5 Aug 2014 10:34:40 +1000 From: Dave Chinner To: Brian Foster Cc: xfs@oss.sgi.com Subject: Re: [PATCH 2/6] xfs: consolidate superblock logging functions Message-ID: <20140805003440.GB20518@dastard> X-ASG-Orig-Subj: Re: [PATCH 2/6] xfs: consolidate superblock logging functions References: <1406791995-14723-1-git-send-email-david@fromorbit.com> <1406791995-14723-3-git-send-email-david@fromorbit.com> <20140801143929.GC3582@laptop.bfoster> <20140804080930.GY20518@dastard> <20140804124836.GA4049@bfoster.bfoster> <20140804221526.GZ20518@dastard> <20140805000333.GA27760@bfoster.bfoster> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140805000333.GA27760@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: 1407198918 X-Barracuda-URL: http://192.48.176.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.8126 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Mon, Aug 04, 2014 at 08:03:33PM -0400, Brian Foster wrote: > On Tue, Aug 05, 2014 at 08:15:26AM +1000, Dave Chinner wrote: > > On Mon, Aug 04, 2014 at 08:48:36AM -0400, Brian Foster wrote: > > > On Mon, Aug 04, 2014 at 06:09:30PM +1000, Dave Chinner wrote: > > > > On Fri, Aug 01, 2014 at 10:39:29AM -0400, Brian Foster wrote: > > > Fair point, an sb modification is something that should stand out. I > > > think the characteristic of the new api is somewhat subtle, however. > > > > Which is why there's a comment explaining it. Is there anything I > > can add to that comment to make it clearer? > > > > I would change this: > > /* > * ... > * > * Note this code can be called during the process of freezing, so > * we may need to use the transaction allocator which does not > * block when the transaction subsystem is in its frozen state. > */ > > ... to something like: > > /* > * ... > * > * Note that the caller is responsible for checking the frozen state of > * the filesystem. This procedure uses the non-blocking transaction > * allocator and thus will allow modifications to a frozen fs. This is > * required because this code can be called during the process of > * freezing where use of the high-level allocator would deadlock. > */ OK, I can do that. > > > > > I'm not sure of the mechanics behind that, but I'm > > > > > guessing some kind of reference remains on the sb of a frozen fs and a > > > > > subsequent umount/mount is purely namespace magic. Point being... this > > > > > appears to be implicit and confusing. IMO, using an _xfs_sync_sb() > > > > > variant that allocates a nonblocking tp if one isn't provided as a > > > > > parameter (for example) and using that only in the contexts we know it's > > > > > Ok to avoid freeze interaction issues might be more clear. > > > > > > > > Well, it was pretty clear to me that the code paths were free of > > > > freeze interactions. Looking at this - especially the quota on/off > > > > paths - I guess it's not as obvious as I thought it was... :/ > > > > > > > > > > My point was more geared towards future use. E.g., we have frozen fs > > > management built into transaction management, which is nice and clean > > > and easy to understand. > > > > Actually, it's nowhere near as clean as you think. :/ > > > > e.g. did you know that the xfs_fs_writable() check in > > xfs_log_sbcount() is to prevent it from writing anything when > > unmounting a fully frozen filesystem? i.e. xfs_log_sbcount needs to > > succeed while a freeze is in progress, but fail when a freeze is > > fully complete? > > > > Hmm, so freeze_super() sets s_frozen to SB_FREEZE_FS before it calls > into the fs. Given the xfs_fs_writable() logic, how is that going to > differentiate a freezing fs from a frozen fs? It makes sense that this > would avoid blocking on umount of a frozen fs, but it seems like we'd > skip out just the same during the freeze sequence. Maybe I'm missing > something... Hmmm - that means we broke it at some point. xfs_attr_quiesce is supposed to make the metadata uptodate on disk, so if it's not updating the superblock (i.e. syncing all the counters) then it's not doing the right thing - the sb counters on disk while the fs is frozen are not uptodate and hence correct behaviour if we crash with a frozen fs is dependent on log recovery finding a dirty log. That's a nasty little landmine and needs to be fixed, even though it's not causing issues at the moment (because we dirty the log after quiescing the filesystem). Did I mention this code is not at all obvious? :/ Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Mon Aug 4 20:18: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.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id D6A977F81 for ; Mon, 4 Aug 2014 20:18:27 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id B16F830404E for ; Mon, 4 Aug 2014 18:18:24 -0700 (PDT) X-ASG-Debug-ID: 1407201502-04bdf03d4416d850001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id BOshEQKw3MyQaIMS for ; Mon, 04 Aug 2014 18:18: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: ArwJACIw4FN5LKl0PGdsb2JhbABbgw2BKYInhQinCwEBAQEBBqUFAYEUFwUBAQEBODaEBAEFOhwjEAgDGAklDwUlAwcaE4hBxEQXGIVkiVAHgy+BHAEEjneNDpg/Ky8 Received: from ppp121-44-169-116.lns20.syd7.internode.on.net (HELO dastard) ([121.44.169.116]) by ipmail06.adl2.internode.on.net with ESMTP; 05 Aug 2014 10:48:01 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1XETO5-0003I3-17; Tue, 05 Aug 2014 11:18:01 +1000 Date: Tue, 5 Aug 2014 11:18:00 +1000 From: Dave Chinner To: Bill Cc: xfs@oss.sgi.com Subject: Re: xfs hang in 3.14.15 Message-ID: <20140805011800.GC20518@dastard> X-ASG-Orig-Subj: Re: xfs hang in 3.14.15 References: <53E02495.4080208@sbcglobal.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <53E02495.4080208@sbcglobal.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: 1407201502 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.8127 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Mon, Aug 04, 2014 at 07:25:57PM -0500, Bill wrote: > Hi, > > I've been running a stress test on 3.14.15 and eventually my xfs > filesystem hangs. Both 3.10.50 and 3.16 seem to work ok. log space hang. 110dc24 xfs: log vector rounding leaks log space Cheers, Dave. -- Dave Chinner david@fromorbit.com From webmaster@dev101.magizz.com Tue Aug 5 02:08: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=2.1 required=5.0 tests=HTML_IMAGE_RATIO_04, HTML_MESSAGE,T_DKIM_INVALID autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 77AAE7F76 for ; Tue, 5 Aug 2014 02:08:31 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 2A63E304053 for ; Tue, 5 Aug 2014 00:08:28 -0700 (PDT) X-ASG-Debug-ID: 1407222504-04bdf03d4217c430001-NocioJ Received: from vps.magizz.com (vps.magizz.com [162.251.83.157]) by cuda.sgi.com with ESMTP id WJoQdUZPoWup0FDv (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 05 Aug 2014 00:08:24 -0700 (PDT) X-Barracuda-Envelope-From: webmaster@dev101.magizz.com X-Barracuda-Apparent-Source-IP: 162.251.83.157 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=dev101.magizz.com; s=default; h=Content-Type:MIME-Version:List-Owner:List-Subscribe:List-Unsubscribe:List-Help:Message-ID:Reply-To:From:Date:Subject:To; bh=gM3wc9DtemqsQqBX0o+hbbeD83hIXpcT0ItO89FOq9U=; b=fNRTgtd5HjMnTIDWnapHdNYE7Sfw75bCKGVZSFa9ti730nnwV4R52y9bJteoy16K9DqXzh5stKh6oq8/3A4VK+iiQ9Xq4faiFwnvzBP5dC5luTXN924xhCrnErAnwlTzYYdUG0U2Ytexsxxxxvh9xyuCNIXArPksQoDgdJG6Pqk=; Received: from dev101magizz by vps.magizz.com with local (Exim 4.82) (envelope-from ) id 1XEYrC-0000VM-Ce for xfs@oss.sgi.com; Tue, 05 Aug 2014 11:08:26 +0400 To: xfs@oss.sgi.com Subject: Best Deals for All Business Owners X-PHP-Script: dev101.magizz.com/mailz/admin/index.php for 122.169.9.116 X-ASG-Orig-Subj: Best Deals for All Business Owners Received: from abts-mum-dynamic-116.9.169.122.airtelbroadband.in [122.169.9.116] by dev101.magizz.com with HTTP; Tue, 05 Aug 2014 07:04:24 +0000 Date: Tue, 5 Aug 2014 07:08:26 +0000 From: Vistaprint Reply-To: Vistaprint Message-ID: <03bb72fdaaaae3fab513188568756adb@dev101.magizz.com> X-Priority: 3 X-Mailer: PHPMailer 5.2.5 (https://github.com/Synchro/PHPMailer/) X-phpList-version: 3.0.6 X-MessageID: 5 X-ListMember: xfs@oss.sgi.com Precedence: bulk Bounces-To: webmaster@dev101.magizz.com List-Help: List-Unsubscribe: List-Subscribe: List-Owner: MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="b1_03bb72fdaaaae3fab513188568756adb" X-AntiAbuse: This header was added to track abuse, please include it with any abuse report X-AntiAbuse: Primary Hostname - vps.magizz.com X-AntiAbuse: Original Domain - oss.sgi.com X-AntiAbuse: Originator/Caller UID/GID - [502 513] / [47 12] X-AntiAbuse: Sender Address Domain - dev101.magizz.com X-Get-Message-Sender-Via: vps.magizz.com: authenticated_id: dev101magizz/from_h X-Barracuda-Connect: vps.magizz.com[162.251.83.157] X-Barracuda-Start-Time: 1407222504 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.17 X-Barracuda-Spam-Status: No, SCORE=0.17 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED, HTML_IMAGE_RATIO_04, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.8127 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 0.17 HTML_IMAGE_RATIO_04 BODY: HTML has a low ratio of text to image area 0.00 HTML_MESSAGE BODY: HTML included in message --b1_03bb72fdaaaae3fab513188568756adb Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable =20 Make An Impression Every Time You Interact With Your Customers ! Please don't reply to this email as it's an unmonitored address. Discounts may vary by quantity and apply to select designs. Additional charges may apply for shipping/processing, upgrades and uploads, unless otherwise specified. Discounts valid only on lowest quantity of each product. Discounts not valid on previous purchases or in combination with any other offers. See website for details. The products and services in this e-mail are provided by Vistaprint. 10 million people per year trust Vistaprint for affordable online and print solutions.India customers may contact us in care of our India subsidiary: Vistaprint India Marketing Solutions Private Limited 2nd Floor, "Piramal Tower", Peninsula Corporate Park, Ganpatrao Kadam Marg, Off Senapati Bapat Marg, Lower Parel, Mumbai India - 400 013 -- This message was sent to xfs@oss.sgi.com by swati@dev101.magizz.com To forward this message, please do not use the forward button of your email application, because this message was made specifically for you only. Instead use the forward page=0A in our newsletter system. To change your details and to choose which lists to be subscribed to, visit your personal preferences page=0A Or you can opt-out completely=0A from all future mailings. =20 amj --b1_03bb72fdaaaae3fab513188568756adb Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: quoted-printable =0A =0A

 

Make An Impression Every Time You Int= eract With Your Customers!
3D""=  
3D"Business 3D"Marketing 3D"Invitations" 3D"Embroidered
3D"=<= /td> 3D"=<= /td> 3D"=<= /td>
3D"=<= /td> 3D"=<= /td> 3D"=<= /td>
3D== 3D== 3D==
 
 
3D""

Please don't reply to this email as it's an unmo= nitored address.
Discounts may vary by quantity and apply to select = designs. Additional charges may apply for shipping/processing, = upgrades and uploads, unless otherwise specified. Discounts valid= only on lowest quantity of each product. Discounts not valid on previous = purchases or in combination with any other offers. See webs= ite for details.

The products and services in this e-mail are provid= ed by Vistaprint. 10 million people per year trust Vistaprint for aff= ordable online and print solutions.India customers may contact us in care = of our India subsidiary:
Vistaprint India Marketing Solutions Private Limite= d
2nd Floor, "Piramal Tower", = Peninsula Corporate Park, Ganpatrao Kadam Marg, O= ff Senapati Bapat Marg,
Lower Parel, Mumbai India - 400 013


-- =20

This message was sent to xfs@oss.sgi.com by swati@dev101.magizz.co= m

To forward this message, please do not use the forward button of y= our email application, because this message was made specifically for you o= nly. Instead use the forward page in our newsletter system.
To change your details and to choose which lists to be subscribed to,= visit your personal preferences page
Or you can opt-out completely from all future mailings.

=0Aamj --b1_03bb72fdaaaae3fab513188568756adb-- From bfoster@redhat.com Tue Aug 5 07:31: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 3F8F87F83 for ; Tue, 5 Aug 2014 07:31:04 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 0F3A6304059 for ; Tue, 5 Aug 2014 05:31:01 -0700 (PDT) X-ASG-Debug-ID: 1407241859-04bdf03d42188a90001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id sKalsXBE8mtwGxW8 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 05 Aug 2014 05:30: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-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 s75CUq5d002332 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Tue, 5 Aug 2014 08:30:52 -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 s75CUqsJ003973; Tue, 5 Aug 2014 08:30:52 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 233CC12577C; Tue, 5 Aug 2014 08:30:51 -0400 (EDT) Date: Tue, 5 Aug 2014 08:30:51 -0400 From: Brian Foster To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 2/6] xfs: consolidate superblock logging functions Message-ID: <20140805123050.GA53538@bfoster.bfoster> X-ASG-Orig-Subj: Re: [PATCH 2/6] xfs: consolidate superblock logging functions References: <1406791995-14723-1-git-send-email-david@fromorbit.com> <1406791995-14723-3-git-send-email-david@fromorbit.com> <20140801143929.GC3582@laptop.bfoster> <20140804080930.GY20518@dastard> <20140804124836.GA4049@bfoster.bfoster> <20140804221526.GZ20518@dastard> <20140805000333.GA27760@bfoster.bfoster> <20140805003440.GB20518@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140805003440.GB20518@dastard> 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: 1407241859 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Tue, Aug 05, 2014 at 10:34:40AM +1000, Dave Chinner wrote: > On Mon, Aug 04, 2014 at 08:03:33PM -0400, Brian Foster wrote: > > On Tue, Aug 05, 2014 at 08:15:26AM +1000, Dave Chinner wrote: > > > On Mon, Aug 04, 2014 at 08:48:36AM -0400, Brian Foster wrote: > > > > On Mon, Aug 04, 2014 at 06:09:30PM +1000, Dave Chinner wrote: > > > > > On Fri, Aug 01, 2014 at 10:39:29AM -0400, Brian Foster wrote: > > > > Fair point, an sb modification is something that should stand out. I > > > > think the characteristic of the new api is somewhat subtle, however. > > > > > > Which is why there's a comment explaining it. Is there anything I > > > can add to that comment to make it clearer? > > > > > > > I would change this: > > > > /* > > * ... > > * > > * Note this code can be called during the process of freezing, so > > * we may need to use the transaction allocator which does not > > * block when the transaction subsystem is in its frozen state. > > */ > > > > ... to something like: > > > > /* > > * ... > > * > > * Note that the caller is responsible for checking the frozen state of > > * the filesystem. This procedure uses the non-blocking transaction > > * allocator and thus will allow modifications to a frozen fs. This is > > * required because this code can be called during the process of > > * freezing where use of the high-level allocator would deadlock. > > */ > > OK, I can do that. > > > > > > > I'm not sure of the mechanics behind that, but I'm > > > > > > guessing some kind of reference remains on the sb of a frozen fs and a > > > > > > subsequent umount/mount is purely namespace magic. Point being... this > > > > > > appears to be implicit and confusing. IMO, using an _xfs_sync_sb() > > > > > > variant that allocates a nonblocking tp if one isn't provided as a > > > > > > parameter (for example) and using that only in the contexts we know it's > > > > > > Ok to avoid freeze interaction issues might be more clear. > > > > > > > > > > Well, it was pretty clear to me that the code paths were free of > > > > > freeze interactions. Looking at this - especially the quota on/off > > > > > paths - I guess it's not as obvious as I thought it was... :/ > > > > > > > > > > > > > My point was more geared towards future use. E.g., we have frozen fs > > > > management built into transaction management, which is nice and clean > > > > and easy to understand. > > > > > > Actually, it's nowhere near as clean as you think. :/ > > > > > > e.g. did you know that the xfs_fs_writable() check in > > > xfs_log_sbcount() is to prevent it from writing anything when > > > unmounting a fully frozen filesystem? i.e. xfs_log_sbcount needs to > > > succeed while a freeze is in progress, but fail when a freeze is > > > fully complete? > > > > > > > Hmm, so freeze_super() sets s_frozen to SB_FREEZE_FS before it calls > > into the fs. Given the xfs_fs_writable() logic, how is that going to > > differentiate a freezing fs from a frozen fs? It makes sense that this > > would avoid blocking on umount of a frozen fs, but it seems like we'd > > skip out just the same during the freeze sequence. Maybe I'm missing > > something... > > Hmmm - that means we broke it at some point. xfs_attr_quiesce is > supposed to make the metadata uptodate on disk, so if it's not > updating the superblock (i.e. syncing all the counters) then it's > not doing the right thing - the sb counters on disk while the fs is > frozen are not uptodate and hence correct behaviour if we crash with > a frozen fs is dependent on log recovery finding a dirty log. That's > a nasty little landmine and needs to be fixed, even though it's not > causing issues at the moment (because we dirty the log after > quiescing the filesystem). > I'm wondering if that even helps in the case of a crash. It looks like we would skip the counter sync and subsequent action of logging the sb entirely. Oh, according to the lazy sb counter commit log description we do some kind of counter rebuild across the AGI/AGF structures and log the result of that. So I take it that should a crash occur while in the frozen state, the simple act of causing a log recovery to occur on subsequent mount should rebuild everything correctly. > Did I mention this code is not at all obvious? :/ > Heh. :P From what I can see, it looks like this has been the case since commit 92821e2b, which introduced xfs_log_sbcount(). That goes way back... there's a vfs_test_for_freeze() macro (xfs_vfs.h) used by xfs_fs_writable() that looks like this: #define vfs_test_for_freeze(vfs) ((vfs)->vfs_super->s_frozen) ... and SB_FREEZE_TRANS is set before a ->write_super_lockfs() call into the fs. The mechanism looks to have changed quite a bit since then, though. Perhaps xfs_log_sbcount() requires an open coded s_frozen check a la the _xfs_trans_alloc() logic. E.g., skip out of SB_FREEZE_COMPLETE, proceed otherwise..? Brian > Cheers, > > Dave. > -- > Dave Chinner > david@fromorbit.com > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From bfoster@redhat.com Tue Aug 5 08:16: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 (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id DC7F47F85 for ; Tue, 5 Aug 2014 08:16:11 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id BA7BA304064 for ; Tue, 5 Aug 2014 06:16:08 -0700 (PDT) X-ASG-Debug-ID: 1407244567-04cb6c555c166d00001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id J1IJnAGFHlowgR4x (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 05 Aug 2014 06:16: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-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 s75DG6sn021890 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK) for ; Tue, 5 Aug 2014 09:16:07 -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 s75DG6da031507; Tue, 5 Aug 2014 09:16:06 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 4EE3A12577C; Tue, 5 Aug 2014 09:16:05 -0400 (EDT) Date: Tue, 5 Aug 2014 09:16:05 -0400 From: Brian Foster To: Eric Sandeen Cc: xfs@oss.sgi.com Subject: Re: [PATCH 1/6] xfs_io: free fshandlep in parent_check() Message-ID: <20140805131604.GB53538@bfoster.bfoster> X-ASG-Orig-Subj: Re: [PATCH 1/6] xfs_io: free fshandlep in parent_check() References: <1406905159-12415-1-git-send-email-sandeen@redhat.com> <1406905159-12415-2-git-send-email-sandeen@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1406905159-12415-2-git-send-email-sandeen@redhat.com> User-Agent: Mutt/1.5.23 (2014-03-12) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1407244567 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Fri, Aug 01, 2014 at 09:59:14AM -0500, Eric Sandeen wrote: > The allocated fshandle wasn't freed in either normal > exit or error paths. > > Do this, and consolidate cleanup into an out: target. > > Signed-off-by: Eric Sandeen > --- Reviewed-by: Brian Foster > io/parent.c | 7 ++++--- > 1 files changed, 4 insertions(+), 3 deletions(-) > > diff --git a/io/parent.c b/io/parent.c > index ca989e9..56e126d 100644 > --- a/io/parent.c > +++ b/io/parent.c > @@ -258,9 +258,8 @@ parent_check(void) > if (!bstatbuf || !parentbuf) { > fprintf(stderr, _("unable to allocate buffers: %s\n"), > strerror(errno)); > - free(bstatbuf); > - free(parentbuf); > - return 1; > + err_status = 1; > + goto out; > } > > if (do_bulkstat(parentbuf, &parentbuf_size, bstatbuf, fsfd, fshandlep) != 0) > @@ -272,8 +271,10 @@ parent_check(void) > printf(_("succeeded checking %llu inodes\n"), > (unsigned long long) inodes_checked); > > +out: > free(bstatbuf); > free(parentbuf); > + free(fshandlep); > return err_status; > } > > -- > 1.7.1 > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From bfoster@redhat.com Tue Aug 5 08:16: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 (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id E5CE27F85 for ; Tue, 5 Aug 2014 08:16:22 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 71955AC005 for ; Tue, 5 Aug 2014 06:16:22 -0700 (PDT) X-ASG-Debug-ID: 1407244580-04cbb02d83174cb0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id AJBe3UkXtmWJLdja (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 05 Aug 2014 06:16: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-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 s75DGKcM001449 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK) for ; Tue, 5 Aug 2014 09:16:20 -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 s75DGJKR010900; Tue, 5 Aug 2014 09:16:20 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 063D512577C; Tue, 5 Aug 2014 09:16:18 -0400 (EDT) Date: Tue, 5 Aug 2014 09:16:18 -0400 From: Brian Foster To: Eric Sandeen Cc: xfs@oss.sgi.com Subject: Re: [PATCH 2/6] xfs_fsr: fix leaks & catch error in fsrfile() Message-ID: <20140805131618.GC53538@bfoster.bfoster> X-ASG-Orig-Subj: Re: [PATCH 2/6] xfs_fsr: fix leaks & catch error in fsrfile() References: <1406905159-12415-1-git-send-email-sandeen@redhat.com> <1406905159-12415-3-git-send-email-sandeen@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1406905159-12415-3-git-send-email-sandeen@redhat.com> User-Agent: Mutt/1.5.23 (2014-03-12) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.24 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1407244580 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Fri, Aug 01, 2014 at 09:59:15AM -0500, Eric Sandeen wrote: > The allocated fshandlep leaks on most error paths; > restructure with an out: target that does all necessary > freeing, and initialize filehandles to -1 so that we > know whether they need to be closed on the error path. > > While we're at it, if gettmpname() fails, we still > return 0 for an error, because error is initialized > to 0 and only set otherwise by fsrfile_common. > So if gettmpname() fails, we return success from the > function even though we did no work. Fix that > as well by initializing error to -1. > > Signed-off-by: Eric Sandeen > --- > fsr/xfs_fsr.c | 28 ++++++++++++++-------------- > 1 files changed, 14 insertions(+), 14 deletions(-) > > diff --git a/fsr/xfs_fsr.c b/fsr/xfs_fsr.c > index 48629fd..752d2db 100644 > --- a/fsr/xfs_fsr.c > +++ b/fsr/xfs_fsr.c > @@ -809,15 +809,15 @@ fsrfile(char *fname, xfs_ino_t ino) > { > xfs_bstat_t statbuf; > jdm_fshandle_t *fshandlep; > - int fd, fsfd; > - int error = 0; > + int fd = -1, fsfd = -1; > + int error = -1; > char *tname; > > fshandlep = jdm_getfshandle(getparent (fname) ); > - if (! fshandlep) { > + if (!fshandlep) { > fsrprintf(_("unable to construct sys handle for %s: %s\n"), > fname, strerror(errno)); > - return -1; > + goto out; > } > > /* > @@ -828,39 +828,39 @@ fsrfile(char *fname, xfs_ino_t ino) > if (fsfd < 0) { > fsrprintf(_("unable to open sys handle for %s: %s\n"), > fname, strerror(errno)); > - return -1; > + goto out; > } > > if ((xfs_bulkstat_single(fsfd, &ino, &statbuf)) < 0) { > fsrprintf(_("unable to get bstat on %s: %s\n"), > fname, strerror(errno)); > - close(fsfd); > - return -1; > + goto out; > } > > fd = jdm_open(fshandlep, &statbuf, O_RDWR|O_DIRECT); > if (fd < 0) { > fsrprintf(_("unable to open handle %s: %s\n"), > fname, strerror(errno)); > - close(fsfd); > - return -1; > + goto out; > } > > /* Get the fs geometry */ > if (xfs_getgeom(fsfd, &fsgeom) < 0 ) { > fsrprintf(_("Unable to get geom on fs for: %s\n"), fname); > - close(fsfd); > - return -1; > + goto out; > } > > - close(fsfd); > - > tname = gettmpname(fname); > > if (tname) > error = fsrfile_common(fname, tname, NULL, fd, &statbuf); > I was wondering whether this bit to not fail if the path is bad was intentional (e.g., to avoid breaking through a higher-level loop or something), but we don't check the return value of this function anyways. :-| Reviewed-by: Brian Foster > - close(fd); > +out: > + if (fsfd >= 0) > + close(fsfd); > + if (fd >= 0) > + close(fd); > + free(fshandlep); > > return error; > } > -- > 1.7.1 > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From bfoster@redhat.com Tue Aug 5 08: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 (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id E74527F8C for ; Tue, 5 Aug 2014 08:16:31 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id D5446304064 for ; Tue, 5 Aug 2014 06:16:31 -0700 (PDT) X-ASG-Debug-ID: 1407244590-04cb6c555e166d50001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id d6U9G9SyIBlO22Jy (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 05 Aug 2014 06:16: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-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 s75DGUrQ003959 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK) for ; Tue, 5 Aug 2014 09:16:30 -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 s75DGTo5028590; Tue, 5 Aug 2014 09:16:30 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 08E1012577C; Tue, 5 Aug 2014 09:16:29 -0400 (EDT) Date: Tue, 5 Aug 2014 09:16:28 -0400 From: Brian Foster To: Eric Sandeen Cc: xfs@oss.sgi.com Subject: Re: [PATCH 3/6] xfs_fsr: free handlep in fsrfs Message-ID: <20140805131628.GD53538@bfoster.bfoster> X-ASG-Orig-Subj: Re: [PATCH 3/6] xfs_fsr: free handlep in fsrfs References: <1406905159-12415-1-git-send-email-sandeen@redhat.com> <1406905159-12415-4-git-send-email-sandeen@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1406905159-12415-4-git-send-email-sandeen@redhat.com> User-Agent: Mutt/1.5.23 (2014-03-12) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.27 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1407244590 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Fri, Aug 01, 2014 at 09:59:16AM -0500, Eric Sandeen wrote: > We leaked the fshandlep in both error returns and > normal function exit. > > Signed-off-by: Eric Sandeen > --- Same thing in the 'if (endtime && endtime < time(0))' thing towards the end of the for loop, but that ends with an exit(), so: Reviewed-by: Brian Foster > fsr/xfs_fsr.c | 3 +++ > 1 files changed, 3 insertions(+), 0 deletions(-) > > diff --git a/fsr/xfs_fsr.c b/fsr/xfs_fsr.c > index 752d2db..580604c 100644 > --- a/fsr/xfs_fsr.c > +++ b/fsr/xfs_fsr.c > @@ -702,6 +702,7 @@ fsrfs(char *mntdir, xfs_ino_t startino, int targetrange) > if ((fsfd = open(mntdir, O_RDONLY)) < 0) { > fsrprintf(_("unable to open: %s: %s\n"), > mntdir, strerror( errno )); > + free(fshandlep); > return -1; > } > > @@ -709,6 +710,7 @@ fsrfs(char *mntdir, xfs_ino_t startino, int targetrange) > fsrprintf(_("Skipping %s: could not get XFS geometry\n"), > mntdir); > close(fsfd); > + free(fshandlep); > return -1; > } > > @@ -774,6 +776,7 @@ fsrfs(char *mntdir, xfs_ino_t startino, int targetrange) > out0: > tmp_close(mntdir); > close(fsfd); > + free(fshandlep); > return 0; > } > > -- > 1.7.1 > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From bfoster@redhat.com Tue Aug 5 08:31: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 (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id DB32E7F88 for ; Tue, 5 Aug 2014 08:31:46 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id C93FB8F8037 for ; Tue, 5 Aug 2014 06:31:43 -0700 (PDT) X-ASG-Debug-ID: 1407245502-04cbb02d831760a0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id drid8jKrkJJTavRE (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 05 Aug 2014 06:31: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-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 s75DVgTt021131 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK) for ; Tue, 5 Aug 2014 09:31:42 -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 s75DVfUO005877; Tue, 5 Aug 2014 09:31:42 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id F292512577C; Tue, 5 Aug 2014 09:31:40 -0400 (EDT) Date: Tue, 5 Aug 2014 09:31:40 -0400 From: Brian Foster To: Eric Sandeen Cc: xfs@oss.sgi.com Subject: Re: [PATCH 4/6] libhandle: Fix handle leak in path_to_fshandle error paths Message-ID: <20140805133140.GE53538@bfoster.bfoster> X-ASG-Orig-Subj: Re: [PATCH 4/6] libhandle: Fix handle leak in path_to_fshandle error paths References: <1406905159-12415-1-git-send-email-sandeen@redhat.com> <1406905159-12415-5-git-send-email-sandeen@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1406905159-12415-5-git-send-email-sandeen@redhat.com> User-Agent: Mutt/1.5.23 (2014-03-12) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.27 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1407245502 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Fri, Aug 01, 2014 at 09:59:17AM -0500, Eric Sandeen wrote: > path_to_fshandle calls obj_to_handle, which potentially > allocates a handle, but the handle isn't freed on > a subsequent error path. > > Signed-off-by: Eric Sandeen > --- > libhandle/handle.c | 1 + > 1 files changed, 1 insertions(+), 0 deletions(-) > > diff --git a/libhandle/handle.c b/libhandle/handle.c > index 9f81483..3c1395a 100644 > --- a/libhandle/handle.c > +++ b/libhandle/handle.c > @@ -97,6 +97,7 @@ path_to_fshandle( > /* new filesystem. add it to the cache */ > fdhp = malloc(sizeof(struct fdhash)); > if (fdhp == NULL) { > + free(*fshanp); Might be a good idea to set *fshanp back to NULL here. It doesn't appear to be an issue with current callers, however: Reviewed-by: Brian Foster > close(fd); > errno = ENOMEM; > return -1; > -- > 1.7.1 > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From bfoster@redhat.com Tue Aug 5 08:31: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 22B617F91 for ; Tue, 5 Aug 2014 08:31:51 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 0FAD28F8037 for ; Tue, 5 Aug 2014 06:31:51 -0700 (PDT) X-ASG-Debug-ID: 1407245509-04cb6c555d1679e0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id qo70brVD5BF2rJRs (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 05 Aug 2014 06:31: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-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 s75DVnQq010181 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK) for ; Tue, 5 Aug 2014 09:31:49 -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 s75DVmWW008615; Tue, 5 Aug 2014 09:31:48 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id D2B9612577C; Tue, 5 Aug 2014 09:31:47 -0400 (EDT) Date: Tue, 5 Aug 2014 09:31:47 -0400 From: Brian Foster To: Eric Sandeen Cc: xfs@oss.sgi.com Subject: Re: [PATCH 5/6] xfs_io: fix leaks in parent_list() Message-ID: <20140805133147.GF53538@bfoster.bfoster> X-ASG-Orig-Subj: Re: [PATCH 5/6] xfs_io: fix leaks in parent_list() References: <1406905159-12415-1-git-send-email-sandeen@redhat.com> <1406905159-12415-6-git-send-email-sandeen@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1406905159-12415-6-git-send-email-sandeen@redhat.com> User-Agent: Mutt/1.5.23 (2014-03-12) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1407245509 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Fri, Aug 01, 2014 at 09:59:18AM -0500, Eric Sandeen wrote: > parent_list() has instances where a handle is leaked, > both by going out of scope, and on error paths. > > Signed-off-by: Eric Sandeen > --- Reviewed-by: Brian Foster > io/parent.c | 6 ++++-- > 1 files changed, 4 insertions(+), 2 deletions(-) > > diff --git a/io/parent.c b/io/parent.c > index 56e126d..0313119 100644 > --- a/io/parent.c > +++ b/io/parent.c > @@ -293,7 +293,7 @@ print_parent_entry(parent_t *parent, int fullpath) > static int > parent_list(int fullpath) > { > - void *handlep; > + void *handlep = NULL; > size_t handlen; > int error, i; > int retval = 1; > @@ -313,6 +313,7 @@ parent_list(int fullpath) > progname, path, strerror(errno)); > goto error; > } > + free_handle(fshandle, fshlen); > } > > if (path_to_handle(path, &handlep, &handlen) != 0) { > @@ -325,7 +326,7 @@ parent_list(int fullpath) > if (!parentbuf) { > fprintf(stderr, _("%s: unable to allocate parent buffer: %s\n"), > progname, strerror(errno)); > - return 1; > + goto error; > } > > if (fullpath) { > @@ -365,6 +366,7 @@ parent_list(int fullpath) > > retval = 0; > error: > + free(handlep); > free(parentbuf); > return retval; > } > -- > 1.7.1 > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From bfoster@redhat.com Tue Aug 5 08:31: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 3B6ED7F96 for ; Tue, 5 Aug 2014 08:31:57 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id BC2B0AC006 for ; Tue, 5 Aug 2014 06:31:56 -0700 (PDT) X-ASG-Debug-ID: 1407245515-04cb6c555f167a00001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id bW473NbznPlNCkq8 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 05 Aug 2014 06:31:55 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s75DVsDT000683 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK) for ; Tue, 5 Aug 2014 09:31:55 -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 s75DVsnh009798; Tue, 5 Aug 2014 09:31:54 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 85CC912577C; Tue, 5 Aug 2014 09:31:53 -0400 (EDT) Date: Tue, 5 Aug 2014 09:31:53 -0400 From: Brian Foster To: Eric Sandeen Cc: xfs@oss.sgi.com Subject: Re: [PATCH 6/6] xfs_db: free flist on error in write_struct() Message-ID: <20140805133153.GG53538@bfoster.bfoster> X-ASG-Orig-Subj: Re: [PATCH 6/6] xfs_db: free flist on error in write_struct() References: <1406905159-12415-1-git-send-email-sandeen@redhat.com> <1406905159-12415-7-git-send-email-sandeen@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1406905159-12415-7-git-send-email-sandeen@redhat.com> User-Agent: Mutt/1.5.23 (2014-03-12) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.26 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1407245515 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Fri, Aug 01, 2014 at 09:59:19AM -0500, Eric Sandeen wrote: > One error path in write_struct() wasn't freeing > the flist_t *fl which was allocated, so it leaks. > > Signed-off-by: Eric Sandeen > --- Reviewed-by: Brian Foster > db/write.c | 1 + > 1 files changed, 1 insertions(+), 0 deletions(-) > > diff --git a/db/write.c b/db/write.c > index 0157a44..a0f14f4 100644 > --- a/db/write.c > +++ b/db/write.c > @@ -652,6 +652,7 @@ write_struct( > buf = convert_arg(argv[1], bit_length); > if (!buf) { > dbprintf(_("unable to convert value '%s'.\n"), argv[1]); > + flist_free(fl); > return; > } > > -- > 1.7.1 > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From sanderwazir10@gmail.com Tue Aug 5 13:09: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=FORGED_HOTMAIL_RCVD2, FREEMAIL_ENVFROM_END_DIGIT,FREEMAIL_FROM,HTML_MESSAGE,T_DKIM_INVALID autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 38F527F90 for ; Tue, 5 Aug 2014 13:09:51 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id C9D16AC006 for ; Tue, 5 Aug 2014 11:09:47 -0700 (PDT) X-ASG-Debug-ID: 1407262185-04bdf06ed203ed0001-NocioJ Received: from mail-vc0-f193.google.com (mail-vc0-f193.google.com [209.85.220.193]) by cuda.sgi.com with ESMTP id 4GyI8BcNyEBWTzIk (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Tue, 05 Aug 2014 11:09:46 -0700 (PDT) X-Barracuda-Envelope-From: sanderwazir10@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 ij19so597459vcb.0 for ; Tue, 05 Aug 2014 11:09:45 -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=6PVsHmU+u3Bt/jCV/TKkE3cn2jKWs/imUKaFSAD4ghc=; b=gaSC+yeLih7stMIXJPNjwcWs1Cii615EJEOcxymqNhkeKs0Owpesj6DowMTgPya0cW McF9LosZg/uLkO3kPf339m3wytv4ht345wxOclQj9W5GqibJdSF+95xg5vy9F5zjlyKG xrVItb5MZJt/PErhlf3yNTuXpvxNKdMhEZiCOZNPsFdGkMT0+lkq0JsFCC+LygNiwxGv jutQT/wQGwjoDtznPXbXWvv40zT+iF6p4ejRMkwhqMKqd7wgskFaOhxcsOzv5waC5EE2 IG7/e8aMJxPJjFXwx0CcqY1BHwmjMx5ygBeSqIrljjFFb19IzhDiEcvmEkGwzf51eFRj 77kA== MIME-Version: 1.0 X-Received: by 10.220.1.5 with SMTP id 5mr3087317vcd.74.1407260603426; Tue, 05 Aug 2014 10:43:23 -0700 (PDT) Sender: sanderwazir10@gmail.com Received: by 10.52.118.65 with HTTP; Tue, 5 Aug 2014 10:43:23 -0700 (PDT) Date: Tue, 5 Aug 2014 17:43:23 +0000 X-Google-Sender-Auth: syU0Qk8WBGXNk8D28m5QEpPaC6o Message-ID: Subject: hi From: sander wazir X-ASG-Orig-Subj: hi To: undisclosed-recipients:; Content-Type: multipart/alternative; boundary=001a11c310665fad5404ffe56434 X-Barracuda-Connect: mail-vc0-f193.google.com[209.85.220.193] X-Barracuda-Start-Time: 1407262185 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 2.62 X-Barracuda-Spam-Status: No, SCORE=2.62 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MJ1576, DKIM_SIGNED, DKIM_VERIFIED, FORGED_HOTMAIL_RCVD2, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.8142 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 1.12 FORGED_HOTMAIL_RCVD2 hotmail.com 'From' address, but no 'Received:' -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 0.00 HTML_MESSAGE BODY: HTML included in message 1.50 BSF_SC0_MJ1576 Custom Rule MJ1576 --001a11c310665fad5404ffe56434 Content-Type: text/plain; charset=UTF-8 Hi, my name is sander,i will like you to write me back because i have important issues to discuss with you waiting for your urgent respond. --001a11c310665fad5404ffe56434 Content-Type: text/html; charset=UTF-8
Hi, my name is sander,i will like you to write me back because i have important issues to discuss with you waiting for your urgent respond.
--001a11c310665fad5404ffe56434-- From david@fromorbit.com Tue Aug 5 14:59: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 164127F90 for ; Tue, 5 Aug 2014 14:59:17 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id E9C10304053 for ; Tue, 5 Aug 2014 12:59:13 -0700 (PDT) X-ASG-Debug-ID: 1407268748-04cb6c75ad08660001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id TvXQWb0Ep2nI52S9 for ; Tue, 05 Aug 2014 12:59: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: ApMHACY24VN5LKl0PGdsb2JhbABbgw2BKYcupwABAQEBBqUGAYEVFwUBAQEBODaEAwEBBAE6HCMFCwgDDgoJJQ8FJQMHGhOIOgfDbBcYhWSJUAeESwWOe40RmEErLw Received: from ppp121-44-169-116.lns20.syd7.internode.on.net (HELO dastard) ([121.44.169.116]) by ipmail06.adl6.internode.on.net with ESMTP; 06 Aug 2014 05:29:07 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1XEkt0-0005wc-6E; Wed, 06 Aug 2014 05:59:06 +1000 Date: Wed, 6 Aug 2014 05:59:06 +1000 From: Dave Chinner To: Brian Foster Cc: xfs@oss.sgi.com Subject: Re: [PATCH 2/6] xfs: consolidate superblock logging functions Message-ID: <20140805195906.GY26465@dastard> X-ASG-Orig-Subj: Re: [PATCH 2/6] xfs: consolidate superblock logging functions References: <1406791995-14723-1-git-send-email-david@fromorbit.com> <1406791995-14723-3-git-send-email-david@fromorbit.com> <20140801143929.GC3582@laptop.bfoster> <20140804080930.GY20518@dastard> <20140804124836.GA4049@bfoster.bfoster> <20140804221526.GZ20518@dastard> <20140805000333.GA27760@bfoster.bfoster> <20140805003440.GB20518@dastard> <20140805123050.GA53538@bfoster.bfoster> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140805123050.GA53538@bfoster.bfoster> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1407268748 X-Barracuda-URL: http://192.48.176.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.8147 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Tue, Aug 05, 2014 at 08:30:51AM -0400, Brian Foster wrote: > On Tue, Aug 05, 2014 at 10:34:40AM +1000, Dave Chinner wrote: > > On Mon, Aug 04, 2014 at 08:03:33PM -0400, Brian Foster wrote: > > > On Tue, Aug 05, 2014 at 08:15:26AM +1000, Dave Chinner wrote: > > > > e.g. did you know that the xfs_fs_writable() check in > > > > xfs_log_sbcount() is to prevent it from writing anything when > > > > unmounting a fully frozen filesystem? i.e. xfs_log_sbcount needs to > > > > succeed while a freeze is in progress, but fail when a freeze is > > > > fully complete? > > > > > > > > > > Hmm, so freeze_super() sets s_frozen to SB_FREEZE_FS before it calls > > > into the fs. Given the xfs_fs_writable() logic, how is that going to > > > differentiate a freezing fs from a frozen fs? It makes sense that this > > > would avoid blocking on umount of a frozen fs, but it seems like we'd > > > skip out just the same during the freeze sequence. Maybe I'm missing > > > something... > > > > Hmmm - that means we broke it at some point. xfs_attr_quiesce is > > supposed to make the metadata uptodate on disk, so if it's not > > updating the superblock (i.e. syncing all the counters) then it's > > not doing the right thing - the sb counters on disk while the fs is > > frozen are not uptodate and hence correct behaviour if we crash with > > a frozen fs is dependent on log recovery finding a dirty log. That's > > a nasty little landmine and needs to be fixed, even though it's not > > causing issues at the moment (because we dirty the log after > > quiescing the filesystem). > > > > I'm wondering if that even helps in the case of a crash. It looks like > we would skip the counter sync and subsequent action of logging the sb > entirely. > > Oh, according to the lazy sb counter commit log description we do some > kind of counter rebuild across the AGI/AGF structures and log the result > of that. So I take it that should a crash occur while in the frozen > state, the simple act of causing a log recovery to occur on subsequent > mount should rebuild everything correctly. Right - it's log recovery that is hiding that little gem. We've been talking about whether we can change freeze to leave the log clean and so avoid the need for log recovery in snapshot images. If we did that, then we'd have exposed this bug.... > > Did I mention this code is not at all obvious? :/ > > > > Heh. :P From what I can see, it looks like this has been the case since > commit 92821e2b, which introduced xfs_log_sbcount(). *nod* > Perhaps xfs_log_sbcount() requires an open coded s_frozen check a la > the _xfs_trans_alloc() logic. E.g., skip out of SB_FREEZE_COMPLETE, > proceed otherwise..? Possibly. But it still also needs the RO and shutdown checks. Perhaps passing xfs_fs_writable() a freeze level and checking against that? Cheers, Dave. -- Dave Chinner david@fromorbit.com From hans@hanshq.net Tue Aug 5 23:44: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 49ACA7F58 for ; Tue, 5 Aug 2014 23:44:31 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 2611C304064 for ; Tue, 5 Aug 2014 21:44:30 -0700 (PDT) X-ASG-Debug-ID: 1407300267-04cbb03b9c1bf40001-NocioJ Received: from s87.loopia.se (s87.loopia.se [194.9.94.112]) by cuda.sgi.com with ESMTP id yjvCA7m70iwltkNd (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 05 Aug 2014 21:44:28 -0700 (PDT) X-Barracuda-Envelope-From: hans@hanshq.net X-Barracuda-Apparent-Source-IP: 194.9.94.112 Received: from s87.loopia.se (localhost [127.0.0.1]) by s87.loopia.se (Postfix) with ESMTP id DE6E61CF4CFE; Wed, 6 Aug 2014 06:44:26 +0200 (CEST) X-Virus-Scanned: amavisd-new at outgoing-smtp.loopia.se Received: from s87.loopia.se ([127.0.0.1]) by s87.loopia.se (s87.loopia.se [127.0.0.1]) (amavisd-new, port 10024) with LMTP id AJ_g23kLzzD1; Wed, 6 Aug 2014 06:44:26 +0200 (CEST) Received: from s498.loopia.se (unknown [172.21.200.96]) by s87.loopia.se (Postfix) with ESMTP id A5E2C1CF4CF6; Wed, 6 Aug 2014 06:44:26 +0200 (CEST) Received: from s405.loopia.se (unknown [172.21.200.105]) by s498.loopia.se (Postfix) with ESMTP id A0403C52AD3; Wed, 6 Aug 2014 06:44:26 +0200 (CEST) X-Virus-Scanned: amavisd-new at amavis.loopia.se Received: from s499.loopia.se ([172.21.200.105]) by s405.loopia.se (s405.loopia.se [172.21.200.135]) (amavisd-new, port 10024) with LMTP id bGu3thrE0yYK; Wed, 6 Aug 2014 06:44:25 +0200 (CEST) Received: from hwennborg.mtv.corp.google.com (unknown [216.239.45.94]) (Authenticated sender: out@wennborg.se) by s499.loopia.se (Postfix) with ESMTPSA id 5816F1533855; Wed, 6 Aug 2014 06:44:24 +0200 (CEST) From: Hans Wennborg To: david@fromorbit.com, xfs@oss.sgi.com, linux-kernel@vger.kernel.org Cc: Hans Wennborg Subject: [PATCH 14/15] xfs: fix decimal printf format specifiers prefixed with 0x Date: Tue, 5 Aug 2014 21:44:16 -0700 X-ASG-Orig-Subj: [PATCH 14/15] xfs: fix decimal printf format specifiers prefixed with 0x Message-Id: <1407300256-495-1-git-send-email-hans@hanshq.net> X-Mailer: git-send-email 2.0.0.526.g5318336 X-Barracuda-Connect: s87.loopia.se[194.9.94.112] X-Barracuda-Start-Time: 1407300268 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.8165 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- The prefix suggests the number should be printed in hex, so use the %x specifier to do that. Found by using regex suggested by Joe Perches. Signed-off-by: Hans Wennborg --- fs/xfs/xfs_discard.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fs/xfs/xfs_discard.c b/fs/xfs/xfs_discard.c index 13d08a1..b4a2415 100644 --- a/fs/xfs/xfs_discard.c +++ b/fs/xfs/xfs_discard.c @@ -228,7 +228,7 @@ xfs_discard_extents( GFP_NOFS, 0); if (error && error != -EOPNOTSUPP) { xfs_info(mp, - "discard failed for extent [0x%llu,%u], error %d", + "discard failed for extent [0x%llx,%u], error %d", (unsigned long long)busyp->bno, busyp->length, error); -- 2.0.0.526.g5318336 From alex@zadarastorage.com Wed Aug 6 03:56: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=1.9 required=5.0 tests=STOX_REPLY_TYPE 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 B567E7F63 for ; Wed, 6 Aug 2014 03:56:31 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id A2FC78F8035 for ; Wed, 6 Aug 2014 01:56:28 -0700 (PDT) X-ASG-Debug-ID: 1407315383-04cbb03b9a25250001-NocioJ Received: from mail-we0-f181.google.com (mail-we0-f181.google.com [74.125.82.181]) by cuda.sgi.com with ESMTP id w2VN4aD0cx55anXM (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Wed, 06 Aug 2014 01:56:23 -0700 (PDT) X-Barracuda-Envelope-From: alex@zadarastorage.com X-Barracuda-Apparent-Source-IP: 74.125.82.181 Received: by mail-we0-f181.google.com with SMTP id k48so2336065wev.12 for ; Wed, 06 Aug 2014 01:56:22 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:message-id:from:to:cc:references:in-reply-to :subject:date:mime-version:content-type:content-transfer-encoding :importance; bh=jN1OHHosFgxGeX+yj20rl9ZSOSB7VWh+fwB1qvc7BqA=; b=JoHYP2aSRFvNmy/+WdLH+sBhToxVs6yNchmpdmH0ThLz+KxZcA1XmZSvOeEkPLkXFe xWknuB7pynCdcLPm4jOnyiK+ZD0RC5TH/JMSv7xy71ZfLOEDqs6PoqUG+rNjclkN/XZ+ BdwEXpDNqDTxQqhy95D/2G9f1A6cKloV6j8FVKgYKWzVvw+nieQHPC5tPMzU0o5ctbV5 v28HfMhPqW1hzL5MpsgiBpb0nnsBfHOUKZpGyo1YABaYG10pRtP8VXdw95EU9qxdCCg0 o+bSBOkLnKYNScA+833T1fXK4l/RpV5djhjgNicfIGVIQCOJRO4Y4iy9t6sluVv+STxF qjvg== X-Gm-Message-State: ALoCoQkjqyMU853JzlFTQmL+mL95me/tH1SPnHs3MjDqwD8uS7LSqI1ZqrYxvFWd01Lb3hxtIjMs X-Received: by 10.194.59.42 with SMTP id w10mr13926508wjq.15.1407315382715; Wed, 06 Aug 2014 01:56:22 -0700 (PDT) Received: from alyakaslap ([212.143.144.103]) by mx.google.com with ESMTPSA id 20sm888605wjt.42.2014.08.06.01.56.21 for (version=TLSv1 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Wed, 06 Aug 2014 01:56:22 -0700 (PDT) Message-ID: <9A75EE5EE1C3431EAB982257E1CBDC4D@alyakaslap> From: "Alex Lyakas" To: "Eric Sandeen" Cc: , "Dave Chinner" References: <20131226230018.GJ20579@dastard> <20140113030230.GF3469@dastard> <20140113204314.GJ3469@dastard> <20140115014503.GQ3469@dastard> <20140119231745.GF18112@dastard> <4B2A412C75324EE9880358513C069476@alyakaslap> <20140701215626.GE9508@dastard> <53DFCDA4.9000605@sandeen.net> In-Reply-To: <53DFCDA4.9000605@sandeen.net> Subject: Re: xfs_growfs_data_private memory leak Date: Wed, 6 Aug 2014 11:56:25 +0300 X-ASG-Orig-Subj: Re: xfs_growfs_data_private memory leak MIME-Version: 1.0 Content-Type: text/plain; format=flowed; charset="iso-8859-1"; reply-type=original Content-Transfer-Encoding: 7bit X-Priority: 3 X-MSMail-Priority: Normal Importance: Normal X-Mailer: Microsoft Windows Live Mail 15.4.3555.308 X-MimeOLE: Produced By Microsoft MimeOLE V15.4.3555.308 X-Barracuda-Connect: mail-we0-f181.google.com[74.125.82.181] X-Barracuda-Start-Time: 1407315383 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, STOX_REPLY_TYPE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.8171 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 STOX_REPLY_TYPE STOX_REPLY_TYPE 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header Hi Eric, What I was trying to achieve is to allow aborting XFS resize in the middle. I am not sure whether a typical user needs this feature, but for my use case it is needed. So XFS resize is performed in two steps: 1) Initialize the newly-added AGs (AGFL, BNO btree, CNT btree etc) 2) Commit this by updating the primary superblock 3) Update all the existing secondary superblocks, and initialize all the newly-added secondary superblocks So I added a custom IOCTL, which can tell this sequence to abort gracefully (just checking a flag on each loop iteration). Aborting during step 1 works perfectly (apart from the memory leak that I discovered and fixed). Since the primary superblock has not been updated, XFS doesn't know about the newly-added AGs, so it doesn't care what's written there. Resize can be restarted, and XFS will redo this step from the beginning. Aborting during step 3 can leave some of the secondary superblocks totally uninitialized. However, from XFS standpoint, the resize has been committed already. That's where my question came from. I realize that kernel can crash during step 3, leading to same results as with my code that aborts this step. Anyways, since I was not sure about these secondary superblocks, I did not add an exit point at this step. (Again, realize that we can crash during this step anyways). Thanks, Alex. -----Original Message----- From: Eric Sandeen Sent: 04 August, 2014 9:15 PM To: Alex Lyakas ; Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: xfs_growfs_data_private memory leak On 7/2/14, 7:27 AM, Alex Lyakas wrote: > Hi Dave, > Thank you for your comments. > > I realize that secondary superblocks are needed mostly for repairing s/mostly/only/ > a broken filesystem. However, I don't see that they get updated > regularly, i.e., during normal operation they don't seem to get > updated at all. I put a print in xfs_sb_write_verify, and it gets > called only with: bp->b_bn==XFS_SB_DADDR. See the comments above verify_sb(): not everything is validated, so not everything needs to be constantly updated. It's just the basic fs geometry, not counters, etc. /* * verify a superblock -- does not verify root inode # * can only check that geometry info is internally * consistent. because of growfs, that's no guarantee * of correctness (e.g. geometry may have changed) * * fields verified or consistency checked: * * sb_magicnum * * sb_versionnum * * sb_inprogress * * sb_blocksize (as a group) * sb_blocklog * * geometry info - sb_dblocks (as a group) * sb_agcount * sb_agblocks * sb_agblklog * * inode info - sb_inodesize (x-checked with geo info) * sb_inopblock * * sector size info - * sb_sectsize * sb_sectlog * sb_logsectsize * sb_logsectlog * * not checked here - * sb_rootino * sb_fname * sb_fpack * sb_logstart * sb_uuid * * ALL real-time fields * final 4 summary counters */ > So do I understand correctly (also from comments in > xfs_growfs_data_private), that it is safe to operate a filesystem > while having broken secondary superblocks? For me, it appears to > mount properly, and all the data seems to be there, but xfs_check > complains like: > bad sb magic # 0xc2a4baf2 in ag 6144 > bad sb version # 0x4b5d in ag 6144 > blocks 6144/65536..2192631388 out of range > blocks 6144/65536..2192631388 claimed by block 6144/0 > bad sb magic # 0xb20f3079 in ag 6145 > bad sb version # 0x6505 in ag 6145 > blocks 6145/65536..3530010017 out of range > blocks 6145/65536..3530010017 claimed by block 6145/0 > ... some of that looks more serious than "just" bad backup sb's. But the bad secondaries shouldn't cause runtime problems AFAIK. > Also, if secondary superblocks do not get updated regularly, and > there is no way to ask an operational XFS to update them, then during > repair we may not find a good secondary superblock. You seem to have 6144 (!) allocation groups; one would hope that a majority of those supers would be "good" and the others will be properly corrected by an xfs_repair. > As for the patch, I cannot post a patch against the upstream kernel, > because I am running an older kernel. Unfortunately, I cannot qualify > an upstream patch properly in a reasonable time. Is there a value in > posting a patch against 3.8.13? Otherwise, it's fine by me if > somebody else posts it and takes the credit. If the patch applies cleanly to both kernels, probably fine to go ahead and post it, with that caveat. -Eric > Thanks, > Alex. > > > > -----Original Message----- From: Dave Chinner > Sent: 02 July, 2014 12:56 AM > To: Alex Lyakas > Cc: xfs@oss.sgi.com > Subject: Re: xfs_growfs_data_private memory leak > > On Tue, Jul 01, 2014 at 06:06:38PM +0300, Alex Lyakas wrote: >> Greetings, >> >> It appears that if xfs_growfs_data_private fails during the "new AG >> headers" loop, it does not free all the per-AG structures for the >> new AGs. When XFS is unmounted later, they are not freed as well, >> because xfs_growfs_data_private did not update the "sb_agcount" >> field, so xfs_free_perag will not free them. This happens on 3.8.13, >> but looking at the latest master branch, it seems to have the same >> issue. >> >> Code like [1] in xfs_growfs_data, seems to fix the issue. > > Why not just do this in the appropriate error stack, like is > done inside xfs_initialize_perag() on error? > > for (i = oagcount; i < nagcount; i++) { > pag = radix_tree_delete(&mp->m_perag_tree, index); > kmem_free(pag); > } > > (though it might need RCU freeing) > > When you have a fix, can you send a proper patch with a sign-off on > it? > >> A follow-up question: if xfs_grows_data_private fails during the >> loop that updates all the secondary superblocks, what is the >> consequence? (I am aware that in the latest master branch, the loop >> is not broken on first error, but attempts to initialize whatever >> possible). When these secondary superblocks will get updated? Is >> there a way to force-update them? Otherwise, what can be the >> consequence of leaving them not updated? > > The consequence is documented in mainline tree - if we don't update > them all, then repair will do the wrong thing. Repair requires a > majority iof identical secondaries to determine if the primary is > correct or out of date. The old behaviour of not updating after the > first error meant that the majority were old superblocks and so at > some time in the future repair could decide your filesystem is > smaller than it really is and hence truncate away the grown section > of the filesystem. i.e. trigger catastrophic, unrecoverable data > loss. > > Hence it's far better to write every seconday we can than to leave > a majority in a bad state.... > > Cheers, > > Dave. From alex@zadarastorage.com Wed Aug 6 05:05: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 (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 11B367F87 for ; Wed, 6 Aug 2014 05:05:42 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id F30618F8035 for ; Wed, 6 Aug 2014 03:05:38 -0700 (PDT) X-ASG-Debug-ID: 1407319535-04cb6c75ae27660001-NocioJ Received: from mail-wi0-f172.google.com (mail-wi0-f172.google.com [209.85.212.172]) by cuda.sgi.com with ESMTP id 0HwFjvCngxAtWeOb (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Wed, 06 Aug 2014 03:05:36 -0700 (PDT) X-Barracuda-Envelope-From: alex@zadarastorage.com X-Barracuda-Apparent-Source-IP: 209.85.212.172 Received: by mail-wi0-f172.google.com with SMTP id n3so8477140wiv.11 for ; Wed, 06 Aug 2014 03:05:35 -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=INVrnozw/jUMxIJIlLX6YBHVMcmtBj/46ymOdCOcqZo=; b=TaRV3G3rvMEWej/lkmeVbYlZBGz/hQ8xd+lkg2d2QEXdxYbD38erWldzafVyPeQkyx IWESlaYT9Ru3iw8pJCv5gpuVUiCmTRfi4iuA5GggJEjSNBIns34r5F9M4nYqPgXFF1Yu gKUzBiRMvT17cbxunkMrWLccBe6R/PUPGB3bzi6sT9IHYqEzuFZrdUrTVGrLKQBvmLFL cFD5i1jbU8xHY6ILzS3GC9/GsFFvXVYpPB6OlaOaivJ1Iem6taiWpSrCawX1rtbO1crX uFb1PLwGURlnc6GNhk7qv7umZCOBDvBajNW4cOy/tl4EfxpHOHRZng0hfgtXD/aj80UQ 3euQ== X-Gm-Message-State: ALoCoQnAyQ6Nn89EshbTgweVd8nq3d8EwCEmyIQqurCVJSQ3EKH9lrKkHV+XkiXegComTXGQA1EK MIME-Version: 1.0 X-Received: by 10.180.21.235 with SMTP id y11mr14326508wie.75.1407319534987; Wed, 06 Aug 2014 03:05:34 -0700 (PDT) Received: by 10.194.15.232 with HTTP; Wed, 6 Aug 2014 03:05:34 -0700 (PDT) In-Reply-To: <20140804230721.GA20518@dastard> References: <20140113030230.GF3469@dastard> <20140113204314.GJ3469@dastard> <20140115014503.GQ3469@dastard> <20140119231745.GF18112@dastard> <4B2A412C75324EE9880358513C069476@alyakaslap> <9D3CBECB663B4A77B7EF74B67973310A@alyakaslap> <20140804230721.GA20518@dastard> Date: Wed, 6 Aug 2014 13:05:34 +0300 Message-ID: Subject: Re: use-after-free on log replay failure From: Alex Lyakas X-ASG-Orig-Subj: Re: use-after-free on log replay failure To: Dave Chinner Cc: xfs@oss.sgi.com Content-Type: text/plain; charset=UTF-8 X-Barracuda-Connect: mail-wi0-f172.google.com[209.85.212.172] X-Barracuda-Start-Time: 1407319536 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=MARKETING_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.8172 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words Hi Dave, On Tue, Aug 5, 2014 at 2:07 AM, Dave Chinner wrote: > On Mon, Aug 04, 2014 at 02:00:05PM +0300, Alex Lyakas wrote: >> Greetings, >> >> we had a log replay failure due to some errors that the underlying >> block device returned: >> [49133.801406] XFS (dm-95): metadata I/O error: block 0x270e8c180 >> ("xlog_recover_iodone") error 28 numblks 16 >> [49133.802495] XFS (dm-95): log mount/recovery failed: error 28 >> [49133.802644] XFS (dm-95): log mount failed > > #define ENOSPC 28 /* No space left on device */ > > You're getting an ENOSPC as a metadata IO error during log recovery? > Thin provisioning problem, perhaps, Yes, it is a thin provisioning problem (which I already know the cause for). > and the error is occurring on > submission rather than completion? If so: > > 8d6c121 xfs: fix buffer use after free on IO error I am not sure what do you mean by "submission rather than completion". Do you mean that xfs_buf_ioapply_map() returns without submitting any bios? In that case, no, bios are submitted to the block device, and it fails them through a different context with ENOSPC error. I will still try the patch you mentioned, because it also looks relevant to another question I addressed to you earlier in: http://oss.sgi.com/archives/xfs/2013-11/msg00648.html Thanks, Alex. > > Cheers, > > Dave. > -- > Dave Chinner > david@fromorbit.com From webmaster@dev102.magizz.com Wed Aug 6 05:06: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=2.2 required=5.0 tests=HTML_IMAGE_ONLY_32, HTML_MESSAGE,T_DKIM_INVALID autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 4F4837F87 for ; Wed, 6 Aug 2014 05:06:39 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 3B9BD8F8035 for ; Wed, 6 Aug 2014 03:06:39 -0700 (PDT) X-ASG-Debug-ID: 1407319596-04cbb03b9a27ff0001-NocioJ Received: from vps.magizz.com (vps.magizz.com [162.251.83.157]) by cuda.sgi.com with ESMTP id yMNcnOIhyo0HAEMp (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 06 Aug 2014 03:06:37 -0700 (PDT) X-Barracuda-Envelope-From: webmaster@dev102.magizz.com X-Barracuda-Apparent-Source-IP: 162.251.83.157 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=dev102.magizz.com; s=default; h=Content-Type:MIME-Version:List-Owner:List-Subscribe:List-Unsubscribe:List-Help:Message-ID:Reply-To:From:Date:Subject:To; bh=qFHFI+nbU8YS/LJu8tnkHtR+GEnDQfHybLFZT/lnMcU=; b=kTdZ/CAG4F1nA7jwrtiHhg0Cv16e1Z8eHU6SdXAPEpDBAsPdrdD1WsLohQbEp6r62N4PQjOytubUhDXlXCRGw8bLi2xwMTiIBTPg8QQToaVIw9bW8/SpWh6XQdwauxM8S9JRELGuhcWIuPJ7NOUUOPOoYwG//Ee3wgSVfNd80GI=; Received: from dev102magizz by vps.magizz.com with local (Exim 4.82) (envelope-from ) id 1XEy7D-0006gb-4j for xfs@oss.sgi.com; Wed, 06 Aug 2014 14:06:39 +0400 To: xfs@oss.sgi.com Subject: Benefit with nil prepayment charges on your online Personal Loan X-PHP-Script: dev102.magizz.com/mailz/admin/index.php for 122.169.6.221 X-ASG-Orig-Subj: Benefit with nil prepayment charges on your online Personal Loan Received: from abts-mum-dynamic-221.6.169.122.airtelbroadband.in [122.169.6.221] by dev102.magizz.com with HTTP; Wed, 06 Aug 2014 10:02:09 +0000 Date: Wed, 6 Aug 2014 10:06:39 +0000 From: Bajaj Finserv Reply-To: Bajaj Finserv Message-ID: <4e25bde88089a3f6931fbe60aff710ed@dev102.magizz.com> X-Priority: 3 X-Mailer: PHPMailer 5.2.5 (https://github.com/Synchro/PHPMailer/) X-phpList-version: 3.0.6 X-MessageID: 10 X-ListMember: xfs@oss.sgi.com Precedence: bulk Bounces-To: webmaster@dev102.magizz.com List-Help: List-Unsubscribe: List-Subscribe: List-Owner: MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="b1_4e25bde88089a3f6931fbe60aff710ed" X-AntiAbuse: This header was added to track abuse, please include it with any abuse report X-AntiAbuse: Primary Hostname - vps.magizz.com X-AntiAbuse: Original Domain - oss.sgi.com X-AntiAbuse: Originator/Caller UID/GID - [503 514] / [47 12] X-AntiAbuse: Sender Address Domain - dev102.magizz.com X-Get-Message-Sender-Via: vps.magizz.com: authenticated_id: dev102magizz/from_h X-Barracuda-Connect: vps.magizz.com[162.251.83.157] X-Barracuda-Start-Time: 1407319597 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED, HTML_IMAGE_ONLY_32, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.8172 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 0.00 HTML_IMAGE_ONLY_32 BODY: HTML: images with 2800-3200 bytes of words 0.00 HTML_MESSAGE BODY: HTML included in message --b1_4e25bde88089a3f6931fbe60aff710ed Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable =20 Dear Customer, Bajaj Finserv brings you the fastest online personal loan approval of upto 15 lacs in 5 minutes and host of other benefits and privileges. Post approval, get cash in your bank within 72 hours of submitting all documents. Apply and get at zero prepayment charges! Apply Now. Click Here to Know More! Thanks,=20 Bajaj Finserv **Terms and conditions apply I Finance at the sole discretion of Bajaj Finance Limited -- This message was sent to xfs@oss.sgi.com by swati@dev102.magizz.com To forward this message, please do not use the forward button of your email application, because this message was made specifically for you only. Instead use the forward page=0A in our newsletter system. To change your details and to choose which lists to be subscribed to, visit your personal preferences page=0A Or you can opt-out completely=0A from all future mailings. =20 amj --b1_4e25bde88089a3f6931fbe60aff710ed Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: quoted-printable =0A =0A

 


-- =20

This message was sent to xfs@oss.sgi.com by swati@dev102.magizz.co= m

To forward this message, please do not use the forward button of y= our email application, because this message was made specifically for you o= nly. Instead use the forward page in our newsletter system.
To change your details and to choose which lists to be subscribed to,= visit your personal preferences page
Or you can opt-out completely from all future mailings.

=0Aamj --b1_4e25bde88089a3f6931fbe60aff710ed-- From felipemonteiro.carvalho@gmail.com Wed Aug 6 05:12: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=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 B6F007F93 for ; Wed, 6 Aug 2014 05:12:17 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 96461304053 for ; Wed, 6 Aug 2014 03:12:14 -0700 (PDT) X-ASG-Debug-ID: 1407319932-04cb6c75ae27aa0001-NocioJ Received: from mail-pd0-f172.google.com (mail-pd0-f172.google.com [209.85.192.172]) by cuda.sgi.com with ESMTP id LnIIugEbC8Xkequ7 (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Wed, 06 Aug 2014 03:12:13 -0700 (PDT) X-Barracuda-Envelope-From: felipemonteiro.carvalho@gmail.com X-Barracuda-RBL-Trusted-Forwarder: 209.85.192.172 Received: by mail-pd0-f172.google.com with SMTP id ft15so3084264pdb.3 for ; Wed, 06 Aug 2014 03:12:12 -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=nF/Z+LMpOSiaaV5xJug8YkKM2xU7LjL7lwzA7/v9uc4=; b=j3pxrM+jF1PBxPgpvWMKbGOoyDJWNUuSTEqa22fCecD4UBg1Ammhg1URoubDzdfndv gZMu5nvg404anYkUTWMG6aAxIZehe76/1dklEPRtKYRuy5kfYb1DTY9VK/RqoxPUZDKB T6cTlqxvjAFS/pArBCTFaTEHUzRCuzHVZLDTNdW4aA2jB3rGiiVcCIrAmGEeasTa5b2P EhnEgSgZWNE/3y/8yHrDZP3PfOiUnJLf+J84NE0z5Rkv6qKOWgrFrUU3fekXozYq+msR jKbRY3zyfRVOeBwMIyocn1Kv8/btQkTIN0pr7OiZ0zOYww0hS+eJyMAa84peXFQuUO0T iztQ== X-Barracuda-BBL-IP: nil MIME-Version: 1.0 X-Received: by 10.70.90.79 with SMTP id bu15mr10189303pdb.158.1407319932685; Wed, 06 Aug 2014 03:12:12 -0700 (PDT) Received: by 10.66.50.9 with HTTP; Wed, 6 Aug 2014 03:12:12 -0700 (PDT) Date: Wed, 6 Aug 2014 12:12:12 +0200 Message-ID: Subject: xfs_bmbt_rec_64 leading to wrong blocks From: Felipe Monteiro de Carvalho X-ASG-Orig-Subj: xfs_bmbt_rec_64 leading to wrong blocks To: xfs@oss.sgi.com Content-Type: text/plain; charset=UTF-8 X-Barracuda-Connect: mail-pd0-f172.google.com[209.85.192.172] X-Barracuda-Start-Time: 1407319933 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.8172 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 a software which reads xfs partitions and it is working well so far, but, at in a particular folder with 10k files, only 7k files appear, the other ones don't. I read an inode which has di_core.di_format = XFS_DINODE_FMT_BTREE No problem here, the btree is trivial, it has only 1 element inside it, which leads to a list of 82 extends. Extends 0..52 aprox. are all great, and work fine. Extent 53 (and other ones after that) point to very wierd memory areas which don't match the pattern that I saw previously =( Here is the hex data of the extents, the selected extent in nr 53: http://magnifier.sourceforge.net/temp/xfs/extent_with_xfs_bmbt_rec_64.png And here is debug information showing which values I extracted from this table: i=0 FLocalExtent.StartOff=0 FLocalExtent.StartBlock=66748 FLocalExtent.BlockCount=1 lStartBlock=65212 i=1 FLocalExtent.StartOff=1 FLocalExtent.StartBlock=66758 FLocalExtent.BlockCount=2 lStartBlock=65222 i=2 FLocalExtent.StartOff=3 FLocalExtent.StartBlock=66772 FLocalExtent.BlockCount=1 lStartBlock=65236 .... i=51 FLocalExtent.StartOff=77 FLocalExtent.StartBlock=67468 FLocalExtent.BlockCount=1 lStartBlock=65932 i=52 FLocalExtent.StartOff=78 FLocalExtent.StartBlock=67479 FLocalExtent.BlockCount=1 lStartBlock=65943 i=53 FLocalExtent.StartOff=8388608 FLocalExtent.StartBlock=66749 FLocalExtent.BlockCount=1 lStartBlock=65213 i=54 FLocalExtent.StartOff=8388609 FLocalExtent.StartBlock=66783 FLocalExtent.BlockCount=2 lStartBlock=65247 ... Note how StartOff is suddenly so big! But I manually checked the bits comparing to xfs_bmbt_rec_64 and the value written is that one. But what sense does it make for StartOff to jump like that? And why are the blocks pointing to a non-XD2D block? Here is the block to which one of the valid extents point to: http://magnifier.sourceforge.net/temp/xfs/correct_block_xd2d.png And here is a block to which one of the extents that I cannot interpretate point to: http://magnifier.sourceforge.net/temp/xfs/wierd_block_xd2d.png and another one: http://magnifier.sourceforge.net/temp/xfs/wierd_xfs_dir2_data_entry.png Any ideas??? I already worked so much on this, but I cannot figure out =( thanks, -- Felipe Monteiro de Carvalho From danhkhoi5@cafeland.vn Wed Aug 6 05:23: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.5 required=5.0 tests=HTML_MESSAGE,SUBJ_ALL_CAPS, T_REMOTE_IMAGE autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 0107B7F99 for ; Wed, 6 Aug 2014 05:23:25 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 99E808F8037 for ; Wed, 6 Aug 2014 03:23:24 -0700 (PDT) X-ASG-Debug-ID: 1407320602-04bdf06ed228bd0001-NocioJ Received: from ABC (vps33723.trouble-free.net [162.220.160.36]) by cuda.sgi.com with ESMTP id roSdssPhmxmdCemT (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 06 Aug 2014 03:23:22 -0700 (PDT) X-Barracuda-Envelope-From: danhkhoi5@cafeland.vn X-Barracuda-Apparent-Source-IP: 162.220.160.36 Received: (qmail 6036 invoked by uid 0); 6 Aug 2014 07:01:06 -0000 Comment: DomainKeys? See http://antispam.yahoo.com/domainkeys DomainKey-Signature: a=rsa-sha1; q=dns; c=nofws; s=private; d=cafeland.vn; b=IIVkXhP51jltw+kTAf8dM3WLLRAYRKkUJW9q1/RM+po7lV6lXOS89ii5ClH6259x; Received: from unknown (HELO SUNGHA-KHOA) (danhkhoi5@cafeland.vn@42.118.164.42) by vps33723.trouble-free.net with ESMTPA; 6 Aug 2014 07:01:06 -0000 From: "Nguyen Dang Khoa" Subject: =?UTF-8?B?Q8SCTiBI4buYIEJJ4buGVCBM4bqsUCDEkOG6sk5HIEPhuqRQIEPDgUNI?= AEON MALL 300M - AN GIA GARDEN To: xfs@oss.sgi.com X-ASG-Orig-Subj: =?UTF-8?B?Q8SCTiBI4buYIEJJ4buGVCBM4bqsUCDEkOG6sk5HIEPhuqRQIEPDgUNI?= AEON MALL 300M - AN GIA GARDEN Content-Type: multipart/mixed; charset="UTF-8"; boundary="btoueFL=_ufgNmc0wfXqNTWSq9KcatPBl50" MIME-Version: 1.0 Reply-To: khoand@danhkhoi.com.vn Date: Wed, 6 Aug 2014 14:01:06 +0700 Message-ID: <3692179112963037@Sungha_Khoa> X-Antivirus: avast! (VPS 140805-0, 08/05/2014), Outbound message X-Antivirus-Status: Clean X-Barracuda-Connect: vps33723.trouble-free.net[162.220.160.36] X-Barracuda-Start-Time: 1407320602 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.31 X-Barracuda-Spam-Status: No, SCORE=2.31 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC3_MV0164, DKIM_SIGNED, HTML_MESSAGE, TVD_RCVD_SINGLE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.8173 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.30 TVD_RCVD_SINGLE TVD_RCVD_SINGLE 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 0.00 HTML_MESSAGE BODY: HTML included in message 2.00 BSF_SC3_MV0164 Custom rule MV0164 This is a multi-part message in MIME format --btoueFL=_ufgNmc0wfXqNTWSq9KcatPBl50 Content-Type: multipart/alternative; boundary="btoueFL=_ufgNmc0wfXqNTWSq9KcatPBl51" --btoueFL=_ufgNmc0wfXqNTWSq9KcatPBl51 Content-Type: text/plain ; charset="UTF-8" Content-Transfer-Encoding: quoted-printable K=C3=ADnh g=E1=BB=9Fi: Qu=C3=BD kh=C3=A1ch h=C3=A0ng. KDC BI=E1=BB=86T L=E1=BA=ACP =C4=90=E1=BA=B2NG C=E1=BA=A4P H=C3=80NG =C4=90= =E1=BA=A6U QU=E1=BA=ACN T=C3=82N PH=C3=9A C=C4=82N H=E1=BB=98 RESORT =C4=90=E1=BA=B2NG C=E1=BA=A4P DOANH NH=C3=82N L= =E1=BA=A6N =C4=90=E1=BA=A6U TI=C3=8AN C=C3=93 M=E1=BA=B6T T=E1=BA=A0I TPHCM= V=E1=BB=9AI GI=C3=81 CH=E1=BB=88 T=E1=BB=AA 999 TR/C=C4=82N Sau th=E1=BB=9Di gian d=C3=A0i nghi=C3=AAn c=E1=BB=A9u th=E1=BB=8B tr=C6=B0= =E1=BB=9Dng ch=C3=BAng t=C3=B4i cho ra =C4=91=E1=BB=9Di 1 d=E1=BB=B1 =C3=A1= n =C4=91=E1=BA=B3ng c=E1=BA=A5p b=E1=BA=ADc nh=E1=BA=A5t Qu=E1=BA=ADn T=C3= =A2n Ph=C3=BA v=E1=BB=ABa c=C4=83n h=E1=BB=99, nh=C3=A0 ph=E1=BB=91 v=C3=A0= bi=E1=BB=87t th=E1=BB=B1. V=E1=BB=9Bi v=E1=BB=8B tr=C3=AD chi=E1=BA=BFn l= =C6=B0=E1=BB=A3c ngay c=C3=B4ng vi=C3=AAn Celadon City 16ha v=C3=A0 trung t= =C3=A2m th=C6=B0=C6=A1ng m=E1=BA=A1i AEON Mall. V=E1=BB=9Bi d=E1=BB=B1 =C3= =A1n qu=C3=BD kh=C3=A1ch h=C3=A0ng s=E1=BA=BD th=E1=BB=83 hi=E1=BB=87n =C4= =91=C6=B0=E1=BB=A3c s=E1=BB=B1 =C4=91=E1=BA=B3ng c=E1=BA=A5p khi s=E1=BB=91= ng trong m=E1=BB=99t d=E1=BB=B1 =C3=A1n Compound bi=E1=BB=87t l=C3=A2p =C4= =91=C6=B0=E1=BB=A3c thi=E1=BA=BFt k=E1=BA=BF theo ki=E1=BA=BFn tr=C3=BAc Re= sort v=E1=BB=9Bi c=C3=A1c ti=E1=BB=87n =C3=ADch Ch=C3=A2u =C3=82u l=E1=BA= =A7n =C4=91=E1=BA=A7u ti=C3=AAn c=C3=B3 m=E1=BA=B7t t=E1=BA=A1i tphcm v=C3= =A0 duy nh=E1=BA=A5t t=E1=BA=A1i An Gia garden: Khu v=C6=B0=E1=BB=9Dn Ph=C3= =A1p m=C3=AA cung, Qu=E1=BA=A3ng Tr=C6=B0=E1=BB=9Dng Ch=C3=A2u =C3=82u tr= =C3=A1ng l=E1=BB=87, Th=C3=A1p N=C6=B0=E1=BB=9Bc Hy L=E1=BA=A1p c=E1=BB=95 = =C4=91i=E1=BB=83n, v=C6=B0=E1=BB=9Dn treo ph=C6=B0=E1=BB=9Bc h=E1=BB=A3p v= =C3=A0 th=C3=A1c n=C6=B0=E1=BB=9Bc tr=C3=AAn kh=C3=B4ng =C4=91=E1=BB=99c = =C4=91=C3=A1o, h=E1=BB=93 b=C6=A1i resort, khu BBQ ngo=C3=A0i tr=E1=BB=9Di,= c=C3=A0 ph=C3=AA s=C3=A2n th=C6=B0=E1=BB=A3ng=E2=80=A6 + Di=E1=BB=87n t=C3=ADch: t=E1=BB=AB 49,5 m2( 2 Ph=C3=B2ng ng=E1=BB=A7) =C4= =91=E1=BA=BFn 84 m2( 3 Ph=C3=B2ng ng=E1=BB=A7) + M=E1=BA=B7t ti=E1=BB=81n =C4=91=C6=B0=E1=BB=9Dng T=C3=A2n K=E1=BB=B3 T=C3= =A2n Qu=C3=BD m=E1=BB=9F r=E1=BB=99ng l=C3=AAn =C4=91=E1=BA=BFn 41m. + C=C3=A1ch Trung T=C3=A2m Th=C6=B0=C6=A1ng M=E1=BA=A1i AEON MALL 300m. + C=C3=A1ch Ga t=C3=A0u =C4=91i=E1=BB=87n ng=E1=BA=A7m Metro 600m. + C=C3=A1ch cao =E1=BB=91c v=C4=83n ph=C3=B2ng l=E1=BB=9Bn nh=E1=BA=A5t tp = 800m. + C=C3=A1ch S=C3=A2n Bay T=C3=A2n S=C3=A2n Nh=E1=BA=A5t 10 ph=C3=BAt. + N=E1=BB=99i th=E1=BA=A5t cao c=E1=BA=A5p nh=E1=BA=ADp kh=E1=BA=A9u t=E1= =BB=AB n=C6=B0=E1=BB=9Bc ngo=C3=A0i c=E1=BB=A7a =C4=90=E1=BB=A9c v=C3=A0 Nh= =E1=BA=ADt B=E1=BA=A3n =C4=91=C6=B0=E1=BB=A3c s=E1=BB=AD d=E1=BB=A5ng cho c= =C3=A1c c=C4=83n h=E1=BB=99 nh=C6=B0: c=C3=A1c c=C4=83n h=E1=BB=99 Sunrise = City, Lexington, Tropic Garden... + H=E1=BB=87 th=E1=BB=91ng kh=C3=B3a t=E1=BB=AB an ninh v=C3=A0 video call = =C4=91=E1=BA=A3m b=E1=BA=A3o an ninh v=C3=A0 y=C3=AAn t=C4=A9nh b=E1=BA=ADc= nh=E1=BA=A5t. + H=E1=BB=97 tr=E1=BB=A3 thanh to=C3=A1n d=C3=A0i h=E1=BA=A1n v=C3=A0 vay N= g=C3=A2n h=C3=A0ng. H=C3=A3y =C4=91=E1=BA=BFn v=E1=BB=9Bi An Gia garden =E2=80=93 KDC bi=E1=BB= =87t l=E1=BA=ADp =C4=91=E1=BA=B3ng c=E1=BA=A5p doanh nh=C3=A2n =C4=91=E1=BB= =83 tr=E1=BA=A3i nghi=E1=BB=87m cu=E1=BB=99c s=E1=BB=91ng Ch=C3=A2u =C3=82u= gi=E1=BB=AFa l=C3=B2ng S=C3=A0i G=C3=B2n AN GIA GARDEN =E2=80=93 N=C6=A0I MU=E1=BB=90N =C4=90=E1=BA=BEN, CH=E1=BB=90= N MU=E1=BB=90N V=E1=BB=80 Qu=C3=BD kh=C3=A1ch quan t=C3=A2m vui l=C3=B2ng li=C3=AAn h=E1=BB=87 nh=C3= =A2n vi=C3=AAn =C4=91=E1=BB=83 =C4=91=C6=B0=E1=BB=A3c t=C6=B0 v=E1=BA=A5n c= hi ti=E1=BA=BFt. Nguy=E1=BB=85n =C4=90=C4=83ng Khoa Chuy=C3=AAn Vi=C3=AAn T=C6=B0 V=E1=BA=A5n Mobile: 0938 579 007 =E2=80=93 09 7887 2228 S=C3=A0n Giao D=E1=BB=8Bch B=E1=BA=A5t =C4=90=E1=BB=99ng S=E1=BA=A3n Danh K= h=C3=B4i 3 Tr=E1=BA=A7n Nh=E1=BA=ADt Du=E1=BA=ADt, p.T=C3=A2n =C4=90=E1=BB=8Bnh, Q1 = --- This email is free from viruses and malware because avast! Antivirus protec= tion is active. http://www.avast.com --btoueFL=_ufgNmc0wfXqNTWSq9KcatPBl51 Content-Type: text/html ; charset="UTF-8" Content-Transfer-Encoding: quoted-printable

Kính gởi: Quý khách hàn= g. 

KDC BIỆT = LẬP ĐẲNG CẤP HÀNG ĐẦU QUẬN T= ÂN PHÚ 

 CĂN HỘ RESORT Đ&= #7858;NG CẤP DOANH NHÂN LẦN ĐẦU TIÊN C&O= acute; MẶT TẠI TPHCM 

VỚI GIÁ CHỈ TỪ 999 TR/CĂ= N 

 

 

 

Sau thời gia= n dài nghiên cứu thị trường chún= g tôi cho ra đời 1 dự án đẳng c= 845;p bậc nhất Quận Tân Phú vừa că= ;n hộ, nhà phố và biệt thự. Với= vị trí chiến lược ngay công viên=  Celadon City 16ha &nb= sp;trung tâm thương mại AEON Mall. V= 899;i dự án quý khách hàng sẽ th= 875; hiện được sự đẳng cấp khi= sống trong một dự án Compound biệt lâ= p được thiết kế theo kiến trúc Res= ort với các tiện ích Châu Âu lầ= n đầu tiên có mặt tại tphcm và d= uy nhất tại An Gia garden:&nbs= p;Khu vườn Pháp mê cu= ngQuảng Trư̖= 1;ng Châu Âu tráng lệTháp N&#= 432;ớc Hy Lạp cổ điển, vườn treo phước hợp v&ag= rave; thác nước trên không độc = 73;áohồ bơi resort, khu BBQ ngoài tr= ời, cà phê sân thượng… =

 

 

 

+ Di&= #7879;n tích: từ 49,5 m2( 2 Ph&ograv= e;ng ngủ) đến 84 m2<= font face=3D"Calibri">( 3 Phòng ngủ)
+ Mặt tiề= ;n đường Tân Kỳ Tân Quý mở r= ộng lên đến 41m.
+ Cách Trung Tâm = Thương Mại AEON MALL 300m.

+ C&a= acute;ch Ga tàu điện ngầm Metro 600m.=

+ C&a= acute;ch cao ốc văn phòng lớn nhất tp 800m.+ Cách Sân Bay Tân Sân Nhất 10 phú= ;t. 

+ Nội thất cao cấ= p nhập khẩu từ nước ngoài của = 72;ức và Nhật Bản được sử d&= #7909;ng cho các căn hộ như: các căn h&#= 7897; Sunrise City, Lexington, Tropic Garden... 

+ Hệ thống khóa tO= 15; an ninh và video call đảm bảo an ninh và= yên tĩnh bậc nhất.

+ Hỗ trợ thanh toán d= ài hạn và vay Ngân hàng.

=

 

 Hãy đến với An Gia garden – KDC biệ= t lập đẳng cấp doanh nhân để trN= 43;i nghiệm cuộc sống Châu Âu giữa l&og= rave;ng Sài Gòn <= /span>

 <= /p>

AN GIA GARDEN – NƠI = MUỐN ĐẾN, CHỐN MUỐN VỀ 

 Quý khách quan tâm vui lò= ;ng liên hệ nhân viên để đư= 907;c tư vấn chi tiết.   =

 

 

Nguyễn Đ&= #259;ng Khoa = ;

Chuyên Vi&ecir= c;n Tư Vấn 

Mobile: 0938 579 007 – 09 7887 2228 

Sàn Giao Dị= ;ch Bất Động Sản Danh Khôi 

3 Trần Nhật= Duật, p.Tân Định, Q1 

  

 

 




This email is free from viruses and malware because avast! Antivirus protection is active.


--btoueFL=_ufgNmc0wfXqNTWSq9KcatPBl51-- --btoueFL=_ufgNmc0wfXqNTWSq9KcatPBl50 Content-Type: application/octet-stream; name="N?i dung spam mail.docx" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="N?i dung spam mail.docx" UEsDBBQABgAIAAAAIQAJJIeCgQEAAI4FAAATAAgCW0NvbnRlbnRfVHlwZXNdLnhtbCCiBAIooAAC AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC0 lE1Pg0AQhu8m/geyVwPbejDGlPag9ahNrPG8LkPZyH5kZ/v17x1KS6qhpVq9kMAy7/vMCzOD0UqX 0QI8KmtS1k96LAIjbabMLGWv08f4lkUYhMlEaQ2kbA3IRsPLi8F07QAjqjaYsiIEd8c5ygK0wMQ6 MHSSW69FoFs/407IDzEDft3r3XBpTQAT4lBpsOHgAXIxL0M0XtHjmsRDiSy6r1+svFImnCuVFIFI +cJk31zirUNClZt3sFAOrwiD8VaH6uSwwbbumaLxKoNoInx4Epow+NL6jGdWzjX1kByXaeG0ea4k NPWVmvNWAiJlrsukOdFCmR3/QQ4M6xLw7ylq3RPt31QoxnkOkj52dx4a46rppLbYq+12gxAopFNM vv6CcVfouFXuRFjC+8u/UeyJd4LkNBpT8V7CCYn/MIxGuhMi0LwD31z7Z3NsZI5Z0mRMvHVI+8P/ ou3dgqiqYxo5Bz4oaFZE24g1jrR7zu4Pqu2WQdbizTfbdPgJAAD//wMAUEsDBBQABgAIAAAAIQAe kRq38wAAAE4CAAALAAgCX3JlbHMvLnJlbHMgogQCKKAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAjJLbSgNBDIbvBd9hyH032woi0tneSKF3 IusDhJnsAXcOzKTavr2jILpQ217m9OfLT9abg5vUO6c8Bq9hWdWg2JtgR99reG23iwdQWchbmoJn DUfOsGlub9YvPJGUoTyMMaui4rOGQSQ+ImYzsKNchci+VLqQHEkJU4+RzBv1jKu6vsf0VwOamaba WQ1pZ+9AtcdYNl/WDl03Gn4KZu/Yy4kVyAdhb9kuYipsScZyjWop9SwabDDPJZ2RYqwKNuBpotX1 RP9fi46FLAmhCYnP83x1nANaXg902aJ5x687HyFZLBZ9e/tDg7MvaD4BAAD//wMAUEsDBBQABgAI AAAAIQB8O5c5IgEAALkDAAAcAAgBd29yZC9fcmVscy9kb2N1bWVudC54bWwucmVscyCiBAEooAAB AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKyTTU+EMBCG7yb+B9K7FFZdjdmyFzXZq67x3C1T aISWdMYP/r0VswrKogcuTWaavs/TSbtav9VV9AIejbOCpXHCIrDK5cYWgj1sb08uWYQkbS4rZ0Gw FpCts+Oj1R1UksIhLE2DUUixKFhJ1FxxjqqEWmLsGrBhRztfSwqlL3gj1ZMsgC+SZMl9P4Nlg8xo kwvmN/kpi7ZtE8h/ZzutjYJrp55rsDSC4AhE4WYYMqUvgATbd+Lgyfi4wuKAQm2Ud+g0xcrV/JP+ Qb0YXowjtRXgo6HyRmtQ1Mf/3JrySA94jIz5H6PoyL1BdPUUfjknnsILgW96V/JuTacczud00M7S Vu6qnsdXa0ribE6JV9jd/3qVveZehA8+XPYOAAD//wMAUEsDBBQABgAIAAAAIQCpUFMjMQ4AAOqG AAARAAAAd29yZC9kb2N1bWVudC54bWzsHV1v29b1fcD+w4WeOtS1JdmxLaFWIcufSKw6ttLXgaJo kTPJy5KUXPcpbbBlWF8SBMOWFkPteG3QdsbSptgACV2BMvD/UH/JzrkkJVIibcm2LEpmgMAURV7x nHu+v/juex8pMqkLuiFRdSmRmk4miKDytCKp1aXEg9LaO4sJYpicWuFkqgpLiUPBSLyX++1v3j3I VihfUwTVJLCEamQPNH4pIZqmlp2ZMXhRUDhjWpF4nRp0z5zmqTJD9/YkXpg5oHplJp1MJdmRplNe MAz4vQKn1jkj4Syn9K5GNUGF39qjusKZxjTVqzMKp+/XtHdgdY0zpbIkS+YhrJ2cd5ehS4marmad B3qn/UB4S9Z+IOePe4feA0XA79p3rjgYYL84owsyPANVDVHSOmBcdjUAUXQfqX4eEHVFdq870FJz Pb/XBrmfPVjRuQPYis6CPcsFIKNi36TINh5wfzu72r1iKnkeMM6O4BLtZ+jnEfy/6T6Jwklqe5nL ocaLXOCIq9D3uk5rWvtxNOlqq22q++21kDEHeLLkPOM8L2jGQAv0sO6uyGlCgih8drOqUp0ry/BE B6k5ghSZyIGwKNPKIf7VyEEWhE1lZymRTCaXZ9OLIHGcU9vAej0nV4Q9riabvd9se06xlbd1/GOI FVivzslLCV4WOB1X56lMYW2uZlL8uCfJ8O0a+5eYYTdpHA9kD99xe6aAj4HXyRIiNj3X/rBTQ7jY Muy2P/BwFfupMgVuZed0+zH0NaqaBi5o8BJsdUlSBIMUhQOyQxUOqPIgK3CGmTckLvBLMa8awbfx sFfdq9lAfOw+TXrOAevjAj4Ce0L73AygGh8Q/mrOg8IFbEN82EekjA6SMoOnXDC64Jqd74XLPufC dZA1c3etU1Uk1VbzSylL7tesn8i+aB3zIhGtI7U6jbCbDAOMXvQIwm8MsJMIzC9HPqBwcxlHuKB5 OMU95dtt9+R48BoPNoegx9zWKwZgHy8hN/zcxmQlLMSExtoayOOky3Tu2blF90xHvNjnfGy4UiDL m63mn0rkXqvxr23y5kmr8UNxnRRajX9ukw3rIRzjua8fkPsP4IoiKVmfFsn2hvW5j5xBErkE6qPa 0cqoaPLoyloyvbrKNK4j30ejD2MeHZ1uD9AIHhZCXbC4OptfzDAqiYqS94mdTKZQ6BU7/Wn/whuQ IRut5t/Jzuru+zulLrGz8n6+uEGKGyhpQCx9XXRFUGnT+kuRFKxnZKvV+E+JlFqNo01S2t4obHVJ ozKl++h37pqcboJkkiqOvahyCpiHv1+nyxy/b4tI99pVFa1S+0owamIN3W3BAnZiezjMsr9GDT2g g2RzoVetf9Bqfr5J1jetT0gB2OzPwCjNb0kmkyGlnRlkPh+3xIQeE3qv53stLmyAmoupLaa2SaS2 y0WnRmfaDeIbIc9GNxI1CCQjFUgxidjRvK6wa4GTpbIu9Rtu9Vzeh47qzyHZ5WrEFFvNf0ikKnEq qVhHElGromR9qxK+1fzG/vozYupnr+AyCEPzotWAP6b1owTHlOgcefOUrZAilVbze2Idq3im8Rov bjW+0ki51TjliSrCBxOCnvBJhXDKC5Vsw1qk3mp+xxH+zSOVwJM895loXb6hJ4IQIkA8SOrHZPdc fm04nQqDoN8AkeehRgQDpjmzBrAtuIyaLhiCXhcSOdhB64hosElPSR2OylKr+dhk9PP9NAHb+wsJ NxOJxToF2pBajZ9VIiPhnMD2V7lDwls/AlXUkby64sKenR4hngZ2ZvpjswJkXytUJQXIAJPUvMhF kER8QY7g2Gp/wEZyY68E3YB+6doaxle8filwS7zj54X0hiDyhsTKpl5j2u+FAoLv7NXZMXxSWo1j ieRX3y+SLU6WI7jVHVOxPx52xXlboX/oTVWGAYjh27FQ0ZhrJUar8RNTXo8IqKrmY7RaHF1loB3j s2HCQB6hrhpwT0N0+r4oASaaT5GodcqIufnc7FhyYYCPy14Hg12Amixag7i3Y8PI1guts/0mM11M sg8GDFCIQMm+bcuAYdPgyY5gUAiug6kDBg8P2Xti2vRjnUIivyBaL2rE+rRG5FbjpW0KvwQz2jap rdcoLf4LVhOTGaYm8gozpiq1Q9dCtr/qA/H+zONIOM+WshKrhfDp2IX5THq2gL4NIFARCk6VC4/J t9n2aajNqYCNucw0JqjZdm0B1LU49RWeNC4759WreZWsSxypcnpFUPtA2DlZ2SFooA40/QndbBgE 4yNkuqs9PFY9CoxUfmFhYW0yDIG7Yo3Ubac4gvs2HOsnWJiiG3+shSFhZIriRlGgWN8SHizDMCyM kIV9Yvkqjt1UJD274WxzDsNUJ2AOldqBr7ZiD9vj20HpYAOhzyODxRyGiJjYWVntEEyKIRF7CQU4 KaI2+4InG4dYfXLbJTpEv/8KLgFY9o9CTcsJIPRglT5FIsjbNvFfmzpzjDdwe8HB0yCWw4gfotsn /dgyft9rhIbtdeEjmBCYb2piiTpRHQyBAoDkEJStYygfUz/PefhjHdMIksx1ISd3q2wf4IFnpHx2 LHXv6M36z8NRdiF0DlkuCOp0A+zncqclaBKwkJsCDq6R5eX7kJijmPU1dUziTkFAC3N84M4YmKHF GDdIRLX668Ovfci5uXKmuHogsHogYtVUY1hg0umQizsCjJF1+8WE4++8vESTVCfQPO7NlYNA0i/h OHkRV5UP3Ed4rfpnCDEBn42LLXF2/YE3m3Jx/uEKlY5RBQnoI9jWe5us2Pk6ExN2WUjFNb+Lor/r 29irBG7nMlN3iJL22W+ezExUohiXpd3QjX6LpDE38QP4qSq0XL/83S9HmNSHorSoo+Iqu704N9l7 nXuLzPq3Neq7eXnCLussC27m3sbOPywbAMn1iVupguW4rI72bqv52j7CkQJh6BhZfsInyC6PjBBx DgUVzS8JeK/PMS2BsSmHyedSShgqJkDk5aYnFzgP2RfYdIwSq7oDWldIya26A4ZoV93l790js8mk 4sdJYIwi3Bz0fxM2wuW2mYM3G+26LlEBAtOmnHUOWhWOaiATbJsPDIHGS4VsCVDtRub7I5kBRwGN gI4iFgzyeBNjTj48RwlUR/Kkjv0pEBdFYxJy31+o7Wo9jSz2kJHHukatex4BjSWCXAEd5mDZvLeL EeRlaPvo1lRjCbOZY7YWA6po9zKlkkgSDbMPtdNFAgNHIaI5OSyqvr9HALlxn/E3+WSYybYjqBVB FyrbXFVY1gVu3/YPQvjwl6MimMWQ27HJtZsNXdRMqGOAsttuQAwDfPxpwsxhW+WpBtm8VgO7NTGW 5Wbq7cxeGPATuuvYtvoSelKfQPcqqG3IZqKwPjXJMhb0gR3IEpo8Nj2cYpvDV6DQsY+VFfJf2IU6 ARQTLCvAnDl7le3CAtmtqbpkCKxxcYrcEz6CQZQmVaegLJJqEk/WWeX99PR0V2noUDyvWAV20iMD RfTH1Nx6G0dlPWYtWtieBBVHr8GZQwEHneqqBHM0kbvrUgXqt3jou2NxnxMF281PqO+aQ4wKmW++ gVu8veh9mG1OYZerKT1mm/+bsGhBTLO3kGb/xoppToByOaA4k+JEBDZZARQRHDKqBa+oWEX/KGDw a6D09NPbjk8RTRh5RjSaEbgtXX6dvS3ODMOAbfFfPl5S4wa25RpLfK/gAt4YoB7ZmE709DvOsnMA hzPrpGeWcleUyR93dCREhMZp+mK7g2Y4YXqwVBVl+I9jLdkA4ENBlukB4s2Low3r5NDNANktunlv lyj59eEzchfG/7qdv+g9neciBcrd24bVEJ8BE22dMT8ViuoOhsSAVoNvmo9QDTZO7IFCYMkp0CHH qsWdfvN2QxXMHmo1/81B8g6jq7tYjboOh75dCRS+gXvjF7E7E2KyRVImuTI2cHO69uEig8V/eawZ O69jcBSDK/aGWuM3hICurdPdFybYowIk5/UJPpWwsJCZhZEBXeBe7OliIWC+CGNf82Q9v7OyWmQy vngGI5K3HrSaT4psjPL/ilNsKCx8dM7CxKqHF8sYP11eaHf7L4/JeDRkfAPSsmO7XcyQSKFdETKP 7eaTjOfEam4AKD93Dgqi930mH9Y4CLlgwUa9JjmaXWYzUKC76LFjJbBBcI6t0A7MmmevYLZK4ysY QAizaaDgqfGz2R1fjCb2zpN0g+JyLMjlikDdnNlwrUU7N8CHgyDWNcKiyRODQBIgJmMSCZu7Pwhi YxK5lre3xVJkVJ2Ifs3qIf0F113ojAlLs3NA8u2wWbFaO2w1/whRiSdQxVUld0Xqn8AaS5nJlzKh pm1fJFQQayyJ+AEzYUtgon6AJuqI3MdYEI2nINqi8BZg4cpz/m7WAO2HP0Liwz72iKZ96tcsvnhU cIrCVi/YXXmeyklmZhfJnYUMSSYXurEwWhd/OACHEAAmW5IZsrC4uEDS6fSiDxWx1p18rTuoqQbJ H5ato2QF3iQA43Shag9eGoHVfNjetctq+FYwz3QXBhD5B9TE9BTTE7oDXtN/FioVoeFHdYtAV/Dt I+YU0aZZMT/S1WeqOEXup2LR5H3/dx9vQ7k47I0MGd3XJ/l0fWptLrOw4jqT/afaAkJW0bRzPIL4 whewBwAVy9ZbJVuvjUTm88nluXmc964bUsVbjOGU0NjZXoE3t3X3ImxMcO5DU1mr7uJY+IOlRCqd hrnwcCzC8Z1Fd0a8Vt3i8GaTanB+zr5Ex0qhzscyNU2qdD7Lwp7nW1GAMfQQIlxIs+X3KIWXuLc/ Vmsm++iMpAe5YcCvOa9HwlsYDBXKr+sSvklXllRhWzJ5eMrZeXdmvcFAZMqpTCuH7ABuqSkwDz/3 fwAAAP//AwBQSwMEFAAGAAgAAAAhADDdQymoBgAApBsAABUAAAB3b3JkL3RoZW1lL3RoZW1lMS54 bWzsWU9v2zYUvw/YdyB0b2MndhoHdYrYsZstTRvEboceaYmW2FCiQNJJfRva44ABw7phhxXYbYdh W4EW2KX7NNk6bB3Qr7BHUpLFWF6SNtiKrT4kEvnj+/8eH6mr1+7HDB0SISlP2l79cs1DJPF5QJOw 7d0e9i+teUgqnASY8YS0vSmR3rWN99+7itdVRGKCYH0i13Hbi5RK15eWpA/DWF7mKUlgbsxFjBW8 inApEPgI6MZsablWW12KMU08lOAYyN4aj6lP0FCT9DZy4j0Gr4mSesBnYqBJE2eFwQYHdY2QU9ll Ah1i1vaAT8CPhuS+8hDDUsFE26uZn7e0cXUJr2eLmFqwtrSub37ZumxBcLBseIpwVDCt9xutK1sF fQNgah7X6/W6vXpBzwCw74OmVpYyzUZ/rd7JaZZA9nGedrfWrDVcfIn+ypzMrU6n02xlsliiBmQf G3P4tdpqY3PZwRuQxTfn8I3OZre76uANyOJX5/D9K63Vhos3oIjR5GAOrR3a72fUC8iYs+1K+BrA 12oZfIaCaCiiS7MY80QtirUY3+OiDwANZFjRBKlpSsbYhyju4ngkKNYM8DrBpRk75Mu5Ic0LSV/Q VLW9D1MMGTGj9+r596+eP0XHD54dP/jp+OHD4wc/WkLOqm2chOVVL7/97M/HH6M/nn7z8tEX1XhZ xv/6wye//Px5NRDSZybOiy+f/PbsyYuvPv39u0cV8E2BR2X4kMZEopvkCO3zGBQzVnElJyNxvhXD CNPyis0klDjBmksF/Z6KHPTNKWaZdxw5OsS14B0B5aMKeH1yzxF4EImJohWcd6LYAe5yzjpcVFph R/MqmXk4ScJq5mJSxu1jfFjFu4sTx7+9SQp1Mw9LR/FuRBwx9xhOFA5JQhTSc/yAkArt7lLq2HWX +oJLPlboLkUdTCtNMqQjJ5pmi7ZpDH6ZVukM/nZss3sHdTir0nqLHLpIyArMKoQfEuaY8TqeKBxX kRzimJUNfgOrqErIwVT4ZVxPKvB0SBhHvYBIWbXmlgB9S07fwVCxKt2+y6axixSKHlTRvIE5LyO3 +EE3wnFahR3QJCpjP5AHEKIY7XFVBd/lbobod/ADTha6+w4ljrtPrwa3aeiINAsQPTMRFb68TrgT v4MpG2NiSg0UdadWxzT5u8LNKFRuy+HiCjeUyhdfP66Q+20t2Zuwe1XlzPaJQr0Id7I8d7kI6Ntf nbfwJNkjkBDzW9S74vyuOHv/+eK8KJ8vviTPqjAUaN2L2EbbtN3xwq57TBkbqCkjN6RpvCXsPUEf BvU6c+IkxSksjeBRZzIwcHChwGYNElx9RFU0iHAKTXvd00RCmZEOJUq5hMOiGa6krfHQ+Ct71Gzq Q4itHBKrXR7Y4RU9nJ81CjJGqtAcaHNGK5rAWZmtXMmIgm6vw6yuhTozt7oRzRRFh1uhsjaxOZSD yQvVYLCwJjQ1CFohsPIqnPk1azjsYEYCbXfro9wtxgsX6SIZ4YBkPtJ6z/uobpyUx8qcIloPGwz6 4HiK1UrcWprsG3A7i5PK7BoL2OXeexMv5RE88xJQO5mOLCknJ0vQUdtrNZebHvJx2vbGcE6GxzgF r0vdR2IWwmWTr4QN+1OT2WT5zJutXDE3Cepw9WHtPqewUwdSIdUWlpENDTOVhQBLNCcr/3ITzHpR ClRUo7NJsbIGwfCvSQF2dF1LxmPiq7KzSyPadvY1K6V8oogYRMERGrGJ2Mfgfh2qoE9AJVx3mIqg X+BuTlvbTLnFOUu68o2YwdlxzNIIZ+VWp2ieyRZuClIhg3kriQe6VcpulDu/KiblL0iVchj/z1TR +wncPqwE2gM+XA0LjHSmtD0uVMShCqUR9fsCGgdTOyBa4H4XpiGo4ILa/BfkUP+3OWdpmLSGQ6Ta pyESFPYjFQlC9qAsmeg7hVg927ssSZYRMhFVElemVuwROSRsqGvgqt7bPRRBqJtqkpUBgzsZf+57 lkGjUDc55XxzKlmx99oc+Kc7H5vMoJRbh01Dk9u/ELFoD2a7ql1vlud7b1kRPTFrsxp5VgCz0lbQ ytL+NUU451ZrK9acxsvNXDjw4rzGMFg0RCncISH9B/Y/Knxmv3boDXXI96G2Ivh4oYlB2EBUX7KN B9IF0g6OoHGygzaYNClr2qx10lbLN+sL7nQLvieMrSU7i7/PaeyiOXPZObl4kcbOLOzY2o4tNDV4 9mSKwtA4P8gYx5jPZOUvWXx0Dxy9Bd8MJkxJE0zwnUpg6KEHJg8g+S1Hs3TjLwAAAP//AwBQSwME FAAGAAgAAAAhAHhGoJB3AwAAywgAABEAAAB3b3JkL3NldHRpbmdzLnhtbLRW227bOBB9X2D/QdDz OpIcN/YKcYo0iXdbxNuiSj+AEmmbCG8YUlbcr+9QFKMa8QbBFvtkai5nbodDX75/kiLZM7Bcq2Va nOVpwlSjKVfbZfrtYTVZpIl1RFEitGLL9MBs+v7q998uu9Iy59DMJgihbCmbZbpzzpRZZpsdk8Se acMUKjcaJHH4CdtMEnhszaTR0hDHay64O2TTPL9IBxi9TFtQ5QAxkbwBbfXGeZdSbza8YcNP9IC3 xA2et7ppJVOuj5gBE5iDVnbHjY1o8r+iYYm7CLJ/rYi9FNGuK/LXLIdyOw302eMt6XkHA7ph1uKA pAjlSsLVM0wxewH03OozbHUWYmceCt2LvD+NmVvxwv/EtMMU73kNBMKYkQA+C9mUH7dKA6kFkqor ZukVMuq71jLpSsOgwSEhHfM8zbyCsg1phXsgdeW0QZM9wfjz6aBudgRI4xhUhjRY8Y1WDrSIdlT/ o90NMg6wIQEw8M9Dh1MVuIweikjMKEgHfq41ZSmqWuAviv7XpnmHPkusra/hdCCNdw84ZViaYJU7 CLbC5Cv+nV0r+qm1jiPje5b+QgavJcCUj/wZb+rDwbAVI67FNv1PwfpJrAQ3aw6g4aOiOOdfDZbF Ifpx4iKjNh6+au3iGPI8/3A+XQyM8WZv0RTX8/l8Ffp37LPI58XF3UnN3fn14s9TmuvFLF8NdDhG u13l07seDasZapClXylf4OoynDwxEhlIdUNkDZwka790kF6yrOHxA1dRXzNcuuxnTdXWUTmZBIWV RIgV3pyo6JsjS8qtuWWbHlasCWxH3MECTkrxln56xvI3mMFfoFsTonVATBh4DFfMZgMeV+6eyyi3 bV1FL4WL4ydVq+jnPXjAbGxPVzp8b/qLc0/UNs6Vqcm3ypsiPwRU/k1ia2IMLgg0qbfFMhV8u3OF J7vDL4pvU/9Rb6eDbtrr8Mvr+g/S+MrQejh4g3BEq+Ewys6j7HyU4eYNdrNR9i7K3o2yiyjDt7Er d3g7QXD1iCsoHr18o4XQHaN/R+EyfSEKTbA7YhjO1W9SvCK67AXDarXJvmRPuHMZ5Q6ffMOpJE9+ BU8vvPtgLchBt+7I1uu8sTmSJpQ4gu79qI6ccXT43+E4F7/hG450rA6yHhf3WUhccOsqZnDHOw1Y cr9W/+iRx38hVz8AAAD//wMAUEsDBBQABgAIAAAAIQDJ7EwNfwEAAEwDAAAUAAAAd29yZC93ZWJT ZXR0aW5ncy54bWyUU1FPwjAQfjfxPyx9h26IBBYGCSEYE2OM4g/oum40tr2mLUz49R4bIooP8NTr 3fd9vbtvG08/tYo2wnkJJiNJNyaRMBwKaaqMvC8XnSGJfGCmYAqMyMhWeDKd3N6M67QW+ZsIAZE+ QhXjU80zsgrBppR6vhKa+S5YYbBYgtMs4NVVVDP3sbYdDtqyIHOpZNjSXhwPyEHGXaICZSm5mANf a2FCw6dOKFQE41fS+m+1+hK1GlxhHXDhPc6jVaunmTRHmaR/JqQld+ChDF0chrYd0b0U0pO4ibQi kebpY2XAsVzhBuukTya4vkJu/OGM6lQWGRnFd/eD3nCUNPUciu1cbrC2YQqtIXSPxuU9iTJ8Z+Nj 9lVWq3/SS7Dn2BmEAPpPHvuZFW7/RvjhGDSdINDvMoKfBgaWcRyiiTkoQK/YOkDbhjrp7Dpm/quj 67judPJrqLQxoRm6DSfj9mx8ARukljuxADdzUHvhGgOYUlC/PD/gBcEn/8DkCwAA//8DAFBLAwQU AAYACAAAACEA5gjbCJEIAAAJQQAAGgAAAHdvcmQvc3R5bGVzV2l0aEVmZmVjdHMueG1stFvfc9s2 DH7f3f4HnZ62h9Q/kiVtbu4uTdc1d13X1sntmZbpmFdJ1CQ5bvrXDwQlWpYsC7DUJ0cUiQ8ggA+0 Q/z+x7co9J5kmikdz/zJi7HvyTjQSxU/zvyH+3dnL30vy0W8FKGO5cx/lpn/x+uff/p9e53lz6HM PBAQZ9fbJJj56zxPrkejLFjLSGQvIhWkOtOr/EWgo5FerVQgR1udLkfT8WSMfyWpDmSWAdqtiJ9E 5hfioqY0ncgYsFY6jUSevdDp4ygS6ddNcgbSE5GrhQpV/gyyx5elGD3zN2l8XSh05hQyS66tQsVH uSJtWHEA1658q4NNJOMcEUepDEEHHWdrlezMOFUamLguVXo6ZsRTFJbztsnkooHnTKb44G0qtuCK ncCGuAObsbSLotDug/Hvzqt1iZPxMWMKjxgRTgeKCvuYpSaRULETc9rWVDcX8qFPfP+V6k3i1ElU P2l38Vcny6QlQ7PxJWZe1bSMJaCRuvO1SKTvRcH13WOsU7EIQaPt5MIzEem/BqpY6uCtXIlNmGfm Mf2UFo/FE36803GeedtrkQVK3QOFgJRIgcD3N3GmfHgjRZbfZEocfLk2sw6+CbK8Iu2NWip/ZBCz 7yDzSYQzfzotR26NBntjoYgfyzEZnz3Mq5rMfDe0ALkzX6Rn8xsjbIRmlp8Vc5M94+EJVUlEAJkH OGKVSyAhYDGDEyrj3ekVMJp9+LIxmys2uS5AUACAVcXCY23HgZuAqeaWseGtXH3QwVe5nOfwYuYj Fgw+3H1KlU6BRmf+q1cGEwbnMlLv1XIpTYEoxh7itVrKf9cyfsjkcjf++R3ScyEx0Js4B/UvrzAK wmz557dAJoYmQXQsjIc/mgXAYeCOCg4qtFE7bexADRUH/yshJ9aHB1HWUpiS5qH+R4HQ6k1voKmx qGoAymXpet5fxEV/Eb/1F4HB228vrvprAQeZvh6xsVGJSrpTcx3Y4Kvuw/mrIyFrVjSiqHNFI2g6 VzRipHNFIyQ6VzQioHNFw+GdKxr+7VzRcOfRFYFA4qpH0TnuBimx71UeQp3sYLpJT6orSo33SaTi MRXJ2jOFta72MbKcbxY5TVWk09PJcp6n2hw3O3YEqrNJ3ZM5+c8oWYtMwam8C6jn1t+bo4/3V6rg +NoB9ZsNvoZNeDA5WMI+hSKQax0uZerdy2/Wo4z1H7U3t6eMTuV6uvWDelznHpwKTcntBLts2fT2 nbDyP6gM9+BoNb9sMaVLOMmHly1x2S78b7lUm6jcGsJp5NLyOcPNNQhU8fgWXRgXNbOr0wrjAIoJ tlzwTUD5BP1tceHLNz6m6G9L0YnyCfrbwnWifIyP4/5lM81b+FnFI6XXFTt3b3Wo09UmLHOgkx6u 2BnsIGgmsJPYySeRxBU7g/fo07sJAvjmRolTti92PMpAYbvDomCy0W1hO6VGexOGRWwH1bCmDKx+ XMsAYpPuF/mkzI/A3GKALO3Omp3pfN6yA1CCSGfozxudd5+hpy2cR0W5i+Hnkkx6NLTzlsyjohXx ZOsdw8f9Ch8DqF8FZAD1K4UMoJb4aD/zuJpIB+lfHBlYbFp2VQzDjszMV2xmdkC8EjBQ3SScv1qy tz0WmnWTgMJ2ULNuElDY3qnVMlc3CViD1U0CVkvVaPdRlVM5RrHrZhXInQQIFg1D3gSgYcibADQM eROA+pN3N8hw5E3AYnOD49QqeROAcArnq74DqpI3AYjNDZbtit+MyrqHUo5/uR2AvAkobAc1yZuA wvZOG3kTsHAKJxJqWI7qCFjDkDcBaBjyJgANQ94EoGHImwA0DHkTgPqTdzfIcORNwGJzg+PUKnkT gNj04ICq5E0AwikcbjhI3pj1P5y8CShsBzXJm4DC9k6NUN0hlYDFdlANy5E3AQuncIKhwMLg5hg1 DHkTLBqGvAlAw5A3AWgY8iYA9SfvbpDhyJuAxeYGx6lV8iYAsenBAVXJmwDE5oaD5I3J+MPJm4DC dlCTvAkobO/UCNXxHAGL7aAaliNvAhbGS2/yJgDhlFOBOBYNQ94Ei4YhbwLQMORNAOpP3t0gw5E3 AYvNDY5Tq+RNAGLTgwOqkjcBiM0NB8kbc+SHkzcBhe2gJnkTUNjeqRGqI28CFttBNSxHdQSsYcib AISB2Zu8CUA45QQgzCKOm4Yhb4JFw5A3Aag/eXeDDEfeBCw2NzhOrZI3AYhNDw6oSt4EIDY3mHu2 cF+UfD110hIE1HsG5a0GMuC0xUlUwMLAL3IlU+gqlN23Q3oClhYyEFvCg2riG62/erSL3ectAUKG UotQabzS/Yy3dCqNCOdXRzoJ7v+59d7bBpjGOgyp/Zs30D1UbRfC9iTTOAR65s8JtOwk5c1yIw0a hExfV9EChD2hd9AQVLT1mMWmzwcmYlNVMYz/ty1Q4W9AxIVNqGANWAF0RB2BKi68uztIeN29Dtxy Kx4V2bVklGoWt+N3Zyg7b++O5lG9c3MT/IjOeFP86B55OMV6takgNGehSl0agssWoW0xgz/u4iVY uC26s6wzl9+EFQXvb2UY/i2wIS3XSfvUUK5y+3YyxgpYE7XQea6j9vUpXhBHTQ4JgHCoKmMfjRHt cRJvooVMi+vmrSFpKgd2ou2HpL3r2hIK1J1u120vXWoJ8q9cHFDIdMR5v8C7X61rFgKa7P4xPXON JOoTGtD0beIBZY7H4zfn05djC9joSlxI6LuG1J/YtkT7eANdiJltKSjSv2heLGbhU3NS0dN4gf+6 NQ+HexqL/kn42GsMnfn3KoK2849y633RkcALi2Vj6MGX2Bh68E0Aja91aTatdp2hF0Wifa90huIY OBz6WI8F5R55OccXTS91giqGEb7m74ME1xKuZSfrjlxBzVY/owHb64VFvc3g81Sz3KGibph70du0 IjhZpilEVS2mlUmbvf4fAAD//wMAUEsDBBQABgAIAAAAIQAkhmcUUgEAAIsCAAARAAgBZG9jUHJv cHMvY29yZS54bWwgogQBKKAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACMklFLwzAUhd8F /0PJe5u0cyKh7UBlTw4EJ4riQ0jutmCThiSu2783bbfaOR98TM+5X865aT7bqSragnWy1gVKE4Ii 0LwWUq8L9Lycxzcocp5pwapaQ4H24NCsvLzIuaG8tvBoawPWS3BRIGlHuSnQxntDMXZ8A4q5JDh0 EFe1VcyHo11jw/gnWwPOCLnGCjwTzDPcAmMzENEBKfiANF+26gCCY6hAgfYOp0mKf7werHJ/DnTK yKmk35vQ6RB3zBa8Fwf3zsnB2DRN0ky6GCF/il8XD09d1VjqdlccUJkLTrkF5mtbSqeYrKI4es9I Sj5yPNLaPVbM+UVY+UqCuN2f288t7ZSFrWxfrcxyPD6Gm7ui/fUgohCd9kWPysvk7n45R2WIcxWT m5hMl2lKJ1NKyFub7mS+rdJ/UIeM/yRmlPwiHgFll/j09ym/AQAA//8DAFBLAwQUAAYACAAAACEA 0SAHjw4IAAAYPgAADwAAAHdvcmQvc3R5bGVzLnhtbLSb33ObOBDH32/m/geGp7uH1L9ycZup20nT 9pqZNk3jZPqMQY41BeQD3CT962+1AgWDgd1Anxx+aD9a7eor2dG+fvsQhc5PkaRSxQt38mLsOiL2 VSDju4V7e/Px6KXrpJkXB16oYrFwH0Xqvn3z5x+v70/T7DEUqQMG4vQ08hfuJsu2p6NR6m9E5KUv 1FbE8HCtksjL4DK5G0Ve8mO3PfJVtPUyuZKhzB5H0/H4xM3NJBQrar2Wvniv/F0k4gzbjxIRgkUV pxu5TQtr9xRr9yoJtonyRZqC01Fo7EWejK2ZyXHNUCT9RKVqnb0AZ0amRyNtCppPxvhXFLpO5J9e 3MUq8VYhDN795Nh9AyMXKP+9WHu7MEv1ZXKV5Jf5FX58VHGWOvenXupLeQNDCgYiCbY+ncWpdOGJ 8NLsLJXewYcb/dbBJ36alay9k4F0R5qY/gKbP71w4U6nxZ1z3YO9e6EX3xX3RHx0uyz3ZOHaWyuw u3C95Gh5po2N0M3is+Tuds95uMKubD0fggEcb50JSArIEc0Jpc7B6RzyxVxc7/S4ertM5RA0ALCy WbisjDjkCmTO0iQwPBXrz8r/IYJlBg8WLrLg5u3FVSJVAkm6cF+90ky4uRSR/CSDQOj5kt+7jTcy EN83Ir5NRfB0/9tHTP7coq92cQbdP5ljFoRp8OHBF1udtmA69nSEL3UDSBwIR4mDHdrJp96YGxUq 3vyvQE5MDA9SNsLTM9zB/reC0Otdb9BUe1R2AO2y+jrrb+K4v4l/+pvA5O03FvP+vQBd7xsRkxul rKQHNVO+Sb7yOMxetaSsblHLos4WtaTpbFHLkc4WtZTobFHLgM4WtYB3tqjFt7NFLZytLXwPhaua RTMcDdLEvpFZKHT7VgGa9JS6fKlxrrzEu0u87cbRC2u1221iudytMlpXUU6fL5bLLFHxXeeIwOqs p+6zNflDtN14qYRdUsfQT3sO/Y3e9Tj/JjLoRP1jkq/mE25MDi5hV6Hni40KA5E4N+LBRJTR/lI5 S7PL6Oxcz7B+lnebzFlucMnthJ00DHrzSBj7n2WKY9A6mU4aXOkyTorhSUNeNhv/IgK5i4qhIexG ToyeM8JcQWAX24foWIeoPrs6vdABoLhglgu+C2if0H+zuPDt6xhT+m+WomfaJ/TfLFzPtI/50R5f ttK8hy+tDml6zdlz91yFKlnvwmIOdMrDnD2DLYLmAnsSW/skkZizZ/CefDpnvg/f3Ch5yo7Fk44y KOxwGApONrov7KBUZG/C8IgdoAprymD101oGiC261+Kn1L+JcRcDVGm71+yczrOGEYAliLSH/rZT WfceetqgeVTKRQw/l6TCodFmDTOPSsvzyax3jBj3W/gYoH4rIAPUbylkgBryo3nPY9dEOqT/4shg sWXZrmKYdmRlnrOV2YJ4S8BA6yZh/9Uwe5tzob5uEijsANXXTQKFHZ3KWmbXTQJrsHWTwGpYNZpj VNZUjlPsdbMMsjsBgkfDiDcBNIx4E0DDiDcB1F+8uyHDiTeBxdYGq6ll8SaA8BXOV30LKos3AcTW BqN2+W9GxbqHVtq/3A4g3gQKO0B18SZQ2NFpEm8CC1/hZEKFZaWOwBpGvAmgYcSbABpGvAmgYcSb ABpGvAmg/uLdDRlOvAkstjZYTS2LNwHElgcLKos3AYSvcLThoHjjrP/t4k2gsANUF28ChR2diqDa TSqBxQ5QhWXFm8DCVzjJkLMwuTlODSPeBI+GEW8CaBjxJoCGEW8CqL94d0OGE28Ci60NVlPL4k0A seXBgsriTQCxteGgeONk/O3iTaCwA1QXbwKFHZ2KoFqdI7DYAaqwrHgTWJgvvcWbAMJXngvieDSM eBM8Gka8CaBhxJsA6i/e3ZDhxJvAYmuD1dSyeBNAbHmwoLJ4E0BsbTgo3jhHfrt4EyjsANXFm0Bh R6ciqFa8CSx2gCosK3UE1jDiTQBhYvYWbwIIX3kGCGcRJ0zDiDfBo2HEmwDqL97dkOHEm8Bia4PV 1LJ4E0BsebCgsngTQGxt0Ods4bwo+XjqpCEJqOcMilMNZOC0IUhUYO7gtViLBIqsRPfpkJ7AwkMG sSE9qC6+U+qHQzvYPWtIEDJKrkKp8Ej3I57SKRUizOYtlQQ3X8+dT6YAptYOU2r/5A1UD5XLhbA8 SRcOQT+zxy2U7GyLk+XaGhQI6bquvAQIS+QuoCAoL+vRjXWdD7yIRVX5bfy/bU6Fv4GIDesofwMs HyqiWlD5gXd7BgmPu1fBDafisSNPJRlFN/PT8U97KPPe3hnN1n5n+iR4S5/xpHjrGDn4iolqvYNQ nIVd6uohhGwVmhIz+OMiDsBDKBLE/5qZYAYPnjEFz89FGH7xsCAtU9vmV0OxzszTyRhXwIqplcoy FTW3T/CAOPbkkAFIh3JnzKV2ojlP4l20EglUeLWM+aXSKwdWou2npDnr2pAK1JFu7tvedKlMkO9i daBDuiLO+Que/W1Cs/KgyO6rrpmrTaI+qQE1sDof0OZ4PH43m74cG2CtKnEloKoVpv7ElCWayzOo QkxNSUE+/fPixfwtvKq/lNc0HmMS6ovDNY15/SR87BWGLtwbGUEV7qW4d65V5OGBxaIw9OBDLAw9 +MRP67fNtHqqDD3OJ9qvUmUo3oOAQx1rW1LuiZcNfF70UhWo/DbiK/E+KHAN6VpUsj6JK3SzMc7o wP3pylDPU/h8rlt2U1F1zD7o7VqenCzXJFJlg2vFpE3f/A8AAP//AwBQSwMEFAAGAAgAAAAhAEl9 oJ3DAQAAogQAABIAAAB3b3JkL2ZvbnRUYWJsZS54bWykkt1O4zAQhe9X2neIfE/tpIGFiBSh7lbi Zi9W8ACu6zQW/ok8brN9eyZ2Gi4qRAuOFCVnPEczn879w3+js730oJytST5jJJNWuI2y25q8PK+u bkkGgdsN187KmhwkkIfFzx/3fdU4GyDDfguVETVpQ+gqSkG00nCYuU5aLDbOGx7w12+p4f51110J Zzoe1FppFQ60YOyGjDb+HBfXNErI307sjLQh9lMvNTo6C63q4OjWn+PWO7/pvBMSAHc2OvkZruxk k5cnRkYJ78A1YYbL0DQRHaywPWfxy2iSGVE9ba3zfK2RXZ+XZDGCy/rKcoPikmu19ioWOm4dyBxr e65rwgq2Ytf4Hp6SzYc3oYODaLkHGaaLLMkNN0ofjir0CiAVOhVEe9T33KthoFQCtcXCDtasJn8Y nmK1IknJa1Ki8LiclAKHSicf78wnBZODg0WfeCW/iz6ooM/YFeekKTonJJ6VkZD9lX32zxluPyBS sBskcY08BjLzi4j46BsJXkCkeJz2x02WuMqv23I+7v9O5O5zIsnnfCJLbjAa/AMSA4FEYiByWTa+ RuI0G6yc2LyTiEnARH0nG2NIYPEGAAD//wMAUEsDBBQABgAIAAAAIQB1LfhV4gEAAN8DAAAQAAgB ZG9jUHJvcHMvYXBwLnhtbCCiBAEooAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJxTwW7b MAy9D9g/GL43tpN23QJFxZBi6GFbA8Rtz5pMx8JkSZBYo9nXj7IbV9l2mk7kI/H09Eixm5deZwP4 oKzZ5NWizDMw0jbKHDb5Q/3l4mOeBRSmEdoa2ORHCPkNf/+O7bx14FFByIjChE3eIbp1UQTZQS/C gsqGKq31vUBK/aGwbask3Fr53IPBYlmWHwp4QTANNBduJswnxvWA/0vaWBn1hcf66EgwZzX0TgsE /j3K0ayYAVZbFLpWPfBVSficsZ04QOBLVkwBe7K+ofzqEyumkG074YVEco9Xl9eEJwD77JxWUiAZ y78p6W2wLWb3owVZJGBF2sLIlj3IZ6/wyElImrKvypCUirRMEWnz4uCF6wJfRYFzxvZSaNjS43kr dABWvAHsDkQc7E4oUswGXA8g0fosqF802mWe/RABomWbfBBeCYNkXWybkjHWLqDntUJN3FSb8jFM 29JYXfJqbKDgvDESTBqocK5uvCHct/Q2/IfYKhU7apikJnKScL7jD9at7Z0wR97Znl5zyqLdP8OD q+1tXJlXH8/BZPZPCru9EzJO6Hp1lW5BUmJ7WhZoaKwnwjeA3ZHnXsdbaYPMAZpTz9+FuFeP03+l pVuUdMZFOmG0DfNH4r8BAAD//wMAUEsBAi0AFAAGAAgAAAAhAAkkh4KBAQAAjgUAABMAAAAAAAAA AAAAAAAAAAAAAFtDb250ZW50X1R5cGVzXS54bWxQSwECLQAUAAYACAAAACEAHpEat/MAAABOAgAA CwAAAAAAAAAAAAAAAAC6AwAAX3JlbHMvLnJlbHNQSwECLQAUAAYACAAAACEAfDuXOSIBAAC5AwAA HAAAAAAAAAAAAAAAAADeBgAAd29yZC9fcmVscy9kb2N1bWVudC54bWwucmVsc1BLAQItABQABgAI AAAAIQCpUFMjMQ4AAOqGAAARAAAAAAAAAAAAAAAAAEIJAAB3b3JkL2RvY3VtZW50LnhtbFBLAQIt ABQABgAIAAAAIQAw3UMpqAYAAKQbAAAVAAAAAAAAAAAAAAAAAKIXAAB3b3JkL3RoZW1lL3RoZW1l MS54bWxQSwECLQAUAAYACAAAACEAeEagkHcDAADLCAAAEQAAAAAAAAAAAAAAAAB9HgAAd29yZC9z ZXR0aW5ncy54bWxQSwECLQAUAAYACAAAACEAyexMDX8BAABMAwAAFAAAAAAAAAAAAAAAAAAjIgAA d29yZC93ZWJTZXR0aW5ncy54bWxQSwECLQAUAAYACAAAACEA5gjbCJEIAAAJQQAAGgAAAAAAAAAA AAAAAADUIwAAd29yZC9zdHlsZXNXaXRoRWZmZWN0cy54bWxQSwECLQAUAAYACAAAACEAJIZnFFIB AACLAgAAEQAAAAAAAAAAAAAAAACdLAAAZG9jUHJvcHMvY29yZS54bWxQSwECLQAUAAYACAAAACEA 0SAHjw4IAAAYPgAADwAAAAAAAAAAAAAAAAAmLwAAd29yZC9zdHlsZXMueG1sUEsBAi0AFAAGAAgA AAAhAEl9oJ3DAQAAogQAABIAAAAAAAAAAAAAAAAAYTcAAHdvcmQvZm9udFRhYmxlLnhtbFBLAQIt ABQABgAIAAAAIQB1LfhV4gEAAN8DAAAQAAAAAAAAAAAAAAAAAFQ5AABkb2NQcm9wcy9hcHAueG1s UEsFBgAAAAAMAAwACQMAAGw8AAAAAA== --btoueFL=_ufgNmc0wfXqNTWSq9KcatPBl50-- From bfoster@redhat.com Wed Aug 6 06:34: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 90DC37F9B for ; Wed, 6 Aug 2014 06:34:56 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 548188F804B for ; Wed, 6 Aug 2014 04:34:56 -0700 (PDT) X-ASG-Debug-ID: 1407324890-04bdf06ed12b650001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id xUr8Sz75xMSCcQHr (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 06 Aug 2014 04:34:51 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s76BYnPQ002795 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 6 Aug 2014 07:34:49 -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 s76BYmos010060; Wed, 6 Aug 2014 07:34:49 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 24F8B12577C; Wed, 6 Aug 2014 07:34:48 -0400 (EDT) Date: Wed, 6 Aug 2014 07:34:48 -0400 From: Brian Foster To: Felipe Monteiro de Carvalho Cc: xfs@oss.sgi.com Subject: Re: xfs_bmbt_rec_64 leading to wrong blocks Message-ID: <20140806113447.GA14820@bfoster.bfoster> X-ASG-Orig-Subj: Re: xfs_bmbt_rec_64 leading to wrong blocks References: MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.23 (2014-03-12) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.26 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1407324891 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Wed, Aug 06, 2014 at 12:12:12PM +0200, Felipe Monteiro de Carvalho wrote: > Hello, > > I am writing a software which reads xfs partitions and it is working > well so far, but, at in a particular folder with 10k files, only 7k > files appear, the other ones don't. > > I read an inode which has di_core.di_format = XFS_DINODE_FMT_BTREE > > No problem here, the btree is trivial, it has only 1 element inside > it, which leads to a list of 82 extends. > > Extends 0..52 aprox. are all great, and work fine. > > Extent 53 (and other ones after that) point to very wierd memory areas > which don't match the pattern that I saw previously =( > > Here is the hex data of the extents, the selected extent in nr 53: > > http://magnifier.sourceforge.net/temp/xfs/extent_with_xfs_bmbt_rec_64.png > > And here is debug information showing which values I extracted from this table: > > i=0 FLocalExtent.StartOff=0 FLocalExtent.StartBlock=66748 > FLocalExtent.BlockCount=1 lStartBlock=65212 > i=1 FLocalExtent.StartOff=1 FLocalExtent.StartBlock=66758 > FLocalExtent.BlockCount=2 lStartBlock=65222 > i=2 FLocalExtent.StartOff=3 FLocalExtent.StartBlock=66772 > FLocalExtent.BlockCount=1 lStartBlock=65236 > .... > > i=51 FLocalExtent.StartOff=77 FLocalExtent.StartBlock=67468 > FLocalExtent.BlockCount=1 lStartBlock=65932 > i=52 FLocalExtent.StartOff=78 FLocalExtent.StartBlock=67479 > FLocalExtent.BlockCount=1 lStartBlock=65943 > i=53 FLocalExtent.StartOff=8388608 FLocalExtent.StartBlock=66749 > FLocalExtent.BlockCount=1 lStartBlock=65213 > i=54 FLocalExtent.StartOff=8388609 FLocalExtent.StartBlock=66783 > FLocalExtent.BlockCount=2 lStartBlock=65247 > ... > > Note how StartOff is suddenly so big! But I manually checked the bits > comparing to xfs_bmbt_rec_64 and the value written is that one. But > what sense does it make for StartOff to jump like that? > Assuming 4k blocks, 8388608 is 32G, which is the offset interval used for some internal sections of directories on XFS. If this is a directory, it could be a node/leaf or freelist block. Looking at xfs_da_format.h, it looks like XFS_DIR2_LEAF_OFFSET points to this offset. This block basically points to a btree of hashed entry names for lookup. See here for basics: http://xfs.org/docs/xfsdocs-xml-dev/XFS_Filesystem_Structure//tmp/en-US/html/Directories.html ... and here for a diagram: http://xfs.org/docs/xfsdocs-xml-dev/XFS_Filesystem_Structure//tmp/en-US/html/Node_Directories.html > And why are the blocks pointing to a non-XD2D block? > > Here is the block to which one of the valid extents point to: > > http://magnifier.sourceforge.net/temp/xfs/correct_block_xd2d.png > > And here is a block to which one of the extents that I cannot > interpretate point to: > > http://magnifier.sourceforge.net/temp/xfs/wierd_block_xd2d.png > and another one: > http://magnifier.sourceforge.net/temp/xfs/wierd_xfs_dir2_data_entry.png > The 0xFEBE magic seems to confirm the second one as a node block. Brian > Any ideas??? > > I already worked so much on this, but I cannot figure out =( > > thanks, > -- > Felipe Monteiro de Carvalho > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From bfoster@redhat.com Wed Aug 6 06:42: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 BC47D7F9D for ; Wed, 6 Aug 2014 06:42:04 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 9A3B08F804B for ; Wed, 6 Aug 2014 04:42:04 -0700 (PDT) X-ASG-Debug-ID: 1407325323-04cbb03b9d2b730001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id rB72DiF4hyE45VnM (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 06 Aug 2014 04:42: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 s76Bft1F004020 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 6 Aug 2014 07:41:55 -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 s76BfsS7011501; Wed, 6 Aug 2014 07:41:55 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id DD8F712577C; Wed, 6 Aug 2014 07:41:53 -0400 (EDT) Date: Wed, 6 Aug 2014 07:41:53 -0400 From: Brian Foster To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 2/6] xfs: consolidate superblock logging functions Message-ID: <20140806114153.GB14820@bfoster.bfoster> X-ASG-Orig-Subj: Re: [PATCH 2/6] xfs: consolidate superblock logging functions References: <1406791995-14723-1-git-send-email-david@fromorbit.com> <1406791995-14723-3-git-send-email-david@fromorbit.com> <20140801143929.GC3582@laptop.bfoster> <20140804080930.GY20518@dastard> <20140804124836.GA4049@bfoster.bfoster> <20140804221526.GZ20518@dastard> <20140805000333.GA27760@bfoster.bfoster> <20140805003440.GB20518@dastard> <20140805123050.GA53538@bfoster.bfoster> <20140805195906.GY26465@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140805195906.GY26465@dastard> User-Agent: Mutt/1.5.23 (2014-03-12) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.27 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1407325323 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Wed, Aug 06, 2014 at 05:59:06AM +1000, Dave Chinner wrote: > On Tue, Aug 05, 2014 at 08:30:51AM -0400, Brian Foster wrote: > > On Tue, Aug 05, 2014 at 10:34:40AM +1000, Dave Chinner wrote: > > > On Mon, Aug 04, 2014 at 08:03:33PM -0400, Brian Foster wrote: > > > > On Tue, Aug 05, 2014 at 08:15:26AM +1000, Dave Chinner wrote: > > > > > e.g. did you know that the xfs_fs_writable() check in > > > > > xfs_log_sbcount() is to prevent it from writing anything when > > > > > unmounting a fully frozen filesystem? i.e. xfs_log_sbcount needs to > > > > > succeed while a freeze is in progress, but fail when a freeze is > > > > > fully complete? > > > > > > > > > > > > > Hmm, so freeze_super() sets s_frozen to SB_FREEZE_FS before it calls > > > > into the fs. Given the xfs_fs_writable() logic, how is that going to > > > > differentiate a freezing fs from a frozen fs? It makes sense that this > > > > would avoid blocking on umount of a frozen fs, but it seems like we'd > > > > skip out just the same during the freeze sequence. Maybe I'm missing > > > > something... > > > > > > Hmmm - that means we broke it at some point. xfs_attr_quiesce is > > > supposed to make the metadata uptodate on disk, so if it's not > > > updating the superblock (i.e. syncing all the counters) then it's > > > not doing the right thing - the sb counters on disk while the fs is > > > frozen are not uptodate and hence correct behaviour if we crash with > > > a frozen fs is dependent on log recovery finding a dirty log. That's > > > a nasty little landmine and needs to be fixed, even though it's not > > > causing issues at the moment (because we dirty the log after > > > quiescing the filesystem). > > > > > > > I'm wondering if that even helps in the case of a crash. It looks like > > we would skip the counter sync and subsequent action of logging the sb > > entirely. > > > > Oh, according to the lazy sb counter commit log description we do some > > kind of counter rebuild across the AGI/AGF structures and log the result > > of that. So I take it that should a crash occur while in the frozen > > state, the simple act of causing a log recovery to occur on subsequent > > mount should rebuild everything correctly. > > Right - it's log recovery that is hiding that little gem. We've been > talking about whether we can change freeze to leave the log clean > and so avoid the need for log recovery in snapshot images. If we > did that, then we'd have exposed this bug.... > > > > Did I mention this code is not at all obvious? :/ > > > > > > > Heh. :P From what I can see, it looks like this has been the case since > > commit 92821e2b, which introduced xfs_log_sbcount(). > > *nod* > > > Perhaps xfs_log_sbcount() requires an open coded s_frozen check a la > > the _xfs_trans_alloc() logic. E.g., skip out of SB_FREEZE_COMPLETE, > > proceed otherwise..? > > Possibly. But it still also needs the RO and shutdown checks. > Perhaps passing xfs_fs_writable() a freeze level and checking > against that? > Right.. I was thinking of open coding the whole thing and modifying the freeze check. Using a param to xfs_fs_writable() sounds generally nicer though and we can prevent any future landmines over 'if (...->s_writers.frozen)' logic. I'll give that a whirl. Brian > Cheers, > > Dave. > -- > Dave Chinner > david@fromorbit.com > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From webmaster@dev103.magizz.com Wed Aug 6 06:54: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,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 EBC687F9F for ; Wed, 6 Aug 2014 06:54:25 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id CAC4D304059 for ; Wed, 6 Aug 2014 04:54:22 -0700 (PDT) X-ASG-Debug-ID: 1407326060-04cb6c75af2b440001-NocioJ Received: from vps.magizz.com (vps.magizz.com [162.251.83.157]) by cuda.sgi.com with ESMTP id ijZiQQSSksbDKZz1 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 06 Aug 2014 04:54:20 -0700 (PDT) X-Barracuda-Envelope-From: webmaster@dev103.magizz.com X-Barracuda-Apparent-Source-IP: 162.251.83.157 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=dev103.magizz.com; s=default; h=Content-Type:MIME-Version:List-Owner:List-Subscribe:List-Unsubscribe:List-Help:Message-ID:Reply-To:From:Date:Subject:To; bh=VJhgMhelojDqY9DsdkeGpbQR5U0JmxMxniGqgfsCsnY=; b=bkr2YdKNfHCrmEJAIgPkxzsZgizsOiIJaFW6YZeDMMckqL/2HyWTpZoaQoR7KmUuLoyX+fImbAHDfGyWoDLeoYUhLIwdLBORpBcEAtUqzH8LnY4qA/EQpEGr3uVUVxAXE5hRdeZO/9D5SzV/K1deFGNyDu9Gn4O4Geqf9RUvSlQ=; Received: from dev103magizz by vps.magizz.com with local (Exim 4.82) (envelope-from ) id 1XEznS-0006Lb-BD for xfs@oss.sgi.com; Wed, 06 Aug 2014 15:54:22 +0400 To: xfs@oss.sgi.com Subject: You have Won a chance to get Expensive Smartphone X-PHP-Script: dev103.magizz.com/mailz/admin/index.php for 122.169.6.221 X-ASG-Orig-Subj: You have Won a chance to get Expensive Smartphone Received: from abts-mum-dynamic-221.6.169.122.airtelbroadband.in [122.169.6.221] by dev103.magizz.com with HTTP; Wed, 06 Aug 2014 10:12:43 +0000 Date: Wed, 6 Aug 2014 11:54:22 +0000 From: Hit the Jackpot Reply-To: Hit the Jackpot Message-ID: <33fd7cd461b2c54e73f3e049de0e4dde@dev103.magizz.com> X-Priority: 3 X-Mailer: PHPMailer 5.2.5 (https://github.com/Synchro/PHPMailer/) X-phpList-version: 3.0.6 X-MessageID: 3 X-ListMember: xfs@oss.sgi.com Precedence: bulk Bounces-To: webmaster@dev103.magizz.com List-Help: List-Unsubscribe: List-Subscribe: List-Owner: MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="b1_33fd7cd461b2c54e73f3e049de0e4dde" X-AntiAbuse: This header was added to track abuse, please include it with any abuse report X-AntiAbuse: Primary Hostname - vps.magizz.com X-AntiAbuse: Original Domain - oss.sgi.com X-AntiAbuse: Originator/Caller UID/GID - [506 517] / [47 12] X-AntiAbuse: Sender Address Domain - dev103.magizz.com X-Get-Message-Sender-Via: vps.magizz.com: authenticated_id: dev103magizz/from_h X-Barracuda-Connect: vps.magizz.com[162.251.83.157] X-Barracuda-Start-Time: 1407326060 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.54 X-Barracuda-Spam-Status: No, SCORE=0.54 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED, HTML_FONT_LOW_CONTRAST, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.8175 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.54 HTML_FONT_LOW_CONTRAST BODY: HTML font color similar to background 0.00 HTML_MESSAGE BODY: HTML included in message --b1_33fd7cd461b2c54e73f3e049de0e4dde Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable =20 Samsung Galaxy Note 3 Android v4.3 OS=20 13 MP Primary Camera=20 2 MP Secondary Camera=20 5.7-inch Touchscreen Claim Now Samsung Galaxy Note 3 Android v4.3 OS=20 13 MP Primary Camera=20 2 MP Secondary Camera=20 5.7-inch Touchscreen Claim Now Samsung Galaxy Note 3 Android v4.3 OS=20 13 MP Primary Camera=20 2 MP Secondary Camera=20 5.7-inch Touchscreen Claim Now Fasten Up, To View Your Gifts. -- This message was sent to xfs@oss.sgi.com by swati@dev103.magizz.com To forward this message, please do not use the forward button of your email application, because this message was made specifically for you only. Instead use the forward page=0A in our newsletter system. To change your details and to choose which lists to be subscribed to, visit your personal preferences page=0A Or you can UNSUBSCRIBE for this panel=0A from all future mailings. =20 amj --b1_33fd7cd461b2c54e73f3e049de0e4dde Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: quoted-printable =0A =0A

 

3D"Congrats
3D"Dont
3D"Apple
 
3D"iPhone
 
Samsung = Galaxy Note 3
 
Android v4.3 OS
13 MP Primary Camera
2 MP Secondary Camera
5.7-inch Touchscreen
 
Claim Now
 
 
3D"iPhone
 
Samsung = Galaxy Note 3
 
Android v4.3 OS
13 MP Primary Camera
2 MP Secondary Camera
5.7-inch Touchscreen
 
Claim Now
 
 
3D"iPhone
 
Samsung = Galaxy Note 3
 
Android v4.3 OS
13 MP Primary Camera
2 MP Secondary Camera
5.7-inch Touchscreen
 
Claim Now
 
Fasten Up, To View Your Gifts.

-- =20

This message was sent to xfs@oss.sgi.com by swati@dev103.magizz.co= m

To forward this message, please do not use the forward button of y= our email application, because this message was made specifically for you o= nly. Instead use the forward page in our newsletter system.
To change your details and to choose which lists to be subscribed to,= visit your personal preferences page
Or you can UNSUBSCRIBE for this panel from all future mailings.

=0Aamj --b1_33fd7cd461b2c54e73f3e049de0e4dde-- From bfoster@redhat.com Wed Aug 6 07:24: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 469417F98 for ; Wed, 6 Aug 2014 07:24:54 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 16674304043 for ; Wed, 6 Aug 2014 05:24:50 -0700 (PDT) X-ASG-Debug-ID: 1407327889-04bdf06ed22d120001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 3qMtOfmWNCXlZU0l (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 06 Aug 2014 05:24:49 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s76COiRU002187 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 6 Aug 2014 08:24: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 s76COh0f002576; Wed, 6 Aug 2014 08:24:43 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 8818712577C; Wed, 6 Aug 2014 08:24:42 -0400 (EDT) Date: Wed, 6 Aug 2014 08:24:42 -0400 From: Brian Foster To: Hans Wennborg Cc: david@fromorbit.com, xfs@oss.sgi.com, linux-kernel@vger.kernel.org Subject: Re: [PATCH 14/15] xfs: fix decimal printf format specifiers prefixed with 0x Message-ID: <20140806122442.GC14820@bfoster.bfoster> X-ASG-Orig-Subj: Re: [PATCH 14/15] xfs: fix decimal printf format specifiers prefixed with 0x References: <1407300256-495-1-git-send-email-hans@hanshq.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1407300256-495-1-git-send-email-hans@hanshq.net> 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: 1407327889 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Tue, Aug 05, 2014 at 09:44:16PM -0700, Hans Wennborg wrote: > The prefix suggests the number should be printed in hex, so use > the %x specifier to do that. > > Found by using regex suggested by Joe Perches. > > Signed-off-by: Hans Wennborg > --- > fs/xfs/xfs_discard.c | 2 +- > 1 file changed, 1 insertion(+), 1 deletion(-) > > diff --git a/fs/xfs/xfs_discard.c b/fs/xfs/xfs_discard.c > index 13d08a1..b4a2415 100644 > --- a/fs/xfs/xfs_discard.c > +++ b/fs/xfs/xfs_discard.c > @@ -228,7 +228,7 @@ xfs_discard_extents( > GFP_NOFS, 0); > if (error && error != -EOPNOTSUPP) { > xfs_info(mp, > - "discard failed for extent [0x%llu,%u], error %d", > + "discard failed for extent [0x%llx,%u], error %d", > (unsigned long long)busyp->bno, > busyp->length, > error); It's kind of annoying seeing values of multiple bases being used to describe a single extent, imo. But using 0x before a decimal value certainly isn't nice... ;) Reviewed-by: Brian Foster > -- > 2.0.0.526.g5318336 > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From felipemonteiro.carvalho@gmail.com Wed Aug 6 07:31: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,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 985D97FA1 for ; Wed, 6 Aug 2014 07:31:13 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 83646304043 for ; Wed, 6 Aug 2014 05:31:13 -0700 (PDT) X-ASG-Debug-ID: 1407328271-04cb6c75af2c850001-NocioJ Received: from mail-pa0-f49.google.com (mail-pa0-f49.google.com [209.85.220.49]) by cuda.sgi.com with ESMTP id tblYi8RDYzwEdAQ9 (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Wed, 06 Aug 2014 05:31:12 -0700 (PDT) X-Barracuda-Envelope-From: felipemonteiro.carvalho@gmail.com X-Barracuda-RBL-Trusted-Forwarder: 209.85.220.49 Received: by mail-pa0-f49.google.com with SMTP id hz1so3324455pad.22 for ; Wed, 06 Aug 2014 05:31:11 -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=onYdBJzTW45PNAdOqHlA5TlimklwrTm23CN3QLDP0yE=; b=n14jSuB40OFtD+38oSs7zgdrA52hKzuOZ9XcreX6jgn6t0jiDU/pG0QGtT2A6haZP2 NrpAZkHb+t40dfiZ8kVaa/G4PE/sVjUDI2GEhoijX8r0Vbu1GIfsBpsxoEmWoHR3s0EH nq/gLD6wGZxJ5Xfn7pbSZu5QYOvExg61MXwJ5AWMzldx28qdXedMvzapKJIHAge6Amz4 EfNWTtH/sk7zPSuQ8yNlk1Su+krbxp+U8PD7ErnbPs6nwC/AI+MD6MK2gvKV/q8u3gu7 XtQHrE+jL3MEqDLN2INE6JyRZsCZrtZFrbDnftH1w1wkYozpW671pnRhMUQZ1wYOqzSV 3rPw== X-Barracuda-BBL-IP: nil MIME-Version: 1.0 X-Received: by 10.70.88.105 with SMTP id bf9mr11239654pdb.54.1407328271492; Wed, 06 Aug 2014 05:31:11 -0700 (PDT) Received: by 10.66.50.9 with HTTP; Wed, 6 Aug 2014 05:31:11 -0700 (PDT) In-Reply-To: <20140806113447.GA14820@bfoster.bfoster> References: <20140806113447.GA14820@bfoster.bfoster> Date: Wed, 6 Aug 2014 14:31:11 +0200 Message-ID: Subject: Re: xfs_bmbt_rec_64 leading to wrong blocks From: Felipe Monteiro de Carvalho X-ASG-Orig-Subj: Re: xfs_bmbt_rec_64 leading to wrong blocks To: Brian Foster Cc: xfs@oss.sgi.com Content-Type: text/plain; charset=UTF-8 X-Barracuda-Connect: mail-pa0-f49.google.com[209.85.220.49] X-Barracuda-Start-Time: 1407328272 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.8176 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 Thanks! Indeed that's it =) One strange thing however is that in my xfs_dir2_data.h there is: #define XFS_DIR2_DATA_ALIGN_LOG 3 /* i.e., 8 bytes */ #define XFS_DIR2_SPACE_SIZE (1ULL << (32 + XFS_DIR2_DATA_ALIGN_LOG)) #define XFS_DIR2_LEAF_SPACE 1 #define XFS_DIR2_LEAF_OFFSET (XFS_DIR2_LEAF_SPACE * XFS_DIR2_SPACE_SIZE) That doesn't match the number that I am seeing here for the offset. Here I see 1 << 23, but according to the headers it should be 1 << 35 -- Felipe Monteiro de Carvalho On Wed, Aug 6, 2014 at 1:34 PM, Brian Foster wrote: > On Wed, Aug 06, 2014 at 12:12:12PM +0200, Felipe Monteiro de Carvalho wrote: >> Hello, >> >> I am writing a software which reads xfs partitions and it is working >> well so far, but, at in a particular folder with 10k files, only 7k >> files appear, the other ones don't. >> >> I read an inode which has di_core.di_format = XFS_DINODE_FMT_BTREE >> >> No problem here, the btree is trivial, it has only 1 element inside >> it, which leads to a list of 82 extends. >> >> Extends 0..52 aprox. are all great, and work fine. >> >> Extent 53 (and other ones after that) point to very wierd memory areas >> which don't match the pattern that I saw previously =( >> >> Here is the hex data of the extents, the selected extent in nr 53: >> >> http://magnifier.sourceforge.net/temp/xfs/extent_with_xfs_bmbt_rec_64.png >> >> And here is debug information showing which values I extracted from this table: >> >> i=0 FLocalExtent.StartOff=0 FLocalExtent.StartBlock=66748 >> FLocalExtent.BlockCount=1 lStartBlock=65212 >> i=1 FLocalExtent.StartOff=1 FLocalExtent.StartBlock=66758 >> FLocalExtent.BlockCount=2 lStartBlock=65222 >> i=2 FLocalExtent.StartOff=3 FLocalExtent.StartBlock=66772 >> FLocalExtent.BlockCount=1 lStartBlock=65236 >> .... >> >> i=51 FLocalExtent.StartOff=77 FLocalExtent.StartBlock=67468 >> FLocalExtent.BlockCount=1 lStartBlock=65932 >> i=52 FLocalExtent.StartOff=78 FLocalExtent.StartBlock=67479 >> FLocalExtent.BlockCount=1 lStartBlock=65943 >> i=53 FLocalExtent.StartOff=8388608 FLocalExtent.StartBlock=66749 >> FLocalExtent.BlockCount=1 lStartBlock=65213 >> i=54 FLocalExtent.StartOff=8388609 FLocalExtent.StartBlock=66783 >> FLocalExtent.BlockCount=2 lStartBlock=65247 >> ... >> >> Note how StartOff is suddenly so big! But I manually checked the bits >> comparing to xfs_bmbt_rec_64 and the value written is that one. But >> what sense does it make for StartOff to jump like that? >> > > Assuming 4k blocks, 8388608 is 32G, which is the offset interval used > for some internal sections of directories on XFS. If this is a > directory, it could be a node/leaf or freelist block. Looking at > xfs_da_format.h, it looks like XFS_DIR2_LEAF_OFFSET points to this > offset. This block basically points to a btree of hashed entry names for > lookup. See here for basics: > > http://xfs.org/docs/xfsdocs-xml-dev/XFS_Filesystem_Structure//tmp/en-US/html/Directories.html > > ... and here for a diagram: > > http://xfs.org/docs/xfsdocs-xml-dev/XFS_Filesystem_Structure//tmp/en-US/html/Node_Directories.html > >> And why are the blocks pointing to a non-XD2D block? >> >> Here is the block to which one of the valid extents point to: >> >> http://magnifier.sourceforge.net/temp/xfs/correct_block_xd2d.png >> >> And here is a block to which one of the extents that I cannot >> interpretate point to: >> >> http://magnifier.sourceforge.net/temp/xfs/wierd_block_xd2d.png >> and another one: >> http://magnifier.sourceforge.net/temp/xfs/wierd_xfs_dir2_data_entry.png >> > > The 0xFEBE magic seems to confirm the second one as a node block. > > Brian > >> Any ideas??? >> >> I already worked so much on this, but I cannot figure out =( >> >> thanks, >> -- >> Felipe Monteiro de Carvalho >> >> _______________________________________________ >> xfs mailing list >> xfs@oss.sgi.com >> http://oss.sgi.com/mailman/listinfo/xfs -- Felipe Monteiro de Carvalho From david@fromorbit.com Wed Aug 6 07:32: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=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id B8A187FA3 for ; Wed, 6 Aug 2014 07:32:34 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 8A7538F8050 for ; Wed, 6 Aug 2014 05:32:31 -0700 (PDT) X-ASG-Debug-ID: 1407328349-04bdf06ed12d550001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id oublZvUZlmmJL0Hs for ; Wed, 06 Aug 2014 05:32:29 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.131 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AlQHAFsf4lN5LDJ8/2dsb2JhbABagw1SV4Inq3UBAQEBAQEGngGHSAGBDxd3hAMBAQQBOhwjBQsIAxgJJQ8FJQMhE4g6Bw7DXRiFZIdAghAHhEsFlSuGZpRmg2YrLwE Received: from ppp121-44-50-124.lns20.syd6.internode.on.net (HELO dastard) ([121.44.50.124]) by ipmail07.adl2.internode.on.net with ESMTP; 06 Aug 2014 22:02:28 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1XF0O7-00084j-9U; Wed, 06 Aug 2014 22:32:15 +1000 Date: Wed, 6 Aug 2014 22:32:15 +1000 From: Dave Chinner To: Alex Lyakas Cc: xfs@oss.sgi.com Subject: Re: use-after-free on log replay failure Message-ID: <20140806123215.GJ20518@dastard> X-ASG-Orig-Subj: Re: use-after-free on log replay failure References: <20140113204314.GJ3469@dastard> <20140115014503.GQ3469@dastard> <20140119231745.GF18112@dastard> <4B2A412C75324EE9880358513C069476@alyakaslap> <9D3CBECB663B4A77B7EF74B67973310A@alyakaslap> <20140804230721.GA20518@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: 1407328349 X-Barracuda-URL: http://192.48.157.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.8176 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words On Wed, Aug 06, 2014 at 01:05:34PM +0300, Alex Lyakas wrote: > Hi Dave, > > On Tue, Aug 5, 2014 at 2:07 AM, Dave Chinner wrote: > > On Mon, Aug 04, 2014 at 02:00:05PM +0300, Alex Lyakas wrote: > >> Greetings, > >> > >> we had a log replay failure due to some errors that the underlying > >> block device returned: > >> [49133.801406] XFS (dm-95): metadata I/O error: block 0x270e8c180 > >> ("xlog_recover_iodone") error 28 numblks 16 > >> [49133.802495] XFS (dm-95): log mount/recovery failed: error 28 > >> [49133.802644] XFS (dm-95): log mount failed > > > > #define ENOSPC 28 /* No space left on device */ > > > > You're getting an ENOSPC as a metadata IO error during log recovery? > > Thin provisioning problem, perhaps, > Yes, it is a thin provisioning problem (which I already know the cause for). > > > and the error is occurring on > > submission rather than completion? If so: > > > > 8d6c121 xfs: fix buffer use after free on IO error > I am not sure what do you mean by "submission rather than completion". > Do you mean that xfs_buf_ioapply_map() returns without submitting any > bios? No, that the bio submission results in immediate failure (e.g. the device goes away, so submission results in ENODEV). Hence when _xfs_buf_ioapply() releases it's IO reference itis the only remaining reference to the buffer and so completion processing is run immediately. i.e. inline from the submission path. Normally IO errors are reported through the bio in IO completion interrupt context. i.e the IO is completed by the hardware and the error status is attached to bio, which is then completed and we get into XFS that way. The IO submision context is long gone at this point.... > In that case, no, bios are submitted to the block device, and it > fails them through a different context with ENOSPC error. I will still > try the patch you mentioned, because it also looks relevant to another > question I addressed to you earlier in: > http://oss.sgi.com/archives/xfs/2013-11/msg00648.html No, that's a different problem. 9c23ecc xfs: unmount does not wait for shutdown during unmount Cheers, Dave. -- Dave Chinner david@fromorbit.com From alex@zadarastorage.com Wed Aug 6 07:52: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=1.9 required=5.0 tests=STOX_REPLY_TYPE 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 8A3237FA1 for ; Wed, 6 Aug 2014 07:52:04 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 770128F8050 for ; Wed, 6 Aug 2014 05:52:04 -0700 (PDT) X-ASG-Debug-ID: 1407329521-04cbb03b9b2e220001-NocioJ Received: from mail-wg0-f50.google.com (mail-wg0-f50.google.com [74.125.82.50]) by cuda.sgi.com with ESMTP id fpxyp5rD3POUi1Yx (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Wed, 06 Aug 2014 05:52:02 -0700 (PDT) X-Barracuda-Envelope-From: alex@zadarastorage.com X-Barracuda-Apparent-Source-IP: 74.125.82.50 Received: by mail-wg0-f50.google.com with SMTP id n12so2617334wgh.9 for ; Wed, 06 Aug 2014 05:52:01 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:message-id:from:to:cc:references:in-reply-to :subject:date:mime-version:content-type:content-transfer-encoding :importance; bh=fQ7OmYBqF6eptiwuhyTEhx1EDodC3ujBuEfw9wyBMVw=; b=kvEYSMYgArHyOq+aJ00ET/70oVG6Dc5iQChIlD/gSXQp/IhVsAQpaTeLCz3q/0okcX hW6WIKalu8I27fN/fO7iAcRpQjI4fFnde9WvKuvjvqelqgN28bGv55YZA89vRQQL3iMk hDC4AsDMFBY4UF+NVwvpfLuDaGNwmMO+NS5aRx44mTRjWVffpr2SCBp+A1aAXpXCRiN3 qZHvc/W9l3m+gKsNgkh8C6HxpxGWbgQBeMTIugNhSo9+a1qv7z92Rsku+4kLU6FJUDK4 UfJJF/qm/bHRgshEt7NakE3bfbhVcAssaprzksOGXKltc5wWKmKcWZ+xWYKSn8OaolWp MflQ== X-Gm-Message-State: ALoCoQmWGPW72LRiBlKzC5oru/TxBJcZh4slDcrOOGC/8xieghY22HzKN1O0eY3srWZfYtlwxQUS X-Received: by 10.180.35.134 with SMTP id h6mr16367718wij.0.1407329520919; Wed, 06 Aug 2014 05:52:00 -0700 (PDT) Received: from alyakaslap ([212.143.144.103]) by mx.google.com with ESMTPSA id bt9sm2287274wjc.40.2014.08.06.05.51.59 for (version=TLSv1 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Wed, 06 Aug 2014 05:52:00 -0700 (PDT) Message-ID: From: "Alex Lyakas" To: "Dave Chinner" Cc: , References: <20140113030230.GF3469@dastard> <20140113204314.GJ3469@dastard> <20140115014503.GQ3469@dastard> <20140119231745.GF18112@dastard> <4B2A412C75324EE9880358513C069476@alyakaslap> <9D3CBECB663B4A77B7EF74B67973310A@alyakaslap> <20140804230721.GA20518@dastard> In-Reply-To: <20140804230721.GA20518@dastard> Subject: Re: use-after-free on log replay failure Date: Wed, 6 Aug 2014 15:52:03 +0300 X-ASG-Orig-Subj: Re: use-after-free on log replay failure MIME-Version: 1.0 Content-Type: text/plain; format=flowed; charset="iso-8859-1"; reply-type=original Content-Transfer-Encoding: 8bit X-Priority: 3 X-MSMail-Priority: Normal Importance: Normal X-Mailer: Microsoft Windows Live Mail 15.4.3555.308 X-MimeOLE: Produced By Microsoft MimeOLE V15.4.3555.308 X-Barracuda-Connect: mail-wg0-f50.google.com[74.125.82.50] X-Barracuda-Start-Time: 1407329522 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, MARKETING_SUBJECT, STOX_REPLY_TYPE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.8176 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 STOX_REPLY_TYPE STOX_REPLY_TYPE 0.60 MARKETING_SUBJECT Subject contains popular marketing words 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header Hello Dave and Brian, Dave, I tried the patch you suggested, but it does not fix the issue. I did some further digging, and it appears that _xfs_buf_ioend(schedule=1) can be called from xfs_buf_iorequest(), which the patch fixes, but also from xfs_buf_bio_end_io() which is my case. I am reproducing the issue pretty easily. The flow that I have is like this: - xlog_recover() calls xlog_find_tail(). This works alright. - Now I add a small sleep before calling xlog_do_recover(), and meanwhile I instruct my block device to return ENOSPC for any WRITE from now on. What seems to happen is that several WRITE bios are submitted and they all fail. When they do, they reach xfs_buf_ioend() through a stack like this: Aug 6 15:23:07 dev kernel: [ 304.410528] [56]xfs*[xfs_buf_ioend:1056] XFS(dm-19): Scheduling xfs_buf_iodone_work on error Aug 6 15:23:07 dev kernel: [ 304.410534] Pid: 56, comm: kworker/u:1 Tainted: G W O 3.8.13-557-generic #1382000791 Aug 6 15:23:07 dev kernel: [ 304.410537] Call Trace: Aug 6 15:23:07 dev kernel: [ 304.410587] [] xfs_buf_ioend+0x1a4/0x1b0 [xfs] Aug 6 15:23:07 dev kernel: [ 304.410621] [] _xfs_buf_ioend+0x25/0x30 [xfs] Aug 6 15:23:07 dev kernel: [ 304.410643] [] xfs_buf_bio_end_io+0x3d/0x50 [xfs] Aug 6 15:23:07 dev kernel: [ 304.410652] [] bio_endio+0x1d/0x40 ... At this point, they are scheduled to run xlog_recover_iodone through xfslogd_workqueue. The first callback that gets called, calls xfs_do_force_shutdown in stack like this: Aug 6 15:23:07 dev kernel: [ 304.411791] XFS (dm-19): metadata I/O error: block 0x3780001 ("xlog_recover_iodone") error 28 numblks 1 Aug 6 15:23:07 dev kernel: [ 304.413493] XFS (dm-19): xfs_do_force_shutdown(0x1) called from line 377 of file /mnt/work/alex/xfs/fs/xfs/xfs_log_recover.c. Return address = 0xffffffffa0526848 Aug 6 15:23:07 dev kernel: [ 304.413837] [] xfs_do_force_shutdown+0x40/0x180 [xfs] Aug 6 15:23:07 dev kernel: [ 304.413870] [] ? xlog_recover_iodone+0x48/0x70 [xfs] Aug 6 15:23:07 dev kernel: [ 304.413902] [] xlog_recover_iodone+0x48/0x70 [xfs] Aug 6 15:23:07 dev kernel: [ 304.413923] [] xfs_buf_iodone_work+0x4d/0xa0 [xfs] Aug 6 15:23:07 dev kernel: [ 304.413930] [] process_one_work+0x141/0x4a0 Aug 6 15:23:07 dev kernel: [ 304.413937] [] worker_thread+0x168/0x410 Aug 6 15:23:07 dev kernel: [ 304.413943] [] ? manage_workers+0x120/0x120 Aug 6 15:23:07 dev kernel: [ 304.413949] [] kthread+0xc0/0xd0 Aug 6 15:23:07 dev kernel: [ 304.413954] [] ? flush_kthread_worker+0xb0/0xb0 Aug 6 15:23:07 dev kernel: [ 304.413976] [] ret_from_fork+0x7c/0xb0 Aug 6 15:23:07 dev kernel: [ 304.413986] [] ? flush_kthread_worker+0xb0/0xb0 Aug 6 15:23:07 dev kernel: [ 304.413990] ---[ end trace 988d698520e1fa81 ]--- Aug 6 15:23:07 dev kernel: [ 304.414012] XFS (dm-19): I/O Error Detected. Shutting down filesystem Aug 6 15:23:07 dev kernel: [ 304.415936] XFS (dm-19): Please umount the filesystem and rectify the problem(s) But the rest of the callbacks also arrive: Aug 6 15:23:07 dev kernel: [ 304.417812] XFS (dm-19): metadata I/O error: block 0x3780002 ("xlog_recover_iodone") error 28 numblks 1 Aug 6 15:23:07 dev kernel: [ 304.420420] XFS (dm-19): xfs_do_force_shutdown(0x1) called from line 377 of file /mnt/work/alex/xfs/fs/xfs/xfs_log_recover.c. Return address = 0xffffffffa0526848 Aug 6 15:23:07 dev kernel: [ 304.420427] XFS (dm-19): metadata I/O error: block 0x3780008 ("xlog_recover_iodone") error 28 numblks 8 Aug 6 15:23:07 dev kernel: [ 304.422708] XFS (dm-19): xfs_do_force_shutdown(0x1) called from line 377 of file /mnt/work/alex/xfs/fs/xfs/xfs_log_recover.c. Return address = 0xffffffffa0526848 Aug 6 15:23:07 dev kernel: [ 304.422738] XFS (dm-19): metadata I/O error: block 0x3780010 ("xlog_recover_iodone") error 28 numblks 8 The mount sequence fails and goes back to the caller: Aug 6 15:23:07 dev kernel: [ 304.423438] XFS (dm-19): log mount/recovery failed: error 28 Aug 6 15:23:07 dev kernel: [ 304.423757] XFS (dm-19): log mount failed But there are still additional callbacks to deliver, which the mount sequence did not wait for! Aug 6 15:23:07 dev kernel: [ 304.425717] XFS (@dR): xfs_do_force_shutdown(0x1) called from line 377 of file /mnt/work/alex/xfs/fs/xfs/xfs_log_recover.c. Return address = 0xffffffffa0526848 Aug 6 15:23:07 dev kernel: [ 304.425723] XFS (@dR): metadata I/O error: block 0x3780018 ("xlog_recover_iodone") error 28 numblks 8 Aug 6 15:23:07 dev kernel: [ 304.428239] XFS (@dR): xfs_do_force_shutdown(0x1) called from line 377 of file /mnt/work/alex/xfs/fs/xfs/xfs_log_recover.c. Return address = 0xffffffffa0526848 Aug 6 15:23:07 dev kernel: [ 304.428246] XFS (@dR): metadata I/O error: block 0x37800a0 ("xlog_recover_iodone") error 28 numblks 16 Notice the junk that they are printing! Naturally, because xfs_mount structure has been kfreed. Finally the kernel crashes (instead of printing junk), because the xfs_mount structure is gone, but the callback tries to access it (printing the name): Aug 6 15:23:07 dev kernel: [ 304.430796] general protection fault: 0000 [#1] SMP Aug 6 15:23:07 dev kernel: [ 304.432035] Modules linked in: xfrm_user xfrm4_tunnel tunnel4 ipcomp xfrm_ipcomp esp4 ah4 iscsi_scst_tcp(O) scst_vdisk(O) scst(O) dm_zcache(O) dm_btrfs(O) xfs(O) btrfs(O) libcrc32c raid456(O) async_pq async_xor xor async_memcpy async_raid6_recov raid6_pq async_tx raid1(O) md_mod deflate zlib_deflate ctr twofish_generic twofish_x86_64_3way glue_helper lrw xts gf128mul twofish_x86_64 twofish_common camellia_generic serpent_generic blowfish_generic blowfish_x86_64 blowfish_common cast5_generic cast_common des_generic xcbc rmd160 sha512_generic crypto_null af_key xfrm_algo dm_round_robin kvm vfat fat ppdev psmouse microcode nfsd nfs_acl dm_multipath(O) serio_raw parport_pc nfsv4 dm_iostat(O) mac_hid i2c_piix4 auth_rpcgss nfs fscache lockd sunrpc lp parport floppy Aug 6 15:23:07 dev kernel: [ 304.432035] CPU 1 Aug 6 15:23:07 dev kernel: [ 304.432035] Pid: 133, comm: kworker/1:1H Tainted: G W O 3.8.13-557-generic #1382000791 Bochs Bochs Aug 6 15:23:07 dev kernel: [ 304.432035] RIP: 0010:[] [] strnlen+0xb/0x30 Aug 6 15:23:07 dev kernel: [ 304.432035] RSP: 0018:ffff880035461b08 EFLAGS: 00010086 Aug 6 15:23:07 dev kernel: [ 304.432035] RAX: 0000000000000000 RBX: ffffffff81e6a4e7 RCX: 0000000000000000 Aug 6 15:23:07 dev kernel: [ 304.432035] RDX: e4e8390a265c0000 RSI: ffffffffffffffff RDI: e4e8390a265c0000 Aug 6 15:23:07 dev kernel: [ 304.432035] RBP: ffff880035461b08 R08: 000000000000ffff R09: 000000000000ffff Aug 6 15:23:07 dev kernel: [ 304.432035] R10: 0000000000000000 R11: 00000000000004cd R12: e4e8390a265c0000 Aug 6 15:23:07 dev kernel: [ 304.432035] R13: ffffffff81e6a8c0 R14: 0000000000000000 R15: 000000000000ffff Aug 6 15:23:07 dev kernel: [ 304.432035] FS: 0000000000000000(0000) GS:ffff88007fc80000(0000) knlGS:0000000000000000 Aug 6 15:23:07 dev kernel: [ 304.432035] CS: 0010 DS: 0000 ES: 0000 CR0: 000000008005003b Aug 6 15:23:07 dev kernel: [ 304.432035] CR2: 00007fc902ffbfd8 CR3: 000000007702a000 CR4: 00000000000006e0 Aug 6 15:23:07 dev kernel: [ 304.432035] DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000 Aug 6 15:23:07 dev kernel: [ 304.432035] DR3: 0000000000000000 DR6: 00000000ffff0ff0 DR7: 0000000000000400 Aug 6 15:23:07 dev kernel: [ 304.432035] Process kworker/1:1H (pid: 133, threadinfo ffff880035460000, task ffff880035412e00) Aug 6 15:23:07 dev kernel: [ 304.432035] Stack: Aug 6 15:23:07 dev kernel: [ 304.432035] ffff880035461b48 ffffffff8133dd5e 0000000000000000 ffffffff81e6a4e7 Aug 6 15:23:07 dev kernel: [ 304.432035] ffffffffa0566cba ffff880035461c80 ffffffffa0566cba ffffffff81e6a8c0 Aug 6 15:23:07 dev kernel: [ 304.432035] ffff880035461bc8 ffffffff8133ef59 ffff880035461bc8 ffffffff81c84040 Aug 6 15:23:07 dev kernel: [ 304.432035] Call Trace: Aug 6 15:23:07 dev kernel: [ 304.432035] [] string.isra.4+0x3e/0xd0 Aug 6 15:23:07 dev kernel: [ 304.432035] [] vsnprintf+0x219/0x640 Aug 6 15:23:07 dev kernel: [ 304.432035] [] vscnprintf+0x11/0x30 Aug 6 15:23:07 dev kernel: [ 304.432035] [] vprintk_emit+0xc1/0x490 Aug 6 15:23:07 dev kernel: [ 304.432035] [] ? vprintk_emit+0x170/0x490 Aug 6 15:23:07 dev kernel: [ 304.432035] [] printk+0x61/0x63 Aug 6 15:23:07 dev kernel: [ 304.432035] [] __xfs_printk+0x31/0x50 [xfs] Aug 6 15:23:07 dev kernel: [ 304.432035] [] xfs_notice+0x53/0x60 [xfs] Aug 6 15:23:07 dev kernel: [ 304.432035] [] xfs_do_force_shutdown+0xf5/0x180 [xfs] Aug 6 15:23:07 dev kernel: [ 304.432035] [] ? xlog_recover_iodone+0x48/0x70 [xfs] Aug 6 15:23:07 dev kernel: [ 304.432035] [] xlog_recover_iodone+0x48/0x70 [xfs] Aug 6 15:23:07 dev kernel: [ 304.432035] [] xfs_buf_iodone_work+0x4d/0xa0 [xfs] Aug 6 15:23:07 dev kernel: [ 304.432035] [] process_one_work+0x141/0x4a0 Aug 6 15:23:07 dev kernel: [ 304.432035] [] worker_thread+0x168/0x410 Aug 6 15:23:07 dev kernel: [ 304.432035] [] ? manage_workers+0x120/0x120 Aug 6 15:23:07 dev kernel: [ 304.432035] [] kthread+0xc0/0xd0 Aug 6 15:23:07 dev kernel: [ 304.432035] [] ? flush_kthread_worker+0xb0/0xb0 Aug 6 15:23:07 dev kernel: [ 304.432035] [] ret_from_fork+0x7c/0xb0 Aug 6 15:23:07 dev kernel: [ 304.432035] [] ? flush_kthread_worker+0xb0/0xb0 Aug 6 15:23:07 dev kernel: [ 304.432035] Code: 31 c0 80 3f 00 55 48 89 e5 74 11 48 89 f8 66 90 48 83 c0 01 80 38 00 75 f7 48 29 f8 5d c3 66 90 55 31 c0 48 85 f6 48 89 e5 74 23 <80> 3f 00 74 1e 48 89 f8 eb 0c 0f 1f 00 48 83 ee 01 80 38 00 74 Aug 6 15:23:07 dev kernel: [ 304.432035] RIP [] strnlen+0xb/0x30 Aug 6 15:23:07 dev kernel: [ 304.432035] RSP So previously you said: "So, something is corrupting memory and stamping all over the XFS structures." and also "given you have a bunch of out of tree modules loaded (and some which are experiemental) suggests that you have a problem with your storage...". But I believe, my analysis shows that during the mount sequence XFS does not wait properly for all the bios to complete, before failing the mount sequence back to the caller. Thanks, Alex. -----Original Message----- From: Dave Chinner Sent: 05 August, 2014 2:07 AM To: Alex Lyakas Cc: xfs@oss.sgi.com Subject: Re: use-after-free on log replay failure On Mon, Aug 04, 2014 at 02:00:05PM +0300, Alex Lyakas wrote: > Greetings, > > we had a log replay failure due to some errors that the underlying > block device returned: > [49133.801406] XFS (dm-95): metadata I/O error: block 0x270e8c180 > ("xlog_recover_iodone") error 28 numblks 16 > [49133.802495] XFS (dm-95): log mount/recovery failed: error 28 > [49133.802644] XFS (dm-95): log mount failed #define ENOSPC 28 /* No space left on device */ You're getting an ENOSPC as a metadata IO error during log recovery? Thin provisioning problem, perhaps, and the error is occurring on submission rather than completion? If so: 8d6c121 xfs: fix buffer use after free on IO error Cheers, Dave. -- Dave Chinner david@fromorbit.com From bfoster@redhat.com Wed Aug 6 08:54: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=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id B847A7FA6 for ; Wed, 6 Aug 2014 08:54:34 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id A6A148F804B for ; Wed, 6 Aug 2014 06:54:31 -0700 (PDT) X-ASG-Debug-ID: 1407333270-04cb6c75ad2ffc0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id D1FdIqOD1lJlHBhb (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 06 Aug 2014 06:54:30 -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 s76DsUhF032522 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK) for ; Wed, 6 Aug 2014 09:54:30 -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 s76DsTFF005755 for ; Wed, 6 Aug 2014 09:54:29 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 9E15912577C; Wed, 6 Aug 2014 09:54:28 -0400 (EDT) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH] xfs: allow lazy sb counter sync during filesystem freeze sequence Date: Wed, 6 Aug 2014 09:54:28 -0400 X-ASG-Orig-Subj: [PATCH] xfs: allow lazy sb counter sync during filesystem freeze sequence Message-Id: <1407333268-38768-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: 1407333270 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 The expectation since the introduction the lazy superblock counters is that the counters are synced and superblock logged appropriately as part of the filesystem freeze sequence. This does not occur, however, due to the logic in xfs_fs_writable() that prevents progress when the fs is in any state other than SB_UNFROZEN. While this is a bug, it has not been exposed to date because the last thing XFS does during freeze is dirty the log. The log recovery process recalculates the counters from AGI/AGF metadata to ensure everything is correct. Therefore should a crash occur while an fs is frozen, the subsequent log recovery puts everything back in order. See the following commit for reference: 92821e2b [XFS] Lazy Superblock Counters We might not always want to rely on dirtying the log on a frozen fs. Modify xfs_log_sbcount() to proceed when the filesystem is freezing but not once the freeze process has completed. Modify xfs_fs_writable() to accept the maximum allowable freeze level as a parameter to support the requirements of various codepaths. Signed-off-by: Brian Foster --- I also toyed with using a 'bypass_freezing' bool parameter and leaving the freeze level bits isolated to xfs_fs_writable(), but this actually looked a bit more clean. I'm fine with either way... thoughts? Brian fs/xfs/xfs_log.c | 2 +- fs/xfs/xfs_mount.c | 27 +++++++++++++++++++-------- fs/xfs/xfs_mount.h | 2 +- 3 files changed, 21 insertions(+), 10 deletions(-) diff --git a/fs/xfs/xfs_log.c b/fs/xfs/xfs_log.c index ca4fd5b..7ada70c 100644 --- a/fs/xfs/xfs_log.c +++ b/fs/xfs/xfs_log.c @@ -1031,7 +1031,7 @@ xfs_log_need_covered(xfs_mount_t *mp) struct xlog *log = mp->m_log; int needed = 0; - if (!xfs_fs_writable(mp)) + if (!xfs_fs_writable(mp, SB_UNFROZEN)) return 0; if (!xlog_cil_empty(log)) diff --git a/fs/xfs/xfs_mount.c b/fs/xfs/xfs_mount.c index fbf0384..177b6ea 100644 --- a/fs/xfs/xfs_mount.c +++ b/fs/xfs/xfs_mount.c @@ -1080,11 +1080,21 @@ xfs_unmountfs( xfs_sysfs_del(&mp->m_kobj); } -int -xfs_fs_writable(xfs_mount_t *mp) +/* + * Determine whether modifications can proceed. The caller specifies the maximum + * freeze level that should be allowed to proceed. This allows certain required + * operations to proceed while the freeze sequence is in progress. + */ +bool +xfs_fs_writable( + struct xfs_mount *mp, + int maxfreeze) { - return !(mp->m_super->s_writers.frozen || XFS_FORCED_SHUTDOWN(mp) || - (mp->m_flags & XFS_MOUNT_RDONLY)); + if ((mp->m_super->s_writers.frozen > maxfreeze) || + XFS_FORCED_SHUTDOWN(mp) || (mp->m_flags & XFS_MOUNT_RDONLY)) + return false; + + return true; } /* @@ -1092,9 +1102,9 @@ xfs_fs_writable(xfs_mount_t *mp) * * Sync the superblock counters to disk. * - * Note this code can be called during the process of freezing, so - * we may need to use the transaction allocator which does not - * block when the transaction subsystem is in its frozen state. + * Note this code can be called during the process of freezing, so we use the + * transaction allocator that does not block when the transaction subsystem is + * in its frozen state. */ int xfs_log_sbcount(xfs_mount_t *mp) @@ -1102,7 +1112,8 @@ xfs_log_sbcount(xfs_mount_t *mp) xfs_trans_t *tp; int error; - if (!xfs_fs_writable(mp)) + /* allow this to proceed during the freeze sequence... */ + if (!xfs_fs_writable(mp, SB_FREEZE_COMPLETE)) return 0; xfs_icsb_sync_counters(mp, 0); diff --git a/fs/xfs/xfs_mount.h b/fs/xfs/xfs_mount.h index b0447c8..fd15e5c 100644 --- a/fs/xfs/xfs_mount.h +++ b/fs/xfs/xfs_mount.h @@ -384,7 +384,7 @@ extern int xfs_mount_log_sb(xfs_mount_t *, __int64_t); extern struct xfs_buf *xfs_getsb(xfs_mount_t *, int); extern int xfs_readsb(xfs_mount_t *, int); extern void xfs_freesb(xfs_mount_t *); -extern int xfs_fs_writable(xfs_mount_t *); +extern bool xfs_fs_writable(struct xfs_mount *mp, int maxfreeze); extern int xfs_sb_validate_fsb_count(struct xfs_sb *, __uint64_t); extern int xfs_dev_is_read_only(struct xfs_mount *, char *); -- 1.8.3.1 From himangi774@gmail.com Wed Aug 6 09:13: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.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 1E25B7FA3 for ; Wed, 6 Aug 2014 09:13:52 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id F179F8F804B for ; Wed, 6 Aug 2014 07:13:48 -0700 (PDT) X-ASG-Debug-ID: 1407334426-04cbb03b9c31970001-NocioJ Received: from mail-pa0-f43.google.com (mail-pa0-f43.google.com [209.85.220.43]) by cuda.sgi.com with ESMTP id T5yyNpmw2tWKaL26 (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Wed, 06 Aug 2014 07:13:47 -0700 (PDT) X-Barracuda-Envelope-From: himangi774@gmail.com X-Barracuda-RBL-Trusted-Forwarder: 209.85.220.43 Received: by mail-pa0-f43.google.com with SMTP id lf10so3523897pab.16 for ; Wed, 06 Aug 2014 07:13:46 -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:mime-version:content-type :content-disposition:user-agent; bh=c8elugR/fLL34/gek8yMUE8blV1xhjhshDDoEdBvxnw=; b=R6UrhBiRYcKNPmw40nbs6ypYo4w2vhNI6xtcjRqj/bXWLYmZI+JeM2zzNDY+w5Os0X murlYTM7qb7iMjjtbPLt2K+l6+wL0R7rWwPbPurANnCS6Gs7Nd3bSnU+6b2EqGPYKwyT weOwTEXyjcyRcm3d237CaNo5Kn9WswVlsDJhAudaXp8gavwErOdvee9d7jtzqUtuNppr IoadVLszmlBejJ7RgmDEjRo0FtAU84/ii6yjcl2zyi3l4yTbCSP/FVD+nTakpccpmOGA vIK8CFu5Ky0X75ccvHZpGrCJYmEW8xhWo5BcwDpSq9s52VtJK/9xGNPm8VeuNmYv8kJm kPaw== X-Barracuda-BBL-IP: nil X-Received: by 10.66.251.170 with SMTP id zl10mr11372013pac.97.1407334426624; Wed, 06 Aug 2014 07:13:46 -0700 (PDT) Received: from localhost ([14.139.82.6]) by mx.google.com with ESMTPSA id dd5sm1410849pbc.85.2014.08.06.07.13.44 for (version=TLSv1.2 cipher=RC4-SHA bits=128/128); Wed, 06 Aug 2014 07:13:45 -0700 (PDT) Date: Wed, 6 Aug 2014 19:43:43 +0530 X-Barracuda-Apparent-Source-IP: 14.139.82.6 From: Himangi Saraogi To: Dave Chinner , xfs@oss.sgi.com, linux-kernel@vger.kernel.org Cc: Julia Lawall Subject: [PATCH] xfs: Remove typedef xfs_uu_t Message-ID: <20140806141343.GA15659@himangi-Dell> X-ASG-Orig-Subj: [PATCH] xfs: Remove typedef xfs_uu_t 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: mail-pa0-f43.google.com[209.85.220.43] X-Barracuda-Start-Time: 1407334427 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, MAILTO_TO_SPAM_ADDR X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.8178 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 0.00 MAILTO_TO_SPAM_ADDR URI: Includes a link to a likely spammer email The Linux kernel coding style guidelines suggest not using typedefs for structure types. This patch gets rid of the typedef for xfs_uu_t. Also the names of the struct is changed to drop the _t, to make the name look less typedef-like. The following Coccinelle semantic patch detects the case. @tn1@ type td; @@ typedef struct { ... } td; @script:python tf@ td << tn1.td; tdres; @@ coccinelle.tdres = td; @@ type tn1.td; identifier tf.tdres; @@ -typedef struct + tdres { ... } -td ; @@ type tn1.td; identifier tf.tdres; @@ ( -td + struct tdres | const - td + struct tdres ) Signed-off-by: Himangi Saraogi Acked-by: Julia Lawall --- fs/xfs/uuid.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/fs/xfs/uuid.c b/fs/xfs/uuid.c index b83f76b..1f21d8f 100644 --- a/fs/xfs/uuid.c +++ b/fs/xfs/uuid.c @@ -18,13 +18,13 @@ #include /* IRIX interpretation of an uuid_t */ -typedef struct { +struct xfs_uu { __be32 uu_timelow; __be16 uu_timemid; __be16 uu_timehi; __be16 uu_clockseq; __be16 uu_node[3]; -} xfs_uu_t; +}; /* * uuid_getnodeuniq - obtain the node unique fields of a UUID. @@ -35,7 +35,7 @@ typedef struct { void uuid_getnodeuniq(uuid_t *uuid, int fsid [2]) { - xfs_uu_t *uup = (xfs_uu_t *)uuid; + struct xfs_uu *uup = (struct xfs_uu *)uuid; fsid[0] = (be16_to_cpu(uup->uu_clockseq) << 16) | be16_to_cpu(uup->uu_timemid); -- 1.9.1 From bfoster@redhat.com Wed Aug 6 09:23: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 (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 176147F6B for ; Wed, 6 Aug 2014 09:23:38 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id A8CDFAC005 for ; Wed, 6 Aug 2014 07:23:34 -0700 (PDT) X-ASG-Debug-ID: 1407335013-04bdf06ed132780001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id ROJALW84NlNxj7yV (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 06 Aug 2014 07:23: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-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 s76ENVW6027231 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 6 Aug 2014 10:23:31 -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 s76ENVDF024878; Wed, 6 Aug 2014 10:23:31 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 1785B12577C; Wed, 6 Aug 2014 10:23:30 -0400 (EDT) Date: Wed, 6 Aug 2014 10:23:30 -0400 From: Brian Foster To: Felipe Monteiro de Carvalho Cc: xfs@oss.sgi.com Subject: Re: xfs_bmbt_rec_64 leading to wrong blocks Message-ID: <20140806142329.GA39990@bfoster.bfoster> X-ASG-Orig-Subj: Re: xfs_bmbt_rec_64 leading to wrong blocks References: <20140806113447.GA14820@bfoster.bfoster> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.23 (2014-03-12) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1407335013 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Wed, Aug 06, 2014 at 02:31:11PM +0200, Felipe Monteiro de Carvalho wrote: > Thanks! Indeed that's it =) > > One strange thing however is that in my xfs_dir2_data.h there is: > > #define XFS_DIR2_DATA_ALIGN_LOG 3 /* i.e., 8 bytes */ > #define XFS_DIR2_SPACE_SIZE (1ULL << (32 + XFS_DIR2_DATA_ALIGN_LOG)) > #define XFS_DIR2_LEAF_SPACE 1 > #define XFS_DIR2_LEAF_OFFSET (XFS_DIR2_LEAF_SPACE * XFS_DIR2_SPACE_SIZE) > > That doesn't match the number that I am seeing here for the offset. > Here I see 1 << 23, but according to the headers it should be 1 << 35 > We're talking about extent map data here right? If so, the offset on disk is in filesystem block units. E.g., block 8388608 * 4096 == 32G == (1 << 35). Brian > -- > Felipe Monteiro de Carvalho > > > On Wed, Aug 6, 2014 at 1:34 PM, Brian Foster wrote: > > On Wed, Aug 06, 2014 at 12:12:12PM +0200, Felipe Monteiro de Carvalho wrote: > >> Hello, > >> > >> I am writing a software which reads xfs partitions and it is working > >> well so far, but, at in a particular folder with 10k files, only 7k > >> files appear, the other ones don't. > >> > >> I read an inode which has di_core.di_format = XFS_DINODE_FMT_BTREE > >> > >> No problem here, the btree is trivial, it has only 1 element inside > >> it, which leads to a list of 82 extends. > >> > >> Extends 0..52 aprox. are all great, and work fine. > >> > >> Extent 53 (and other ones after that) point to very wierd memory areas > >> which don't match the pattern that I saw previously =( > >> > >> Here is the hex data of the extents, the selected extent in nr 53: > >> > >> http://magnifier.sourceforge.net/temp/xfs/extent_with_xfs_bmbt_rec_64.png > >> > >> And here is debug information showing which values I extracted from this table: > >> > >> i=0 FLocalExtent.StartOff=0 FLocalExtent.StartBlock=66748 > >> FLocalExtent.BlockCount=1 lStartBlock=65212 > >> i=1 FLocalExtent.StartOff=1 FLocalExtent.StartBlock=66758 > >> FLocalExtent.BlockCount=2 lStartBlock=65222 > >> i=2 FLocalExtent.StartOff=3 FLocalExtent.StartBlock=66772 > >> FLocalExtent.BlockCount=1 lStartBlock=65236 > >> .... > >> > >> i=51 FLocalExtent.StartOff=77 FLocalExtent.StartBlock=67468 > >> FLocalExtent.BlockCount=1 lStartBlock=65932 > >> i=52 FLocalExtent.StartOff=78 FLocalExtent.StartBlock=67479 > >> FLocalExtent.BlockCount=1 lStartBlock=65943 > >> i=53 FLocalExtent.StartOff=8388608 FLocalExtent.StartBlock=66749 > >> FLocalExtent.BlockCount=1 lStartBlock=65213 > >> i=54 FLocalExtent.StartOff=8388609 FLocalExtent.StartBlock=66783 > >> FLocalExtent.BlockCount=2 lStartBlock=65247 > >> ... > >> > >> Note how StartOff is suddenly so big! But I manually checked the bits > >> comparing to xfs_bmbt_rec_64 and the value written is that one. But > >> what sense does it make for StartOff to jump like that? > >> > > > > Assuming 4k blocks, 8388608 is 32G, which is the offset interval used > > for some internal sections of directories on XFS. If this is a > > directory, it could be a node/leaf or freelist block. Looking at > > xfs_da_format.h, it looks like XFS_DIR2_LEAF_OFFSET points to this > > offset. This block basically points to a btree of hashed entry names for > > lookup. See here for basics: > > > > http://xfs.org/docs/xfsdocs-xml-dev/XFS_Filesystem_Structure//tmp/en-US/html/Directories.html > > > > ... and here for a diagram: > > > > http://xfs.org/docs/xfsdocs-xml-dev/XFS_Filesystem_Structure//tmp/en-US/html/Node_Directories.html > > > >> And why are the blocks pointing to a non-XD2D block? > >> > >> Here is the block to which one of the valid extents point to: > >> > >> http://magnifier.sourceforge.net/temp/xfs/correct_block_xd2d.png > >> > >> And here is a block to which one of the extents that I cannot > >> interpretate point to: > >> > >> http://magnifier.sourceforge.net/temp/xfs/wierd_block_xd2d.png > >> and another one: > >> http://magnifier.sourceforge.net/temp/xfs/wierd_xfs_dir2_data_entry.png > >> > > > > The 0xFEBE magic seems to confirm the second one as a node block. > > > > Brian > > > >> Any ideas??? > >> > >> I already worked so much on this, but I cannot figure out =( > >> > >> thanks, > >> -- > >> Felipe Monteiro de Carvalho > >> > >> _______________________________________________ > >> xfs mailing list > >> xfs@oss.sgi.com > >> http://oss.sgi.com/mailman/listinfo/xfs > > > > -- > Felipe Monteiro de Carvalho > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From BATV+e7dd069109cb1df529b2+4000+infradead.org+hch@bombadil.srs.infradead.org Wed Aug 6 09:28: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 BD1FA7F6B for ; Wed, 6 Aug 2014 09:28:54 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 9BA9630404E for ; Wed, 6 Aug 2014 07:28:51 -0700 (PDT) X-ASG-Debug-ID: 1407335329-04bdf06ecf32b40001-NocioJ Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.9]) by cuda.sgi.com with ESMTP id qp4WdVbbg7cjtpNV (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 06 Aug 2014 07:28:49 -0700 (PDT) X-Barracuda-Envelope-From: BATV+e7dd069109cb1df529b2+4000+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 1XF2Ct-0004hI-6g; Wed, 06 Aug 2014 14:28:47 +0000 Date: Wed, 6 Aug 2014 07:28:47 -0700 From: Christoph Hellwig To: Himangi Saraogi Cc: Dave Chinner , xfs@oss.sgi.com, linux-kernel@vger.kernel.org, Julia Lawall Subject: Re: [PATCH] xfs: Remove typedef xfs_uu_t Message-ID: <20140806142847.GA9757@infradead.org> X-ASG-Orig-Subj: Re: [PATCH] xfs: Remove typedef xfs_uu_t References: <20140806141343.GA15659@himangi-Dell> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140806141343.GA15659@himangi-Dell> User-Agent: Mutt/1.5.23 (2014-03-12) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: bombadil.infradead.org[198.137.202.9] X-Barracuda-Start-Time: 1407335329 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.8178 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Wed, Aug 06, 2014 at 07:43:43PM +0530, Himangi Saraogi wrote: > The Linux kernel coding style guidelines suggest not using typedefs > for structure types. This patch gets rid of the typedef for xfs_uu_t. > Also the names of the struct is changed to drop the _t, to make the > name look less typedef-like. The right fix is to just kill the type, and read the values directly from the uuid_t type using get_unaligned_be16. From alex@zadarastorage.com Wed Aug 6 09:43: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=1.9 required=5.0 tests=STOX_REPLY_TYPE 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 3C0497FAB for ; Wed, 6 Aug 2014 09:43:04 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id DA5FAAC00F for ; Wed, 6 Aug 2014 07:43:03 -0700 (PDT) X-ASG-Debug-ID: 1407336179-04bdf06ecf336e0001-NocioJ Received: from mail-we0-f169.google.com (mail-we0-f169.google.com [74.125.82.169]) by cuda.sgi.com with ESMTP id 3WFxYVLQ4YefHCCW (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Wed, 06 Aug 2014 07:43:00 -0700 (PDT) X-Barracuda-Envelope-From: alex@zadarastorage.com X-Barracuda-Apparent-Source-IP: 74.125.82.169 Received: by mail-we0-f169.google.com with SMTP id u56so2755883wes.14 for ; Wed, 06 Aug 2014 07:42:59 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:message-id:from:to:cc:references:in-reply-to :subject:date:mime-version:content-type:content-transfer-encoding :importance; bh=3uaACW8SoPuNh4ajAWgaruf0z61vNk0M6wjtLk25Oow=; b=CmfJ4ythBlMEirBkW+2oDo3jZXkZIM82YblqkHgX0KXR9kXdRCkIF0p8kZrzOHZq5B 6c/yvU6UStOFnD+5qIlDkscFZ58NRcYkA5FLIJwZB1rA76eXl4+IcdeU51Zgx5Tdeusx uq4UFUxg2/jG2vyy24tAZst4NCKYKO3kWSW09GSQq5ZWULpedZgraju++g0vMm3PJabO aH55w+I45f5rc9Vyb40g0fkMLihcJwae5co/hampUWdst3EcCFaK18Y+BqzpnU12gsl9 IVfgEIBBVNDQTr5Z7QpY9yjHBZSR9f0ra592FtKOXyrZ36L7+zSkxHojyyhvAmGTuAW+ cVSg== X-Gm-Message-State: ALoCoQkaTso1HP91q+bAqqbJV6Ys/QF/oFJ4vP/lxtI4yNKxy3CqTsJGaEObbkxO1VdSPgg7CdSz X-Received: by 10.194.221.6 with SMTP id qa6mr16252628wjc.39.1407336179378; Wed, 06 Aug 2014 07:42:59 -0700 (PDT) Received: from alyakaslap ([212.143.144.103]) by mx.google.com with ESMTPSA id z5sm2921100wje.49.2014.08.06.07.42.58 for (version=TLSv1 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Wed, 06 Aug 2014 07:42:58 -0700 (PDT) Message-ID: <2AFC01BCF35045BB86C38182FB398C2D@alyakaslap> From: "Alex Lyakas" To: "Dave Chinner" Cc: References: <20140113204314.GJ3469@dastard> <20140115014503.GQ3469@dastard> <20140119231745.GF18112@dastard> <4B2A412C75324EE9880358513C069476@alyakaslap> <9D3CBECB663B4A77B7EF74B67973310A@alyakaslap> <20140804230721.GA20518@dastard> <20140806123215.GJ20518@dastard> In-Reply-To: <20140806123215.GJ20518@dastard> Subject: Re: use-after-free on log replay failure Date: Wed, 6 Aug 2014 17:43:02 +0300 X-ASG-Orig-Subj: Re: use-after-free on log replay failure MIME-Version: 1.0 Content-Type: text/plain; format=flowed; charset="UTF-8"; reply-type=original Content-Transfer-Encoding: 8bit X-Priority: 3 X-MSMail-Priority: Normal Importance: Normal X-Mailer: Microsoft Windows Live Mail 15.4.3555.308 X-MimeOLE: Produced By Microsoft MimeOLE V15.4.3555.308 X-Barracuda-Connect: mail-we0-f169.google.com[74.125.82.169] X-Barracuda-Start-Time: 1407336180 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, MARKETING_SUBJECT, STOX_REPLY_TYPE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.8178 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 STOX_REPLY_TYPE STOX_REPLY_TYPE 0.60 MARKETING_SUBJECT Subject contains popular marketing words 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header Hello Dave, I applied this patch manually to 3.8.13, but still hitting exact same issue with my reproduction. I still have xlog_recover_iodone callbacks delivered through xfs_buf_bio_end_io scheduling it through xfslogd_workqueue. Some of the callbacks arrive before mount completes: Aug 6 17:31:33 dev kernel: [ 3258.774970] XFS (dm-19): metadata I/O error: block 0x3780001 ("xlog_recover_iodone") error 28 numblks 1 Aug 6 17:31:33 dev kernel: [ 3258.776687] XFS (dm-19): xfs_do_force_shutdown(0x1) called from line 377 of file /mnt/work/alex/xfs/fs/xfs/xfs_log_recover.c. Return address = 0xffffffffa0743848 Aug 6 17:31:33 dev kernel: [ 3258.777262] XFS (dm-19): I/O Error Detected. Shutting down filesystem Aug 6 17:31:33 dev kernel: [ 3258.778369] XFS (dm-19): Please umount the filesystem and rectify the problem(s) Aug 6 17:31:33 dev kernel: [ 3258.779634] XFS (dm-19): metadata I/O error: block 0x3780002 ("xlog_recover_iodone") error 28 numblks 1 Aug 6 17:31:33 dev kernel: [ 3258.781929] XFS (dm-19): xfs_do_force_shutdown(0x1) called from line 377 of file /mnt/work/alex/xfs/fs/xfs/xfs_log_recover.c. Return address = 0xffffffffa0743848 Aug 6 17:31:33 dev kernel: [ 3258.781939] XFS (dm-19): metadata I/O error: block 0x3780008 ("xlog_recover_iodone") error 28 numblks 8 Aug 6 17:31:33 dev kernel: [ 3258.784235] XFS (dm-19): xfs_do_force_shutdown(0x1) called from line 377 of file /mnt/work/alex/xfs/fs/xfs/xfs_log_recover.c. Return address = 0xffffffffa0743848 Aug 6 17:31:33 dev kernel: [ 3258.784260] XFS (dm-19): metadata I/O error: block 0x3780010 ("xlog_recover_iodone") error 28 numblks 8 Aug 6 17:31:33 dev kernel: [ 3258.784389] XFS (dm-19): log mount/recovery failed: error 28 Aug 6 17:31:33 dev kernel: [ 3258.784549] XFS (dm-19): log mount failed And some arrive afterwards, and print garbage. Aug 6 17:31:33 dev kernel: [ 3258.786398] XFS (ˆm&_): xfs_do_force_shutdown(0x1) called from line 377 of file /mnt/work/alex/xfs/fs/xfs/xfs_log_recover.c. Return address = 0xffffffffa0743848 Aug 6 17:31:33 dev kernel: [ 3258.786404] XFS (ˆm&_): metadata I/O error: block 0x3780018 ("xlog_recover_iodone") error 28 numblks 8 Aug 6 17:31:33 dev kernel: [ 3258.788575] XFS (ˆm&_): xfs_do_force_shutdown(0x1) called from line 377 of file /mnt/work/alex/xfs/fs/xfs/xfs_log_recover.c. Return address = 0xffffffffa0743848 Aug 6 17:31:33 dev kernel: [ 3258.788614] XFS (ˆm&_): metadata I/O error: block 0x37800a0 ("xlog_recover_iodone") error 28 numblks 16 Aug 6 17:31:33 dev kernel: [ 3258.790849] XFS (ˆm&_): xfs_do_force_shutdown(0x1) called from line 377 of file /mnt/work/alex/xfs/fs/xfs/xfs_log_recover.c. Return address = 0xffffffffa0743848 Maybe some additional patch is needed for my kernel? Thanks, Alex. -----Original Message----- From: Dave Chinner Sent: 06 August, 2014 3:32 PM To: Alex Lyakas Cc: xfs@oss.sgi.com Subject: Re: use-after-free on log replay failure On Wed, Aug 06, 2014 at 01:05:34PM +0300, Alex Lyakas wrote: > Hi Dave, > > On Tue, Aug 5, 2014 at 2:07 AM, Dave Chinner wrote: > > On Mon, Aug 04, 2014 at 02:00:05PM +0300, Alex Lyakas wrote: > >> Greetings, > >> > >> we had a log replay failure due to some errors that the underlying > >> block device returned: > >> [49133.801406] XFS (dm-95): metadata I/O error: block 0x270e8c180 > >> ("xlog_recover_iodone") error 28 numblks 16 > >> [49133.802495] XFS (dm-95): log mount/recovery failed: error 28 > >> [49133.802644] XFS (dm-95): log mount failed > > > > #define ENOSPC 28 /* No space left on device */ > > > > You're getting an ENOSPC as a metadata IO error during log recovery? > > Thin provisioning problem, perhaps, > Yes, it is a thin provisioning problem (which I already know the cause > for). > > > and the error is occurring on > > submission rather than completion? If so: > > > > 8d6c121 xfs: fix buffer use after free on IO error > I am not sure what do you mean by "submission rather than completion". > Do you mean that xfs_buf_ioapply_map() returns without submitting any > bios? No, that the bio submission results in immediate failure (e.g. the device goes away, so submission results in ENODEV). Hence when _xfs_buf_ioapply() releases it's IO reference itis the only remaining reference to the buffer and so completion processing is run immediately. i.e. inline from the submission path. Normally IO errors are reported through the bio in IO completion interrupt context. i.e the IO is completed by the hardware and the error status is attached to bio, which is then completed and we get into XFS that way. The IO submision context is long gone at this point.... > In that case, no, bios are submitted to the block device, and it > fails them through a different context with ENOSPC error. I will still > try the patch you mentioned, because it also looks relevant to another > question I addressed to you earlier in: > http://oss.sgi.com/archives/xfs/2013-11/msg00648.html No, that's a different problem. 9c23ecc xfs: unmount does not wait for shutdown during unmount Cheers, Dave. -- Dave Chinner david@fromorbit.com From bfoster@redhat.com Wed Aug 6 10:20: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 (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id BCB857FAD for ; Wed, 6 Aug 2014 10:20:50 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 9CA0A8F8037 for ; Wed, 6 Aug 2014 08:20:47 -0700 (PDT) X-ASG-Debug-ID: 1407338445-04cbb03b9d348f0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id oEvKufwAW1KkJxJb (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 06 Aug 2014 08:20:46 -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 s76FKinw021024 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 6 Aug 2014 11:20: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 s76FKhin024758; Wed, 6 Aug 2014 11:20:43 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id A4AC212577C; Wed, 6 Aug 2014 11:20:42 -0400 (EDT) Date: Wed, 6 Aug 2014 11:20:42 -0400 From: Brian Foster To: Alex Lyakas Cc: Dave Chinner , xfs@oss.sgi.com Subject: Re: use-after-free on log replay failure Message-ID: <20140806152042.GB39990@bfoster.bfoster> X-ASG-Orig-Subj: Re: use-after-free on log replay failure References: <20140113204314.GJ3469@dastard> <20140115014503.GQ3469@dastard> <20140119231745.GF18112@dastard> <4B2A412C75324EE9880358513C069476@alyakaslap> <9D3CBECB663B4A77B7EF74B67973310A@alyakaslap> <20140804230721.GA20518@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-Transfer-Encoding: quoted-printable In-Reply-To: User-Agent: Mutt/1.5.23 (2014-03-12) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1407338446 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Wed, Aug 06, 2014 at 03:52:03PM +0300, Alex Lyakas wrote: > Hello Dave and Brian, >=20 > Dave, I tried the patch you suggested, but it does not fix the issue. I d= id > some further digging, and it appears that _xfs_buf_ioend(schedule=3D1) ca= n be > called from xfs_buf_iorequest(), which the patch fixes, but also from > xfs_buf_bio_end_io() which is my case. I am reproducing the issue pretty > easily. The flow that I have is like this: > - xlog_recover() calls xlog_find_tail(). This works alright. What's the purpose of a sleep here? > - Now I add a small sleep before calling xlog_do_recover(), and meanwhile= I > instruct my block device to return ENOSPC for any WRITE from now on. >=20 > What seems to happen is that several WRITE bios are submitted and they all > fail. When they do, they reach xfs_buf_ioend() through a stack like this: >=20 > Aug 6 15:23:07 dev kernel: [ 304.410528] [56]xfs*[xfs_buf_ioend:1056] > XFS(dm-19): Scheduling xfs_buf_iodone_work on error > Aug 6 15:23:07 dev kernel: [ 304.410534] Pid: 56, comm: kworker/u:1 > Tainted: G W O 3.8.13-557-generic #1382000791 > Aug 6 15:23:07 dev kernel: [ 304.410537] Call Trace: > Aug 6 15:23:07 dev kernel: [ 304.410587] [] > xfs_buf_ioend+0x1a4/0x1b0 [xfs] > Aug 6 15:23:07 dev kernel: [ 304.410621] [] > _xfs_buf_ioend+0x25/0x30 [xfs] > Aug 6 15:23:07 dev kernel: [ 304.410643] [] > xfs_buf_bio_end_io+0x3d/0x50 [xfs] > Aug 6 15:23:07 dev kernel: [ 304.410652] [] > bio_endio+0x1d/0x40 > ... >=20 > At this point, they are scheduled to run xlog_recover_iodone through > xfslogd_workqueue. > The first callback that gets called, calls xfs_do_force_shutdown in stack > like this: >=20 > Aug 6 15:23:07 dev kernel: [ 304.411791] XFS (dm-19): metadata I/O erro= r: > block 0x3780001 ("xlog_recover_iodone") error 28 numblks 1 > Aug 6 15:23:07 dev kernel: [ 304.413493] XFS (dm-19): > xfs_do_force_shutdown(0x1) called from line 377 of file > /mnt/work/alex/xfs/fs/xfs/xfs_log_recover.c. Return address =3D > 0xffffffffa0526848 > Aug 6 15:23:07 dev kernel: [ 304.413837] [] > xfs_do_force_shutdown+0x40/0x180 [xfs] > Aug 6 15:23:07 dev kernel: [ 304.413870] [] ? > xlog_recover_iodone+0x48/0x70 [xfs] > Aug 6 15:23:07 dev kernel: [ 304.413902] [] > xlog_recover_iodone+0x48/0x70 [xfs] > Aug 6 15:23:07 dev kernel: [ 304.413923] [] > xfs_buf_iodone_work+0x4d/0xa0 [xfs] > Aug 6 15:23:07 dev kernel: [ 304.413930] [] > process_one_work+0x141/0x4a0 > Aug 6 15:23:07 dev kernel: [ 304.413937] [] > worker_thread+0x168/0x410 > Aug 6 15:23:07 dev kernel: [ 304.413943] [] ? > manage_workers+0x120/0x120 > Aug 6 15:23:07 dev kernel: [ 304.413949] [] > kthread+0xc0/0xd0 > Aug 6 15:23:07 dev kernel: [ 304.413954] [] ? > flush_kthread_worker+0xb0/0xb0 > Aug 6 15:23:07 dev kernel: [ 304.413976] [] > ret_from_fork+0x7c/0xb0 > Aug 6 15:23:07 dev kernel: [ 304.413986] [] ? > flush_kthread_worker+0xb0/0xb0 > Aug 6 15:23:07 dev kernel: [ 304.413990] ---[ end trace 988d698520e1fa81 > ]--- > Aug 6 15:23:07 dev kernel: [ 304.414012] XFS (dm-19): I/O Error Detecte= d. > Shutting down filesystem > Aug 6 15:23:07 dev kernel: [ 304.415936] XFS (dm-19): Please umount the > filesystem and rectify the problem(s) >=20 > But the rest of the callbacks also arrive: > Aug 6 15:23:07 dev kernel: [ 304.417812] XFS (dm-19): metadata I/O erro= r: > block 0x3780002 ("xlog_recover_iodone") error 28 numblks 1 > Aug 6 15:23:07 dev kernel: [ 304.420420] XFS (dm-19): > xfs_do_force_shutdown(0x1) called from line 377 of file > /mnt/work/alex/xfs/fs/xfs/xfs_log_recover.c. Return address =3D > 0xffffffffa0526848 > Aug 6 15:23:07 dev kernel: [ 304.420427] XFS (dm-19): metadata I/O erro= r: > block 0x3780008 ("xlog_recover_iodone") error 28 numblks 8 > Aug 6 15:23:07 dev kernel: [ 304.422708] XFS (dm-19): > xfs_do_force_shutdown(0x1) called from line 377 of file > /mnt/work/alex/xfs/fs/xfs/xfs_log_recover.c. Return address =3D > 0xffffffffa0526848 > Aug 6 15:23:07 dev kernel: [ 304.422738] XFS (dm-19): metadata I/O erro= r: > block 0x3780010 ("xlog_recover_iodone") error 28 numblks 8 >=20 > The mount sequence fails and goes back to the caller: > Aug 6 15:23:07 dev kernel: [ 304.423438] XFS (dm-19): log mount/recovery > failed: error 28 > Aug 6 15:23:07 dev kernel: [ 304.423757] XFS (dm-19): log mount failed >=20 > But there are still additional callbacks to deliver, which the mount > sequence did not wait for! > Aug 6 15:23:07 dev kernel: [ 304.425717] XFS (=10@dR): > xfs_do_force_shutdown(0x1) called from line 377 of file > /mnt/work/alex/xfs/fs/xfs/xfs_log_recover.c. Return address =3D > 0xffffffffa0526848 > Aug 6 15:23:07 dev kernel: [ 304.425723] XFS (=10@dR): metadata I/O err= or: > block 0x3780018 ("xlog_recover_iodone") error 28 numblks 8 > Aug 6 15:23:07 dev kernel: [ 304.428239] XFS (=10@dR): > xfs_do_force_shutdown(0x1) called from line 377 of file > /mnt/work/alex/xfs/fs/xfs/xfs_log_recover.c. Return address =3D > 0xffffffffa0526848 > Aug 6 15:23:07 dev kernel: [ 304.428246] XFS (=10@dR): metadata I/O err= or: > block 0x37800a0 ("xlog_recover_iodone") error 28 numblks 16 >=20 > Notice the junk that they are printing! Naturally, because xfs_mount > structure has been kfreed. >=20 > Finally the kernel crashes (instead of printing junk), because the xfs_mo= unt > structure is gone, but the callback tries to access it (printing the name= ): >=20 > Aug 6 15:23:07 dev kernel: [ 304.430796] general protection fault: 0000 > [#1] SMP > Aug 6 15:23:07 dev kernel: [ 304.432035] Modules linked in: xfrm_user > xfrm4_tunnel tunnel4 ipcomp xfrm_ipcomp esp4 ah4 iscsi_scst_tcp(O) > scst_vdisk(O) scst(O) dm_zcache(O) dm_btrfs(O) xfs(O) btrfs(O) libcrc32c > raid456(O) async_pq async_xor xor async_memcpy async_raid6_recov raid6_pq > async_tx raid1(O) md_mod deflate zlib_deflate ctr twofish_generic > twofish_x86_64_3way glue_helper lrw xts gf128mul twofish_x86_64 > twofish_common camellia_generic serpent_generic blowfish_generic > blowfish_x86_64 blowfish_common cast5_generic cast_common des_generic xcbc > rmd160 sha512_generic crypto_null af_key xfrm_algo dm_round_robin kvm vfat > fat ppdev psmouse microcode nfsd nfs_acl dm_multipath(O) serio_raw > parport_pc nfsv4 dm_iostat(O) mac_hid i2c_piix4 auth_rpcgss nfs fscache > lockd sunrpc lp parport floppy > Aug 6 15:23:07 dev kernel: [ 304.432035] CPU 1 > Aug 6 15:23:07 dev kernel: [ 304.432035] Pid: 133, comm: kworker/1:1H > Tainted: G W O 3.8.13-557-generic #1382000791 Bochs Bochs > Aug 6 15:23:07 dev kernel: [ 304.432035] RIP: 0010:[] > [] strnlen+0xb/0x30 > Aug 6 15:23:07 dev kernel: [ 304.432035] RSP: 0018:ffff880035461b08 > EFLAGS: 00010086 > Aug 6 15:23:07 dev kernel: [ 304.432035] RAX: 0000000000000000 RBX: > ffffffff81e6a4e7 RCX: 0000000000000000 > Aug 6 15:23:07 dev kernel: [ 304.432035] RDX: e4e8390a265c0000 RSI: > ffffffffffffffff RDI: e4e8390a265c0000 > Aug 6 15:23:07 dev kernel: [ 304.432035] RBP: ffff880035461b08 R08: > 000000000000ffff R09: 000000000000ffff > Aug 6 15:23:07 dev kernel: [ 304.432035] R10: 0000000000000000 R11: > 00000000000004cd R12: e4e8390a265c0000 > Aug 6 15:23:07 dev kernel: [ 304.432035] R13: ffffffff81e6a8c0 R14: > 0000000000000000 R15: 000000000000ffff > Aug 6 15:23:07 dev kernel: [ 304.432035] FS: 0000000000000000(0000) > GS:ffff88007fc80000(0000) knlGS:0000000000000000 > Aug 6 15:23:07 dev kernel: [ 304.432035] CS: 0010 DS: 0000 ES: 0000 CR= 0: > 000000008005003b > Aug 6 15:23:07 dev kernel: [ 304.432035] CR2: 00007fc902ffbfd8 CR3: > 000000007702a000 CR4: 00000000000006e0 > Aug 6 15:23:07 dev kernel: [ 304.432035] DR0: 0000000000000000 DR1: > 0000000000000000 DR2: 0000000000000000 > Aug 6 15:23:07 dev kernel: [ 304.432035] DR3: 0000000000000000 DR6: > 00000000ffff0ff0 DR7: 0000000000000400 > Aug 6 15:23:07 dev kernel: [ 304.432035] Process kworker/1:1H (pid: 133, > threadinfo ffff880035460000, task ffff880035412e00) > Aug 6 15:23:07 dev kernel: [ 304.432035] Stack: > Aug 6 15:23:07 dev kernel: [ 304.432035] ffff880035461b48 > ffffffff8133dd5e 0000000000000000 ffffffff81e6a4e7 > Aug 6 15:23:07 dev kernel: [ 304.432035] ffffffffa0566cba > ffff880035461c80 ffffffffa0566cba ffffffff81e6a8c0 > Aug 6 15:23:07 dev kernel: [ 304.432035] ffff880035461bc8 > ffffffff8133ef59 ffff880035461bc8 ffffffff81c84040 > Aug 6 15:23:07 dev kernel: [ 304.432035] Call Trace: > Aug 6 15:23:07 dev kernel: [ 304.432035] [] > string.isra.4+0x3e/0xd0 > Aug 6 15:23:07 dev kernel: [ 304.432035] [] > vsnprintf+0x219/0x640 > Aug 6 15:23:07 dev kernel: [ 304.432035] [] > vscnprintf+0x11/0x30 > Aug 6 15:23:07 dev kernel: [ 304.432035] [] > vprintk_emit+0xc1/0x490 > Aug 6 15:23:07 dev kernel: [ 304.432035] [] ? > vprintk_emit+0x170/0x490 > Aug 6 15:23:07 dev kernel: [ 304.432035] [] > printk+0x61/0x63 > Aug 6 15:23:07 dev kernel: [ 304.432035] [] > __xfs_printk+0x31/0x50 [xfs] > Aug 6 15:23:07 dev kernel: [ 304.432035] [] > xfs_notice+0x53/0x60 [xfs] > Aug 6 15:23:07 dev kernel: [ 304.432035] [] > xfs_do_force_shutdown+0xf5/0x180 [xfs] > Aug 6 15:23:07 dev kernel: [ 304.432035] [] ? > xlog_recover_iodone+0x48/0x70 [xfs] > Aug 6 15:23:07 dev kernel: [ 304.432035] [] > xlog_recover_iodone+0x48/0x70 [xfs] > Aug 6 15:23:07 dev kernel: [ 304.432035] [] > xfs_buf_iodone_work+0x4d/0xa0 [xfs] > Aug 6 15:23:07 dev kernel: [ 304.432035] [] > process_one_work+0x141/0x4a0 > Aug 6 15:23:07 dev kernel: [ 304.432035] [] > worker_thread+0x168/0x410 > Aug 6 15:23:07 dev kernel: [ 304.432035] [] ? > manage_workers+0x120/0x120 > Aug 6 15:23:07 dev kernel: [ 304.432035] [] > kthread+0xc0/0xd0 > Aug 6 15:23:07 dev kernel: [ 304.432035] [] ? > flush_kthread_worker+0xb0/0xb0 > Aug 6 15:23:07 dev kernel: [ 304.432035] [] > ret_from_fork+0x7c/0xb0 > Aug 6 15:23:07 dev kernel: [ 304.432035] [] ? > flush_kthread_worker+0xb0/0xb0 > Aug 6 15:23:07 dev kernel: [ 304.432035] Code: 31 c0 80 3f 00 55 48 89 = e5 > 74 11 48 89 f8 66 90 48 83 c0 01 80 38 00 75 f7 48 29 f8 5d c3 66 90 55 31 > c0 48 85 f6 48 89 e5 74 23 <80> 3f 00 74 1e 48 89 f8 eb 0c 0f 1f 00 48 83= ee > 01 80 38 00 74 > Aug 6 15:23:07 dev kernel: [ 304.432035] RIP [] > strnlen+0xb/0x30 > Aug 6 15:23:07 dev kernel: [ 304.432035] RSP >=20 >=20 > So previously you said: "So, something is corrupting memory and stamping = all > over the XFS structures." and also "given you have a bunch of out of tree > modules loaded (and some which are experiemental) suggests that you have a > problem with your storage...". >=20 > But I believe, my analysis shows that during the mount sequence XFS does = not > wait properly for all the bios to complete, before failing the mount > sequence back to the caller. >=20 As an experiment, what about the following? Compile tested only and not safe for general use. What might help more is to see if you can create a reproducer on a recent, clean kernel. Perhaps a metadump of your reproducer fs combined with whatever block device ENOSPC hack you're using would do it. Brian ---8<--- diff --git a/fs/xfs/xfs_buf.c b/fs/xfs/xfs_buf.c index cd7b8ca..fbcf524 100644 --- a/fs/xfs/xfs_buf.c +++ b/fs/xfs/xfs_buf.c @@ -1409,19 +1409,27 @@ xfs_buf_iorequest( * case nothing will ever complete. It returns the I/O error code, if any= , or * 0 if there was no error. */ -int -xfs_buf_iowait( - xfs_buf_t *bp) +static int +__xfs_buf_iowait( + struct xfs_buf *bp, + bool skip_error) { trace_xfs_buf_iowait(bp, _RET_IP_); =20 - if (!bp->b_error) + if (skip_error || !bp->b_error) wait_for_completion(&bp->b_iowait); =20 trace_xfs_buf_iowait_done(bp, _RET_IP_); return bp->b_error; } =20 +int +xfs_buf_iowait( + struct xfs_buf *bp) +{ + return __xfs_buf_iowait(bp, false); +} + xfs_caddr_t xfs_buf_offset( xfs_buf_t *bp, @@ -1866,7 +1874,7 @@ xfs_buf_delwri_submit( bp =3D list_first_entry(&io_list, struct xfs_buf, b_list); =20 list_del_init(&bp->b_list); - error2 =3D xfs_buf_iowait(bp); + error2 =3D __xfs_buf_iowait(bp, true); xfs_buf_relse(bp); if (!error) error =3D error2; --- > Thanks, > Alex. >=20 >=20 >=20 > -----Original Message----- From: Dave Chinner > Sent: 05 August, 2014 2:07 AM > To: Alex Lyakas > Cc: xfs@oss.sgi.com > Subject: Re: use-after-free on log replay failure >=20 > On Mon, Aug 04, 2014 at 02:00:05PM +0300, Alex Lyakas wrote: > >Greetings, > > > >we had a log replay failure due to some errors that the underlying > >block device returned: > >[49133.801406] XFS (dm-95): metadata I/O error: block 0x270e8c180 > >("xlog_recover_iodone") error 28 numblks 16 > >[49133.802495] XFS (dm-95): log mount/recovery failed: error 28 > >[49133.802644] XFS (dm-95): log mount failed >=20 > #define ENOSPC 28 /* No space left on device */ >=20 > You're getting an ENOSPC as a metadata IO error during log recovery? > Thin provisioning problem, perhaps, and the error is occurring on > submission rather than completion? If so: >=20 > 8d6c121 xfs: fix buffer use after free on IO error >=20 > Cheers, >=20 > Dave. > --=20 > Dave Chinner > david@fromorbit.com >=20 From alex@zadarastorage.com Wed Aug 6 10:29: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=1.9 required=5.0 tests=STOX_REPLY_TYPE 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 BA25D7F76 for ; Wed, 6 Aug 2014 10:29:10 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 55675AC005 for ; Wed, 6 Aug 2014 08:29:07 -0700 (PDT) X-ASG-Debug-ID: 1407338943-04bdf06ecf35940001-NocioJ Received: from mail-we0-f179.google.com (mail-we0-f179.google.com [74.125.82.179]) by cuda.sgi.com with ESMTP id ab6OMb4xrakrstT1 (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Wed, 06 Aug 2014 08:29:04 -0700 (PDT) X-Barracuda-Envelope-From: alex@zadarastorage.com X-Barracuda-Apparent-Source-IP: 74.125.82.179 Received: by mail-we0-f179.google.com with SMTP id u57so2819988wes.10 for ; Wed, 06 Aug 2014 08:29:03 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:message-id:from:to:cc:references:in-reply-to :subject:date:mime-version:content-type:content-transfer-encoding :importance; bh=0ijq1E4e9r3ErT0QNMwyGAE7AnolCqSua7glZxbrius=; b=BJwPGR2Ni/GMWQefj5wuZkHxnPB+1ghC3SAPNnWVSGK2hjiTC/bfICkYySXySLAVqv dOE+2+TyHs3kbioOFgZSvq6hqLdX32TYgKudYn9mUcMDxfc0qpEqO8SB+Y9FIJkRTr22 X+T8XwM0FnWNqB377xHw6RHb8Zqkov55EIT+x7NHIZ/u9MMPaT6TOBt+Ls/Ab+fSLoJS a4ZXNJAyLmhtBn4Tpm3NolAvp7Rb6n6bqrXpPXt3Bq0zXI4iSyeBtml8AbrUW0nSQnSO qx8KAt0aplZ3kZT+nhffDF2nys58EITkoPEUW2SMSBTNU2iazRbj47FhT69nT/iFkCDk akDA== X-Gm-Message-State: ALoCoQlkxWWKtXVPVGJ2kGy8Sy+YtIkQaryVd2tqFfLWrunCRxrnIE6IXjvq4+1LUU+EZKI+L6PF X-Received: by 10.180.101.65 with SMTP id fe1mr26094508wib.53.1407338943485; Wed, 06 Aug 2014 08:29:03 -0700 (PDT) Received: from alyakaslap ([212.143.144.103]) by mx.google.com with ESMTPSA id lq15sm7191038wic.1.2014.08.06.08.29.02 for (version=TLSv1 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Wed, 06 Aug 2014 08:29:02 -0700 (PDT) Message-ID: From: "Alex Lyakas" To: "Brian Foster" Cc: "Dave Chinner" , References: <20140113204314.GJ3469@dastard> <20140115014503.GQ3469@dastard> <20140119231745.GF18112@dastard> <4B2A412C75324EE9880358513C069476@alyakaslap> <9D3CBECB663B4A77B7EF74B67973310A@alyakaslap> <20140804230721.GA20518@dastard> <20140806152042.GB39990@bfoster.bfoster> In-Reply-To: <20140806152042.GB39990@bfoster.bfoster> Subject: Re: use-after-free on log replay failure Date: Wed, 6 Aug 2014 18:28:34 +0300 X-ASG-Orig-Subj: Re: use-after-free on log replay failure MIME-Version: 1.0 Content-Type: text/plain; format=flowed; charset="iso-8859-1"; reply-type=original Content-Transfer-Encoding: 8bit X-Priority: 3 X-MSMail-Priority: Normal Importance: Normal X-Mailer: Microsoft Windows Live Mail 15.4.3555.308 X-MimeOLE: Produced By Microsoft MimeOLE V15.4.3555.308 X-Barracuda-Connect: mail-we0-f179.google.com[74.125.82.179] X-Barracuda-Start-Time: 1407338944 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, MARKETING_SUBJECT, STOX_REPLY_TYPE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.8180 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 STOX_REPLY_TYPE STOX_REPLY_TYPE 0.60 MARKETING_SUBJECT Subject contains popular marketing words 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header Hi Brian, The purpose of the sleep is like this: I added a module parameter to my block device, which says "from now on fail all WRITEs with ENOSPC". If I set this parameter before mounting, then xlog_find_tail() fails. This does not reproduce my problem. So I want xlog_find_tail() to succeed, and then start returning errors. So I need the sleep so that I can set my parameter, before actual log recovery is attempted:) Will try what you suggest. Thanks, Alex. -----Original Message----- From: Brian Foster Sent: 06 August, 2014 6:20 PM To: Alex Lyakas Cc: Dave Chinner ; xfs@oss.sgi.com Subject: Re: use-after-free on log replay failure On Wed, Aug 06, 2014 at 03:52:03PM +0300, Alex Lyakas wrote: > Hello Dave and Brian, > > Dave, I tried the patch you suggested, but it does not fix the issue. I > did > some further digging, and it appears that _xfs_buf_ioend(schedule=1) can > be > called from xfs_buf_iorequest(), which the patch fixes, but also from > xfs_buf_bio_end_io() which is my case. I am reproducing the issue pretty > easily. The flow that I have is like this: > - xlog_recover() calls xlog_find_tail(). This works alright. What's the purpose of a sleep here? > - Now I add a small sleep before calling xlog_do_recover(), and meanwhile > I > instruct my block device to return ENOSPC for any WRITE from now on. > > What seems to happen is that several WRITE bios are submitted and they all > fail. When they do, they reach xfs_buf_ioend() through a stack like this: > > Aug 6 15:23:07 dev kernel: [ 304.410528] [56]xfs*[xfs_buf_ioend:1056] > XFS(dm-19): Scheduling xfs_buf_iodone_work on error > Aug 6 15:23:07 dev kernel: [ 304.410534] Pid: 56, comm: kworker/u:1 > Tainted: G W O 3.8.13-557-generic #1382000791 > Aug 6 15:23:07 dev kernel: [ 304.410537] Call Trace: > Aug 6 15:23:07 dev kernel: [ 304.410587] [] > xfs_buf_ioend+0x1a4/0x1b0 [xfs] > Aug 6 15:23:07 dev kernel: [ 304.410621] [] > _xfs_buf_ioend+0x25/0x30 [xfs] > Aug 6 15:23:07 dev kernel: [ 304.410643] [] > xfs_buf_bio_end_io+0x3d/0x50 [xfs] > Aug 6 15:23:07 dev kernel: [ 304.410652] [] > bio_endio+0x1d/0x40 > ... > > At this point, they are scheduled to run xlog_recover_iodone through > xfslogd_workqueue. > The first callback that gets called, calls xfs_do_force_shutdown in stack > like this: > > Aug 6 15:23:07 dev kernel: [ 304.411791] XFS (dm-19): metadata I/O > error: > block 0x3780001 ("xlog_recover_iodone") error 28 numblks 1 > Aug 6 15:23:07 dev kernel: [ 304.413493] XFS (dm-19): > xfs_do_force_shutdown(0x1) called from line 377 of file > /mnt/work/alex/xfs/fs/xfs/xfs_log_recover.c. Return address = > 0xffffffffa0526848 > Aug 6 15:23:07 dev kernel: [ 304.413837] [] > xfs_do_force_shutdown+0x40/0x180 [xfs] > Aug 6 15:23:07 dev kernel: [ 304.413870] [] ? > xlog_recover_iodone+0x48/0x70 [xfs] > Aug 6 15:23:07 dev kernel: [ 304.413902] [] > xlog_recover_iodone+0x48/0x70 [xfs] > Aug 6 15:23:07 dev kernel: [ 304.413923] [] > xfs_buf_iodone_work+0x4d/0xa0 [xfs] > Aug 6 15:23:07 dev kernel: [ 304.413930] [] > process_one_work+0x141/0x4a0 > Aug 6 15:23:07 dev kernel: [ 304.413937] [] > worker_thread+0x168/0x410 > Aug 6 15:23:07 dev kernel: [ 304.413943] [] ? > manage_workers+0x120/0x120 > Aug 6 15:23:07 dev kernel: [ 304.413949] [] > kthread+0xc0/0xd0 > Aug 6 15:23:07 dev kernel: [ 304.413954] [] ? > flush_kthread_worker+0xb0/0xb0 > Aug 6 15:23:07 dev kernel: [ 304.413976] [] > ret_from_fork+0x7c/0xb0 > Aug 6 15:23:07 dev kernel: [ 304.413986] [] ? > flush_kthread_worker+0xb0/0xb0 > Aug 6 15:23:07 dev kernel: [ 304.413990] ---[ end trace 988d698520e1fa81 > ]--- > Aug 6 15:23:07 dev kernel: [ 304.414012] XFS (dm-19): I/O Error > Detected. > Shutting down filesystem > Aug 6 15:23:07 dev kernel: [ 304.415936] XFS (dm-19): Please umount the > filesystem and rectify the problem(s) > > But the rest of the callbacks also arrive: > Aug 6 15:23:07 dev kernel: [ 304.417812] XFS (dm-19): metadata I/O > error: > block 0x3780002 ("xlog_recover_iodone") error 28 numblks 1 > Aug 6 15:23:07 dev kernel: [ 304.420420] XFS (dm-19): > xfs_do_force_shutdown(0x1) called from line 377 of file > /mnt/work/alex/xfs/fs/xfs/xfs_log_recover.c. Return address = > 0xffffffffa0526848 > Aug 6 15:23:07 dev kernel: [ 304.420427] XFS (dm-19): metadata I/O > error: > block 0x3780008 ("xlog_recover_iodone") error 28 numblks 8 > Aug 6 15:23:07 dev kernel: [ 304.422708] XFS (dm-19): > xfs_do_force_shutdown(0x1) called from line 377 of file > /mnt/work/alex/xfs/fs/xfs/xfs_log_recover.c. Return address = > 0xffffffffa0526848 > Aug 6 15:23:07 dev kernel: [ 304.422738] XFS (dm-19): metadata I/O > error: > block 0x3780010 ("xlog_recover_iodone") error 28 numblks 8 > > The mount sequence fails and goes back to the caller: > Aug 6 15:23:07 dev kernel: [ 304.423438] XFS (dm-19): log mount/recovery > failed: error 28 > Aug 6 15:23:07 dev kernel: [ 304.423757] XFS (dm-19): log mount failed > > But there are still additional callbacks to deliver, which the mount > sequence did not wait for! > Aug 6 15:23:07 dev kernel: [ 304.425717] XFS (@dR): > xfs_do_force_shutdown(0x1) called from line 377 of file > /mnt/work/alex/xfs/fs/xfs/xfs_log_recover.c. Return address = > 0xffffffffa0526848 > Aug 6 15:23:07 dev kernel: [ 304.425723] XFS (@dR): metadata I/O error: > block 0x3780018 ("xlog_recover_iodone") error 28 numblks 8 > Aug 6 15:23:07 dev kernel: [ 304.428239] XFS (@dR): > xfs_do_force_shutdown(0x1) called from line 377 of file > /mnt/work/alex/xfs/fs/xfs/xfs_log_recover.c. Return address = > 0xffffffffa0526848 > Aug 6 15:23:07 dev kernel: [ 304.428246] XFS (@dR): metadata I/O error: > block 0x37800a0 ("xlog_recover_iodone") error 28 numblks 16 > > Notice the junk that they are printing! Naturally, because xfs_mount > structure has been kfreed. > > Finally the kernel crashes (instead of printing junk), because the > xfs_mount > structure is gone, but the callback tries to access it (printing the > name): > > Aug 6 15:23:07 dev kernel: [ 304.430796] general protection fault: 0000 > [#1] SMP > Aug 6 15:23:07 dev kernel: [ 304.432035] Modules linked in: xfrm_user > xfrm4_tunnel tunnel4 ipcomp xfrm_ipcomp esp4 ah4 iscsi_scst_tcp(O) > scst_vdisk(O) scst(O) dm_zcache(O) dm_btrfs(O) xfs(O) btrfs(O) libcrc32c > raid456(O) async_pq async_xor xor async_memcpy async_raid6_recov raid6_pq > async_tx raid1(O) md_mod deflate zlib_deflate ctr twofish_generic > twofish_x86_64_3way glue_helper lrw xts gf128mul twofish_x86_64 > twofish_common camellia_generic serpent_generic blowfish_generic > blowfish_x86_64 blowfish_common cast5_generic cast_common des_generic xcbc > rmd160 sha512_generic crypto_null af_key xfrm_algo dm_round_robin kvm vfat > fat ppdev psmouse microcode nfsd nfs_acl dm_multipath(O) serio_raw > parport_pc nfsv4 dm_iostat(O) mac_hid i2c_piix4 auth_rpcgss nfs fscache > lockd sunrpc lp parport floppy > Aug 6 15:23:07 dev kernel: [ 304.432035] CPU 1 > Aug 6 15:23:07 dev kernel: [ 304.432035] Pid: 133, comm: kworker/1:1H > Tainted: G W O 3.8.13-557-generic #1382000791 Bochs Bochs > Aug 6 15:23:07 dev kernel: [ 304.432035] RIP: 0010:[] > [] strnlen+0xb/0x30 > Aug 6 15:23:07 dev kernel: [ 304.432035] RSP: 0018:ffff880035461b08 > EFLAGS: 00010086 > Aug 6 15:23:07 dev kernel: [ 304.432035] RAX: 0000000000000000 RBX: > ffffffff81e6a4e7 RCX: 0000000000000000 > Aug 6 15:23:07 dev kernel: [ 304.432035] RDX: e4e8390a265c0000 RSI: > ffffffffffffffff RDI: e4e8390a265c0000 > Aug 6 15:23:07 dev kernel: [ 304.432035] RBP: ffff880035461b08 R08: > 000000000000ffff R09: 000000000000ffff > Aug 6 15:23:07 dev kernel: [ 304.432035] R10: 0000000000000000 R11: > 00000000000004cd R12: e4e8390a265c0000 > Aug 6 15:23:07 dev kernel: [ 304.432035] R13: ffffffff81e6a8c0 R14: > 0000000000000000 R15: 000000000000ffff > Aug 6 15:23:07 dev kernel: [ 304.432035] FS: 0000000000000000(0000) > GS:ffff88007fc80000(0000) knlGS:0000000000000000 > Aug 6 15:23:07 dev kernel: [ 304.432035] CS: 0010 DS: 0000 ES: 0000 > CR0: > 000000008005003b > Aug 6 15:23:07 dev kernel: [ 304.432035] CR2: 00007fc902ffbfd8 CR3: > 000000007702a000 CR4: 00000000000006e0 > Aug 6 15:23:07 dev kernel: [ 304.432035] DR0: 0000000000000000 DR1: > 0000000000000000 DR2: 0000000000000000 > Aug 6 15:23:07 dev kernel: [ 304.432035] DR3: 0000000000000000 DR6: > 00000000ffff0ff0 DR7: 0000000000000400 > Aug 6 15:23:07 dev kernel: [ 304.432035] Process kworker/1:1H (pid: 133, > threadinfo ffff880035460000, task ffff880035412e00) > Aug 6 15:23:07 dev kernel: [ 304.432035] Stack: > Aug 6 15:23:07 dev kernel: [ 304.432035] ffff880035461b48 > ffffffff8133dd5e 0000000000000000 ffffffff81e6a4e7 > Aug 6 15:23:07 dev kernel: [ 304.432035] ffffffffa0566cba > ffff880035461c80 ffffffffa0566cba ffffffff81e6a8c0 > Aug 6 15:23:07 dev kernel: [ 304.432035] ffff880035461bc8 > ffffffff8133ef59 ffff880035461bc8 ffffffff81c84040 > Aug 6 15:23:07 dev kernel: [ 304.432035] Call Trace: > Aug 6 15:23:07 dev kernel: [ 304.432035] [] > string.isra.4+0x3e/0xd0 > Aug 6 15:23:07 dev kernel: [ 304.432035] [] > vsnprintf+0x219/0x640 > Aug 6 15:23:07 dev kernel: [ 304.432035] [] > vscnprintf+0x11/0x30 > Aug 6 15:23:07 dev kernel: [ 304.432035] [] > vprintk_emit+0xc1/0x490 > Aug 6 15:23:07 dev kernel: [ 304.432035] [] ? > vprintk_emit+0x170/0x490 > Aug 6 15:23:07 dev kernel: [ 304.432035] [] > printk+0x61/0x63 > Aug 6 15:23:07 dev kernel: [ 304.432035] [] > __xfs_printk+0x31/0x50 [xfs] > Aug 6 15:23:07 dev kernel: [ 304.432035] [] > xfs_notice+0x53/0x60 [xfs] > Aug 6 15:23:07 dev kernel: [ 304.432035] [] > xfs_do_force_shutdown+0xf5/0x180 [xfs] > Aug 6 15:23:07 dev kernel: [ 304.432035] [] ? > xlog_recover_iodone+0x48/0x70 [xfs] > Aug 6 15:23:07 dev kernel: [ 304.432035] [] > xlog_recover_iodone+0x48/0x70 [xfs] > Aug 6 15:23:07 dev kernel: [ 304.432035] [] > xfs_buf_iodone_work+0x4d/0xa0 [xfs] > Aug 6 15:23:07 dev kernel: [ 304.432035] [] > process_one_work+0x141/0x4a0 > Aug 6 15:23:07 dev kernel: [ 304.432035] [] > worker_thread+0x168/0x410 > Aug 6 15:23:07 dev kernel: [ 304.432035] [] ? > manage_workers+0x120/0x120 > Aug 6 15:23:07 dev kernel: [ 304.432035] [] > kthread+0xc0/0xd0 > Aug 6 15:23:07 dev kernel: [ 304.432035] [] ? > flush_kthread_worker+0xb0/0xb0 > Aug 6 15:23:07 dev kernel: [ 304.432035] [] > ret_from_fork+0x7c/0xb0 > Aug 6 15:23:07 dev kernel: [ 304.432035] [] ? > flush_kthread_worker+0xb0/0xb0 > Aug 6 15:23:07 dev kernel: [ 304.432035] Code: 31 c0 80 3f 00 55 48 89 > e5 > 74 11 48 89 f8 66 90 48 83 c0 01 80 38 00 75 f7 48 29 f8 5d c3 66 90 55 31 > c0 48 85 f6 48 89 e5 74 23 <80> 3f 00 74 1e 48 89 f8 eb 0c 0f 1f 00 48 83 > ee > 01 80 38 00 74 > Aug 6 15:23:07 dev kernel: [ 304.432035] RIP [] > strnlen+0xb/0x30 > Aug 6 15:23:07 dev kernel: [ 304.432035] RSP > > > So previously you said: "So, something is corrupting memory and stamping > all > over the XFS structures." and also "given you have a bunch of out of tree > modules loaded (and some which are experiemental) suggests that you have a > problem with your storage...". > > But I believe, my analysis shows that during the mount sequence XFS does > not > wait properly for all the bios to complete, before failing the mount > sequence back to the caller. > As an experiment, what about the following? Compile tested only and not safe for general use. What might help more is to see if you can create a reproducer on a recent, clean kernel. Perhaps a metadump of your reproducer fs combined with whatever block device ENOSPC hack you're using would do it. Brian ---8<--- diff --git a/fs/xfs/xfs_buf.c b/fs/xfs/xfs_buf.c index cd7b8ca..fbcf524 100644 --- a/fs/xfs/xfs_buf.c +++ b/fs/xfs/xfs_buf.c @@ -1409,19 +1409,27 @@ xfs_buf_iorequest( * case nothing will ever complete. It returns the I/O error code, if any, or * 0 if there was no error. */ -int -xfs_buf_iowait( - xfs_buf_t *bp) +static int +__xfs_buf_iowait( + struct xfs_buf *bp, + bool skip_error) { trace_xfs_buf_iowait(bp, _RET_IP_); - if (!bp->b_error) + if (skip_error || !bp->b_error) wait_for_completion(&bp->b_iowait); trace_xfs_buf_iowait_done(bp, _RET_IP_); return bp->b_error; } +int +xfs_buf_iowait( + struct xfs_buf *bp) +{ + return __xfs_buf_iowait(bp, false); +} + xfs_caddr_t xfs_buf_offset( xfs_buf_t *bp, @@ -1866,7 +1874,7 @@ xfs_buf_delwri_submit( bp = list_first_entry(&io_list, struct xfs_buf, b_list); list_del_init(&bp->b_list); - error2 = xfs_buf_iowait(bp); + error2 = __xfs_buf_iowait(bp, true); xfs_buf_relse(bp); if (!error) error = error2; --- > Thanks, > Alex. > > > > -----Original Message----- From: Dave Chinner > Sent: 05 August, 2014 2:07 AM > To: Alex Lyakas > Cc: xfs@oss.sgi.com > Subject: Re: use-after-free on log replay failure > > On Mon, Aug 04, 2014 at 02:00:05PM +0300, Alex Lyakas wrote: > >Greetings, > > > >we had a log replay failure due to some errors that the underlying > >block device returned: > >[49133.801406] XFS (dm-95): metadata I/O error: block 0x270e8c180 > >("xlog_recover_iodone") error 28 numblks 16 > >[49133.802495] XFS (dm-95): log mount/recovery failed: error 28 > >[49133.802644] XFS (dm-95): log mount failed > > #define ENOSPC 28 /* No space left on device */ > > You're getting an ENOSPC as a metadata IO error during log recovery? > Thin provisioning problem, perhaps, and the error is occurring on > submission rather than completion? If so: > > 8d6c121 xfs: fix buffer use after free on IO error > > Cheers, > > Dave. > -- > Dave Chinner > david@fromorbit.com > From david@fromorbit.com Wed Aug 6 19:09: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 (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 69AAA7FA2 for ; Wed, 6 Aug 2014 19:09:40 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 5884B8F8052 for ; Wed, 6 Aug 2014 17:09:37 -0700 (PDT) X-ASG-Debug-ID: 1407370173-04cb6c3f6d14370001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id DTixTeFzKYSywLyA for ; Wed, 06 Aug 2014 17:09:34 -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: AuwOAC3D4lN5LDJ8PGdsb2JhbABagw0fM1eCJ6t8Bp5GCodEAgKBEhcFAQEBATg2hAsCSwgWAggDGCQDMQUUCQgDBy0UBwIEiCAOxBAYhWSHQIElCQsGAVCCPw9EJIEcBZUsg3GCdYFVlHCCCysvgQUIFw Received: from ppp121-44-50-124.lns20.syd6.internode.on.net (HELO dastard) ([121.44.50.124]) by ipmail06.adl6.internode.on.net with ESMTP; 07 Aug 2014 09:39:24 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1XFBGk-0001KA-8u; Thu, 07 Aug 2014 10:09:22 +1000 Date: Thu, 7 Aug 2014 10:09:22 +1000 From: Dave Chinner To: xfs@oss.sgi.com Cc: fstests@vger.kernel.org Subject: [DISCUSS] Moving from oss.sgi.com to kernel.org Message-ID: <20140807000922.GA26465@dastard> X-ASG-Orig-Subj: [DISCUSS] Moving from oss.sgi.com to kernel.org MIME-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha1; protocol="application/pgp-signature"; boundary="k+w/mQv8wyuph6w0" 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: 1407370173 X-Barracuda-URL: http://192.48.176.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.8198 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- --k+w/mQv8wyuph6w0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-Transfer-Encoding: quoted-printable Hi folks, A few recent incidents, discoveries and comments have me concerned about the viability of using oss.sgi.com to host XFS deveopment and community support. We are very grateful for the time, effort and money that SGI has put into providing oss.sgi.com for us over many, many years, but these recent issues have brought the state of oss.sgi.com and hence it's viability as a host for XFS development to my immediate attention. Ultimately, as the XFS maintainer, I'm responsible for the contents of the pull requests sent to Linus and the code we distribute to users, distros and developers. That means I need to be able to trust that the hosting infrastructure is secure and well maintained. The short story is that I can't trust oss.sgi.com to be maintained and secure anymore. The recent DOS issues with oss.sgi.com made it clear that it is essentially unmaintained and the SGI admins don't have time to address issues that arise. This little snippet of the conversion about blocking the rogue spider causing the recent ftp and gitweb DOS problems is instructive: [19/07/14 09:07] trev, it's you guys' box :) [19/07/14 09:07] you get to make it work=20 [19/07/14 09:07] I am not eh administrator, and if I'm forced = to do this sort of thing I'll just take the content elsewhere.... [19/07/14 09:08] dchinner__, please do so. I don't have much time fo= r oss anymore It should be no surprise that since this conversation I've been looking at what is involved in moving everything XFS off oss.sgi.com to kernel.org. Right now I have the main XFS repositories up to date on kernel.org. For userspace I've simply pushed the current trees and tags to the pre-existing repositories here: git://git.kernel.org/pub/scm/fs/xfs/xfsprogs-dev.git git://git.kernel.org/pub/scm/fs/xfs/xfsdump-dev.git git://git.kernel.org/pub/scm/fs/xfs/xfstests-dev.git These trees currently have the same content as the trees on oss.sgi.com. I may rename these as a result of discussions here (e.g. some people don't like the -dev suffix on the trees) so it's best for people to continue to use the trees on oss.sgi.com until this disucssion comes to a conclusion. My new kernel dev tree can be found here: git://git.kernel.org/pub/scm/linux/kernel/git/dgc/linux-xfs.git This is my immediate concern: this tree, regardless of anything else, the tree I am going to be asking Linus to pull from - it is now *my* master tree and the tree on oss.sgi.com will simply mirror that tree. For the short term, I will set up a cron job to keep the oss trees up to date with the trees on kernel.org. By "short-term" I mean till the end of the year at most. This will allow people time to change their workflows, update their repos, bookmarks, etc in their own time so hopefully not take anyone by surprise when the trees on oss.sgi.com stop updating. "short-term" is a rubbery concept - if anyone things it should be longer or shorter or whether a completely different approach is warranted, please speak up. Over the next few days I will move the remaining xfs trees to kernel.org - the historical kernel archive and documentation trees - and then I'll maintain them as the primary trees with the same short term mirroring backup. In moving these trees, we will need to update some documentation (e.g. the "where to get" documentation on the xfs.org wiki) and links, as well as place a "readme" in the gitweb main page on oss.sgi.com to indicate that the up-to-date XFS trees are now on kernel.org and documenting the drop-dead date to when the trees on oss will no longer be kept up to date. The only remaining issue is what to do about tarball releases for xfsprogs/xfsdump/fstests. We currently have a bunch of historic releases in the ftp release area on oss.sgi.com. I will organise a release directory on kernel.org for future releases (location yet to be confirmed), but I'm not sure what to do with the older releases. I'm open to suggestions here, but the limit of what I will try to move to kernel.org is signed tarballs that I have verified. For xfstests, I think this would be a good time to rename the project officially as well (i.e. to "fstests"). I'll need to talk to the kernel.org admins on where to locate it (pub/scm/fs/fstests is the best candidate, I think), but in the mean time I'll just mirror to oss.sgi.com as per the above so nobody needs to change anything until we sort out the final location/name of the tree. If anyone has any other ideas on this, please let me know, otherwise I'll just proceed with this plan. In conjunction with this source tree move, I'd also like to start the move the mailing list. We have ongoing spam, performance and user access issues with oss.sgi.com, so IMO if we are moving source trees off this host we should also move the mailing list to kernel.org infrastructure. To that end, there is a linux-xfs@vger.kernel.org list already - it was created at the same time that the above kernel.org repositories were created, but we've never used it. It is archived here: http://www.spinics.net/lists/linux-xfs/ Moving the mailing list is going to be something that affects more than just the developers - we've got lots of documentation that points at this list and there are lots of users that are subscribed, read it though nntp gateways, have aliases for it, etc so we need a good transition plan here. I'm not sure what the best approach - perhaps just forwarding all email from xfs@oss.sgi.com to linux-xfs@vger.kernel.org will solve most transitional problems for users that aren't aware of the change or are following old documentation or "please report bug" messages from xfs_repair. But it means that everyone needs to subscribe to the new list and probably unsubscribe from the old list. I dont see how we can avoid that in the long term, but I'd like to minimise the pain as much as possible for everyone. Again, I'm open to suggestions on how to approach this and maintain the oss list aliases for long enough that people and search engines learn about the new list. I would like to make this as painless as possible for everyone. This isn't the only solution to the problems we have with oss.sgi.com, but it's the path of least effort/greatest gain for me. If anyone has any ideas on alternative solutions, reservations about moving to kernel.org infrastructure and/or suggestions to make it less painful for everyone, please speak up now. Cheers, Dave. --=20 Dave Chinner david@fromorbit.com --k+w/mQv8wyuph6w0 Content-Type: application/pgp-signature; name="signature.asc" Content-Description: Digital signature -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.12 (GNU/Linux) iQIcBAEBAgAGBQJT4sOxAAoJEK3oKUf0dfodHRsQANRBTF02Q742McbEZxb0J9IB EKz+eLegRB5zRaHQAa7GEVq5xSnEJvX4/M2XTCK+HBCNdGy6DPH3777Tf6869uLt 5YLf1hIhQso/o3FPqaRdb9UmaV/fXGjAjBIcTneCHThMO1JWRpyLlZBAcYIrO3yQ MD8xjypUk/KxRxLZU54kXHZG5TZ6abXF6MAksBBX7gnKlLMBeVwBznn64WLUebAF aJEJCiaiBKYo0Hcd7MkKLtBdbi977Mk/pkMS1U3AILrRBN40jl7o7pFDnyApzTy6 r03VbWTuZSgaPQF32SfSqBXUTAKaOJA4zEr61QuS7yyvVhm2a6YcY92/yw1ia7AY kT5eMqn9vxZwPHI8b/38Dhrm/HJEXS/TkCAafCQlaMN7U0auvpsZtHQain2s4Vm4 SW7hzb26Y1zy/A0pLDGz0GHEs+Hml9DuZvu5BbmCtFnrsi6u0DpHUorwQ4JxWuiJ SbonlU1Wf4g7h2SwShoPmtRKS2ar2vFmS5jnuUoq7HtWjLJwFryKuDHHjaDReVVA JeV4Ux13BeRnGqFpn7Xbaphm/3I3fFQc7h6qU+u/Clt6u6bC1+2j41Nq35fCT04M wB7ogbW19elsr/hbZBINLWmb5k6lZ8WFXMKuvlUdEvwTL89FTOhimWZRrKNlDSDc TSDH886bZf4WgoN8h505 =4kZa -----END PGP SIGNATURE----- --k+w/mQv8wyuph6w0-- From felipemonteiro.carvalho@gmail.com Thu Aug 7 06:51: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=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 CAB887F7E for ; Thu, 7 Aug 2014 06:51:06 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id B98ED30404E for ; Thu, 7 Aug 2014 04:51:06 -0700 (PDT) X-ASG-Debug-ID: 1407412262-04cb6c3f6f362f0001-NocioJ Received: from mail-pd0-f170.google.com (mail-pd0-f170.google.com [209.85.192.170]) by cuda.sgi.com with ESMTP id 1zWRB42tEuhYfUwf (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Thu, 07 Aug 2014 04:51:02 -0700 (PDT) X-Barracuda-Envelope-From: felipemonteiro.carvalho@gmail.com X-Barracuda-RBL-Trusted-Forwarder: 209.85.192.170 Received: by mail-pd0-f170.google.com with SMTP id g10so5100019pdj.29 for ; Thu, 07 Aug 2014 04:51:01 -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=bM0spycRMLx+DsVaZkUmPNpGZ0onAta8E92SORAlvMY=; b=0Q4gc7yPtgJE75KdYeajeFhIY8iaga1D+VuNJKzsxegZvSbRk72/3JFiOevLkgkUVt J8Pnf0jWA3UIr4gBTIYxLI/oteMs+1YbhU4vEw4hK/JX4tcRG6Foi0rPtmf+oQ3ye5o3 BWkrgIrFawySlrEvE6psUhtSCjXy/Q9xo+Rdw7zPuu64vLnotEEx9YsZSZ1BWxtO2pyR /1K6NuO3+tPSDjzgolq7y8yGhHy1dA4cKJe1Cb79uKIrYIqQ2JSIYyQ2TVebN9azIVJh K2MiQMSgcnInPfm7UWQkyR+fLIur2U4e5igmhDv+SWD/ZDkhk9zZh/rPYh6b91IpO6Qb pKsg== X-Barracuda-BBL-IP: nil MIME-Version: 1.0 X-Received: by 10.67.4.234 with SMTP id ch10mr17060087pad.3.1407412261841; Thu, 07 Aug 2014 04:51:01 -0700 (PDT) Received: by 10.66.50.9 with HTTP; Thu, 7 Aug 2014 04:51:01 -0700 (PDT) In-Reply-To: <20140806142329.GA39990@bfoster.bfoster> References: <20140806113447.GA14820@bfoster.bfoster> <20140806142329.GA39990@bfoster.bfoster> Date: Thu, 7 Aug 2014 13:51:01 +0200 Message-ID: Subject: Re: xfs_bmbt_rec_64 leading to wrong blocks From: Felipe Monteiro de Carvalho X-ASG-Orig-Subj: Re: xfs_bmbt_rec_64 leading to wrong blocks To: Brian Foster Cc: xfs@oss.sgi.com Content-Type: text/plain; charset=UTF-8 X-Barracuda-Connect: mail-pd0-f170.google.com[209.85.192.170] X-Barracuda-Start-Time: 1407412262 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.8214 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, Thanks, that worked perfectly =) My actual idea is to not only read the partition, but to also recover deleted/corrupted files. With the information that you provided I advanced a lot in this direction, and I can now recover the file information in that memory area completely. I can also obtain the inode nr (well 4 bytes of it are preserved, but its better then nothing), but my current problem is with the inode itself. In a deleted file the following changes are done by the linux driver in the inode: xfs_dinode_core_t.di_mode was changed to zero xfs_dinode_core_t.di_format was changed from 1 (local) to 2 (extent) But di_mode in particular is a key element as I am using it to differentiate files from directories. Is there anything else what I can use to differentiate files from directories in case di_mode was corrupted? I am searching here but so far I didn't find anything... thanks, -- Felipe Monteiro de Carvalho From bfoster@redhat.com Thu Aug 7 07:32: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 7D6297F82 for ; Thu, 7 Aug 2014 07:32:16 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 6C7698F8065 for ; Thu, 7 Aug 2014 05:32:13 -0700 (PDT) X-ASG-Debug-ID: 1407414731-04cb6c3f6e382d0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 5NCPXjAr5Hqk1mjB (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 07 Aug 2014 05:32:12 -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 s77CW3I8008579 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 7 Aug 2014 08:32:03 -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 s77CW3Nk008294; Thu, 7 Aug 2014 08:32:03 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 8871512577C; Thu, 7 Aug 2014 08:32:02 -0400 (EDT) Date: Thu, 7 Aug 2014 08:32:02 -0400 From: Brian Foster To: Dave Chinner Cc: xfs@oss.sgi.com, fstests@vger.kernel.org Subject: Re: [DISCUSS] Moving from oss.sgi.com to kernel.org Message-ID: <20140807123202.GA53888@bfoster.bfoster> X-ASG-Orig-Subj: Re: [DISCUSS] Moving from oss.sgi.com to kernel.org References: <20140807000922.GA26465@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140807000922.GA26465@dastard> User-Agent: Mutt/1.5.23 (2014-03-12) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1407414731 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Thu, Aug 07, 2014 at 10:09:22AM +1000, Dave Chinner wrote: > Hi folks, > > A few recent incidents, discoveries and comments have me concerned > about the viability of using oss.sgi.com to host XFS deveopment and > community support. > > We are very grateful for the time, effort and money that SGI has put > into providing oss.sgi.com for us over many, many years, but these > recent issues have brought the state of oss.sgi.com and hence it's > viability as a host for XFS development to my immediate attention. > > Ultimately, as the XFS maintainer, I'm responsible for the contents > of the pull requests sent to Linus and the code we distribute to > users, distros and developers. That means I need to be able to trust > that the hosting infrastructure is secure and well maintained. > > The short story is that I can't trust oss.sgi.com to be maintained > and secure anymore. The recent DOS issues with oss.sgi.com made it > clear that it is essentially unmaintained and the SGI admins don't > have time to address issues that arise. This little snippet of the > conversion about blocking the rogue spider causing the recent > ftp and gitweb DOS problems is instructive: > > [19/07/14 09:07] trev, it's you guys' box :) > [19/07/14 09:07] you get to make it work > [19/07/14 09:07] I am not eh administrator, and if I'm forced to do this sort of thing I'll just take the content elsewhere.... > [19/07/14 09:08] dchinner__, please do so. I don't have much time for oss anymore > > It should be no surprise that since this conversation I've been > looking at what is involved in moving everything XFS off oss.sgi.com > to kernel.org. Right now I have the main XFS repositories up to > date on kernel.org. For userspace I've simply pushed the current > trees and tags to the pre-existing repositories here: > > git://git.kernel.org/pub/scm/fs/xfs/xfsprogs-dev.git > git://git.kernel.org/pub/scm/fs/xfs/xfsdump-dev.git > git://git.kernel.org/pub/scm/fs/xfs/xfstests-dev.git > > These trees currently have the same content as the trees on > oss.sgi.com. I may rename these as a result of discussions here > (e.g. some people don't like the -dev suffix on the trees) so it's > best for people to continue to use the trees on oss.sgi.com until > this disucssion comes to a conclusion. > These should be renamed, IMO. -dev implies the repo is some kind of subtree. Furthermore, aside from the issue of updating current references to point to new trees, I'm sure there's a decent enough archive of references on the mailing list to these particular trees being deprecated. > My new kernel dev tree can be found here: > > git://git.kernel.org/pub/scm/linux/kernel/git/dgc/linux-xfs.git > > This is my immediate concern: this tree, regardless of anything > else, the tree I am going to be asking Linus to pull from - it is > now *my* master tree and the tree on oss.sgi.com will simply mirror > that tree. > > For the short term, I will set up a cron job to keep the oss trees > up to date with the trees on kernel.org. By "short-term" I mean till > the end of the year at most. This will allow people time to change > their workflows, update their repos, bookmarks, etc in their own > time so hopefully not take anyone by surprise when the trees on > oss.sgi.com stop updating. "short-term" is a rubbery concept - if > anyone things it should be longer or shorter or whether a completely > different approach is warranted, please speak up. > What's the expected frequency of mirror updates? I'm assuming something nightly, so changes should reflect generally within 24 hours..? > Over the next few days I will move the remaining xfs trees to > kernel.org - the historical kernel archive and documentation trees - > and then I'll maintain them as the primary trees with the same > short term mirroring backup. > > In moving these trees, we will need to update some documentation > (e.g. the "where to get" documentation on the xfs.org wiki) and > links, as well as place a "readme" in the gitweb main page on > oss.sgi.com to indicate that the up-to-date XFS trees are now on > kernel.org and documenting the drop-dead date to when the trees on > oss will no longer be kept up to date. > It might be a good idea to somehow mark those repos when that drop dead date hits. Perhaps rename master and drop a single README file with a reference to the new repo, etc. Just a thought considering it seems like at that point we could have up to three repos (if the -dev renames end up being new repo creations or something, and if nuking the old ones isn't an option) for some projects. > The only remaining issue is what to do about tarball releases for > xfsprogs/xfsdump/fstests. We currently have a bunch of historic > releases in the ftp release area on oss.sgi.com. I will organise a > release directory on kernel.org for future releases (location yet to > be confirmed), but I'm not sure what to do with the older releases. > I'm open to suggestions here, but the limit of what I will try to > move to kernel.org is signed tarballs that I have verified. > > For xfstests, I think this would be a good time to rename the > project officially as well (i.e. to "fstests"). I'll need to talk to > the kernel.org admins on where to locate it (pub/scm/fs/fstests is > the best candidate, I think), but in the mean time I'll just mirror > to oss.sgi.com as per the above so nobody needs to change anything > until we sort out the final location/name of the tree. If anyone has > any other ideas on this, please let me know, otherwise I'll just > proceed with this plan. > Personally, I can switch kernel trees fairly easily. I've cloned the linux-xfs tree and can either move over whatever things I'm working on or just start new efforts in the new tree. That said, I'm hesitant to bother with any of the -dev repos until it's clear what's going to happen with them (which is pretty much what you suggested above). In other words, it's easiest to move once rather than from oss.sgi.com xfstests, to kernel.org xfstests-dev then to kernel.org fstests. Of course, it's good to have the latest repos replicated somewhere if there is concern about the stability of the current host. > In conjunction with this source tree move, I'd also like to start the > move the mailing list. We have ongoing spam, performance and user > access issues with oss.sgi.com, so IMO if we are moving source trees > off this host we should also move the mailing list to kernel.org > infrastructure. > I hope that doesn't mean we lose our megatron subscription. ;) Brian > To that end, there is a linux-xfs@vger.kernel.org > list already - it was created at the same time that the above > kernel.org repositories were created, but we've never used it. It > is archived here: > > http://www.spinics.net/lists/linux-xfs/ > > Moving the mailing list is going to be something that affects more > than just the developers - we've got lots of documentation that > points at this list and there are lots of users that are subscribed, > read it though nntp gateways, have aliases for it, etc so we need > a good transition plan here. > > I'm not sure what the best approach - perhaps just > forwarding all email from xfs@oss.sgi.com to > linux-xfs@vger.kernel.org will solve most transitional problems > for users that aren't aware of the change or are following old > documentation or "please report bug" messages from xfs_repair. > But it means that everyone needs to subscribe to the new list > and probably unsubscribe from the old list. I dont see how we can > avoid that in the long term, but I'd like to minimise the pain > as much as possible for everyone. > > Again, I'm open to suggestions on how to approach this and maintain > the oss list aliases for long enough that people and search engines > learn about the new list. > > I would like to make this as painless as possible for everyone. This > isn't the only solution to the problems we have with oss.sgi.com, > but it's the path of least effort/greatest gain for me. If anyone > has any ideas on alternative solutions, reservations about moving to > kernel.org infrastructure and/or suggestions to make it less painful > for everyone, please speak up now. > > 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 Thu Aug 7 07:56: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 7E9A97F87 for ; Thu, 7 Aug 2014 07:56:31 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 1AEACAC002 for ; Thu, 7 Aug 2014 05:56:28 -0700 (PDT) X-ASG-Debug-ID: 1407416186-04cbb00fa13f880001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id G9bTQMHI6jFexpI0 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 07 Aug 2014 05:56:27 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s77CuOqL021653 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 7 Aug 2014 08:56:25 -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 s77CuOSv015784; Thu, 7 Aug 2014 08:56:24 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id B8A7612577C; Thu, 7 Aug 2014 08:56:23 -0400 (EDT) Date: Thu, 7 Aug 2014 08:56:23 -0400 From: Brian Foster To: Felipe Monteiro de Carvalho Cc: xfs@oss.sgi.com Subject: Re: xfs_bmbt_rec_64 leading to wrong blocks Message-ID: <20140807125623.GB53888@bfoster.bfoster> X-ASG-Orig-Subj: Re: xfs_bmbt_rec_64 leading to wrong blocks References: <20140806113447.GA14820@bfoster.bfoster> <20140806142329.GA39990@bfoster.bfoster> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.23 (2014-03-12) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1407416186 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Thu, Aug 07, 2014 at 01:51:01PM +0200, Felipe Monteiro de Carvalho wrote: > Hello, > > Thanks, that worked perfectly =) > > My actual idea is to not only read the partition, but to also recover > deleted/corrupted files. With the information that you provided I > advanced a lot in this direction, and I can now recover the file > information in that memory area completely. I can also obtain the > inode nr (well 4 bytes of it are preserved, but its better then > nothing), but my current problem is with the inode itself. In a > deleted file the following changes are done by the linux driver in the > inode: > > xfs_dinode_core_t.di_mode was changed to zero > xfs_dinode_core_t.di_format was changed from 1 (local) to 2 (extent) > These are set in xfs_ifree() when the inode is pulled from the unlinked list and ultimately freed. Resetting these values certainly makes sense, but I'm not aware of the reason why di_format is set as such. > But di_mode in particular is a key element as I am using it to > differentiate files from directories. > In general you can't rely on on-disk data once the inode has been freed. Perhaps you should start a new thread with some kind of write up about what you're trying to accomplish and how you're going about it. Brian > Is there anything else what I can use to differentiate files from > directories in case di_mode was corrupted? I am searching here but so > far I didn't find anything... > > thanks, > -- > Felipe Monteiro de Carvalho > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From felipemonteiro.carvalho@gmail.com Thu Aug 7 08:42: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=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 35D8E7F82 for ; Thu, 7 Aug 2014 08:42:02 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 07FEB8F8064 for ; Thu, 7 Aug 2014 06:41:59 -0700 (PDT) X-ASG-Debug-ID: 1407418917-04bdf0346743c40001-NocioJ Received: from mail-pa0-f44.google.com (mail-pa0-f44.google.com [209.85.220.44]) by cuda.sgi.com with ESMTP id 6E4TuXNvlclx9vap (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Thu, 07 Aug 2014 06:41:57 -0700 (PDT) X-Barracuda-Envelope-From: felipemonteiro.carvalho@gmail.com X-Barracuda-RBL-Trusted-Forwarder: 209.85.220.44 Received: by mail-pa0-f44.google.com with SMTP id eu11so5484367pac.3 for ; Thu, 07 Aug 2014 06:41:57 -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=JSe1XwPUNRCHSPCx+kCY2pR5A4ZxAHxwgrkip9FwzkA=; b=Py3UBJDi/EYLfGzaofsgsYV+4p3JUnhX3HpVUYBy+iZP/4MJ3lC8sBwyQdezfxMjkZ wtezzkazCVTAMKgclYJFfD1g5SPUYOp4uKArd9MGR+nyPQRjUNOLpp2l75ZtU4tKba8p 07A53H+3dqR9mQQ75zzy9Rln6G4eUmZQJqzcGoiPNe5drqRvy/gaJZ9LJ5221SmEGg+6 PNcNIifitPRamUY2US8rsTRU3OmhZnx4b6aWJPtDuQcb+o/WqcCMv+RUb0TsPUtKpM5D 7CNynwu7Pf82md8kJEH3zXhQVFukbHiBokGNIgwsyzlHdDKVSUIyhwN1P9QIo7Ruilki 8QpA== X-Barracuda-BBL-IP: nil MIME-Version: 1.0 X-Received: by 10.66.158.130 with SMTP id wu2mr17739156pab.59.1407418917073; Thu, 07 Aug 2014 06:41:57 -0700 (PDT) Received: by 10.66.50.9 with HTTP; Thu, 7 Aug 2014 06:41:57 -0700 (PDT) Date: Thu, 7 Aug 2014 15:41:57 +0200 Message-ID: Subject: Recovery of deleted files/directories From: Felipe Monteiro de Carvalho X-ASG-Orig-Subj: Recovery of deleted files/directories To: xfs@oss.sgi.com Content-Type: text/plain; charset=UTF-8 X-Barracuda-Connect: mail-pa0-f44.google.com[209.85.220.44] X-Barracuda-Start-Time: 1407418917 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.8216 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, Aug 7, 2014 at 2:56 PM, Brian Foster wrote: >> But di_mode in particular is a key element as I am using it to >> differentiate files from directories. > In general you can't rely on on-disk data once the inode has been freed. > Perhaps you should start a new thread with some kind of write up about > what you're trying to accomplish and how you're going about it. Yes, I know it is unreliable, and that's OK for me. I'm satisfied in having a best effort solution which works often, it does not have to be fully reliable. What I am trying to accomplish is quite simple: Recover as many deleted files in a XFS partition as possible. For example if someone deletes a file by mistake, how to get it back? And the current place where I got stuck is exactly the post-xfs_ifree inode, specifically deciding if the inode is a directory or a file. In my hex editor I see that all the information is still there, it would be a petty to give up when so little is missing. That di_format is overwritten is a big problem too, but I think I can work around it by trying each format and choose the best result from all tries. Also, I just noticed that di_size is also overwritten ... which will be very bad for file recovery. But knowing if the inode is a file or a directory is the most pressing issue. For a better illustration, here is the data I see for a directory (xfs_del is the deleted, xfs_orig is before delete): http://magnifier.sourceforge.net/temp/xfs/xfs_deleted_inode_dir.png And the same for a file: http://magnifier.sourceforge.net/temp/xfs/xfs_deleted_inode_file.png Well, it might be that what I want to do is impossible, but I just I might ask in case anyone knows any other way to differentiate a file from a directory, if at least this information is present I could somehow work around the other issues. thanks, -- Felipe Monteiro de Carvalho From sandeen@sandeen.net Thu Aug 7 09:45: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 978057F6C for ; Thu, 7 Aug 2014 09:45:44 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 8684A8F8040 for ; Thu, 7 Aug 2014 07:45:41 -0700 (PDT) X-ASG-Debug-ID: 1407422739-04cbb00fa146f40001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id 2L2lFwDxSEGifOpZ for ; Thu, 07 Aug 2014 07:45:39 -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 8641D63BE4E6; Thu, 7 Aug 2014 09:45:39 -0500 (CDT) Message-ID: <53E39117.4090200@sandeen.net> Date: Thu, 07 Aug 2014 09:45:43 -0500 From: Eric Sandeen MIME-Version: 1.0 To: Felipe Monteiro de Carvalho , xfs@oss.sgi.com Subject: Re: Recovery of deleted files/directories References: X-ASG-Orig-Subj: Re: Recovery of deleted files/directories In-Reply-To: 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: 1407422739 X-Barracuda-URL: http://192.48.176.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.8217 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 8/7/14, 8:41 AM, Felipe Monteiro de Carvalho wrote: > On Thu, Aug 7, 2014 at 2:56 PM, Brian Foster wrote: >>> But di_mode in particular is a key element as I am using it to >>> differentiate files from directories. >> In general you can't rely on on-disk data once the inode has been freed. >> Perhaps you should start a new thread with some kind of write up about >> what you're trying to accomplish and how you're going about it. > > Yes, I know it is unreliable, and that's OK for me. I'm satisfied in > having a best effort solution which works often, it does not have to > be fully reliable. > > What I am trying to accomplish is quite simple: Recover as many > deleted files in a XFS partition as possible. For example if someone > deletes a file by mistake, how to get it back? Do you have a link to the project you're working on? Is it an open source tool? There's another tool out there already called "xfs_irecover" which looks for any inode anywhere on disk, and tries to copy back out any data that it points to, deleted or not. It could use some love. Thanks, -Eric From bfoster@redhat.com Thu Aug 7 10:18: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 662DF7F7D for ; Thu, 7 Aug 2014 10:18:56 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 45CAC8F8073 for ; Thu, 7 Aug 2014 08:18:53 -0700 (PDT) X-ASG-Debug-ID: 1407424731-04cb6c3f6f40470001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id lMynd7d9NTwNVvif (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 07 Aug 2014 08:18: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 s77FInk0007988 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 7 Aug 2014 11:18:49 -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 s77FImtb012677; Thu, 7 Aug 2014 11:18:49 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id D571912577C; Thu, 7 Aug 2014 11:18:47 -0400 (EDT) Date: Thu, 7 Aug 2014 11:18:47 -0400 From: Brian Foster To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 04/18] xfs: introduce inode record hole mask for sparse inode chunks Message-ID: <20140807151847.GC53888@bfoster.bfoster> X-ASG-Orig-Subj: Re: [PATCH 04/18] xfs: introduce inode record hole mask for sparse inode chunks References: <1406211788-63206-1-git-send-email-bfoster@redhat.com> <1406211788-63206-5-git-send-email-bfoster@redhat.com> <20140724221453.GP20518@dastard> <20140728161632.GC59542@bfoster.bfoster> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140728161632.GC59542@bfoster.bfoster> User-Agent: Mutt/1.5.23 (2014-03-12) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.24 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1407424732 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Mon, Jul 28, 2014 at 12:16:33PM -0400, Brian Foster wrote: > On Fri, Jul 25, 2014 at 08:14:53AM +1000, Dave Chinner wrote: > > On Thu, Jul 24, 2014 at 10:22:54AM -0400, Brian Foster wrote: > > > The inode btrees track 64 inodes per record, regardless of inode size. > > > Thus, inode chunks on disk vary in size depending on the size of the > > > inodes. This creates a contiguous allocation requirement for new inode > > > chunks that can be difficult to satisfy on an aged and fragmented (free > > > space) filesystem. > > > > > > The inode record freecount currently uses 4 bytes on disk to track the > > > free inode count. With a maximum freecount value of 64, only one byte is > > > required. Convert the freecount field to a single byte and reserve two > > > of the remaining 3 higher order bytes left to the hole mask field. > > > > > > The hole mask field tracks potential holes in the chunks of physical > > > space that the inode record refers to. This facilitates the sparse > > > allocation of inode chunks when contiguous chunks are not available and > > > allows the inode btrees to identify what portions of the chunk contain > > > valid inodes. > > > > > > Tracking holes means the field is initialized to zero and thus maintains > > > backwards compatibility with existing filesystems. E.g., the higher > > > order bytes of a counter with a max value of 64 are already initialized > > > to 0. Update the inode record management functions to handle the new > > > field and initialize it to zero for now. > > > > > > Signed-off-by: Brian Foster > > > --- > > > fs/xfs/libxfs/xfs_format.h | 7 +++++-- > > > fs/xfs/libxfs/xfs_ialloc.c | 9 +++++++-- > > > fs/xfs/libxfs/xfs_ialloc_btree.c | 4 +++- > > > 3 files changed, 15 insertions(+), 5 deletions(-) > > > > > > diff --git a/fs/xfs/libxfs/xfs_format.h b/fs/xfs/libxfs/xfs_format.h > > > index 34d85ac..39022d9 100644 > > > --- a/fs/xfs/libxfs/xfs_format.h > > > +++ b/fs/xfs/libxfs/xfs_format.h > > > @@ -221,13 +221,16 @@ static inline xfs_inofree_t xfs_inobt_maskn(int i, int n) > > > */ > > > typedef struct xfs_inobt_rec { > > > __be32 ir_startino; /* starting inode number */ > > > - __be32 ir_freecount; /* count of free inodes (set bits) */ > > > + __be16 ir_holemask; /* hole mask for sparse chunks */ > > > + __u8 ir_pad; > > > + __u8 ir_freecount; /* count of free inodes (set bits) */ > > > __be64 ir_free; /* free inode mask */ > > > } xfs_inobt_rec_t; > > > > might we want the number of inodes allocated in the chunk there as > > well (i.e. in the pad field) so we can validate the holemask against > > the number of inodes allocated in the chunk? > > > > So you're suggesting something like this? > > - __be32 ir_freecount; /* count of free inodes (set bits) */ > + __be16 ir_holemask; /* hole mask for sparse chunks */ > + __u8 ir_count; /* total inode count */ > + __u8 ir_freecount; /* count of free inodes (set bits) */ > > That's an interesting thought. It might make some of the code more clear > and eliminate the need for the derivation of that value from the > holemask (beyond for validation purposes). I do like the extra > validation and potential debug use given the holemask is not quite as > human friendly as the free mask in terms of having a bit per inode. > > As long as there isn't any concern over reserving this space for > something else down the road (I suspect not, since the pad is introduced > by this feature), I'll look to use it as an inode count. > The ir_count field along with changing the way we handle the feature bit to be fixed rather than dynamic introduces an interesting design point with regard to backwards compatibility. The feature bit is now fixed at mkfs time and we have an assumption that it could be removed via some userspace mechanism (e.g., repair, xfs_admin, etc.). To do that safely, the mechanism requires some kind of verification that sparse inode chunks do not exist, either as part of the repair tracking or some kind of new counter somewhere that xfs_admin could refer to. The ir_count field helps with verification of the holemask and simplifies calculation of a "real" inode count for such records (e.g., for bulkstat). We could set ir_count only for inode records that are sparse, but that seems slightly unfortunate if we expect this record format to eventually be default. Alternatively (and what I have in my tree at the moment), we can use ir_count unconditionally so long as the feature bit is set. That obviously breaks the backwards compatibility of the record format since this is a higher order byte of ir_freecount on older kernels. So if the feature bit is mkfs time and there is no intent to enable it thereafter, it seems there isn't much benefit to record backwards compatibility. If we go that route, perhaps it's better to have an ir_alloc field or some such instead of ir_holemask, invert the bits and eliminate that bit of complexity. On the flipside, limiting usage of ir_count and retaining ir_holemask in its current form leaves open the possibility for enabling sparse inode chunks without a reformat (given certain requirements, e.g., a v5 superblock). Thoughts? Brian > Brian > > > -Dave. > > -- > > Dave Chinner > > david@fromorbit.com > > > > _______________________________________________ > > xfs mailing list > > xfs@oss.sgi.com > > http://oss.sgi.com/mailman/listinfo/xfs > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From sandeen@sandeen.net Thu Aug 7 15:14: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 (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id C14687F82 for ; Thu, 7 Aug 2014 15:14:45 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 50900AC010 for ; Thu, 7 Aug 2014 13:14:41 -0700 (PDT) X-ASG-Debug-ID: 1407442476-04cb6c3f6e4d280001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id MvgSBxDYFusQaGwJ for ; Thu, 07 Aug 2014 13:14:36 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1 with cipher DHE-RSA-AES128-SHA (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 705DB6370CE0; Thu, 7 Aug 2014 15:14:36 -0500 (CDT) Message-ID: <53E3DE2B.6080205@sandeen.net> Date: Thu, 07 Aug 2014 15:14:35 -0500 From: Eric Sandeen MIME-Version: 1.0 To: Dave Chinner , xfs@oss.sgi.com CC: fstests@vger.kernel.org Subject: Re: [DISCUSS] Moving from oss.sgi.com to kernel.org References: <20140807000922.GA26465@dastard> X-ASG-Orig-Subj: Re: [DISCUSS] Moving from oss.sgi.com to kernel.org In-Reply-To: <20140807000922.GA26465@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: 1407442476 X-Barracuda-URL: http://192.48.176.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.8224 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 On 8/6/14, 7:09 PM, Dave Chinner wrote: > Hi folks, > It should be no surprise that since this conversation I've been > looking at what is involved in moving everything XFS off oss.sgi.com > to kernel.org. Right now I have the main XFS repositories up to > date on kernel.org. For userspace I've simply pushed the current > trees and tags to the pre-existing repositories here: > > git://git.kernel.org/pub/scm/fs/xfs/xfsprogs-dev.git > git://git.kernel.org/pub/scm/fs/xfs/xfsdump-dev.git > git://git.kernel.org/pub/scm/fs/xfs/xfstests-dev.git > > These trees currently have the same content as the trees on > oss.sgi.com. I may rename these as a result of discussions here > (e.g. some people don't like the -dev suffix on the trees) so it's > best for people to continue to use the trees on oss.sgi.com until > this disucssion comes to a conclusion. I agree with the move to kernel.org; they have paid staff with time and resources to look after this stuff; it's a resource we should use, and it'll save us all time and/or money. But I'm one of the "some people" who don't want to re-use the -dev trees; let's just get properly named repos up there. These served a different purpose, long ago. If you want to rename to fstests, that's ok with me, but that's potentially a different scope; depending on how much content in the tree needs to be updated etc, I could see doing that a bit later if needed. If/when you get the names truly settled, let me know and I'll help with updating the wiki etc if you like. As for the old tarballs - they do claim to be signed, right? So if we can verify their identity, I see no harm in keeping them around. As for mailing lists, is it possible to forward for a while, and also send a reply back about the address change? That might be most foolproof, then eventually stop the forwarding and just add a reply about the list move, and leave that there until oss crumbles into dust. ;) Thanks, and "May the source be with you" ;) - -Eric -----BEGIN PGP SIGNATURE----- Version: GnuPG/MacGPG2 v2.0.17 (Darwin) Comment: GPGTools - http://gpgtools.org Comment: Using GnuPG with Thunderbird - http://www.enigmail.net/ iQIbBAEBAgAGBQJT494qAAoJECCuFpLhPd7gJm4P93Eas7qaiftU6WF4qKkvkKpD 0MzWk/b17wBR2cHqG9eLnw6Y4AuXCuYb3DTa77B1+8G+v7RBL1NWzbHAJBfc8KUe mfVNbNfGfTBdgUC7FAyvYZtPlHotcG5ghv8pkdIZNT1aazgZ0Eztjkbfz1NnF5Ia RwlqGdCyRNB3NsKn+rWypIPaIfUXcCwiSp94YfTiIPvuYIwRnBY4MjKzQa1i+eBl qNjziJDxNLuHdsnCRClxiDubnLbxlBoQiu4hHNblA+ogC+xvdjAknqbmq2oF825R 9P1BM8gwYJIqvZtoDT1P1NFSPt4NpSYL41Eakn5d8KoprbB3FWwsnYV/biX6UyMX 692Vw5GTtKD6wLeu7Ovi4C8JA+zCFHuMbd8wdmji1IwylRrTvGyGFOdel+caD9ua sWoTgJfA8ZZBFgbzmEb6jRJe8x8zx5jobaS1w1KxR2gHXL39/8WOGQ7/TukQnzeE omZ2QFqfJTaCbPlns01qrNOvZJHgX7XUPFZ1BxL7kSfptDfCMYnGiACxjhYiWrFf H/wPEq4F4itgn2L+eyIpiSlLfLZffsqUFAUKot/raV9+SwjXHfp3zFlbw5Mbw/Co H6krvTY0ZN4OzgyrT/16BsC8JUjKMSsN05oTDHfB0ldl2gaFGOuDYv20yzHAKN5m WJLBciq+9DFYsBiOnIw= =nbLn -----END PGP SIGNATURE----- From gregkh@linuxfoundation.org Thu Aug 7 16:10: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 (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 403047F5D for ; Thu, 7 Aug 2014 16:10:59 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 111DF304043 for ; Thu, 7 Aug 2014 14:10:55 -0700 (PDT) X-ASG-Debug-ID: 1407445853-04bdf034665c930001-NocioJ Received: from mail.linuxfoundation.org (mail.linuxfoundation.org [140.211.169.12]) by cuda.sgi.com with ESMTP id ASddJZBshTtTlHXl (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 07 Aug 2014 14:10:54 -0700 (PDT) X-Barracuda-Envelope-From: gregkh@linuxfoundation.org X-Barracuda-Apparent-Source-IP: 140.211.169.12 Received: from localhost (c-24-22-230-10.hsd1.wa.comcast.net [24.22.230.10]) by mail.linuxfoundation.org (Postfix) with ESMTPSA id 22918A58; Thu, 7 Aug 2014 21:10:53 +0000 (UTC) Date: Thu, 7 Aug 2014 14:10:52 -0700 From: Greg KH To: Bill Cc: Dave Chinner , xfs@oss.sgi.com Subject: Re: xfs hang in 3.14.15 Message-ID: <20140807211052.GD17105@kroah.com> X-ASG-Orig-Subj: Re: xfs hang in 3.14.15 References: <53E02495.4080208@sbcglobal.net> <20140805011800.GC20518@dastard> <53E372AA.4030304@sbcglobal.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <53E372AA.4030304@sbcglobal.net> User-Agent: Mutt/1.5.23 (2014-03-12) X-Barracuda-Connect: mail.linuxfoundation.org[140.211.169.12] X-Barracuda-Start-Time: 1407445854 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.8225 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Thu, Aug 07, 2014 at 07:35:54AM -0500, Bill wrote: > On 08/04/2014 08:18 PM, Dave Chinner wrote: > >On Mon, Aug 04, 2014 at 07:25:57PM -0500, Bill wrote: > >>Hi, > >> > >>I've been running a stress test on 3.14.15 and eventually my xfs > >>filesystem hangs. Both 3.10.50 and 3.16 seem to work ok. > >log space hang. > > > >110dc24 xfs: log vector rounding leaks log space > > > >Cheers, > > > >Dave. > > Thanks Dave, that helped. > > Greg, Please consider this for inclusion in 3.14.y. It fixed an xfs hang I > had on 3.14.15 Dave, any objection for me to include it? thanks, greg k-h From namjae.jeon@samsung.com Fri Aug 8 00:05: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.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 91E987F89 for ; Fri, 8 Aug 2014 00:05:33 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 2E279AC002 for ; Thu, 7 Aug 2014 22:05:29 -0700 (PDT) X-ASG-Debug-ID: 1407474324-04bdf0346670020001-NocioJ Received: from mailout1.samsung.com (mailout1.samsung.com [203.254.224.24]) by cuda.sgi.com with ESMTP id o084mY9g3ITH3buN (version=TLSv1 cipher=RC4-MD5 bits=128 verify=NO) for ; Thu, 07 Aug 2014 22:05:25 -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 <0N9Z001N724ZHH90@mailout1.samsung.com> for xfs@oss.sgi.com; Fri, 08 Aug 2014 14:05:23 +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.114]) by epcpsbgr5.samsung.com (EPCPMTA) with SMTP id EA.F6.15745.39A54E35; Fri, 08 Aug 2014 14:05:23 +0900 (KST) X-AuditID: cbfee691-b7f306d000003d81-93-53e45a93d8aa Received: from epmmp1.local.host ( [203.254.227.16]) by epcpsbgm2.samsung.com (EPCPMTA) with SMTP id 49.C7.05196.39A54E35; Fri, 08 Aug 2014 14:05: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 <0N9Z00MCO24ZZ3A0@mmp1.samsung.com>; Fri, 08 Aug 2014 14:05:23 +0900 (KST) From: Namjae Jeon To: Dave Chinner , Theodore Ts'o Cc: linux-ext4 , linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, xfs@oss.sgi.com, =?iso-8859-2?Q?Luk=E1=B9_Czerner?= , Brian Foster Subject: [PATCH v5 0/10] fs: Introduce FALLOC_FL_INSERT_RANGE for fallocate Date: Fri, 08 Aug 2014 14:05:23 +0900 X-ASG-Orig-Subj: [PATCH v5 0/10] fs: Introduce FALLOC_FL_INSERT_RANGE for fallocate Message-id: <004101cfb2c6$5c0194f0$1404bed0$@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: Ac+yvdpLZZhppUsVRoavl1NNMg7M+A== Content-language: ko X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFjrFIsWRmVeSWpSXmKPExsWyRsSkSHdy1JNgg4WdGhbvPldZbDl2j9Fi 2YPNLBYz591hs9iz9ySLxeVdc9gsWnt+slss6rvF6MDhcWqRhEfTmaPMHqsvbGX0eL/vKpvH 501yAaxRXDYpqTmZZalF+nYJXBnHG66zFdzhq7j65wFzA+M37i5GTg4JAROJ2c0rmSFsMYkL 99azdTFycQgJLGWU2DvtOCNM0eP7x6ESixgl2j+dYQFJCAn8ZZSY8FKoi5GDg01AW+LPFlGQ sIiAq8S8u9/BepkF7jBK/FpjDGILC3hLrNz7hxXEZhFQldi9cRLYGF4BS4n3l7pZIWxBiR+T 77GAjGQW0JH4OikCYoy8xOY1b6HuVJDYcfY1I8QqPYlJN45DrRKR2PfiHSPImRICl9glHi38 wAyxS0Di2+RDYDMlBGQlNh2AmiMpcXDFDZYJjGKzkGyehbB5FpLNs5BsWMDIsopRNLUguaA4 Kb3IVK84Mbe4NC9dLzk/dxMjMB5P/3s2cQfj/QPWhxiTgbZPZJYSTc4HxnNeSbyhsZmRhamJ qbGRuaUZacJK4rzpj5KChATSE0tSs1NTC1KL4otKc1KLDzEycXBKNTAyTThwanmcw8+AJvd3 kwLEWWrY456/O75/3dbDrNt/zdnEJ8d46o9MzLmY+zGRR3Y16iybfEzHp1pqV1w1e9I1hl3d QRbHEu5WBvvek+qYE3Mv5C1P5sWd/sITVsVue736+JrZft8uhdZdPWLze3WDzLNLW0O3SSk0 RDbwec3pubqez3Sx4fzbSizFGYmGWsxFxYkAcki6tN0CAAA= X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFvrJIsWRmVeSWpSXmKPExsVy+t9jAd3JUU+CDfZ3KFi8+1xlseXYPUaL ZQ82s1jMnHeHzWLP3pMsFpd3zWGzaO35yW6xqO8WowOHx6lFEh5NZ44ye6y+sJXR4/2+q2we nzfJBbBGNTDaZKQmpqQWKaTmJeenZOal2yp5B8c7x5uaGRjqGlpamCsp5CXmptoqufgE6Lpl 5gCdoqRQlphTChQKSCwuVtK3wzQhNMRN1wKmMULXNyQIrsfIAA0krGHMON5wna3gDl/F1T8P mBsYv3F3MXJySAiYSDy+f5wNwhaTuHBvPZDNxSEksIhRov3TGRaQhJDAX0aJCS+Fuhg5ONgE tCX+bBEFCYsIuErMu/udEcRmFrjDKPFrjTGILSzgLbFy7x9WEJtFQFVi98ZJYGN4BSwl3l/q ZoWwBSV+TL7HAjKSWUBH4uukCIgx8hKb17xlhjhHQWLH2deMEKv0JCbdOA61SkRi34t3jBMY BWYhmTQLYdIsJJNmIelYwMiyilE0tSC5oDgpPddIrzgxt7g0L10vOT93EyM42p9J72Bc1WBx iFGAg1GJh1eg+3GwEGtiWXFl7iFGCQ5mJRHems9AId6UxMqq1KL8+KLSnNTiQ4ymQH9OZJYS Tc4HJqK8knhDYxMzI0sjc0MLI2NzJXHeg63WgUIC6YklqdmpqQWpRTB9TBycUg2MU1vqebnM 382csyAzL9Vb6/jUFRdeKAVxzfVxCvrkOc/0a//+Dccn8yrNDT269mDsGfZoJdkz9r8mRRwx /PpX9c7TjAUzb5kf36XqpiPGfPXq+zX/ZFz0yz5xer15dzTOukDmcA73BoOvrB+Np948Yt2s /Svid0y6yVELcZ4v32UN2/Jfah6UU2Ipzkg01GIuKk4EAHwNum8MAwAA 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: 1407474325 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 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 FALLOC_FL_COLLAPSE_RANGE flag. As such, specifying FALLOC_FL_INSERT_RANGE flag will create new space inside file by inserting a hole 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 creates space within file by inserting a hole 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 hole space. 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 insert 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/029: Standard insert range tests xfstests: generic/030: Delayed allocation insert range xfstests: generic/031: Multi insert range tests xfstests: generic/032: 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 Fri Aug 8 00:05: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.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 F0DC77F96 for ; Fri, 8 Aug 2014 00:05:39 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id C13EA8F8037 for ; Thu, 7 Aug 2014 22:05:36 -0700 (PDT) X-ASG-Debug-ID: 1407474334-04bdf0346670040001-NocioJ Received: from mailout1.samsung.com (mailout1.samsung.com [203.254.224.24]) by cuda.sgi.com with ESMTP id BPzMWv1sf7DuBkBn (version=TLSv1 cipher=RC4-MD5 bits=128 verify=NO) for ; Thu, 07 Aug 2014 22:05:35 -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 <0N9Z000Q725AUKB0@mailout1.samsung.com> for xfs@oss.sgi.com; Fri, 08 Aug 2014 14:05:34 +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 epcpsbgr4.samsung.com (EPCPMTA) with SMTP id BB.6A.13863.C9A54E35; Fri, 08 Aug 2014 14:05:32 +0900 (KST) X-AuditID: cbfee690-b7f526d000003627-57-53e45a9c38fb Received: from epmmp2 ( [203.254.227.17]) by epcpsbgm2.samsung.com (EPCPMTA) with SMTP id DF.C7.05196.C9A54E35; Fri, 08 Aug 2014 14:05:32 +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 <0N9Z003HV2588HB0@mmp2.samsung.com>; Fri, 08 Aug 2014 14:05:32 +0900 (KST) From: Namjae Jeon To: Dave Chinner , Theodore Ts'o Cc: linux-ext4 , linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, xfs@oss.sgi.com, =?iso-8859-2?Q?Luk=E1=B9_Czerner?= , Brian Foster Subject: [PATCH v5 1/10] fs: Add support FALLOC_FL_INSERT_RANGE for fallocate Date: Fri, 08 Aug 2014 14:05:32 +0900 X-ASG-Orig-Subj: [PATCH v5 1/10] fs: Add support FALLOC_FL_INSERT_RANGE for fallocate Message-id: <004201cfb2c6$61514ae0$23f3e0a0$@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: Ac+yvfwyPw+5qhA+QPi4KCaFScV1QQ== Content-language: ko X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFjrFIsWRmVeSWpSXmKPExsWyRsSkRHdO1JNggy+tShbvPldZbDl2j9Fi 2YPNLBYz591hs9iz9ySLxeVdc9gsWnt+slss6rvF6MDhcWqRhEfTmaPMHqsvbGX0eL/vKpvH 501yAaxRXDYpqTmZZalF+nYJXBkf105mLLgqWrGm5ThjA+MBwS5GDg4JAROJX8/tuhg5gUwx iQv31rN1MXJxCAksZZQ4tHYZE0TCROL1mR52iMR0RonTNyYyQjh/GSUu3rnIBDKJTUBb4s8W UZAGEQFXiXl3vzOC2MwCdxglfq0xBrGFBXwlbm7aCDaURUBVYvf2k2A2r4ClxIJ5P6BsQYkf k++xgIxkFtCR+DopAmKMvMTmNW+ZIe5RkNhx9jUjxCo9ictbnrJA1IhI7HvxDuw0CYFL7BKH /0xkhtglIPFt8iEWiIdlJTYdgJojKXFwxQ2WCYxis5BsnoWweRaSzbOQbFjAyLKKUTS1ILmg OCm9yESvODG3uDQvXS85P3cTIzAeT/97NmEH470D1ocYk4G2T2SWEk3OB8ZzXkm8obGZkYWp iamxkbmlGWnCSuK8ao+SgoQE0hNLUrNTUwtSi+KLSnNSiw8xMnFwSjUwcr+OaV+8cMq/jbcC p72wVtTPvTJb7NMtl8S38d6WWeFvbGRXxStM5t7NcnDDNOGv6cnT/VPVzxTv7d36TatpdbPM 1+lVXh83HnstYpbvNEnwRtS2Q+XTvR7/a7irK1is1fZ0956ZXOFTj3Zml38q/DB71/+TOWu+ 3Yle2O7y6Uv+7gm+Xlv2zFViKc5INNRiLipOBACmz6Xz3QIAAA== X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFvrFIsWRmVeSWpSXmKPExsVy+t9jQd05UU+CDW4ukLJ497nKYsuxe4wW yx5sZrGYOe8Om8WevSdZLC7vmsNm0drzk91iUd8tRgcOj1OLJDyazhxl9lh9YSujx/t9V9k8 Pm+SC2CNamC0yUhNTEktUkjNS85PycxLt1XyDo53jjc1MzDUNbS0MFdSyEvMTbVVcvEJ0HXL zAE6RUmhLDGnFCgUkFhcrKRvh2lCaIibrgVMY4Sub0gQXI+RARpIWMOY8XHtZMaCq6IVa1qO MzYwHhDsYuTkkBAwkXh9pocdwhaTuHBvPVsXIxeHkMB0RonTNyYyQjh/GSUu3rnI1MXIwcEm oC3xZ4soSIOIgKvEvLvfGUFsZoE7jBK/1hiD2MICvhI3N21kArFZBFQldm8/CWbzClhKLJj3 A8oWlPgx+R4LyEhmAR2Jr5MiIMbIS2xe85YZ4h4FiR1nXzNCrNKTuLzlKQtEjYjEvhfvGCcw CsxCMmkWwqRZSCbNQtKxgJFlFaNoakFyQXFSeq6RXnFibnFpXrpecn7uJkZwvD+T3sG4qsHi EKMAB6MSD69A9+NgIdbEsuLK3EOMEhzMSiK8NZ+BQrwpiZVVqUX58UWlOanFhxhNgf6cyCwl mpwPTEV5JfGGxiZmRpZG5oYWRsbmSuK8B1utA4UE0hNLUrNTUwtSi2D6mDg4pRoYZ3m63He7 EtfWzm5zc/t9uTqGvKszdHu+MRh41lWddjopz6I8lyFyiU3KB/dpa2/2vz4avntu6idX/3y7 ZAWBGMtfjAvMZ9aGV388dT27eq8cg9hfrcPBRZGNTuEFM+1/aVRurtSbU3SmcdWxRYLKjUvs J7x6sFTz7seVm4+uNclyPbNiAfNjJZbijERDLeai4kQAXhQ+Rw0DAAA= 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: 1407474335 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 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 create space for writing new data within a file after shifting extents to right as given length. and this command also has same limitation as FALLOC_FL_COLLAPSE_RANGE, that is block boundary and use ftruncate(2) for crosses EOF. Signed-off-by: Namjae Jeon Signed-off-by: Ashish Sangwan --- fs/open.c | 8 +++++++- include/uapi/linux/falloc.h | 15 +++++++++++++++ 2 files changed, 22 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..1f20723 100644 --- a/include/uapi/linux/falloc.h +++ b/include/uapi/linux/falloc.h @@ -41,4 +41,19 @@ */ #define FALLOC_FL_ZERO_RANGE 0x10 +/* + * FALLOC_FL_INSERT_RANGE is use to insert 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 a hole. 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 insert space 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 Fri Aug 8 00:06: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.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 2448F7FA1 for ; Fri, 8 Aug 2014 00:06:17 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 10028304053 for ; Thu, 7 Aug 2014 22:06:17 -0700 (PDT) X-ASG-Debug-ID: 1407474373-04cb6c3f6d5f250001-NocioJ Received: from mailout4.samsung.com (mailout4.samsung.com [203.254.224.34]) by cuda.sgi.com with ESMTP id DUlQ6alS7bM5QGEZ (version=TLSv1 cipher=RC4-MD5 bits=128 verify=NO) for ; Thu, 07 Aug 2014 22:06:15 -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 <0N9Z001I825X5140@mailout4.samsung.com> for xfs@oss.sgi.com; Fri, 08 Aug 2014 14:05: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.116]) by epcpsbgr4.samsung.com (EPCPMTA) with SMTP id C0.BA.13863.3BA54E35; Fri, 08 Aug 2014 14:05:55 +0900 (KST) X-AuditID: cbfee690-b7f526d000003627-8a-53e45ab34ba5 Received: from epmmp1.local.host ( [203.254.227.16]) by epcpsbgm2.samsung.com (EPCPMTA) with SMTP id 4F.D7.05196.3BA54E35; Fri, 08 Aug 2014 14:05: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 <0N9Z00N3025V0JB0@mmp1.samsung.com>; Fri, 08 Aug 2014 14:05:55 +0900 (KST) From: Namjae Jeon To: Dave Chinner , Theodore Ts'o Cc: linux-ext4 , linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, xfs@oss.sgi.com, =?iso-8859-2?Q?Luk=E1=B9_Czerner?= , Brian Foster Subject: [PATCH v5 2/10] xfs: Add support FALLOC_FL_INSERT_RANGE for fallocate Date: Fri, 08 Aug 2014 14:05:55 +0900 X-ASG-Orig-Subj: [PATCH v5 2/10] xfs: Add support FALLOC_FL_INSERT_RANGE for fallocate Message-id: <004301cfb2c6$6ef2d330$4cd87990$@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: Ac+yviK/lLAUeKvWTI+4bilqMLmeZA== Content-language: ko X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFjrLIsWRmVeSWpSXmKPExsWyRsSkRHdz1JNgg3MrdSzefa6y2HLsHqPF sgebWSxmzrvDZrFn70kWi8u75rBZtPb8ZLdY1HeL0YHD49QiCY+mM0eZPVZf2Mro8X7fVTaP z5vkAlijuGxSUnMyy1KL9O0SuDI+rl7JWrBgOWPFh/n/2RoYr7QwdjFyckgImEgsm7qEBcIW k7hwbz1bFyMXh5DAUkaJb7MPMMMUvdtziwkisYhR4tPet8wQzl9GiV+/XgM5HBxsAtoSf7aI gjSICLhKzLv7HWwDs8AdoJo1xiC2sICfxNG2N2BxFgFViZ8rzoEt4BWwlNg05TqULSjxY/I9 FpCRzAI6El8nRUCMkZfYvOYt1D0KEjvOvmaEWKUnsfP5IahVIhL7XrxjBDlNQuAcu8S0A3OZ IXYJSHybfAhspoSArMQmmL8kJQ6uuMEygVFsFpLNsxA2z0KyeRaSDQsYWVYxiqYWJBcUJ6UX megVJ+YWl+al6yXn525iBEbl6X/PJuxgvHfA+hBjMtD2icxSosn5wKjOK4k3NDYzsjA1MTU2 Mrc0I01YSZxX7VFSkJBAemJJanZqakFqUXxRaU5q8SFGJg5OqQZG32Irycbw2fIZ+w586X3d Emdh29TRY7LLhHMd+w62F19MDV7ImbmzsPztzuxpNYtVv7GK7dGNzC8/dnKIW5zVjX2clnkv I+DDYyV5O+utcgu0J/yS4fXvPmid6bf24PIbTWLlyameMlGtc3P3lN21ZlnDs2/VfGWvGydT HxxP0G0P2qjzlV2JpTgj0VCLuag4EQA4QiSC4AIAAA== X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFvrDIsWRmVeSWpSXmKPExsVy+t9jAd3NUU+CDTpvK1i8+1xlseXYPUaL ZQ82s1jMnHeHzWLP3pMsFpd3zWGzaO35yW6xqO8WowOHx6lFEh5NZ44ye6y+sJXR4/2+q2we nzfJBbBGNTDaZKQmpqQWKaTmJeenZOal2yp5B8c7x5uaGRjqGlpamCsp5CXmptoqufgE6Lpl 5gCdoqRQlphTChQKSCwuVtK3wzQhNMRN1wKmMULXNyQIrsfIAA0krGHM+Lh6JWvBguWMFR/m /2drYLzSwtjFyMkhIWAi8W7PLSYIW0ziwr31bF2MXBxCAosYJT7tfcsM4fxllPj16zWQw8HB JqAt8WeLKEiDiICrxLy738EGMQvcAapZYwxiCwv4SRxtewMWZxFQlfi54hwziM0rYCmxacp1 KFtQ4sfkeywgI5kFdCS+ToqAGCMvsXnNW2aIexQkdpx9zQixSk9i5/NDUKtEJPa9eMc4gVFg FpJJsxAmzUIyaRaSjgWMLKsYRVMLkguKk9JzjfSKE3OLS/PS9ZLzczcxgmP+mfQOxlUNFocY BTgYlXh4BbofBwuxJpYVV+YeYpTgYFYS4a35DBTiTUmsrEotyo8vKs1JLT7EaAr050RmKdHk fGA6yiuJNzQ2MTOyNDI3tDAyNlcS5z3Yah0oJJCeWJKanZpakFoE08fEwSnVwNh8+cRFNu19 e6WtH7lu+/NtlUpUgW+0dfRGG6sYtQkOgl61hvnbMjSnrC/icPvVfTXyyXUHae8bO3W9e/aY ajzJP2XisIbxa8XFmFCXpMPzGStEGXTDVN6pa/Es1VVQWMJ3I1km8tZr6S7/uVwJuz0ntu2t 5U+bIsXxt+qX9wuFi29budiZlViKMxINtZiLihMBj8Wd0A8DAAA= 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: 1407474374 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. Signed-off-by: Namjae Jeon Signed-off-by: Ashish Sangwan Reviewed-by: Brian Foster --- Changelog v5: - remove allocation part. 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/libxfs/xfs_bmap.c | 379 ++++++++++++++++++++++++++++++++++++++++++++++- fs/xfs/libxfs/xfs_bmap.h | 9 +- fs/xfs/xfs_bmap_util.c | 123 ++++++++++++++- fs/xfs/xfs_bmap_util.h | 2 + fs/xfs/xfs_file.c | 38 ++++- fs/xfs/xfs_trace.h | 1 + 6 files changed, 547 insertions(+), 5 deletions(-) diff --git a/fs/xfs/libxfs/xfs_bmap.c b/fs/xfs/libxfs/xfs_bmap.c index de2d26d..62f5aa7 100644 --- a/fs/xfs/libxfs/xfs_bmap.c +++ b/fs/xfs/libxfs/xfs_bmap.c @@ -5413,7 +5413,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, @@ -5443,7 +5443,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 -EFSCORRUPTED; } @@ -5600,3 +5600,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 -EFSCORRUPTED; + } + + if (XFS_FORCED_SHUTDOWN(mp)) + return -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 -EFSCORRUPTED; + } + + if (XFS_FORCED_SHUTDOWN(mp)) + return -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 = -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/libxfs/xfs_bmap.h b/fs/xfs/libxfs/xfs_bmap.h index b879ca5..135cf81 100644 --- a/fs/xfs/libxfs/xfs_bmap.h +++ b/fs/xfs/libxfs/xfs_bmap.h @@ -177,10 +177,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 d32889a..815584e 100644 --- a/fs/xfs/xfs_bmap_util.c +++ b/fs/xfs/xfs_bmap_util.c @@ -1505,7 +1505,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); @@ -1529,6 +1529,127 @@ out: } /* + * xfs_insert_file_space() + * This routine create hole space by shifting extents 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. + * 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; + } + +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 2fdb72d..6cb116c 100644 --- a/fs/xfs/xfs_bmap_util.h +++ b/fs/xfs/xfs_bmap_util.h @@ -98,6 +98,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 fcf91a2..09c82e7 100644 --- a/fs/xfs/xfs_file.c +++ b/fs/xfs/xfs_file.c @@ -771,11 +771,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); @@ -805,6 +807,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)) { @@ -855,8 +879,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 to create a hole inside the file. 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 namjae.jeon@samsung.com Fri Aug 8 00:06: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.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 265E37FA1 for ; Fri, 8 Aug 2014 00:06:30 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id D23368F8037 for ; Thu, 7 Aug 2014 22:06:29 -0700 (PDT) X-ASG-Debug-ID: 1407474387-04bdf03466700c0001-NocioJ Received: from mailout1.samsung.com (mailout1.samsung.com [203.254.224.24]) by cuda.sgi.com with ESMTP id CCgYHRrKxrG1FKk9 (version=TLSv1 cipher=RC4-MD5 bits=128 verify=NO) for ; Thu, 07 Aug 2014 22:06: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 epcpsbgr1.samsung.com (u141.gpu120.samsung.co.kr [203.254.230.141]) by mailout1.samsung.com (Oracle Communications Messaging Server 7u4-24.01 (7.0.4.24.0) 64bit (built Nov 17 2011)) with ESMTP id <0N9Z000S6265UKB0@mailout1.samsung.com> for xfs@oss.sgi.com; Fri, 08 Aug 2014 14:06:05 +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 epcpsbgr1.samsung.com (EPCPMTA) with SMTP id 3A.31.25328.DBA54E35; Fri, 08 Aug 2014 14:06:05 +0900 (KST) X-AuditID: cbfee68d-b7f2f6d0000062f0-49-53e45abd35d0 Received: from epmmp1.local.host ( [203.254.227.16]) by epcpsbgm1.samsung.com (EPCPMTA) with SMTP id 99.BC.04943.DBA54E35; Fri, 08 Aug 2014 14:06:05 +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 <0N9Z00NCL26544A0@mmp1.samsung.com>; Fri, 08 Aug 2014 14:06:05 +0900 (KST) From: Namjae Jeon To: Dave Chinner , Theodore Ts'o Cc: linux-ext4 , linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, xfs@oss.sgi.com, =?iso-8859-2?Q?Luk=E1=B9_Czerner?= , Brian Foster Subject: [PATCH v5 3/10] ext4: Add support FALLOC_FL_INSERT_RANGE for fallocate Date: Fri, 08 Aug 2014 14:06:05 +0900 X-ASG-Orig-Subj: [PATCH v5 3/10] ext4: Add support FALLOC_FL_INSERT_RANGE for fallocate Message-id: <004401cfb2c6$74f78140$5ee683c0$@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: Ac+yvlvaHlD6qkcgS52trDD9+v5ymg== Content-language: ko X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFjrJIsWRmVeSWpSXmKPExsWyRsSkUHdv1JNgg8V/VCzefa6y2HLsHqPF sgebWSxmzrvDZrFn70kWi8u75rBZtPb8ZLdY1HeL0YHD49QiCY+mM0eZPVZf2Mro8X7fVTaP z5vkAlijuGxSUnMyy1KL9O0SuDKm7ZAqOJNdcfRlO1sD46SwLkZODgkBE4lrs3+wQNhiEhfu rWfrYuTiEBJYyijR3vqdCabo3om9jBCJRYwSj7b8YoFw/jJKbO35y9zFyMHBJqAt8WeLKEiD iICrxLy73xlBbGaBO4wSv9YYg9jCAv4SG19MZQOxWQRUJboXtDKD2LwClhKv19xhgbAFJX5M vscCMpJZQEfi66QIiDHyEpvXvGWGuEdBYsfZ14wQq/Qk5jz+wA5RIyKx78U7RoiaS+wSMycV Q6wSkPg2+RDYSAkBWYlNB6DGSEocXHGDZQKj2Cwki2chLJ6FZPEsJAsWMLKsYhRNLUguKE5K LzLUK07MLS7NS9dLzs/dxAiMxtP/nvXuYLx9wPoQYzLQ9onMUqLJ+cBoziuJNzQ2M7IwNTE1 NjK3NCNNWEmcN+lhUpCQQHpiSWp2ampBalF8UWlOavEhRiYOTqkGxms115Oln048cs45mfuR mCv3f6nklgwfxk0iEqemTw9n/XLloqjzkjUJG8slkxTPFRp+9v/MdUn9ybyJDHfeLmpvq3sy ecvvNVdrK/uZMt96He7kWty7ZHGyvDzrhevOobvEjs8Im7xBrHhZFsPK8y8nGKydNmtLd+HX o7GqWQ5T905/5m5gv0eJpTgj0VCLuag4EQD6BcWk3AIAAA== X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFvrJIsWRmVeSWpSXmKPExsVy+t9jAd29UU+CDa5ekbJ497nKYsuxe4wW yx5sZrGYOe8Om8WevSdZLC7vmsNm0drzk91iUd8tRgcOj1OLJDyazhxl9lh9YSujx/t9V9k8 Pm+SC2CNamC0yUhNTEktUkjNS85PycxLt1XyDo53jjc1MzDUNbS0MFdSyEvMTbVVcvEJ0HXL zAE6RUmhLDGnFCgUkFhcrKRvh2lCaIibrgVMY4Sub0gQXI+RARpIWMOYMW2HVMGZ7IqjL9vZ GhgnhXUxcnJICJhI3DuxlxHCFpO4cG89WxcjF4eQwCJGiUdbfrFAOH8ZJbb2/GXuYuTgYBPQ lvizRRSkQUTAVWLe3e9gzcwCdxglfq0xBrGFBfwlNr6YygZiswioSnQvaGUGsXkFLCVer7nD AmELSvyYfI8FZCSzgI7E10kREGPkJTavecsMcY+CxI6zrxkhVulJzHn8gR2iRkRi34t3jBMY BWYhmTQLYdIsJJNmIelYwMiyilE0tSC5oDgpPddQrzgxt7g0L10vOT93EyM42p9J7WBc2WBx iFGAg1GJh1eg+3GwEGtiWXFl7iFGCQ5mJRHems9AId6UxMqq1KL8+KLSnNTiQ4ymQH9OZJYS Tc4HJqK8knhDYxMzI0sjc0MLI2NzJXHeA63WgUIC6YklqdmpqQWpRTB9TBycUg2MZvH3XyYX RcV+flpzel1RlsCG10Vn15XtiT2npZDZ+C1dl9vXwZ/79eG5qTFdCkenr/ywJ2YvX4UQd6DR 1K1tRqtvqz+8GLdUxbAjV2eKX7u6z6edEx9dsY1/0H3yn77HSdugbX11kyX2HTt/PcD8h/oM Xz2VoFtXH+3dtmrV8n9aL+TqLnV8VGIpzkg01GIuKk4EACM07EEMAwAA 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: 1407474387 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. Signed-off-by: Namjae Jeon Signed-off-by: Ashish Sangwan --- Changelog v5: - remove allocation part. fs/ext4/ext4.h | 1 + fs/ext4/extents.c | 322 ++++++++++++++++++++++++++++++++++++++++++-- include/trace/events/ext4.h | 25 ++++ 3 files changed, 339 insertions(+), 9 deletions(-) diff --git a/fs/ext4/ext4.h b/fs/ext4/ext4.h index 5b19760..03bd3ec 100644 --- a/fs/ext4/ext4.h +++ b/fs/ext4/ext4.h @@ -2730,6 +2730,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 76c2df3..a1e0635 100644 --- a/fs/ext4/extents.c +++ b/fs/ext4/extents.c @@ -4891,7 +4891,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) @@ -4914,6 +4915,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; /* @@ -5216,13 +5220,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) { @@ -5292,13 +5296,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; @@ -5378,7 +5382,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); @@ -5483,7 +5487,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); @@ -5508,3 +5512,303 @@ 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. + * The data blocks starting from @offset to the EOF are shifted by @len + * towards right to create a hole in the @inode. 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_CLUSTER_SIZE(sb) - 1) || + len & (EXT4_CLUSTER_SIZE(sb) - 1)) + return -EINVAL; + + if (!S_ISREG(inode->i_mode)) + 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; + inode->i_mtime = inode->i_ctime = ext4_current_time(inode); + ret = ext4_mark_inode_dirty(handle, inode); + if (ret) + goto out_stop; + + if (!extent) + goto out_stop; + + 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)) { + up_write(&EXT4_I(inode)->i_data_sem); + goto out_stop; + } + + depth = ext_depth(inode); + extent = path[depth].p_ext; + if (extent) { + 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 < 0) { + up_write(&EXT4_I(inode)->i_data_sem); + goto out_stop; + } + } + + ret = ext4_es_remove_extent(inode, offset_lblk, + EXT_MAX_BLOCKS - offset_lblk); + if (ret) { + up_write(&EXT4_I(inode)->i_data_sem); + goto out_stop; + } + + /* + * 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); + + up_write(&EXT4_I(inode)->i_data_sem); + if (IS_SYNC(inode)) + ext4_handle_sync(handle); + +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 Fri Aug 8 00:06: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.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 05A857FA1 for ; Fri, 8 Aug 2014 00:06:31 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 96D9CAC003 for ; Thu, 7 Aug 2014 22:06:30 -0700 (PDT) X-ASG-Debug-ID: 1407474387-04bdf03466700c0002-NocioJ Received: from mailout1.samsung.com (mailout1.samsung.com [203.254.224.24]) by cuda.sgi.com with ESMTP id agvmHo2VvtzReCsn (version=TLSv1 cipher=RC4-MD5 bits=128 verify=NO) for ; Thu, 07 Aug 2014 22:06:29 -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 <0N9Z000TB26QUKB0@mailout1.samsung.com> for xfs@oss.sgi.com; Fri, 08 Aug 2014 14:06:26 +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 epcpsbgr5.samsung.com (EPCPMTA) with SMTP id 97.97.15745.2DA54E35; Fri, 08 Aug 2014 14:06:26 +0900 (KST) X-AuditID: cbfee691-b7f306d000003d81-e5-53e45ad24e57 Received: from epmmp1.local.host ( [203.254.227.16]) by epcpsbgm2.samsung.com (EPCPMTA) with SMTP id E1.08.05196.2DA54E35; Fri, 08 Aug 2014 14:06:26 +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 <0N9Z00MME26QZ3A0@mmp1.samsung.com>; Fri, 08 Aug 2014 14:06:26 +0900 (KST) From: Namjae Jeon To: Dave Chinner , Theodore Ts'o Cc: linux-ext4 , linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, xfs@oss.sgi.com, =?iso-8859-2?Q?Luk=E1=B9_Czerner?= , Brian Foster Subject: [PATCH v5 4/10] xfsprogs: xfs_io: add finsert command for insert range via fallocate Date: Fri, 08 Aug 2014 14:06:26 +0900 X-ASG-Orig-Subj: [PATCH v5 4/10] xfsprogs: xfs_io: add finsert command for insert range via fallocate Message-id: <004501cfb2c6$81801f80$84805e80$@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: Ac+yvoP/t8Q4vyYeTd2Z+8W0I8agCw== Content-language: ko X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFjrJIsWRmVeSWpSXmKPExsWyRsSkQPdS1JNgg0WNWhbvPldZbDl2j9Fi 2YPNLBYz591hs9iz9ySLxeVdc9gsWnt+slss6rvF6MDhcWqRhEfTmaPMHqsvbGX0eL/vKpvH 501yAaxRXDYpqTmZZalF+nYJXBm/DrxmKbgrWPFswiq2BsYZfF2MnBwSAiYSM+//Z4OwxSQu 3FsPZgsJLGWUmP5JCaZm9pP3zF2MXEDxRYwSWw9MY4Io+ssoseyRRxcjBwebgLbEny2iIGER AVeJeXe/M4LYzAJ3GCV+rTEGsYUF4iW2zZkBNp9FQFXiwOReMJtXwFJiyoz77BC2oMSPyfdY QEYyC+hIfJ0UATFGXmLzmrfMEOcoSOw4+5oRYpWexMbONcwQNSIS+168YwQ5U0LgGrtEa9tO qF0CEt8mHwKbKSEgK7HpANQcSYmDK26wTGAUm4Vk8yyEzbOQbJ6FZMMCRpZVjKKpBckFxUnp RaZ6xYm5xaV56XrJ+bmbGIHRePrfs4k7GO8fsD7EmAy0fSKzlGhyPjCa80riDY3NjCxMTUyN jcwtzUgTVhLnTX+UFCQkkJ5YkpqdmlqQWhRfVJqTWnyIkYmDU6qBMVNiBU/Cw8nL9hx30ZXd OjVeouPC+5UsRfpv970N0LxxacHG6hV1x9n+xFULxfuohypJCorWLcsMY0xhqp6g6aQ/o3Db w65PfNPee9bvujy5siYoTOxyQU3xR/+U080h4bG7bE5OE45XWXLOTaym1OrnykcRnxnOKN3e aX8p9VLqJFf/51s3KLEUZyQaajEXFScCAPJo+cXcAgAA X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFvrJIsWRmVeSWpSXmKPExsVy+t9jAd1LUU+CDZ5/VLR497nKYsuxe4wW yx5sZrGYOe8Om8WevSdZLC7vmsNm0drzk91iUd8tRgcOj1OLJDyazhxl9lh9YSujx/t9V9k8 Pm+SC2CNamC0yUhNTEktUkjNS85PycxLt1XyDo53jjc1MzDUNbS0MFdSyEvMTbVVcvEJ0HXL zAE6RUmhLDGnFCgUkFhcrKRvh2lCaIibrgVMY4Sub0gQXI+RARpIWMOY8evAa5aCu4IVzyas YmtgnMHXxcjJISFgIjH7yXtmCFtM4sK99WxdjFwcQgKLGCW2HpjGBJIQEvjLKLHskUcXIwcH m4C2xJ8toiBhEQFXiXl3vzOC2MwCdxglfq0xBrGFBeIlts2ZwQZiswioShyY3Atm8wpYSkyZ cZ8dwhaU+DH5HgvISGYBHYmvkyIgxshLbF7zFuocBYkdZ18zQqzSk9jYuYYZokZEYt+Ld4wT GAVmIZk0C2HSLCSTZiHpWMDIsopRNLUguaA4KT3XSK84Mbe4NC9dLzk/dxMjONqfSe9gXNVg cYhRgINRiYdXoPtxsBBrYllxZe4hRgkOZiUR3prPQCHelMTKqtSi/Pii0pzU4kOMpkB/TmSW Ek3OByaivJJ4Q2MTMyNLI3NDCyNjcyVx3oOt1oFCAumJJanZqakFqUUwfUwcnFINjNJyPyuc J/93fm7x+MCcZx+8Lhw20Tq0cRVjVdiPr9rvswx4J/6dOO3cTHUJbUcry0+np/5bl1D1Uiz+ 0Lab97pM2y7Y/zlpGr95ZnJt+f575r9/pm98X7rrZY609gl9e2bhn1+q1i10sz74oJFtRX7J 7JlpLX3qTpobXBSaDYweLqo70XPRp0GJpTgj0VCLuag4EQBPBNwiDAMAAA== 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: 1407474389 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 Add finsert command for fallocate FALLOC_FL_INSERT_RANGE flag. Signed-off-by: Namjae Jeon Signed-off-by: Ashish Sangwan --- 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 = + _("creates new space for writing within file 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 Fri Aug 8 00:06: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.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 001647F4E for ; Fri, 8 Aug 2014 00:06:42 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 72458AC005 for ; Thu, 7 Aug 2014 22:06:42 -0700 (PDT) X-ASG-Debug-ID: 1407474398-04cbb00fa36bbf0001-NocioJ Received: from mailout2.samsung.com (mailout2.samsung.com [203.254.224.25]) by cuda.sgi.com with ESMTP id zBj9r1r7Zh1j1Fj2 (version=TLSv1 cipher=RC4-MD5 bits=128 verify=NO) for ; Thu, 07 Aug 2014 22:06:40 -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 <0N9Z00A9Z26YQI00@mailout2.samsung.com> for xfs@oss.sgi.com; Fri, 08 Aug 2014 14:06:34 +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.113]) by epcpsbgr3.samsung.com (EPCPMTA) with SMTP id FE.56.14752.ADA54E35; Fri, 08 Aug 2014 14:06:34 +0900 (KST) X-AuditID: cbfee68f-b7fa26d0000039a0-33-53e45adabd49 Received: from epmmp2 ( [203.254.227.17]) by epcpsbgm2.samsung.com (EPCPMTA) with SMTP id 37.08.05196.9DA54E35; Fri, 08 Aug 2014 14:06:33 +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 <0N9Z003F126X22B0@mmp2.samsung.com>; Fri, 08 Aug 2014 14:06:33 +0900 (KST) From: Namjae Jeon To: Dave Chinner , Theodore Ts'o Cc: linux-ext4 , linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, xfs@oss.sgi.com, =?iso-8859-2?Q?Luk=E1=B9_Czerner?= , Brian Foster Subject: [PATCH v5 5/10] xfstests: generic/029: Standard insert range tests Date: Fri, 08 Aug 2014 14:06:33 +0900 X-ASG-Orig-Subj: [PATCH v5 5/10] xfstests: generic/029: Standard insert range tests Message-id: <004601cfb2c6$86035db0$920a1910$@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: Ac+yvrMbr/8vi1gJQX2Wlv/g+rKl6g== Content-language: ko X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFjrFIsWRmVeSWpSXmKPExsWyRsSkUPdW1JNgg+3LOCzefa6y2HLsHqPF sgebWSxmzrvDZrFn70kWi8u75rBZtPb8ZLdY1HeL0YHD49QiCY+mM0eZPVZf2Mro8X7fVTaP z5vkAlijuGxSUnMyy1KL9O0SuDK29K1jKjirX/H93xOmBsZ/al2MnBwSAiYSa7ZPZYSwxSQu 3FvP1sXIxSEksJRR4sC/WewwRQuezIdKTAdKHPjMDOH8ZZQ4snoOkMPBwSagLfFniyhIg4iA q8S8u9/BpjIL3GGU+LXGGMQWFvCWeDPrLxtIOYuAqsS7eRkgYV4BS4mDO5cxQdiCEj8m32MB KWEW0JH4OikCYoq8xOY1b5khzlGQ2HH2NSPEJj2J3TuPMkPUiEjse/GOEeQyCYFL7BI7T18H m8kiICDxbfIhsJkSArISmw5AzZGUOLjiBssERrFZSDbPQtg8C8nmWUg2LGBkWcUomlqQXFCc lF5krFecmFtcmpeul5yfu4kRGI+n/z3r38F494D1IcZkoO0TmaVEk/OB8ZxXEm9obGZkYWpi amxkbmlGmrCSOO/9h0lBQgLpiSWp2ampBalF8UWlOanFhxiZODilGhiPqt9e+WPv4y08nzt1 zmdM+/jnunAKc/LJmTWy51UqPO9EmTefvrXrUVjHA0fFeamLPzg7+3utfrStYffbSVwG8hxV R4KkA3UqlzmJCcnELg5W+RW4mN/yfK7vNiPurDnL5IIvzvz54Zw528tFk5fYaz/zOWJ4arqV mhv7nSWNm1f/sY4UUudTYinOSDTUYi4qTgQADY4rA90CAAA= X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFvrJIsWRmVeSWpSXmKPExsVy+t9jQd2bUU+CDb432Vq8+1xlseXYPUaL ZQ82s1jMnHeHzWLP3pMsFpd3zWGzaO35yW6xqO8WowOHx6lFEh5NZ44ye6y+sJXR4/2+q2we nzfJBbBGNTDaZKQmpqQWKaTmJeenZOal2yp5B8c7x5uaGRjqGlpamCsp5CXmptoqufgE6Lpl 5gCdoqRQlphTChQKSCwuVtK3wzQhNMRN1wKmMULXNyQIrsfIAA0krGHM2NK3jqngrH7F939P mBoY/6l1MXJySAiYSCx4Mp8NwhaTuHBvPZDNxSEkMJ1R4sCBz8wQzl9GiSOr5wA5HBxsAtoS f7aIgjSICLhKzLv7nRHEZha4wyjxa40xiC0s4C3xZtZfNpByFgFViXfzMkDCvAKWEgd3LmOC sAUlfky+xwJSwiygI/F1UgTEFHmJzWveMkOcoyCx4+xrRohNehK7dx5lhqgRkdj34h3jBEaB WUgmzUKYNAvJpFlIOhYwsqxiFE0tSC4oTkrPNdIrTswtLs1L10vOz93ECI72Z9I7GFc1WBxi FOBgVOLhFeh+HCzEmlhWXJl7iFGCg1lJhLfmM1CINyWxsiq1KD++qDQntfgQoynQmxOZpUST 84GJKK8k3tDYxMzI0sjc0MLI2FxJnPdgq3WgkEB6YklqdmpqQWoRTB8TB6dUA2POhtnvVh0W 47xWz7fIUHta0XS3xeKlzn5T9+rbXXJMkuIMvBRj8ffNeiXNsszMtL9V669ob1zV9VGqJe9B SlhBlNYFjU+rtn6alOdzNnlpwjPb3vKqx+bl5aGb5iT+UhGvEbf7tz303dHXTy/u4l39+8/+ 0jKvnufmWVNfrH76Z6uPhxvv2YNKLMUZiYZazEXFiQAlZx/TDAMAAA== 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: 1407474400 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(029) tries to test various corner cases for finsert range functionality over different type of extents. Signed-off-by: Namjae Jeon Signed-off-by: Ashish Sangwan --- common/punch | 5 ++++ common/rc | 2 +- tests/generic/029 | 65 ++++++++++++++++++++++++++++++++++++++++++ tests/generic/029.out | 78 +++++++++++++++++++++++++++++++++++++++++++++++++++ tests/generic/group | 1 + 5 files changed, 150 insertions(+), 1 deletion(-) create mode 100644 tests/generic/029 create mode 100644 tests/generic/029.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 2c83340..6d805cf 100644 --- a/common/rc +++ b/common/rc @@ -1272,7 +1272,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/029 b/tests/generic/029 new file mode 100644 index 0000000..2b18069 --- /dev/null +++ b/tests/generic/029 @@ -0,0 +1,65 @@ +#! /bin/bash +# FS QA Test No. generic/029 +# +# 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/029.out b/tests/generic/029.out new file mode 100644 index 0000000..572fa45 --- /dev/null +++ b/tests/generic/029.out @@ -0,0 +1,78 @@ +QA output created by 029 + 1. into a hole +cf845a781c107ec1346e849c9dd1b7e8 + 2. into allocated space +0: [0..7]: extent +1: [8..23]: hole +2: [24..55]: extent +64e72217eebcbdf31b1b058f9f5f476a + 3. into unwritten space +0: [0..7]: extent +1: [8..23]: hole +2: [24..55]: extent +cf845a781c107ec1346e849c9dd1b7e8 + 4. hole -> data +0: [0..31]: hole +1: [32..47]: extent +2: [48..55]: hole +adb08a6d94a3b5eff90fdfebb2366d31 + 5. hole -> unwritten +0: [0..31]: hole +1: [32..47]: extent +2: [48..55]: hole +cf845a781c107ec1346e849c9dd1b7e8 + 6. data -> hole +0: [0..7]: extent +1: [8..23]: hole +2: [24..31]: extent +3: [32..55]: hole +be0f35d4292a20040766d87883b0abd1 + 7. data -> unwritten +0: [0..7]: extent +1: [8..23]: hole +2: [24..47]: extent +3: [48..55]: hole +be0f35d4292a20040766d87883b0abd1 + 8. unwritten -> hole +0: [0..7]: extent +1: [8..23]: hole +2: [24..31]: extent +3: [32..55]: hole +cf845a781c107ec1346e849c9dd1b7e8 + 9. unwritten -> data +0: [0..7]: extent +1: [8..23]: hole +2: [24..47]: extent +3: [48..55]: hole +adb08a6d94a3b5eff90fdfebb2366d31 + 10. hole -> data -> hole +0: [0..39]: hole +1: [40..47]: extent +2: [48..63]: hole +0487b3c52810f994c541aa166215375f + 11. data -> hole -> data +0: [0..7]: extent +1: [8..31]: hole +2: [32..39]: extent +3: [40..47]: hole +4: [48..63]: extent +e3a8d52acc4d91a8ed19d7b6f4f26a71 + 12. unwritten -> data -> unwritten +0: [0..7]: extent +1: [8..31]: hole +2: [32..63]: extent +0487b3c52810f994c541aa166215375f + 13. data -> unwritten -> data +0: [0..7]: extent +1: [8..31]: hole +2: [32..63]: extent +2b22165f4a24a2c36fd05ef00b41df88 + 14. data -> hole @ EOF +0: [0..23]: extent +1: [24..39]: hole +2: [40..55]: extent +aa0f20d1edcdbce60d8ef82700ba30c3 + 15. data -> hole @ 0 +0: [0..15]: hole +1: [16..55]: extent +86c9d033be2761385c9cfa203c426bb2 diff --git a/tests/generic/group b/tests/generic/group index e822dfd..b1dc921 100644 --- a/tests/generic/group +++ b/tests/generic/group @@ -31,6 +31,7 @@ 026 acl quick auto 027 auto enospc 028 auto quick +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 Fri Aug 8 00:06: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.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 BA0537FBE for ; Fri, 8 Aug 2014 00:06:44 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 8AF1B30404E for ; Thu, 7 Aug 2014 22:06:43 -0700 (PDT) X-ASG-Debug-ID: 1407474401-04bdf03469700f0001-NocioJ Received: from mailout1.samsung.com (mailout1.samsung.com [203.254.224.24]) by cuda.sgi.com with ESMTP id vrHnJxqmfAQGX6XZ (version=TLSv1 cipher=RC4-MD5 bits=128 verify=NO) for ; Thu, 07 Aug 2014 22:06:42 -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 <0N9Z000MH275TPB0@mailout1.samsung.com> for xfs@oss.sgi.com; Fri, 08 Aug 2014 14:06:41 +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.112]) by epcpsbgr4.samsung.com (EPCPMTA) with SMTP id FB.3B.13863.0EA54E35; Fri, 08 Aug 2014 14:06:40 +0900 (KST) X-AuditID: cbfee690-b7f526d000003627-ff-53e45ae04b59 Received: from epmmp1.local.host ( [203.254.227.16]) by epcpsbgm1.samsung.com (EPCPMTA) with SMTP id 2E.DC.04943.0EA54E35; Fri, 08 Aug 2014 14:06:40 +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 <0N9Z00N5E2740JB0@mmp1.samsung.com>; Fri, 08 Aug 2014 14:06:40 +0900 (KST) From: Namjae Jeon To: Dave Chinner , Theodore Ts'o Cc: linux-ext4 , linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, xfs@oss.sgi.com, =?iso-8859-2?Q?Luk=E1=B9_Czerner?= , Brian Foster Subject: [PATCH v5 6/10] xfstests: generic/030: Delayed allocation insert range Date: Fri, 08 Aug 2014 14:06:40 +0900 X-ASG-Orig-Subj: [PATCH v5 6/10] xfstests: generic/030: Delayed allocation insert range Message-id: <004701cfb2c6$89be69e0$9d3b3da0$@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: Ac+yvtHopGdANkC+RMuDGWG+wb1Ftw== Content-language: ko X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFjrJIsWRmVeSWpSXmKPExsWyRsSkQPdB1JNgg79rFSzefa6y2HLsHqPF sgebWSxmzrvDZrFn70kWi8u75rBZtPb8ZLdY1HeL0YHD49QiCY+mM0eZPVZf2Mro8X7fVTaP z5vkAlijuGxSUnMyy1KL9O0SuDK2LUkuuK5RMfH7f5YGxgeKXYycHBICJhJ9l7cwQdhiEhfu rWfrYuTiEBJYyigxdc5fdpiiJQseM0EkFjFKLP2/hBnC+csoce3xYtYuRg4ONgFtiT9bREEa RARcJebd/c4IYjML3GGU+LXGGMQWFvCX+L26G2wbi4CqxJueA8wgNq+ApcTxd5dZIGxBiR+T 77GAjGQW0JH4OikCYoy8xOY1b5kh7lGQ2HH2NSPEKj2Jpz372SBqRCT2vXjHCFFziV1iy181 iFUCEt8mHwIbKSEgK7HpANQYSYmDK26wTGAUm4Vk8SyExbOQLJ6FZMECRpZVjKKpBckFxUnp RSZ6xYm5xaV56XrJ+bmbGIHRePrfswk7GO8dsD7EmAy0fSKzlGhyPjCa80riDY3NjCxMTUyN jcwtzUgTVhLnVXuUFCQkkJ5YkpqdmlqQWhRfVJqTWnyIkYmDU6qBUaBgKjMLf3ROyTnh203Z s/I2Kb6YGrqw53Nesq1OTdLDEwXOj8P0ebSfbDjF+064eGO7vHj6sytNbfPE1hvnbjr++Ulz xZFlTEcW/No368m0+vrC94tSWZrdasxM/QyXpd2x/SfJ1HzEwrtFo85JtuKfcyv3vTuHV8aw X+qTW5p40HAnx+kdSizFGYmGWsxFxYkAmhsEm9wCAAA= X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFvrJIsWRmVeSWpSXmKPExsVy+t9jAd0HUU+CDc5OkrB497nKYsuxe4wW yx5sZrGYOe8Om8WevSdZLC7vmsNm0drzk91iUd8tRgcOj1OLJDyazhxl9lh9YSujx/t9V9k8 Pm+SC2CNamC0yUhNTEktUkjNS85PycxLt1XyDo53jjc1MzDUNbS0MFdSyEvMTbVVcvEJ0HXL zAE6RUmhLDGnFCgUkFhcrKRvh2lCaIibrgVMY4Sub0gQXI+RARpIWMOYsW1JcsF1jYqJ3/+z NDA+UOxi5OSQEDCRWLLgMROELSZx4d56ti5GLg4hgUWMEkv/L2GGcP4ySlx7vJi1i5GDg01A W+LPFlGQBhEBV4l5d78zgtjMAncYJX6tMQaxhQX8JX6v7gYbyiKgKvGm5wAziM0rYClx/N1l FghbUOLH5HssICOZBXQkvk6KgBgjL7F5zVtmiHsUJHacfc0IsUpP4mnPfjaIGhGJfS/eMU5g FJiFZNIshEmzkEyahaRjASPLKkbR1ILkguKk9FxDveLE3OLSvHS95PzcTYzgaH8mtYNxZYPF IUYBDkYlHl6B7sfBQqyJZcWVuYcYJTiYlUR4az4DhXhTEiurUovy44tKc1KLDzGaAv05kVlK NDkfmIjySuINjU3MjCyNzA0tjIzNlcR5D7RaBwoJpCeWpGanphakFsH0MXFwSjUwmkycedMq 5+6/NYwfupZfW/1mqZlr1FbtvW7h7JO6r5zdnylzYxlfzuTDrHqiRuz/rtd1zDkadf/eRsNt 821nbJYKECl0zjDsUZczqCxq+7A8LKRtdujyLqWd9ksfPSuPmqBf/zds1a4ZEpEfJp+3Wf7V 1WKJcpWiy6Fbdmem9Sc+3cx5IFSwWomlOCPRUIu5qDgRAN0D+bYMAwAA 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: 1407474401 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(030) tries to test various corner cases with delayed extents for finsert range functionality over different type of extents. Signed-off-by: Namjae Jeon Signed-off-by: Ashish Sangwan --- tests/generic/030 | 65 ++++++++++++++++++++++++++++++++++++++++++ tests/generic/030.out | 78 +++++++++++++++++++++++++++++++++++++++++++++++++++ tests/generic/group | 1 + 3 files changed, 144 insertions(+) create mode 100644 tests/generic/030 create mode 100644 tests/generic/030.out diff --git a/tests/generic/030 b/tests/generic/030 new file mode 100644 index 0000000..7cbfa88 --- /dev/null +++ b/tests/generic/030 @@ -0,0 +1,65 @@ +#! /bin/bash +# FS QA Test No. generic/030 +# +# 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/030.out b/tests/generic/030.out new file mode 100644 index 0000000..5812622 --- /dev/null +++ b/tests/generic/030.out @@ -0,0 +1,78 @@ +QA output created by 030 + 1. into a hole +cf845a781c107ec1346e849c9dd1b7e8 + 2. into allocated space +0: [0..7]: extent +1: [8..23]: hole +2: [24..55]: extent +64e72217eebcbdf31b1b058f9f5f476a + 3. into unwritten space +0: [0..7]: extent +1: [8..23]: hole +2: [24..55]: extent +cf845a781c107ec1346e849c9dd1b7e8 + 4. hole -> data +0: [0..31]: hole +1: [32..47]: extent +2: [48..55]: hole +adb08a6d94a3b5eff90fdfebb2366d31 + 5. hole -> unwritten +0: [0..31]: hole +1: [32..47]: extent +2: [48..55]: hole +cf845a781c107ec1346e849c9dd1b7e8 + 6. data -> hole +0: [0..7]: extent +1: [8..23]: hole +2: [24..31]: extent +3: [32..55]: hole +be0f35d4292a20040766d87883b0abd1 + 7. data -> unwritten +0: [0..7]: extent +1: [8..23]: hole +2: [24..47]: extent +3: [48..55]: hole +be0f35d4292a20040766d87883b0abd1 + 8. unwritten -> hole +0: [0..7]: extent +1: [8..23]: hole +2: [24..31]: extent +3: [32..55]: hole +cf845a781c107ec1346e849c9dd1b7e8 + 9. unwritten -> data +0: [0..7]: extent +1: [8..23]: hole +2: [24..47]: extent +3: [48..55]: hole +adb08a6d94a3b5eff90fdfebb2366d31 + 10. hole -> data -> hole +0: [0..39]: hole +1: [40..47]: extent +2: [48..63]: hole +0487b3c52810f994c541aa166215375f + 11. data -> hole -> data +0: [0..7]: extent +1: [8..31]: hole +2: [32..39]: extent +3: [40..47]: hole +4: [48..63]: extent +e3a8d52acc4d91a8ed19d7b6f4f26a71 + 12. unwritten -> data -> unwritten +0: [0..7]: extent +1: [8..31]: hole +2: [32..63]: extent +0487b3c52810f994c541aa166215375f + 13. data -> unwritten -> data +0: [0..7]: extent +1: [8..31]: hole +2: [32..63]: extent +2b22165f4a24a2c36fd05ef00b41df88 + 14. data -> hole @ EOF +0: [0..23]: extent +1: [24..39]: hole +2: [40..55]: extent +aa0f20d1edcdbce60d8ef82700ba30c3 + 15. data -> hole @ 0 +0: [0..15]: hole +1: [16..55]: extent +86c9d033be2761385c9cfa203c426bb2 diff --git a/tests/generic/group b/tests/generic/group index b1dc921..b847c47 100644 --- a/tests/generic/group +++ b/tests/generic/group @@ -32,6 +32,7 @@ 027 auto enospc 028 auto quick 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 Fri Aug 8 00: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.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 BE2957F4E for ; Fri, 8 Aug 2014 00:06:54 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 8EACB304059 for ; Thu, 7 Aug 2014 22:06:54 -0700 (PDT) X-ASG-Debug-ID: 1407474411-04bdf0346970100001-NocioJ Received: from mailout3.samsung.com (mailout3.samsung.com [203.254.224.33]) by cuda.sgi.com with ESMTP id nHEaZYeDBtA8cJdF (version=TLSv1 cipher=RC4-MD5 bits=128 verify=NO) for ; Thu, 07 Aug 2014 22:06:52 -0700 (PDT) X-Barracuda-Envelope-From: namjae.jeon@samsung.com X-Barracuda-Apparent-Source-IP: 203.254.224.33 Received: from epcpsbgr4.samsung.com (u144.gpu120.samsung.co.kr [203.254.230.144]) by mailout3.samsung.com (Oracle Communications Messaging Server 7u4-24.01 (7.0.4.24.0) 64bit (built Nov 17 2011)) with ESMTP id <0N9Z00F3427EWL40@mailout3.samsung.com> for xfs@oss.sgi.com; Fri, 08 Aug 2014 14:06:50 +0900 (KST) Received: from epcpsbgm1.samsung.com ( [172.20.52.113]) by epcpsbgr4.samsung.com (EPCPMTA) with SMTP id DC.4B.13863.9EA54E35; Fri, 08 Aug 2014 14:06:50 +0900 (KST) X-AuditID: cbfee690-b7f526d000003627-6a-53e45ae98268 Received: from epmmp2 ( [203.254.227.17]) by epcpsbgm1.samsung.com (EPCPMTA) with SMTP id 36.EC.04943.9EA54E35; Fri, 08 Aug 2014 14:06:49 +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 <0N9Z00BZC27D8N10@mmp2.samsung.com>; Fri, 08 Aug 2014 14:06:49 +0900 (KST) From: Namjae Jeon To: Dave Chinner , Theodore Ts'o Cc: linux-ext4 , linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, xfs@oss.sgi.com, =?iso-8859-2?Q?Luk=E1=B9_Czerner?= , Brian Foster Subject: [PATCH v5 7/10] xfstests: generic/031: Multi insert range tests Date: Fri, 08 Aug 2014 14:06:49 +0900 X-ASG-Orig-Subj: [PATCH v5 7/10] xfstests: generic/031: Multi insert range tests Message-id: <004801cfb2c6$8f712760$ae537620$@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: Ac+yvyLkil/6/WKKSBymP0M64Z84eA== Content-language: ko X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFjrJIsWRmVeSWpSXmKPExsWyRsSkUPdV1JNgg947rBbvPldZbDl2j9Fi 2YPNLBYz591hs9iz9ySLxeVdc9gsWnt+slss6rvF6MDhcWqRhEfTmaPMHqsvbGX0eL/vKpvH 501yAaxRXDYpqTmZZalF+nYJXBkrDp9jKmjQrJj6dBpLA2OjUhcjJ4eEgInEnoMtzBC2mMSF e+vZQGwhgaWMErOO68PUnDj3n72LkQsoPp1RYvmXo4wQzl9GifYpd4AcDg42AW2JP1tEQRpE BFwl5t39zghiMwvcYZT4tcYYxBYW8JDY+PU42AIWAVWJn3s3sIDYvAKWEnvaZjBB2IISPybf YwEZySygI/F1UgTEGHmJzWveQt2pILHj7GtGiFV6Epfnf2GFqBGR2PfiHSNEzSV2ibed/hCr BCS+TT4ENlJCQFZi0wGoMZISB1fcYJnAKDYLyeJZCItnIVk8C8mCBYwsqxhFUwuSC4qT0otM 9IoTc4tL89L1kvNzNzECo/H0v2cTdjDeO2B9iDEZaPtEZinR5HxgNOeVxBsamxlZmJqYGhuZ W5qRJqwkzqv2KClISCA9sSQ1OzW1ILUovqg0J7X4ECMTB6dUA2P1miKN1rWzbJr3nJr/J+R9 cu8XDnO5mz93rrjK4bZuWUnTz7mnhF0EAq3D5M393ar7G+W/izjPy7ZjTuzaE31+/pr2/qDZ VassOCxqFzmuFFLvCuebvnSu74EbCtI/GrrPuAu/Kn6540xhNvfZ+w2zUiI7K3eeuNndvo9H Omri3MwTW54bGSmxFGckGmoxFxUnAgB/lpsZ3AIAAA== X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFvrFIsWRmVeSWpSXmKPExsVy+t9jQd2XUU+CDXouWVm8+1xlseXYPUaL ZQ82s1jMnHeHzWLP3pMsFpd3zWGzaO35yW6xqO8WowOHx6lFEh5NZ44ye6y+sJXR4/2+q2we nzfJBbBGNTDaZKQmpqQWKaTmJeenZOal2yp5B8c7x5uaGRjqGlpamCsp5CXmptoqufgE6Lpl 5gCdoqRQlphTChQKSCwuVtK3wzQhNMRN1wKmMULXNyQIrsfIAA0krGHMWHH4HFNBg2bF1KfT WBoYG5W6GDk5JARMJE6c+88OYYtJXLi3nq2LkYtDSGA6o8TyL0cZIZy/jBLtU+4AORwcbALa En+2iII0iAi4Ssy7+50RxGYWuMMo8WuNMYgtLOAhsfHrcTYQm0VAVeLn3g0sIDavgKXEnrYZ TBC2oMSPyfdYQEYyC+hIfJ0UATFGXmLzmrfMEPcoSOw4+5oRYpWexOX5X1ghakQk9r14xziB UWAWkkmzECbNQjJpFpKOBYwsqxhFUwuSC4qT0nMN9YoTc4tL89L1kvNzNzGC4/2Z1A7GlQ0W hxgFOBiVeHgFuh8HC7EmlhVX5h5ilOBgVhLhrfkMFOJNSaysSi3Kjy8qzUktPsRoCvTnRGYp 0eR8YCrKK4k3NDYxM7I0Mje0MDI2VxLnPdBqHSgkkJ5YkpqdmlqQWgTTx8TBKdXAuGtiBx+7 0HP7th03/QP9buzZXqAXFfH+s9atrYYvlGIj3xyqzn3ZPCk0aplTjHDIfm+mg/f31iz77pu3 b9PJB4duPGU8tJqb+88XZsH6GRNq16ts0Kq8a6bf1f/inYnRNlnRbMEpvAbnJ2863VyeEicm oSY3I8098sqx/YqXVbI9p2fc0rr9T4mlOCPRUIu5qDgRACXKRfsNAwAA 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: 1407474412 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.61 X-Barracuda-Spam-Status: No, SCORE=0.61 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=MARKETING_SUBJECT, THREAD_INDEX X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.8235 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.01 THREAD_INDEX thread-index: AcO7Y8iR61tzADqsRmmc5wNiFHEOig== 0.60 MARKETING_SUBJECT Subject contains popular marketing words This testcase(031) tries to test various corner cases with pre-existing holes for finsert range functionality over different type of extents. Signed-off-by: Namjae Jeon Signed-off-by: Ashish Sangwan --- tests/generic/031 | 65 +++++++++++++++++++++++++++++++++++++++++ tests/generic/031.out | 80 +++++++++++++++++++++++++++++++++++++++++++++++++++ tests/generic/group | 1 + 3 files changed, 146 insertions(+) create mode 100644 tests/generic/031 create mode 100644 tests/generic/031.out diff --git a/tests/generic/031 b/tests/generic/031 new file mode 100644 index 0000000..0e18f87 --- /dev/null +++ b/tests/generic/031 @@ -0,0 +1,65 @@ +#! /bin/bash +# FS QA Test No. generic/031 +# +# 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/031.out b/tests/generic/031.out new file mode 100644 index 0000000..ae45352 --- /dev/null +++ b/tests/generic/031.out @@ -0,0 +1,80 @@ +QA output created by 031 + 1. into a hole +cf845a781c107ec1346e849c9dd1b7e8 + 2. into allocated space +0: [0..7]: extent +1: [8..23]: hole +2: [24..55]: extent +64e72217eebcbdf31b1b058f9f5f476a + 3. into unwritten space +0: [0..7]: extent +1: [8..23]: hole +2: [24..55]: extent +22b7303d274481990b5401b6263effe0 + 4. hole -> data +0: [0..7]: extent +1: [8..31]: hole +2: [32..55]: extent +c4fef62ba1de9d91a977cfeec6632f19 + 5. hole -> unwritten +0: [0..7]: extent +1: [8..31]: hole +2: [32..55]: extent +1ca74f7572a0f4ab477fdbb5682e5f61 + 6. data -> hole +0: [0..7]: extent +1: [8..23]: hole +2: [24..31]: extent +3: [32..47]: hole +4: [48..55]: extent +be0f35d4292a20040766d87883b0abd1 + 7. data -> unwritten +0: [0..7]: extent +1: [8..23]: hole +2: [24..47]: extent +3: [48..55]: hole +bddb1f3895268acce30d516a99cb0f2f + 8. unwritten -> hole +0: [0..7]: extent +1: [8..23]: hole +2: [24..31]: extent +3: [32..39]: hole +4: [40..55]: extent +f8fc47adc45b7cf72f988b3ddf5bff64 + 9. unwritten -> data +0: [0..7]: extent +1: [8..23]: hole +2: [24..47]: extent +3: [48..55]: hole +c4fef62ba1de9d91a977cfeec6632f19 + 10. hole -> data -> hole +0: [0..7]: extent +1: [8..39]: hole +2: [40..63]: extent +52af1bfcbf43f28af2328de32e0567e5 + 11. data -> hole -> data +0: [0..7]: extent +1: [8..31]: hole +2: [32..39]: extent +3: [40..47]: hole +4: [48..63]: extent +e3a8d52acc4d91a8ed19d7b6f4f26a71 + 12. unwritten -> data -> unwritten +0: [0..7]: extent +1: [8..31]: hole +2: [32..63]: extent +52af1bfcbf43f28af2328de32e0567e5 + 13. data -> unwritten -> data +0: [0..7]: extent +1: [8..31]: hole +2: [32..63]: extent +2b22165f4a24a2c36fd05ef00b41df88 + 14. data -> hole @ EOF +0: [0..23]: extent +1: [24..39]: hole +2: [40..55]: extent +aa0f20d1edcdbce60d8ef82700ba30c3 + 15. data -> hole @ 0 +0: [0..15]: hole +1: [16..55]: extent +86c9d033be2761385c9cfa203c426bb2 diff --git a/tests/generic/group b/tests/generic/group index b847c47..544d422 100644 --- a/tests/generic/group +++ b/tests/generic/group @@ -33,6 +33,7 @@ 028 auto quick 029 auto quick prealloc 030 auto quick prealloc +031 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 Fri Aug 8 00:07: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.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 213A57FBC for ; Fri, 8 Aug 2014 00:07:04 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 0E88C8F804B for ; Thu, 7 Aug 2014 22:07:03 -0700 (PDT) X-ASG-Debug-ID: 1407474421-04cbb00fa06bc00001-NocioJ Received: from mailout2.samsung.com (mailout2.samsung.com [203.254.224.25]) by cuda.sgi.com with ESMTP id NWOGpA3FjcfKBsYL (version=TLSv1 cipher=RC4-MD5 bits=128 verify=NO) for ; Thu, 07 Aug 2014 22:07:02 -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 <0N9Z00ABE27PQI00@mailout2.samsung.com> for xfs@oss.sgi.com; Fri, 08 Aug 2014 14:07:01 +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.114]) by epcpsbgr1.samsung.com (EPCPMTA) with SMTP id 05.D1.25328.5FA54E35; Fri, 08 Aug 2014 14:07:01 +0900 (KST) X-AuditID: cbfee68d-b7f2f6d0000062f0-38-53e45af5a7b2 Received: from epmmp1.local.host ( [203.254.227.16]) by epcpsbgm1.samsung.com (EPCPMTA) with SMTP id FC.EC.04943.5FA54E35; Fri, 08 Aug 2014 14:07:01 +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 <0N9Z00NJ227O44A0@mmp1.samsung.com>; Fri, 08 Aug 2014 14:07:01 +0900 (KST) From: Namjae Jeon To: Dave Chinner , Theodore Ts'o Cc: linux-ext4 , linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, xfs@oss.sgi.com, =?iso-8859-2?Q?Luk=E1=B9_Czerner?= , Brian Foster Subject: [PATCH v5 8/10] xfstests: generic/032: Delayed allocation multi insert Date: Fri, 08 Aug 2014 14:07:00 +0900 X-ASG-Orig-Subj: [PATCH v5 8/10] xfstests: generic/032: Delayed allocation multi insert Message-id: <004901cfb2c6$9631d270$c2957750$@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: Ac+yv1ABYEBXbeu8QnOYnI+26EVbpw== Content-language: ko X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFjrNIsWRmVeSWpSXmKPExsWyRsSkSPdr1JNgg0ufBCzefa6y2HLsHqPF sgebWSxmzrvDZrFn70kWi8u75rBZtPb8ZLdY1HeL0YHD49QiCY+mM0eZPVZf2Mro8X7fVTaP z5vkAlijuGxSUnMyy1KL9O0SuDIWXbvOVrBFs2LV41VMDYxrlboYOTkkBEwkJs06zARhi0lc uLeerYuRi0NIYCmjxMZzj9hhiiYf3ccEkVjEKLF35hGoqr+MEjMvL2PsYuTgYBPQlvizRRSk QUTAVWLe3e+MIDazwB1GiV9rjEFsYQF/iV8NN8G2sQioSkxsvs0MYvMKWEr87fvCAmELSvyY fI8FZCSzgI7E10kREGPkJTavecsMcY+CxI6zrxkhVulJHPp+gh2iRkRi34t3jCCnSQhcYpc4 cXsqK8QuAYlvkw+BzZQQkJXYdABqjqTEwRU3WCYwis1CsnkWwuZZSDbPQrJhASPLKkbR1ILk guKk9CJDveLE3OLSvHS95PzcTYzAiDz971nvDsbbB6wPMSYDbZ/ILCWanA+M6LySeENjMyML UxNTYyNzSzPShJXEeZMeJgUJCaQnlqRmp6YWpBbFF5XmpBYfYmTi4JRqYKw06Dly4Y7B5NfX Xc68OnPTQ/NYU3naYuv1LgIZa3t25W9lOBXxg6vl5q3Qo03nL0Y2T1dg+Zf7anPgQ62fd2U7 36Wbff4764Rptrqe+asD25dnfbd871e//Pbi1pktX6LsjZSEuF7JG75oXrt+WoeJaErArdb0 qWuYdGqKAioz7++892E51x4lluKMREMt5qLiRAB72YkU3gIAAA== X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFvrFIsWRmVeSWpSXmKPExsVy+t9jAd2vUU+CDU5/4LB497nKYsuxe4wW yx5sZrGYOe8Om8WevSdZLC7vmsNm0drzk91iUd8tRgcOj1OLJDyazhxl9lh9YSujx/t9V9k8 Pm+SC2CNamC0yUhNTEktUkjNS85PycxLt1XyDo53jjc1MzDUNbS0MFdSyEvMTbVVcvEJ0HXL zAE6RUmhLDGnFCgUkFhcrKRvh2lCaIibrgVMY4Sub0gQXI+RARpIWMOYsejadbaCLZoVqx6v YmpgXKvUxcjJISFgIjH56D4mCFtM4sK99WxdjFwcQgKLGCX2zjwC5fxllJh5eRljFyMHB5uA tsSfLaIgDSICrhLz7n5nBLGZBe4wSvxaYwxiCwv4S/xquAk2lEVAVWJi821mEJtXwFLib98X FghbUOLH5HssICOZBXQkvk6KgBgjL7F5zVtmiHsUJHacfc0IsUpP4tD3E+wQNSIS+168Y5zA KDALyaRZCJNmIZk0C0nHAkaWVYyiqQXJBcVJ6bmGesWJucWleel6yfm5mxjB8f5MagfjygaL Q4wCHIxKPLwC3Y+DhVgTy4orcw8xSnAwK4nw1nwGCvGmJFZWpRblxxeV5qQWH2I0BfpzIrOU aHI+MBXllcQbGpuYGVkamRtaGBmbK4nzHmi1DhQSSE8sSc1OTS1ILYLpY+LglGpg3Ky2R53/ nuqm6H19uUZuW77FzrW4L5h4YF/FVCHHeVKzru5tFbLYeVL8jPwshYikS+rrl8h3i79ekZk4 ParuDmPMMycpc46lLYfnKf1ex3pwY/D+f322h9I1TyjGH7JSLhdeahxtz/Vtf+s0v4g3roxd rFnOd/XFTij9694j+XDhPvPDf82WKbEUZyQaajEXFScCAInfvkcNAwAA 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: 1407474422 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(032) 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 Signed-off-by: Ashish Sangwan --- tests/generic/032 | 65 +++++++++++++++++++++++++++++++++++++++++ tests/generic/032.out | 80 +++++++++++++++++++++++++++++++++++++++++++++++++++ tests/generic/group | 1 + 3 files changed, 146 insertions(+) create mode 100644 tests/generic/032 create mode 100644 tests/generic/032.out diff --git a/tests/generic/032 b/tests/generic/032 new file mode 100644 index 0000000..32798f3 --- /dev/null +++ b/tests/generic/032 @@ -0,0 +1,65 @@ +#! /bin/bash +# FS QA Test No. generic/032 +# +# 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/032.out b/tests/generic/032.out new file mode 100644 index 0000000..6d7acfd --- /dev/null +++ b/tests/generic/032.out @@ -0,0 +1,80 @@ +QA output created by 032 + 1. into a hole +cf845a781c107ec1346e849c9dd1b7e8 + 2. into allocated space +0: [0..7]: extent +1: [8..23]: hole +2: [24..55]: extent +64e72217eebcbdf31b1b058f9f5f476a + 3. into unwritten space +0: [0..7]: extent +1: [8..23]: hole +2: [24..55]: extent +22b7303d274481990b5401b6263effe0 + 4. hole -> data +0: [0..7]: extent +1: [8..31]: hole +2: [32..55]: extent +c4fef62ba1de9d91a977cfeec6632f19 + 5. hole -> unwritten +0: [0..7]: extent +1: [8..31]: hole +2: [32..55]: extent +1ca74f7572a0f4ab477fdbb5682e5f61 + 6. data -> hole +0: [0..7]: extent +1: [8..23]: hole +2: [24..31]: extent +3: [32..47]: hole +4: [48..55]: extent +be0f35d4292a20040766d87883b0abd1 + 7. data -> unwritten +0: [0..7]: extent +1: [8..23]: hole +2: [24..47]: extent +3: [48..55]: hole +bddb1f3895268acce30d516a99cb0f2f + 8. unwritten -> hole +0: [0..7]: extent +1: [8..23]: hole +2: [24..31]: extent +3: [32..39]: hole +4: [40..55]: extent +f8fc47adc45b7cf72f988b3ddf5bff64 + 9. unwritten -> data +0: [0..7]: extent +1: [8..23]: hole +2: [24..47]: extent +3: [48..55]: hole +c4fef62ba1de9d91a977cfeec6632f19 + 10. hole -> data -> hole +0: [0..7]: extent +1: [8..39]: hole +2: [40..63]: extent +52af1bfcbf43f28af2328de32e0567e5 + 11. data -> hole -> data +0: [0..7]: extent +1: [8..31]: hole +2: [32..39]: extent +3: [40..47]: hole +4: [48..63]: extent +e3a8d52acc4d91a8ed19d7b6f4f26a71 + 12. unwritten -> data -> unwritten +0: [0..7]: extent +1: [8..31]: hole +2: [32..63]: extent +52af1bfcbf43f28af2328de32e0567e5 + 13. data -> unwritten -> data +0: [0..7]: extent +1: [8..31]: hole +2: [32..63]: extent +2b22165f4a24a2c36fd05ef00b41df88 + 14. data -> hole @ EOF +0: [0..23]: extent +1: [24..39]: hole +2: [40..55]: extent +aa0f20d1edcdbce60d8ef82700ba30c3 + 15. data -> hole @ 0 +0: [0..15]: hole +1: [16..55]: extent +86c9d033be2761385c9cfa203c426bb2 diff --git a/tests/generic/group b/tests/generic/group index 544d422..01d719b 100644 --- a/tests/generic/group +++ b/tests/generic/group @@ -34,6 +34,7 @@ 029 auto quick prealloc 030 auto quick prealloc 031 auto quick prealloc +032 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 Fri Aug 8 00:07: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.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 C3DA57FCA for ; Fri, 8 Aug 2014 00:07:15 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id B16BD8F8037 for ; Thu, 7 Aug 2014 22:07:15 -0700 (PDT) X-ASG-Debug-ID: 1407474433-04cb6c3f6d5f2e0001-NocioJ Received: from mailout4.samsung.com (mailout4.samsung.com [203.254.224.34]) by cuda.sgi.com with ESMTP id oTAcKObTTxxg3L4p (version=TLSv1 cipher=RC4-MD5 bits=128 verify=NO) for ; Thu, 07 Aug 2014 22:07:14 -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 epcpsbgr5.samsung.com (u145.gpu120.samsung.co.kr [203.254.230.145]) by mailout4.samsung.com (Oracle Communications Messaging Server 7u4-24.01 (7.0.4.24.0) 64bit (built Nov 17 2011)) with ESMTP id <0N9Z001KN2805140@mailout4.samsung.com> for xfs@oss.sgi.com; Fri, 08 Aug 2014 14:07:12 +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 epcpsbgr5.samsung.com (EPCPMTA) with SMTP id 76.28.15745.00B54E35; Fri, 08 Aug 2014 14:07:12 +0900 (KST) X-AuditID: cbfee691-b7f306d000003d81-43-53e45b00a669 Received: from epmmp2 ( [203.254.227.17]) by epcpsbgm1.samsung.com (EPCPMTA) with SMTP id B6.FC.04943.00B54E35; Fri, 08 Aug 2014 14:07:12 +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 <0N9Z00B06280HC10@mmp2.samsung.com>; Fri, 08 Aug 2014 14:07:12 +0900 (KST) From: Namjae Jeon To: Dave Chinner , Theodore Ts'o Cc: linux-ext4 , linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, xfs@oss.sgi.com, =?iso-8859-2?Q?Luk=E1=B9_Czerner?= , Brian Foster Subject: [PATCH v5 10/10] xfstests: fsx: Add fallocate insert range operation Date: Fri, 08 Aug 2014 14:07:12 +0900 X-ASG-Orig-Subj: [PATCH v5 10/10] xfstests: fsx: Add fallocate insert range operation Message-id: <004b01cfb2c6$9d084f70$d718ee50$@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: Ac+ywE/fM47JiJviQBS4QsLNnH/91g== Content-language: ko X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFjrFIsWRmVeSWpSXmKPExsWyRsSkWJch+kmwwd6dehbvPldZbDl2j9Fi 2YPNLBYz591hs9iz9ySLxeVdc9gsWnt+slss6rvF6MDhcWqRhEfTmaPMHqsvbGX0eL/vKpvH 501yAaxRXDYpqTmZZalF+nYJXBkXzu1hK3iiWdHZk93AeEKhi5GTQ0LARGLfkk4mCFtM4sK9 9WxdjFwcQgJLGSV+zdzMDlO0qnMlM0RiOqNE7+oZjBDOX0aJKY3TgFo4ONgEtCX+bBEFaRAR cJWYd/c7I4jNLHAHaNIaYxBbWMBX4v3ll2BxFgFViY0z14Jt5hWwlFi9rJERwhaU+DH5HgvI SGYBHYmvkyIgxshLbF7zlhniHgWJHWdfM0Ks0pOYt/sqO0SNiMS+F+/ATpMQOMcu0bt0NRPE LgGJb5MPgc2UEJCV2HQAao6kxMEVN1gmMIrNQrJ5FsLmWUg2z0KyYQEjyypG0dSC5ILipPQi U73ixNzi0rx0veT83E2MwHg8/e/ZxB2M9w9YH2JMBto+kVlKNDkfGM95JfGGxmZGFqYmpsZG 5pZmpAkrifOmP0oKEhJITyxJzU5NLUgtii8qzUktPsTIxMEp1cCoYfv67TSWR0vnOK9e4r5F 5NZElZPxWbE7P/LHT+lvnZLFuuxI5ed3YQ3rj28+1ioUtHB5gOOBfw+Xy3yWbwyO+ZlVcFDE S41hVlrJ0cJCJonaJ9e+p3ocTr1yd2GgZ8zHnYoq3PK/PL2j9rx7nN4WeWW7pHmDwWyfnGnt ize2NzGJvn0477+cEktxRqKhFnNRcSIApKm72N0CAAA= X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFvrJIsWRmVeSWpSXmKPExsVy+t9jQV2G6CfBBp2vVC3efa6y2HLsHqPF sgebWSxmzrvDZrFn70kWi8u75rBZtPb8ZLdY1HeL0YHD49QiCY+mM0eZPVZf2Mro8X7fVTaP z5vkAlijGhhtMlITU1KLFFLzkvNTMvPSbZW8g+Od403NDAx1DS0tzJUU8hJzU22VXHwCdN0y c4BOUVIoS8wpBQoFJBYXK+nbYZoQGuKmawHTGKHrGxIE12NkgAYS1jBmXDi3h63giWZFZ092 A+MJhS5GTg4JAROJVZ0rmSFsMYkL99azdTFycQgJTGeU6F09gxHC+csoMaVxGlCGg4NNQFvi zxZRkAYRAVeJeXe/M4LYzAJ3GCV+rTEGsYUFfCXeX34JFmcRUJXYOHMtE4jNK2ApsXpZIyOE LSjxY/I9FpCRzAI6El8nRUCMkZfYvOYt1D0KEjvOvmaEWKUnMW/3VXaIGhGJfS/eMU5gFJiF ZNIshEmzkEyahaRjASPLKkbR1ILkguKk9FxDveLE3OLSvHS95PzcTYzgaH8mtYNxZYPFIUYB DkYlHl6B7sfBQqyJZcWVuYcYJTiYlUR4az4DhXhTEiurUovy44tKc1KLDzGaAv05kVlKNDkf mIjySuINjU3MjCyNzA0tjIzNlcR5D7RaBwoJpCeWpGanphakFsH0MXFwSjUwzms7nvvLyvuA 6GqO5y1fw2KzU+T43jPZfJee1h9nddvlEpuG8aLEJe7t5yIipy28yD45a1Giz00/z3iv8O93 2UKKd2+Sm7S0zu2c1cVANxE558g934K6jhdtvtuTdTuOpZxVWGml/KQJfw5d0WRynLnCevPr DN07L3MtlpTNfF7KdCzkMsdUJZbijERDLeai4kQAWCq12QwDAAA= 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: 1407474434 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 commit adds fallocate FALLOC_FL_INSERT_RANGE support for fsx. Signed-off-by: Namjae Jeon Signed-off-by: Ashish Sangwan --- ltp/fsx.c | 96 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 94 insertions(+), 2 deletions(-) diff --git a/ltp/fsx.c b/ltp/fsx.c index 47d3ee8..9dc1655 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 namjae.jeon@samsung.com Fri Aug 8 00:07: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.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 759E87FCE for ; Fri, 8 Aug 2014 00:07:37 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 46129304059 for ; Thu, 7 Aug 2014 22:07:37 -0700 (PDT) X-ASG-Debug-ID: 1407474454-04bdf0346970190001-NocioJ Received: from mailout3.samsung.com (mailout3.samsung.com [203.254.224.33]) by cuda.sgi.com with ESMTP id SwsZuZ5bAjfemXfb (version=TLSv1 cipher=RC4-MD5 bits=128 verify=NO) for ; Thu, 07 Aug 2014 22:07:35 -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 <0N9Z00F4W27TWS40@mailout3.samsung.com> for xfs@oss.sgi.com; Fri, 08 Aug 2014 14:07:05 +0900 (KST) Received: from epcpsbgm1.samsung.com ( [172.20.52.116]) by epcpsbgr5.samsung.com (EPCPMTA) with SMTP id 53.18.15745.9FA54E35; Fri, 08 Aug 2014 14:07:05 +0900 (KST) X-AuditID: cbfee691-b7f306d000003d81-dc-53e45af93a01 Received: from epmmp2 ( [203.254.227.17]) by epcpsbgm1.samsung.com (EPCPMTA) with SMTP id 1F.EC.04943.9FA54E35; Fri, 08 Aug 2014 14:07:05 +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 <0N9Z003SO27T8HB0@mmp2.samsung.com>; Fri, 08 Aug 2014 14:07:05 +0900 (KST) From: Namjae Jeon To: Dave Chinner , Theodore Ts'o Cc: linux-ext4 , linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, xfs@oss.sgi.com, =?iso-8859-2?Q?Luk=E1=B9_Czerner?= , Brian Foster Subject: [PATCH v5 9/10] xfstests: fsstress: Add fallocate insert range Date: Fri, 08 Aug 2014 14:07:05 +0900 X-ASG-Orig-Subj: [PATCH v5 9/10] xfstests: fsstress: Add fallocate insert range Message-id: <004a01cfb2c6$98c4b250$ca4e16f0$@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: Ac+yv3OjJL5fopW9RcyywOOIcarnIQ== Content-language: ko X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFjrNIsWRmVeSWpSXmKPExsWyRsSkRPdn1JNgg82bVSzefa6y2HLsHqPF sgebWSxmzrvDZrFn70kWi8u75rBZtPb8ZLdY1HeL0YHD49QiCY+mM0eZPVZf2Mro8X7fVTaP z5vkAlijuGxSUnMyy1KL9O0SuDJ+HJrLXDBLtOLqog7GBsafAl2MnBwSAiYSs7u+MUPYYhIX 7q1n62Lk4hASWMoocfnHNnaYos5fa9ghEtMZJeb0XWeEcP4ySqx/vY61i5GDg01AW+LPFlGQ BhEBV4l5d78zgtjMAncYJX6tMQaxhQU8JNYfnAo2lEVAVeLnhU42EJtXwFJi7f05LBC2oMSP yfdYQEYyC+hIfJ0UATFGXmLzmrdQhypI7Dj7mhFilZ7Ep+0rmSBqRCT2vXgHdpqEwCV2iRuL L7JA7BKQ+Db5ENhMCQFZiU0HoOZIShxccYNlAqPYLCSbZyFsnoVk8ywkGxYwsqxiFE0tSC4o TkovMtUrTswtLs1L10vOz93ECIzI0/+eTdzBeP+A9SHGZKDtE5mlRJPzgRGdVxJvaGxmZGFq YmpsZG5pRpqwkjhv+qOkICGB9MSS1OzU1ILUovii0pzU4kOMTBycUg2MmhnHW+1LJHV2HORP lo5foPjaZ1pmU9EzBfY97pxG0x4V1e9ZsHCS6JYy19cb/67r8i7JXrTgRo1iyg9PtUmMN115 X5/6v7R00ryDjksSVas/r3nfJpHxMcwmJV22ff4jy6N/d2V4/ktpfHv38qxZqRJusR+Mp100 kJfTN7u3xlM8pn7Hu7snlViKMxINtZiLihMBpFmfP94CAAA= X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFvrFIsWRmVeSWpSXmKPExsVy+t9jQd2fUU+CDWacl7F497nKYsuxe4wW yx5sZrGYOe8Om8WevSdZLC7vmsNm0drzk91iUd8tRgcOj1OLJDyazhxl9lh9YSujx/t9V9k8 Pm+SC2CNamC0yUhNTEktUkjNS85PycxLt1XyDo53jjc1MzDUNbS0MFdSyEvMTbVVcvEJ0HXL zAE6RUmhLDGnFCgUkFhcrKRvh2lCaIibrgVMY4Sub0gQXI+RARpIWMOY8ePQXOaCWaIVVxd1 MDYw/hToYuTkkBAwkej8tYYdwhaTuHBvPVsXIxeHkMB0Rok5fdcZIZy/jBLrX69j7WLk4GAT 0Jb4s0UUpEFEwFVi3t3vjCA2s8AdRolfa4xBbGEBD4n1B6eCDWURUJX4eaGTDcTmFbCUWHt/ DguELSjxY/I9FpCRzAI6El8nRUCMkZfYvOYtM8Q9ChI7zr5mhFilJ/Fp+0omiBoRiX0v3jFO YBSYhWTSLIRJs5BMmoWkYwEjyypG0dSC5ILipPRcQ73ixNzi0rx0veT83E2M4Hh/JrWDcWWD xSFGAQ5GJR5ege7HwUKsiWXFlbmHGCU4mJVEeGs+A4V4UxIrq1KL8uOLSnNSiw8xmgL9OZFZ SjQ5H5iK8kriDY1NzIwsjcwNLYyMzZXEeQ+0WgcKCaQnlqRmp6YWpBbB9DFxcEo1MJbrVits E9ALyZV/c6fu3dPuC8vWcLXUODKEiGuHOG5w23Yp/BG/+YsNS7zkuT2ulPD4euzctuWQ/Mz1 KfmT4z1efe3PdtWy/5IXY9jJ4TzTs697irPBjL+JVSZGrg9vTdU9wp1w8YjOH/998wxXTGY9 oFlwiftB5NE7aaYSC+UUnS48Omz4UImlOCPRUIu5qDgRAGEovCkNAwAA 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: 1407474455 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.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.8235 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 Signed-off-by: Ashish Sangwan --- 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..f63246b 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 david@fromorbit.com Fri Aug 8 02:39: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 9E5977F77 for ; Fri, 8 Aug 2014 02:39:38 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 6D6F4304062 for ; Fri, 8 Aug 2014 00:39:38 -0700 (PDT) X-ASG-Debug-ID: 1407483575-04bdf0346974d30001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id S46kr5kgCcsxKJ12 for ; Fri, 08 Aug 2014 00:39:35 -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: AicRALR95FN5LDJ8PGdsb2JhbABagw2BKYInhQemSQEBAQEBAQamIAGBExcFAQEBATg2hAQBBTocIxAIAxgJJQ8FJQMHGhOIQcRmFxiFZIlQB4MvgRwBBI8DjSGYXCsv Received: from ppp121-44-50-124.lns20.syd6.internode.on.net (HELO dastard) ([121.44.50.124]) by ipmail05.adl6.internode.on.net with ESMTP; 08 Aug 2014 17:09:34 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1XFelv-0005MU-Ln; Fri, 08 Aug 2014 17:39:31 +1000 Date: Fri, 8 Aug 2014 17:39:31 +1000 From: Dave Chinner To: Greg KH Cc: Bill , xfs@oss.sgi.com Subject: Re: xfs hang in 3.14.15 Message-ID: <20140808073931.GD26465@dastard> X-ASG-Orig-Subj: Re: xfs hang in 3.14.15 References: <53E02495.4080208@sbcglobal.net> <20140805011800.GC20518@dastard> <53E372AA.4030304@sbcglobal.net> <20140807211052.GD17105@kroah.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140807211052.GD17105@kroah.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: 1407483575 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.8237 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Thu, Aug 07, 2014 at 02:10:52PM -0700, Greg KH wrote: > On Thu, Aug 07, 2014 at 07:35:54AM -0500, Bill wrote: > > On 08/04/2014 08:18 PM, Dave Chinner wrote: > > >On Mon, Aug 04, 2014 at 07:25:57PM -0500, Bill wrote: > > >>Hi, > > >> > > >>I've been running a stress test on 3.14.15 and eventually my xfs > > >>filesystem hangs. Both 3.10.50 and 3.16 seem to work ok. > > >log space hang. > > > > > >110dc24 xfs: log vector rounding leaks log space > > > > > >Cheers, > > > > > >Dave. > > > > Thanks Dave, that helped. > > > > Greg, Please consider this for inclusion in 3.14.y. It fixed an xfs hang I > > had on 3.14.15 > > Dave, any objection for me to include it? Go ahead, Greg. FWIW, if you are doing another 3.15 release, it is needed there as well as this fix didn't go in until 3.16-rc1.... Thanks! -Dave. -- Dave Chinner david@fromorbit.com From felipemonteiro.carvalho@gmail.com Fri Aug 8 03:54: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=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 1B1797F8D for ; Fri, 8 Aug 2014 03:54:25 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 9CF26AC002 for ; Fri, 8 Aug 2014 01:54:21 -0700 (PDT) X-ASG-Debug-ID: 1407488058-04cbb00fa071d00001-NocioJ Received: from mail-pd0-f169.google.com (mail-pd0-f169.google.com [209.85.192.169]) by cuda.sgi.com with ESMTP id R0dzCux9Qqk7TfiK (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Fri, 08 Aug 2014 01:54:19 -0700 (PDT) X-Barracuda-Envelope-From: felipemonteiro.carvalho@gmail.com X-Barracuda-RBL-Trusted-Forwarder: 209.85.192.169 Received: by mail-pd0-f169.google.com with SMTP id y10so6718668pdj.14 for ; Fri, 08 Aug 2014 01:54:18 -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=MgHHxj9mpr0A7R4s9fEOAxEhZXZ4xh2/BTDl9pxZwE4=; b=06lHyS9ZmFolBxKadt5DAfkcQiD4ZPlY0FNvGkWoRw1Pbl0WOV/eMS3NNyq5E4YiDJ 3XvAlinTwkgUuVGhu68Zje0twHGIxPIHSHmlnAjvnTdiZ4orely5NCsk3YxMryg0GMyZ /s54vyjfc9XqBDckuGBgKkKEeA8UkNL8mgMzSZ5pB8RosgwtkP9XFfM/twXfkXnlVwYF QUVXOKdXr+kFADFzNun/iGdMwH0gcd9adlN+O2YHHu1MccpBa+YspNvcMIoOa9eoNybK UxOgeggAA/9zb/Q2WQfqlhJOquH7PNJn57nNWvW4J52E/WmGEfrbQGskE9w6BALSmW1h 6vGQ== X-Barracuda-BBL-IP: nil MIME-Version: 1.0 X-Received: by 10.70.140.75 with SMTP id re11mr23014007pdb.65.1407488058388; Fri, 08 Aug 2014 01:54:18 -0700 (PDT) Received: by 10.66.50.9 with HTTP; Fri, 8 Aug 2014 01:54:18 -0700 (PDT) In-Reply-To: <53E39117.4090200@sandeen.net> References: <53E39117.4090200@sandeen.net> Date: Fri, 8 Aug 2014 10:54:18 +0200 Message-ID: Subject: Re: Recovery of deleted files/directories From: Felipe Monteiro de Carvalho X-ASG-Orig-Subj: Re: Recovery of deleted files/directories To: Eric Sandeen Cc: xfs@oss.sgi.com Content-Type: text/plain; charset=UTF-8 X-Barracuda-Connect: mail-pd0-f169.google.com[209.85.192.169] X-Barracuda-Start-Time: 1407488059 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.8239 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, Aug 7, 2014 at 4:45 PM, Eric Sandeen wrote: > Do you have a link to the project you're working on? Is it an open > source tool? At the moment its only local in my computer, I'm first trying to get it to work and afterwards think about what to do with it... > There's another tool out there already called "xfs_irecover" which > looks for any inode anywhere on disk, and tries to copy back out any > data that it points to, deleted or not. It could use some love. Nice! So indeed it's possible =) From what I could understand it looks like that it recovers only file, not really directories, and it seams to suppose that the files have format extent, so I suppose that it won't work with very small files (with local data in the inode) and neither will work in files with format btree. Still, it should be able to recover most files I guess that local and btree formats are less commonly found. -- Felipe Monteiro de Carvalho From edithi0iochou@yahoo.co.jp Fri Aug 8 06:46: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=1.0 required=5.0 tests=FREEMAIL_FROM,FREEMAIL_REPLYTO, HTML_MESSAGE,T_DKIM_INVALID,T_HK_NAME_FM_DR 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 AC5017F82 for ; Fri, 8 Aug 2014 06:46:29 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 7D2E6304059 for ; Fri, 8 Aug 2014 04:46:29 -0700 (PDT) X-ASG-Debug-ID: 1407498383-04bdf034677d1a0001-NocioJ Received: from web101217.mail.kks.yahoo.co.jp (web101217.mail.kks.yahoo.co.jp [183.79.100.221]) by cuda.sgi.com with SMTP id YK1noRdJTVq7zf0y for ; Fri, 08 Aug 2014 04:46:24 -0700 (PDT) X-Barracuda-Envelope-From: edithi0iochou@yahoo.co.jp X-Barracuda-Apparent-Source-IP: 183.79.100.221 Received: (qmail 59958 invoked by uid 60001); 8 Aug 2014 11:46:22 -0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.co.jp; s=yj20110701; t=1407498382; bh=s+cd+x8Nx85Dv6bkIv+LPlt7B5rXADfpkwSnZSOWnQw=; h=Message-ID:X-YMail-OSG:Received:X-Mailer:X-YMail-JAS:Date:From:Reply-To:Subject:To:MIME-Version:Content-Type; b=Io9jMdgXBxx1CKCo0hcnwT2JhypvQ8HSiJAy8X+E/9ldaCLMH+su/V+/0yF6uFvntUY1EaqTmPN/KrnSBikhQ/bci7jXcW5ypV6TRIULa4YunN4B97KBzyutyPqMVly7XCMCFPyVqWqbAuJfKcr+JFThZpKqqz4t9dwR9YBaax4= DomainKey-Signature:a=rsa-sha1; q=dns; c=nofws; s=yj20110701; d=yahoo.co.jp; h=Message-ID:X-YMail-OSG:Received:X-Mailer:X-YMail-JAS:Date:From:Reply-To:Subject:To:MIME-Version:Content-Type; b=UbOSHDUAdonVoagLo4IbaauVZJwd1u/vYXzyANOsw3xtK2VH2W4hpiaq+psSeH11XTYoy33ppRrwef0t3K5wwWtaFHNr8RqQ1K4tKoNaTeswpGzPprastcfAe3jJ/BqTY7cz1C2XnJqBrFJitcXWzndmc7QiqtKSbvAH0vP3zck=; Message-ID: <427527.55176.qm@web101217.mail.kks.yahoo.co.jp> X-YMail-OSG: uy7x3vsVM1n8iVJlQL4iHjZmX9h0hCuLmvuC7VQItoytuzaihSdz5imsLfWWlk.U9X2b2fA2qRtTsgYw1Jnf_SPggEv6fuy2..anw6cscMpZBPEuve8uzdjx1vdDMvYBCOl1wncM1jYPEk1jYdYedAH18nADOdHki.XH4qcEJgdI7QwP_isCocRwWinQ1nyfYv6rSsczaGZRp7Lo3nkyI22QEDUrKJLTuPWBTlJ45p0xFXze2Bc8ECQIB8x7rTV4Qohu5ToX6Q3264gRu7aAp30PsKnyiYNA9EIJbpPfNEWD4SWuAPyC1bvYpPhyRBDGm8Lzd6KRu0o2AFEVeSeZIToKvjPlGnTfjTyqLmNzZ0KEROaJHnsc6ake5renxSJNTe68TAmhEPlkkw1nF4bBw72djk3cnhzv7Txb3ZC.BJGhr1Xgg11looQ1m6cViPaAUpaqYIE97RK.U_VI93m8Wjj2DJCznbhp9vwyRgN0urNvXIEU1_fqNxsw9b9WrfKgxizvTwUZPXVNp5Dad5eAMxDk7gITgWHkzq6gwzPZ_I5BxnIND_tgAHg28ccXxaPzBcoF5c3spoL.PcVkWrt61NRlD4o292Yl14l2ELsUbfqMYSnR9ByyAZ_ggv28QYDEDDrjrymY6OFmZoKfZVDJMu.ni8ttxfVup0dkg7elqoBx4geGYEStf6PYiQM2aA-- Received: from [41.189.42.86] by web101217.mail.kks.yahoo.co.jp via HTTP; Fri, 08 Aug 2014 20:46:21 JST X-Mailer: YahooMailWebService/0.8.111_55 X-YMail-JAS: WtCfOnsVM1nxFuDqG_1ry5Ee1zl399AD7yB6y3Qf0LRfBAJLTLBkKdQTwzmtDzD28lKVcABBi19X2_MUt_SdzPVO9mkA7igbZQ8De8kgQjzcRbm1A8BOstPp5Dz6PpC_nyl4 Date: Fri, 8 Aug 2014 20:46:21 +0900 (JST) From: Dr Geoffrrey Abdoulaye Reply-To: Dr Geoffrrey Abdoulaye Subject: Good day and how are you today To: undisclosed recipients: ; X-ASG-Orig-Subj: Good day and how are you today MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="0-662168773-1407498381=:55176" X-Barracuda-Connect: web101217.mail.kks.yahoo.co.jp[183.79.100.221] X-Barracuda-Start-Time: 1407498384 X-Barracuda-URL: http://192.48.157.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=ADVANCE_FEE_1, DKIM_SIGNED, DKIM_VERIFIED, HTML_MESSAGE, VALIDYAHOOJP X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.8241 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.00 ADVANCE_FEE_1 Appears to be advance fee fraud (Nigerian 419) --0-662168773-1407498381=:55176 Content-Type: text/plain; charset=iso-8859-1 Content-Transfer-Encoding: quoted-printable Attn:Dear Friend,=0A=A0=0AGood day and how are=0Ayou today?=0A=A0=0AListen = carefully for=0Athe information, As courtesy demands, I am Dr Geoffrrey =A0= Abdoulaye The Operations Manager In Ecowas=0Aoffice in African There is an = information I think might interest you. First of=0Aall, I do not know if I = am talking to the right person, but I will like you to=0Aconfirm if you are= the owner of this email ID. Already I have your name and=0Adetails in our = file in the office, but somehow I am not comfortable and too=0Asure. So I j= ust want to make sure am communicating with the real owner of this=0AEmail = ID.=0A=A0=0ASpecial Thanks To You=0AMy Good Friend,=0A=A0=0ADr Geoffrrey=0A= Abdoulaye. --0-662168773-1407498381=:55176 Content-Type: text/html; charset=iso-8859-1 Content-Transfer-Encoding: quoted-printable
Attn:Dear Fri= end,
=0A=0A
 
= =0A=0A
Good day and how are=0Ayou today?
=0A=0A
 
=0A=0A
Listen carefully for=0Athe information, As courtesy d= emands, I am Dr Geoffrrey  Abdoulaye The Operations Manager In Ecowas= =0Aoffice in African There is an information I think might interest you. Fi= rst of=0Aall, I do not know if I am talking to the right person, but I will= like you to=0Aconfirm if you are the owner of this email ID. Already I hav= e your name and=0Adetails in our file in the office, but somehow I am not c= omfortable and too=0Asure. So I just want to make sure am communicating wit= h the real owner of this=0AEmail ID.
=0A=0A
 
=0A=0A
Special= Thanks To You=0AMy Good Friend,
=0A=0A
 
=0A=0A
Dr Geoffrrey= =0AAbdoulaye.
--0-662168773-1407498381=:55176-- From debbugs@buxtehude.debian.org Fri Aug 8 07:24: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=3.0 required=5.0 tests=TVD_SUBJ_NUM_OBFU_MINFP autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 449127F72 for ; Fri, 8 Aug 2014 07:24:15 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 32637304053 for ; Fri, 8 Aug 2014 05:24:12 -0700 (PDT) X-ASG-Debug-ID: 1407500649-04cbb00fa079ec0001-NocioJ Received: from buxtehude.debian.org (buxtehude.debian.org [140.211.166.26]) by cuda.sgi.com with ESMTP id WLNykdwBt6THNzLE (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO) for ; Fri, 08 Aug 2014 05:24: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 1XFjDK-00083R-OM; Fri, 08 Aug 2014 12:24:06 +0000 X-Loop: owner@bugs.debian.org Subject: Bug#757455: please run dh_autoreconf or manually update m4/libtool.m4 for ppc64el Reply-To: Matthias Klose , 757455@bugs.debian.org X-ASG-Orig-Subj: Bug#757455: please run dh_autoreconf or manually update m4/libtool.m4 for ppc64el Resent-From: Matthias Klose Resent-To: debian-bugs-dist@lists.debian.org Resent-Cc: XFS Development Team X-Loop: owner@bugs.debian.org Resent-Date: Fri, 08 Aug 2014 12:24:01 +0000 Resent-Message-ID: X-Debian-PR-Message: report 757455 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.140750047430208 (code B); Fri, 08 Aug 2014 12:24:01 +0000 Received: (at submit) by bugs.debian.org; 8 Aug 2014 12:21:14 +0000 Received: from youngberry.canonical.com ([91.189.89.112]) by buxtehude.debian.org with esmtp (Exim 4.80) (envelope-from ) id 1XFjAY-0007r0-3e for submit@bugs.debian.org; Fri, 08 Aug 2014 12:21:14 +0000 Received: from dslb-088-073-116-129.088.073.pools.vodafone-ip.de ([88.73.116.129] helo=[192.168.42.220]) by youngberry.canonical.com with esmtpsa (TLS1.0:DHE_RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1XFjAU-00048T-HI for submit@bugs.debian.org; Fri, 08 Aug 2014 12:21:10 +0000 Message-ID: <53E4C0A5.8060704@debian.org> Date: Fri, 08 Aug 2014 14:20:53 +0200 From: Matthias Klose User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:31.0) Gecko/20100101 Thunderbird/31.0 MIME-Version: 1.0 To: Debian Bug Tracking System Content-Type: text/plain; charset=utf-8 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: 1407500649 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.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 X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.8242 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.01 BSF_SC0_SA_TO_FROM_DOMAIN_MATCH Sender Domain Matches Recipient Domain Package: src:xfsprogs Version: 3.2.1 trying to use dh_autoreconf: autoreconf -f -i libtoolize: putting auxiliary files in AC_CONFIG_AUX_DIR, `.'. libtoolize: copying file `./ltmain.sh' libtoolize: putting macros in AC_CONFIG_MACRO_DIR, `m4'. libtoolize: copying file `m4/libtool.m4' libtoolize: copying file `m4/ltoptions.m4' libtoolize: copying file `m4/ltsugar.m4' libtoolize: copying file `m4/ltversion.m4' libtoolize: copying file `m4/lt~obsolete.m4' libtoolize: Consider adding `-I m4' to ACLOCAL_AMFLAGS in Makefile.am. autoheader: warning: missing template: HAVE_UMODE_T autoheader: Use AC_DEFINE([HAVE_UMODE_T], [], [Description]) autoheader: warning: missing template: HAVE___PSINT_T autoheader: warning: missing template: HAVE___PSUNSIGNED_T autoheader: warning: missing template: HAVE___U32 autoreconf: /usr/bin/autoheader failed with exit status: 1 please fix this and use dh_autoreconf, or update libtool.m4 manually as in http://launchpadlibrarian.net/181798228/xfsprogs_3.1.9ubuntu2_3.2.1ubuntu1.diff.gz From prvs=32979cee0f=clm@fb.com Fri Aug 8 09:35: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=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 28A927F74 for ; Fri, 8 Aug 2014 09:35:54 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 1671A304062 for ; Fri, 8 Aug 2014 07:35:50 -0700 (PDT) X-ASG-Debug-ID: 1407508549-04cb6c3f6d75690001-NocioJ Received: from mx0b-00082601.pphosted.com (mx0b-00082601.pphosted.com [67.231.153.30]) by cuda.sgi.com with ESMTP id bGSBu67MVNsVKP4X for ; Fri, 08 Aug 2014 07:35:50 -0700 (PDT) X-Barracuda-Envelope-From: prvs=32979cee0f=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 (m0004077 [127.0.0.1]) by mx0b-00082601.pphosted.com (8.14.5/8.14.5) with SMTP id s78EZgvP019392; Fri, 8 Aug 2014 07:35: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 : subject : content-type : content-transfer-encoding; s=facebook; bh=pTuG6SnM/znip3JPIfY9vmcVuMVYaRvIijEOKiDNuOk=; b=IACqUU5LgKuo7Oj+f+wP14gzY6/nN/J9wWjTUI9783T17zaSN5TTfK6WVBlq32FU2sCF pPxLtEjCg8LIxi80R7Y7t93HB43uuYZM9zCo0mZtaJyey3dXXRICV3wSP+kbPG6BOCNe GRnkRZk7dncoN+/dbWFJrWGe/81Q3BayTDw= Received: from mail.thefacebook.com (mailwest.thefacebook.com [173.252.71.148]) by mx0b-00082601.pphosted.com with ESMTP id 1nmhyqt7w5-1 (version=TLSv1/SSLv3 cipher=AES128-SHA bits=128 verify=OK); Fri, 08 Aug 2014 07:35:42 -0700 Received: from [172.23.2.80] (192.168.57.29) by mail.thefacebook.com (192.168.16.21) with Microsoft SMTP Server (TLS) id 14.3.195.1; Fri, 8 Aug 2014 07:35:40 -0700 Message-ID: <53E4E03A.7050101@fb.com> Date: Fri, 8 Aug 2014 10:35:38 -0400 From: Chris Mason User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Thunderbird/24.6.0 MIME-Version: 1.0 To: , Dave Chinner , Eric Sandeen Subject: [PATCH] xfs: don't zero partial page cache pages during O_DIRECT X-Enigmail-Version: 1.6 X-ASG-Orig-Subj: [PATCH] xfs: don't zero partial page cache pages during O_DIRECT Content-Type: text/plain; charset="ISO-8859-1" Content-Transfer-Encoding: 7bit X-Originating-IP: [192.168.57.29] X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10432:5.12.52,1.0.27,0.0.0000 definitions=2014-08-08_04:2014-08-08,2014-08-08,1970-01-01 signatures=0 X-Proofpoint-Spam-Details: rule=fb_default_notspam policy=fb_default score=0 kscore.is_bulkscore=2.38886133097083e-11 kscore.compositescore=0 circleOfTrustscore=0 compositescore=0.997797736942976 urlsuspect_oldscore=0.997797736942976 suspectscore=8 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=11180 rbsscore=0.997797736942976 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-1408080174 X-FB-Internal: deliver X-Barracuda-Connect: mx0b-00082601.pphosted.com[67.231.153.30] X-Barracuda-Start-Time: 1407508549 X-Barracuda-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 is using truncate_pagecache_range to invalidate the page cache during DIO reads. This is different from the other filesystems who only invalidate pages during DIO writes. truncate_pagecache_range is meant to be used when we are freeing the underlying data structs from disk, so it will zero any partial ranges in the page. This means a DIO read can zero out part of the page cache page, and it is possible the page will stay in cache. buffered reads will find an up to date page with zeros instead of the data actually on disk. This patch fixes things by leaving the page cache alone during DIO reads. We discovered this when our buffered IO program for distributing database indexes was finding zero filled blocks. I think writes are broken too, but I'll leave that for a separate patch because I don't fully understand what XFS needs to happen during a DIO write. Test program: /* * gcc -Wall -o read-race read-race.c * ./read-race filename */ #define _XOPEN_SOURCE 600 #include #include #include #include #include #include #include #include #include #ifndef O_DIRECT #define O_DIRECT 00040000 #endif #define READ_SIZE 512 #define BUF_SIZE 1024 * 1024 static void usage(char *name) { fprintf(stderr, "usage: %s filename\n", name); exit(1); } /* return 1 if the buffer is full of zeros */ static int all_zeros(char *buf, int sz) { int i; for (i = 0; i < sz; i++) { if (*buf++) return 0; } return 1; } static void run_test(char *filename, char *buf, int direct) { int fd; int ret; struct timeval start; struct timeval now; fd = open(filename, O_RDONLY | direct); if (fd < 0) { perror("open"); exit(1); } /* * seek to a 512b aligned offset in the page and then do a * read. Check the read for zeros, and if we're buffered * use FADV_DONTNEED to drop the page cache. repeat for 15 seconds */ gettimeofday(&start, NULL); while (1) { ret = lseek(fd, 5120, SEEK_SET); if (ret < 0) { perror("lseek"); exit(1); } if (!direct) { ret = posix_fadvise(fd, 0, 8192, POSIX_FADV_DONTNEED); if (ret) { perror("fadvise"); exit(1); } } ret = read(fd, buf, READ_SIZE); if (ret < READ_SIZE) { fprintf(stderr, "invalid read\n"); exit(1); } if (all_zeros(buf, READ_SIZE)) { fprintf(stderr, "error: found zero range direct: %d\n", direct ? 1 : 0); exit(255); } gettimeofday(&now, NULL); if (now.tv_sec - start.tv_sec > 15) exit(0); } } int main(int ac, char **av) { int ret; int fd; char *filename; char *buf; int pagesize = sysconf(_SC_PAGESIZE); pid_t buffered_pid = 0; pid_t direct_pid = 0; pid_t wait_pid; int status = 0; int test_failure = 0; if (ac != 2) usage(av[0]); else filename = av[1]; ret = posix_memalign((void **)&buf, pagesize, BUF_SIZE); if (ret) { perror("posix_memalign"); exit(1); } /* step one, create our test file and fill with non-zero */ fd = open(filename, O_WRONLY | O_CREAT, 0700); if (fd < 0) { perror("open for writing"); exit(1); } memset(buf, 1, BUF_SIZE); ret = write(fd, buf, BUF_SIZE); if (ret != BUF_SIZE) { fprintf(stderr, "failed to fill the test file\n"); exit(1); } close(fd); /* start the buffered reader */ buffered_pid = fork(); if (buffered_pid < 0) { perror("fork"); exit(1); } else if (buffered_pid == 0) { run_test(filename, buf, 0); exit(0); } /* start the direct reader */ direct_pid = fork(); if (direct_pid < 0) { perror("fork"); goto cleanup; } else if (direct_pid == 0) { run_test(filename, buf, O_DIRECT); exit(0); } /* wait for buffered to finish */ wait_pid = waitpid(buffered_pid, &status, 0); if (wait_pid < 0) { perror("waitpid buffered"); goto cleanup; } if (WIFEXITED(status)) { int ret = WEXITSTATUS(status); printf("buffered exits with %d\n", ret); if (ret) { buffered_pid = 0; test_failure = ret; goto cleanup; } } else { test_failure = 1; } /* wait for direct to finish */ wait_pid = waitpid(direct_pid, &status, 0); if (wait_pid < 0) { perror("waitpid direct"); goto cleanup; } if (WIFEXITED(status)) { int ret = WEXITSTATUS(status); printf("direct exits with %d\n", ret); test_failure |= ret; } else { test_failure |= 1; } exit(test_failure); cleanup: if (direct_pid > 0) kill(direct_pid, SIGTERM); if (buffered_pid > 0) kill(buffered_pid, SIGTERM); exit(test_failure); } Signed-off-by: Chris Mason cc: stable@vger.kernel.org diff --git a/fs/xfs/xfs_file.c b/fs/xfs/xfs_file.c index 1f66779..8d25d98 100644 --- a/fs/xfs/xfs_file.c +++ b/fs/xfs/xfs_file.c @@ -295,7 +295,11 @@ xfs_file_read_iter( xfs_rw_iunlock(ip, XFS_IOLOCK_EXCL); return ret; } - truncate_pagecache_range(VFS_I(ip), pos, -1); + + /* we don't remove any pages here. A direct read + * does not invalidate any contents of the page + * cache + */ } xfs_rw_ilock_demote(ip, XFS_IOLOCK_EXCL); } From prvs=32979cee0f=clm@fb.com Fri Aug 8 10:18: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=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 9EAFB7F73 for ; Fri, 8 Aug 2014 10:18:02 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 7DAE130404E for ; Fri, 8 Aug 2014 08:17:59 -0700 (PDT) X-ASG-Debug-ID: 1407511078-04cb6c3f6e786c0001-NocioJ Received: from mx0a-00082601.pphosted.com (mx0a-00082601.pphosted.com [67.231.145.42]) by cuda.sgi.com with ESMTP id LUukCEMFX3aNZ2Yc for ; Fri, 08 Aug 2014 08:17:58 -0700 (PDT) X-Barracuda-Envelope-From: prvs=32979cee0f=clm@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 (m0004348 [127.0.0.1]) by m0004348.ppops.net (8.14.5/8.14.5) with SMTP id s78FDsBX017041; Fri, 8 Aug 2014 08:17:51 -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=QBt6hboSoUHwKLrqvRZStwiW2wdIG7Ay7jvbqu5NinI=; b=iC0LdbvZJD59lLA9IXomuZIYrpFerc77M/sTQkW4qFRFMM2KSsuDM4P/YG7WshOgM4Gq F9B19XdInMeW7tgMdOVvr7CA1HH0ABI5cmW1Dw6Hey8w/JWATr/7hmGm7ae+6WnFc9ec eWMO8zjPoLZ5xF4W3G8nTpnkvaBnO4b67NU= Received: from mail.thefacebook.com (mailwest.thefacebook.com [173.252.71.148]) by m0004348.ppops.net with ESMTP id 1nmhyt18s9-1 (version=TLSv1/SSLv3 cipher=AES128-SHA bits=128 verify=OK); Fri, 08 Aug 2014 08:17:51 -0700 Received: from [172.23.2.80] (192.168.57.29) by mail.thefacebook.com (192.168.16.22) with Microsoft SMTP Server (TLS) id 14.3.195.1; Fri, 8 Aug 2014 08:17:49 -0700 Message-ID: <53E4EA1C.6030009@fb.com> Date: Fri, 8 Aug 2014 11:17:48 -0400 From: Chris Mason User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Thunderbird/24.6.0 MIME-Version: 1.0 To: , Dave Chinner , Eric Sandeen Subject: Re: [PATCH] xfs: don't zero partial page cache pages during O_DIRECT References: <53E4E03A.7050101@fb.com> X-ASG-Orig-Subj: Re: [PATCH] xfs: don't zero partial page cache pages during O_DIRECT In-Reply-To: <53E4E03A.7050101@fb.com> X-Enigmail-Version: 1.6 Content-Type: text/plain; charset="ISO-8859-1" Content-Transfer-Encoding: 7bit X-Originating-IP: [192.168.57.29] X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10432:5.12.52,1.0.27,0.0.0000 definitions=2014-08-08_04:2014-08-08,2014-08-08,1970-01-01 signatures=0 X-Proofpoint-Spam-Details: rule=fb_default_notspam policy=fb_default score=0 kscore.is_bulkscore=3.36192185201867e-12 kscore.compositescore=0 circleOfTrustscore=0 compositescore=0.997797736942976 urlsuspect_oldscore=0.997797736942976 suspectscore=8 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=9058 rbsscore=0.997797736942976 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-1408080183 X-FB-Internal: deliver X-Barracuda-Connect: mx0a-00082601.pphosted.com[67.231.145.42] X-Barracuda-Start-Time: 1407511078 X-Barracuda-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 08/08/2014 10:35 AM, Chris Mason wrote: > > xfs is using truncate_pagecache_range to invalidate the page cache > during DIO reads. This is different from the other filesystems who only > invalidate pages during DIO writes. > > truncate_pagecache_range is meant to be used when we are freeing the > underlying data structs from disk, so it will zero any partial ranges > in the page. This means a DIO read can zero out part of the page cache > page, and it is possible the page will stay in cache. > > buffered reads will find an up to date page with zeros instead of the > data actually on disk. > > This patch fixes things by leaving the page cache alone during DIO > reads. > > We discovered this when our buffered IO program for distributing > database indexes was finding zero filled blocks. I think writes > are broken too, but I'll leave that for a separate patch because I don't > fully understand what XFS needs to happen during a DIO write. I stuck a cc: stable@vger.kernel.org after my sob, but then inserted a giant test program. Just realized the cc might get lost...sorry I wasn't trying to sneak it in. I've been trying to figure out why this bug doesn't show up in our 3.2 kernels but does show up now. Today xfs does this: truncate_pagecache_range(VFS_I(ip), pos, -1); But in 3.2 we did this: ret = -xfs_flushinval_pages(ip, (iocb->ki_pos & PAGE_CACHE_MASK), -1, FI_REMAPF_LOCKED); Since we've done pos & PAGE_CACHE_MASK, the 3.2 code never sent a partial offset. So it never zero'd partial pages. > > Signed-off-by: Chris Mason > cc: stable@vger.kernel.org > > diff --git a/fs/xfs/xfs_file.c b/fs/xfs/xfs_file.c > index 1f66779..8d25d98 100644 > --- a/fs/xfs/xfs_file.c > +++ b/fs/xfs/xfs_file.c > @@ -295,7 +295,11 @@ xfs_file_read_iter( > xfs_rw_iunlock(ip, XFS_IOLOCK_EXCL); > return ret; > } > - truncate_pagecache_range(VFS_I(ip), pos, -1); > + > + /* we don't remove any pages here. A direct read > + * does not invalidate any contents of the page > + * cache > + */ > } > xfs_rw_ilock_demote(ip, XFS_IOLOCK_EXCL); > } > From prvs=32979cee0f=clm@fb.com Fri Aug 8 11:05: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=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 D79B57F59 for ; Fri, 8 Aug 2014 11:05:04 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 58B09AC004 for ; Fri, 8 Aug 2014 09:05:01 -0700 (PDT) X-ASG-Debug-ID: 1407513897-04cb6c3f6e7b810001-NocioJ Received: from mx0a-00082601.pphosted.com (mx0b-00082601.pphosted.com [67.231.153.30]) by cuda.sgi.com with ESMTP id OOtgEeCKuiWncMlt for ; Fri, 08 Aug 2014 09:04:58 -0700 (PDT) X-Barracuda-Envelope-From: prvs=32979cee0f=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 s78G43AT024676; Fri, 8 Aug 2014 09:04:57 -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 : subject : references : in-reply-to : content-type : content-transfer-encoding; s=facebook; bh=hkfURDh/IGyzlHrhjsWVmtZq9IcA67p9amu+5Y7ZtiU=; b=S0GrJ4uaeEngGlIhFpZvgEFiJPSieD78u4SiffEIG/XTLdNE3X9gmtVk+fONLfTYfiwx c2k1x8HUERI3CWM/ou3BGcl0jPN6q5MNpn4UI6efzTxQD2fW3nx2PVQGPHnab6wMN1RB FE/CMCW5IOO41v0+yj3spr2tYMi6K6bMvpY= Received: from mail.thefacebook.com (mailwest.thefacebook.com [173.252.71.148]) by mx0b-00082601.pphosted.com with ESMTP id 1nmkjcj51e-6 (version=TLSv1/SSLv3 cipher=AES128-SHA bits=128 verify=OK); Fri, 08 Aug 2014 09:04:56 -0700 Received: from [172.23.2.80] (192.168.57.29) by mail.thefacebook.com (192.168.16.21) with Microsoft SMTP Server (TLS) id 14.3.195.1; Fri, 8 Aug 2014 09:04:42 -0700 Message-ID: <53E4F518.9030107@fb.com> Date: Fri, 8 Aug 2014 12:04:40 -0400 From: Chris Mason User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Thunderbird/24.6.0 MIME-Version: 1.0 To: , Dave Chinner , Eric Sandeen Subject: [PATCH RFC] xfs: use invalidate_inode_pages2_range for DIO writes References: <53E4E03A.7050101@fb.com> X-ASG-Orig-Subj: [PATCH RFC] xfs: use invalidate_inode_pages2_range for DIO writes In-Reply-To: <53E4E03A.7050101@fb.com> X-Enigmail-Version: 1.6 Content-Type: text/plain; charset="ISO-8859-1" Content-Transfer-Encoding: 7bit X-Originating-IP: [192.168.57.29] X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10432:5.12.52,1.0.27,0.0.0000 definitions=2014-08-08_04:2014-08-08,2014-08-08,1970-01-01 signatures=0 X-Proofpoint-Spam-Details: rule=fb_default_notspam policy=fb_default score=0 kscore.is_bulkscore=1.0296763441886e-12 kscore.compositescore=0 circleOfTrustscore=0 compositescore=0.997797736942976 urlsuspect_oldscore=0.997797736942976 suspectscore=8 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=11180 rbsscore=0.997797736942976 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-1408080191 X-FB-Internal: deliver X-Barracuda-Connect: mx0b-00082601.pphosted.com[67.231.153.30] X-Barracuda-Start-Time: 1407513898 X-Barracuda-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 is using truncate_pagecache_range to invalidate the page cache during DIO writes. The other filesystems are calling invalidate_inode_pages2_range truncate_pagecache_range is meant to be used when we are freeing the underlying data structs from disk, so it will zero any partial ranges in the page. This means a DIO write can zero out part of the page cache page, and it is possible the page will stay in cache. This one is an RFC because it is untested and because I don't understand how XFS is dealing with pages the truncate was unable to clear away. I'm not able to actually trigger zeros by mixing DIO writes with buffered reads. Signed-off-by: Chris Mason diff --git a/fs/xfs/xfs_file.c b/fs/xfs/xfs_file.c index 8d25d98..c30c112 100644 --- a/fs/xfs/xfs_file.c +++ b/fs/xfs/xfs_file.c @@ -638,7 +638,10 @@ xfs_file_dio_aio_write( pos, -1); if (ret) goto out; - truncate_pagecache_range(VFS_I(ip), pos, -1); + + /* what do we do if we can't invalidate the pages? */ + invalidate_inode_pages2_range(VFS_I(ip)->i_mapping, + pos >> PAGE_CACHE_SHIFT, -1); } /* From bfoster@redhat.com Fri Aug 8 13:49: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 CB9707F6F for ; Fri, 8 Aug 2014 13:49:30 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 4C31DAC002 for ; Fri, 8 Aug 2014 11:49:30 -0700 (PDT) X-ASG-Debug-ID: 1407523768-04cbb0508c09fd0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 1t5QGxvbSbuBCxTy (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 08 Aug 2014 11:49:28 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s78InRe3015114 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK) for ; Fri, 8 Aug 2014 14:49:28 -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 s78InRtX029446 for ; Fri, 8 Aug 2014 14:49:27 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 610C312577D; Fri, 8 Aug 2014 14:49:26 -0400 (EDT) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH 2/2] xfs: hole the inode lock across a full file collapse Date: Fri, 8 Aug 2014 14:49:26 -0400 X-ASG-Orig-Subj: [PATCH 2/2] xfs: hole the inode lock across a full file collapse Message-Id: <1407523766-62233-3-git-send-email-bfoster@redhat.com> In-Reply-To: <1407523766-62233-1-git-send-email-bfoster@redhat.com> References: <1407523766-62233-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: 1407523768 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 A file collapse stress test workload reproduces collapse failures mid-operation due to changes in the inode fork extent count across extent shift cycles. xfs_collapse_file_space() currently calls xfs_bmap_shift_extents() to shift one extent at a time per transaction. The extent index is used to track the next extent to shift after each iteration. A concurrent fsx and fsstress workload reproduces a scenario where the extent count changes during this sequence, causing the 'current_ext' index to become inaccurate and possibly skip shifting an extent. The likely result of this behavior is the subsequent shift attempt will not find a hole in the area of the skipped extent and fail, leaving the file in a partially collapsed state. This occurs because the ilock is released and acquired across each transaction and each individual extent shift. Tracepoint output shows that once the ilock is released after an extent shift, a pending blocking writeback (e.g., sync) can acquire the lock and proceed before the next extent is shifted down. If the writeback converts part of a delayed allocation earlier in the file, for example, it can insert a new extent into the map. Tracing confirms a call to xfs_bmap_add_extent_delay_real() in this particular instance. To prevent this scenario, hold the ilock across the entire extent shift loop in xfs_collapse_file_space(). Signed-off-by: Brian Foster --- fs/xfs/xfs_bmap_util.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/fs/xfs/xfs_bmap_util.c b/fs/xfs/xfs_bmap_util.c index 2f1e30d..96eb97b 100644 --- a/fs/xfs/xfs_bmap_util.c +++ b/fs/xfs/xfs_bmap_util.c @@ -1474,6 +1474,8 @@ xfs_collapse_file_space( if (error) return error; + xfs_ilock(ip, XFS_ILOCK_EXCL); + while (!error && !done) { tp = xfs_trans_alloc(mp, XFS_TRANS_DIOSTRAT); /* @@ -1489,7 +1491,6 @@ xfs_collapse_file_space( 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, @@ -1517,9 +1518,9 @@ xfs_collapse_file_space( goto out; error = xfs_trans_commit(tp, XFS_TRANS_RELEASE_LOG_RES); - xfs_iunlock(ip, XFS_ILOCK_EXCL); } + xfs_iunlock(ip, XFS_ILOCK_EXCL); return error; out: -- 1.8.3.1 From bfoster@redhat.com Fri Aug 8 13:49: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 7212C7F77 for ; Fri, 8 Aug 2014 13:49:37 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 51B74304032 for ; Fri, 8 Aug 2014 11:49:34 -0700 (PDT) X-ASG-Debug-ID: 1407523768-04bdf06ef80a8d0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id KsdcCZlK7IC8N2R8 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 08 Aug 2014 11:49: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 s78InR3o017678 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK) for ; Fri, 8 Aug 2014 14:49:28 -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 s78InRZU019225 for ; Fri, 8 Aug 2014 14:49:27 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 4985B12577C; Fri, 8 Aug 2014 14:49:26 -0400 (EDT) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH 0/2] xfs: for-next file collapse bug fixes Date: Fri, 8 Aug 2014 14:49:24 -0400 X-ASG-Orig-Subj: [PATCH 0/2] xfs: for-next file collapse bug fixes Message-Id: <1407523766-62233-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: 1407523769 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 Hi all, I've seen collapse range fall over during some recent stress testing. I'm running fsx and 16 fsstress threads in parallel to reproduce. Note that the fsstress workload doesn't need to be on the same fs (I suspect a sync() is a trigger). These patches are what has fallen out so far... The first patch stems from the fact that the error caused an fs shutdown that appeared to be unnecessary. I was initially going to skip the inode log on any error, but on closer inspection it seems like we expect to abort/shutdown if something has in fact been changed, so this modifies the code to reduce that shutdown window. The second patch deals with the actual collapse failure by fixing up the locking. Note that I still reproduced at least one collapse failure even with these fixes, so there could be more at play here with the implementation: XFS: Internal error XFS_WANT_CORRUPTED_GOTO at line 5535 of file fs/xfs/libxfs/xfs_bmap.c. Caller xfs_collapse_file_space+0x1af/0x280 [xfs] This took significantly longer to reproduce and I don't yet have a feel for how reproducible it is in general. In the meantime, these two seemed relatively straightforward and incremental... Brian Brian Foster (2): xfs: don't log inode unless extent shift makes extent modifications xfs: hole the inode lock across a full file collapse fs/xfs/libxfs/xfs_bmap.c | 18 ++++++++++-------- fs/xfs/xfs_bmap_util.c | 5 +++-- 2 files changed, 13 insertions(+), 10 deletions(-) -- 1.8.3.1 From bfoster@redhat.com Fri Aug 8 13:49: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 AC6277F77 for ; Fri, 8 Aug 2014 13: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 7DB5A8F8066 for ; Fri, 8 Aug 2014 11:49:34 -0700 (PDT) X-ASG-Debug-ID: 1407523769-04bdf06ef70a8d0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id DBjLlWT11hsGLBzD (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 08 Aug 2014 11:49:29 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx14.intmail.prod.int.phx2.redhat.com (int-mx14.intmail.prod.int.phx2.redhat.com [10.5.11.27]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s78InR9m007657 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK) for ; Fri, 8 Aug 2014 14:49:28 -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 s78InRCF014088 for ; Fri, 8 Aug 2014 14:49:27 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 58AF812346F; Fri, 8 Aug 2014 14:49:26 -0400 (EDT) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH 1/2] xfs: don't log inode unless extent shift makes extent modifications Date: Fri, 8 Aug 2014 14:49:25 -0400 X-ASG-Orig-Subj: [PATCH 1/2] xfs: don't log inode unless extent shift makes extent modifications Message-Id: <1407523766-62233-2-git-send-email-bfoster@redhat.com> In-Reply-To: <1407523766-62233-1-git-send-email-bfoster@redhat.com> References: <1407523766-62233-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: 1407523769 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 The file collapse mechanism uses xfs_bmap_shift_extents() to collapse all subsequent extents down into the specified, previously punched out, region. This function performs some validation, such as whether a sufficient hole exists in the target region of the collapse, then shifts the remaining exents downward. The exit path of the function currently logs the inode unconditionally. While we must log the inode (and abort) if an error occurs and the transaction is dirty, the initial validation paths can generate errors before the transaction has been dirtied. This creates an unnecessary filesystem shutdown scenario, as the caller will cancel a transaction that has been marked dirty. Modify xfs_bmap_shift_extents() to OR the logflags bits as modifications are made to the inode bmap. Only log the inode in the exit path if logflags has been set. This ensures we only have to cancel a dirty transaction if modifications have been made and prevents an unnecessary filesystem shutdown otherwise. Signed-off-by: Brian Foster --- fs/xfs/libxfs/xfs_bmap.c | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/fs/xfs/libxfs/xfs_bmap.c b/fs/xfs/libxfs/xfs_bmap.c index de2d26d..86df952 100644 --- a/fs/xfs/libxfs/xfs_bmap.c +++ b/fs/xfs/libxfs/xfs_bmap.c @@ -5424,7 +5424,7 @@ xfs_bmap_shift_extents( struct xfs_bmap_free *flist, int num_exts) { - struct xfs_btree_cur *cur; + struct xfs_btree_cur *cur = NULL; struct xfs_bmbt_rec_host *gotp; struct xfs_bmbt_irec got; struct xfs_bmbt_irec left; @@ -5435,7 +5435,7 @@ xfs_bmap_shift_extents( int error = 0; int i; int whichfork = XFS_DATA_FORK; - int logflags; + int logflags = 0; xfs_filblks_t blockcount = 0; int total_extents; @@ -5478,16 +5478,11 @@ xfs_bmap_shift_extents( } } - /* 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 = *firstblock; cur->bc_private.b.flist = flist; cur->bc_private.b.flags = 0; - } else { - cur = NULL; - logflags |= XFS_ILOG_DEXT; } /* @@ -5545,11 +5540,14 @@ xfs_bmap_shift_extents( blockcount = left.br_blockcount + got.br_blockcount; xfs_iext_remove(ip, *current_ext, 1, 0); + logflags |= XFS_ILOG_CORE; if (cur) { error = xfs_btree_delete(cur, &i); if (error) goto del_cursor; XFS_WANT_CORRUPTED_GOTO(i == 1, del_cursor); + } else { + logflags |= XFS_ILOG_DEXT; } XFS_IFORK_NEXT_SET(ip, whichfork, XFS_IFORK_NEXTENTS(ip, whichfork) - 1); @@ -5575,6 +5573,7 @@ xfs_bmap_shift_extents( got.br_startoff = startoff; } + logflags |= XFS_ILOG_CORE; if (cur) { error = xfs_bmbt_update(cur, got.br_startoff, got.br_startblock, @@ -5582,6 +5581,8 @@ xfs_bmap_shift_extents( got.br_state); if (error) goto del_cursor; + } else { + logflags |= XFS_ILOG_DEXT; } (*current_ext)++; @@ -5597,6 +5598,7 @@ del_cursor: xfs_btree_del_cursor(cur, error ? XFS_BTREE_ERROR : XFS_BTREE_NOERROR); - xfs_trans_log_inode(tp, ip, logflags); + if (logflags) + xfs_trans_log_inode(tp, ip, logflags); return error; } -- 1.8.3.1 From fanael4@gmail.com Fri Aug 8 14:23: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.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 8EBB57F77 for ; Fri, 8 Aug 2014 14:23:52 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 7CBA530406A for ; Fri, 8 Aug 2014 12:23:49 -0700 (PDT) X-ASG-Debug-ID: 1407525827-04cb6c4c940b420001-NocioJ Received: from mail-qa0-f67.google.com (mail-qa0-f67.google.com [209.85.216.67]) by cuda.sgi.com with ESMTP id CPWxSanClXJ0cmma (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Fri, 08 Aug 2014 12:23:47 -0700 (PDT) X-Barracuda-Envelope-From: fanael4@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.216.67 X-Barracuda-IPDD: Level1 [gmail.com/209.85.216.67] Received: by mail-qa0-f67.google.com with SMTP id v10so1793179qac.10 for ; Fri, 08 Aug 2014 12:23:46 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.216.67] X-Barracuda-IPDD: Level1 [gmail.com/209.85.216.67] 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=G8s1/bdAU66ehRTncXxWIOZJpYn00+nF2eF3zNinmIQ=; b=CEBnaWdfn6nd0vhTaKTIPcqLZyD39LFfxiZESpCwQWyRw25WngRHeQVcqRg52yrtYR oSHSCVAG5uGs5H2xp5qq/XZmLUcuP9ZF6o03noZPfYgPb4suIZqFMod3L6r5daHSaY1r G+vKaD0zvFyUiWDX6iV5LTn8LmAbEX/TzlyB6ihR+0xGaNXDvE0pnDWyhUxBcb0rtEr1 vXt35ArKGIbrfM4maWy2tMGRyji0M2C6EWdwNscRqebmLwqrFNmoXfjb6EcJrYcMc30D bi2qI4zd7W0OXyfhFUGvumCKPFvXAfuz2BS0VhgNZb8PzzvojNuU2ECnsizsmYhYAk0i G/Mg== MIME-Version: 1.0 X-Received: by 10.224.88.198 with SMTP id b6mr22728902qam.97.1407525826548; Fri, 08 Aug 2014 12:23:46 -0700 (PDT) Received: by 10.224.182.200 with HTTP; Fri, 8 Aug 2014 12:23:46 -0700 (PDT) Date: Fri, 8 Aug 2014 21:23:46 +0200 Message-ID: Subject: Verifier fixes backported to stable kernels? From: Fanael Linithien X-ASG-Orig-Subj: Verifier fixes backported to stable kernels? To: xfs@oss.sgi.com Content-Type: text/plain; charset=UTF-8 X-Barracuda-Connect: mail-qa0-f67.google.com[209.85.216.67] X-Barracuda-Start-Time: 1407525827 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.8250 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 Will the verifier fixes get backported to 3.15 and/or 3.16, or do we have to wait for 3.17? I don't want to wait for 3.17. My / has just been eaten by this bug, and I'm reluctant to reinstall until it's fixed. From bfoster@redhat.com Fri Aug 8 15:39: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 E17D17F73 for ; Fri, 8 Aug 2014 15:39:46 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id A3783304059 for ; Fri, 8 Aug 2014 13:39:43 -0700 (PDT) X-ASG-Debug-ID: 1407530381-04bdf06ef7137c0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id H3n6n0N95JEaQbG6 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 08 Aug 2014 13:39: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-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 s78KdUsT030033 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Fri, 8 Aug 2014 16:39:31 -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 s78KdUZY005631; Fri, 8 Aug 2014 16:39:30 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 018AD12577C; Fri, 8 Aug 2014 16:39:28 -0400 (EDT) Date: Fri, 8 Aug 2014 16:39:28 -0400 From: Brian Foster To: Chris Mason Cc: xfs@oss.sgi.com, Dave Chinner , Eric Sandeen Subject: Re: [PATCH] xfs: don't zero partial page cache pages during O_DIRECT Message-ID: <20140808203928.GA64279@bfoster.bfoster> X-ASG-Orig-Subj: Re: [PATCH] xfs: don't zero partial page cache pages during O_DIRECT References: <53E4E03A.7050101@fb.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <53E4E03A.7050101@fb.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: 1407530381 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Fri, Aug 08, 2014 at 10:35:38AM -0400, Chris Mason wrote: > > xfs is using truncate_pagecache_range to invalidate the page cache > during DIO reads. This is different from the other filesystems who only > invalidate pages during DIO writes. > > truncate_pagecache_range is meant to be used when we are freeing the > underlying data structs from disk, so it will zero any partial ranges > in the page. This means a DIO read can zero out part of the page cache > page, and it is possible the page will stay in cache. > > buffered reads will find an up to date page with zeros instead of the > data actually on disk. > > This patch fixes things by leaving the page cache alone during DIO > reads. > > We discovered this when our buffered IO program for distributing > database indexes was finding zero filled blocks. I think writes > are broken too, but I'll leave that for a separate patch because I don't > fully understand what XFS needs to happen during a DIO write. > > Test program: > ... > > Signed-off-by: Chris Mason > cc: stable@vger.kernel.org > > diff --git a/fs/xfs/xfs_file.c b/fs/xfs/xfs_file.c > index 1f66779..8d25d98 100644 > --- a/fs/xfs/xfs_file.c > +++ b/fs/xfs/xfs_file.c > @@ -295,7 +295,11 @@ xfs_file_read_iter( > xfs_rw_iunlock(ip, XFS_IOLOCK_EXCL); > return ret; > } > - truncate_pagecache_range(VFS_I(ip), pos, -1); > + > + /* we don't remove any pages here. A direct read > + * does not invalidate any contents of the page > + * cache > + */ > } That seems sane to me at first glance. I don't know why we would need to completely kill the cache on a dio read. I'm not a fan of the additional comment though. We should probably just fix up the existing comment instead. It also seems like we might be able to kill the XFS_IOLOCK_EXCL dance here if the truncate goes away.. Dave? FWIW, I had to go back to the following commit to see where this originates from: commit 9cea236492ebabb9545564eb039aa0f477a05c96 Author: Nathan Scott Date: Fri Mar 17 17:26:41 2006 +1100 [XFS] Flush and invalidate dirty pages at the start of a direct read also, else we can hit a delalloc-extents-via-direct-io BUG. SGI-PV: 949916 SGI-Modid: xfs-linux-melb:xfs-kern:25483a Signed-off-by: Nathan Scott ... That adds a VOP_FLUSHINVAL_PAGES() call that looks like it's some kind of portability API. I would expect the flush to deal with any delalloc conversion issues vs. the invalidation, so perhaps the invalidation part is a historical artifact of the api. Then again, there's also a straight 'flushpages' call so perhaps there's more to it than that. Brian > xfs_rw_ilock_demote(ip, XFS_IOLOCK_EXCL); > } > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From david@fromorbit.com Fri Aug 8 19: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 (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 620057F89 for ; Fri, 8 Aug 2014 19:36:49 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id D6518AC003 for ; Fri, 8 Aug 2014 17:36:45 -0700 (PDT) X-ASG-Debug-ID: 1407544602-04cbb0508b1ce00001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id 7ihn50gHa5qb8Jbk for ; Fri, 08 Aug 2014 17:36:43 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.131 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AqwHAA1s5VN5LDJ8/2dsb2JhbABagw2BKYInq3ABAQEGpiABgQ4Xd4QDAQEEAScTHCMFCwgDDgoJJQ8FJQMKFxOIOgfGBxcYhWSJUAeDL4EcBZwoi38EiHaDaSsv Received: from ppp121-44-50-124.lns20.syd6.internode.on.net (HELO dastard) ([121.44.50.124]) by ipmail07.adl2.internode.on.net with ESMTP; 09 Aug 2014 10:06:41 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1XFue4-00084i-Ib; Sat, 09 Aug 2014 10:36:28 +1000 Date: Sat, 9 Aug 2014 10:36:28 +1000 From: Dave Chinner To: Chris Mason Cc: xfs@oss.sgi.com, Eric Sandeen Subject: Re: [PATCH] xfs: don't zero partial page cache pages during O_DIRECT Message-ID: <20140809003628.GE26465@dastard> X-ASG-Orig-Subj: Re: [PATCH] xfs: don't zero partial page cache pages during O_DIRECT References: <53E4E03A.7050101@fb.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <53E4E03A.7050101@fb.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: 1407544603 X-Barracuda-URL: http://192.48.176.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.8256 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Fri, Aug 08, 2014 at 10:35:38AM -0400, Chris Mason wrote: > > xfs is using truncate_pagecache_range to invalidate the page cache > during DIO reads. This is different from the other filesystems who only > invalidate pages during DIO writes. Historical oddity thanks to wrapper functions that were kept way longer than they should have been. > truncate_pagecache_range is meant to be used when we are freeing the > underlying data structs from disk, so it will zero any partial ranges > in the page. This means a DIO read can zero out part of the page cache > page, and it is possible the page will stay in cache. commit fb59581 ("xfs: remove xfs_flushinval_pages"). also removed the offset masks that seem to be the issue here. Classic case of a regression caused by removing 10+ year old code that was not clearly documented and didn't appear important. The real question is why isn't fsx and other corner case data integrity tools tripping over this? > buffered reads will find an up to date page with zeros instead of the > data actually on disk. > > This patch fixes things by leaving the page cache alone during DIO > reads. > > We discovered this when our buffered IO program for distributing > database indexes was finding zero filled blocks. I think writes > are broken too, but I'll leave that for a separate patch because I don't > fully understand what XFS needs to happen during a DIO write. > > Test program: Encapsulate it in a generic xfstest, please, and send it to fstests@vger.kernel.org. ... > diff --git a/fs/xfs/xfs_file.c b/fs/xfs/xfs_file.c > index 1f66779..8d25d98 100644 > --- a/fs/xfs/xfs_file.c > +++ b/fs/xfs/xfs_file.c > @@ -295,7 +295,11 @@ xfs_file_read_iter( > xfs_rw_iunlock(ip, XFS_IOLOCK_EXCL); > return ret; > } > - truncate_pagecache_range(VFS_I(ip), pos, -1); > + > + /* we don't remove any pages here. A direct read > + * does not invalidate any contents of the page > + * cache > + */ I guarantee you that there are applications out there that rely on the implicit invalidation behaviour for performance. There are also applications out that rely on it for correctness, too, because the OS is not the only source of data in the filesystem the OS has mounted. Besides, XFS's direct IO semantics are far saner, more predictable and hence are more widely useful than the generic code. As such, we're not going to regress semantics that have been unchanged over 20 years just to match whatever insanity the generic Linux code does right now. Go on, call me a deranged monkey on some serious mind-controlling substances. I don't care. :) I think the fix should probably just be: - truncate_pagecache_range(VFS_I(ip), pos, -1); + invalidate_inode_pages2_range(VFS_I(ip)->i_mapping, + pos >> PAGE_CACHE_SHIFT, -1); Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Fri Aug 8 19:49: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 A06287F8C for ; Fri, 8 Aug 2014 19:49:13 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 49BD4AC003 for ; Fri, 8 Aug 2014 17:49:13 -0700 (PDT) X-ASG-Debug-ID: 1407545350-04bdf06ef71dfb0001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id kGtUTAvS8lbwuKbR for ; Fri, 08 Aug 2014 17:49:10 -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: AqsHAJNv5VN5LDJ8/2dsb2JhbABagw2BKYInq3ABAQEGpiABgQ4Xd4QEAQUnExwjEAgDDgoJJQ8FJQMhE4hBxX4XGIVkiVAHgy+BHAWcKIwDiHaDaSsv Received: from ppp121-44-50-124.lns20.syd6.internode.on.net (HELO dastard) ([121.44.50.124]) by ipmail07.adl2.internode.on.net with ESMTP; 09 Aug 2014 10:19:09 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1XFuq9-000865-7i; Sat, 09 Aug 2014 10:48:57 +1000 Date: Sat, 9 Aug 2014 10:48:57 +1000 From: Dave Chinner To: Chris Mason Cc: xfs@oss.sgi.com, Eric Sandeen Subject: Re: [PATCH RFC] xfs: use invalidate_inode_pages2_range for DIO writes Message-ID: <20140809004857.GF26465@dastard> X-ASG-Orig-Subj: Re: [PATCH RFC] xfs: use invalidate_inode_pages2_range for DIO writes References: <53E4E03A.7050101@fb.com> <53E4F518.9030107@fb.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <53E4F518.9030107@fb.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: 1407545350 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.8256 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Fri, Aug 08, 2014 at 12:04:40PM -0400, Chris Mason wrote: > > xfs is using truncate_pagecache_range to invalidate the page cache > during DIO writes. The other filesystems are calling > invalidate_inode_pages2_range > > truncate_pagecache_range is meant to be used when we are freeing the > underlying data structs from disk, so it will zero any partial ranges > in the page. This means a DIO write can zero out part of the page cache > page, and it is possible the page will stay in cache. > > This one is an RFC because it is untested and because I don't understand > how XFS is dealing with pages the truncate was unable to clear away. > I'm not able to actually trigger zeros by mixing DIO writes with > buffered reads. > > Signed-off-by: Chris Mason > > diff --git a/fs/xfs/xfs_file.c b/fs/xfs/xfs_file.c > index 8d25d98..c30c112 100644 > --- a/fs/xfs/xfs_file.c > +++ b/fs/xfs/xfs_file.c > @@ -638,7 +638,10 @@ xfs_file_dio_aio_write( > pos, -1); > if (ret) > goto out; > - truncate_pagecache_range(VFS_I(ip), pos, -1); > + > + /* what do we do if we can't invalidate the pages? */ > + invalidate_inode_pages2_range(VFS_I(ip)->i_mapping, > + pos >> PAGE_CACHE_SHIFT, -1); I don't think it can on XFS. We're holding the XFS_IOLOCK_EXCL, so no other syscall based IO can dirty pages, all the pages are clean, try_to_free_buffers() will never fail, no-one can run a truncate operation concurently, and so on. The only thing that could cause an issue is a racing mmap page fault dirtying the page. But if you are mixing mmap+direct IO on the same file, you lost a long time ago so that's nothing new at all. So, I'd just do: ret = invalidate_inode_pages2_range(VFS_I(ip)->i_mapping, pos >> PAGE_CACHE_SHIFT, -1); WARN_ON_ONCE(ret); ret = 0; That way we'll find out if it does ever fail, and if it does we can take it from there. Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Fri Aug 8 19:54: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 D8D787F90 for ; Fri, 8 Aug 2014 19:54:23 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id C7AE7304053 for ; Fri, 8 Aug 2014 17:54:20 -0700 (PDT) X-ASG-Debug-ID: 1407545657-04cb6c4c93192f0001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id G629DE1ezTHJLiSc for ; Fri, 08 Aug 2014 17:54:18 -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: AkYLAH9w5VN5LDJ8/2dsb2JhbABagw2BKYInq3ABAQEGphsDAgGBDhd3hAMBAQQBOhwjBQsIAxgJJQ8FJQMhE4g6B8YBFxiFZIlQB4RLBZwolHmDaSsv Received: from ppp121-44-50-124.lns20.syd6.internode.on.net (HELO dastard) ([121.44.50.124]) by ipmail07.adl2.internode.on.net with ESMTP; 09 Aug 2014 10:24:17 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1XFuv6-00086p-Hb; Sat, 09 Aug 2014 10:54:04 +1000 Date: Sat, 9 Aug 2014 10:54:04 +1000 From: Dave Chinner To: Fanael Linithien Cc: xfs@oss.sgi.com Subject: Re: Verifier fixes backported to stable kernels? Message-ID: <20140809005404.GG26465@dastard> X-ASG-Orig-Subj: Re: Verifier fixes backported to stable kernels? 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: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1407545657 X-Barracuda-URL: http://192.48.176.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.8257 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Fri, Aug 08, 2014 at 09:23:46PM +0200, Fanael Linithien wrote: > Will the verifier fixes get backported to 3.15 and/or 3.16, or do we > have to wait for 3.17? What fixes are you talking about? List of commits, please, noting whether the commit already has a "cc: " in it or not. > I don't want to wait for 3.17. My / has just been eaten by this bug, > and I'm reluctant to reinstall until it's fixed. Patch your kernel with the fixes you've identified are necessary, then - it can take some time for fixes to propagate through the stable process.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From prvs=32982dafea=clm@fb.com Fri Aug 8 21:33: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=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 19B177F90 for ; Fri, 8 Aug 2014 21:33:11 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 08364304062 for ; Fri, 8 Aug 2014 19:33:10 -0700 (PDT) X-ASG-Debug-ID: 1407551586-04cbb0508c1fb60001-NocioJ Received: from mx0b-00082601.pphosted.com (mx0b-00082601.pphosted.com [67.231.153.30]) by cuda.sgi.com with ESMTP id H0oOoX8mYvYxihHl for ; Fri, 08 Aug 2014 19:33:07 -0700 (PDT) X-Barracuda-Envelope-From: prvs=32982dafea=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 (m0004077 [127.0.0.1]) by mx0b-00082601.pphosted.com (8.14.5/8.14.5) with SMTP id s792X6hr030706; Fri, 8 Aug 2014 19:33:06 -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=MLDjoQ2ubixNNONj5UnSCe4VtTgdZ238DZExFJp6QGQ=; b=CQ6bYynu7hughsn1n2CwdjJLTRi5nMugZTMCxtNdyCPWZSnEiZUzfL+ZBNsr2Hbs5w9N r/Vk6+A+fpQQyFeD2sNzS5RnnEHYV86QUiHYtZCWLCdEINsFgC7+BFiOmg6ZZ9CMZnsO WBhMyX1JOlNnJqW/Fe0uBRp6GxCmR8AkdAQ= Received: from mail.thefacebook.com (mailwest.thefacebook.com [173.252.71.148]) by mx0b-00082601.pphosted.com with ESMTP id 1nn2vhsqg6-1 (version=TLSv1/SSLv3 cipher=AES128-SHA bits=128 verify=OK); Fri, 08 Aug 2014 19:33:05 -0700 Received: from [172.23.2.80] (192.168.16.4) by mail.thefacebook.com (192.168.16.24) with Microsoft SMTP Server (TLS) id 14.3.195.1; Fri, 8 Aug 2014 19:33:00 -0700 Message-ID: <53E5885A.9090302@fb.com> Date: Fri, 8 Aug 2014 22:32:58 -0400 From: Chris Mason User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Thunderbird/24.6.0 MIME-Version: 1.0 To: Dave Chinner CC: , Eric Sandeen Subject: Re: [PATCH] xfs: don't zero partial page cache pages during O_DIRECT References: <53E4E03A.7050101@fb.com> <20140809003628.GE26465@dastard> X-ASG-Orig-Subj: Re: [PATCH] xfs: don't zero partial page cache pages during O_DIRECT In-Reply-To: <20140809003628.GE26465@dastard> Content-Type: text/plain; charset="ISO-8859-1" Content-Transfer-Encoding: 7bit X-Originating-IP: [192.168.16.4] X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10432:5.12.52,1.0.27,0.0.0000 definitions=2014-08-08_06:2014-08-08,2014-08-08,1970-01-01 signatures=0 X-Proofpoint-Spam-Details: rule=fb_default_notspam policy=fb_default score=0 kscore.is_bulkscore=7.98772165078176e-09 kscore.compositescore=0 circleOfTrustscore=0 compositescore=0.997797736942976 urlsuspect_oldscore=0.997797736942976 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=11180 rbsscore=0.997797736942976 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-1408090031 X-FB-Internal: deliver X-Barracuda-Connect: mx0b-00082601.pphosted.com[67.231.153.30] X-Barracuda-Start-Time: 1407551587 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On 08/08/2014 08:36 PM, Dave Chinner wrote: > On Fri, Aug 08, 2014 at 10:35:38AM -0400, Chris Mason wrote: >> >> xfs is using truncate_pagecache_range to invalidate the page cache >> during DIO reads. This is different from the other filesystems who only >> invalidate pages during DIO writes. > > Historical oddity thanks to wrapper functions that were kept way > longer than they should have been. > >> truncate_pagecache_range is meant to be used when we are freeing the >> underlying data structs from disk, so it will zero any partial ranges >> in the page. This means a DIO read can zero out part of the page cache >> page, and it is possible the page will stay in cache. > > commit fb59581 ("xfs: remove xfs_flushinval_pages"). also removed > the offset masks that seem to be the issue here. Classic case of a > regression caused by removing 10+ year old code that was not clearly > documented and didn't appear important. > > The real question is why isn't fsx and other corner case data > integrity tools tripping over this? > My question too. Maybe not mixing buffered/direct for partial pages? Does fsx only do 4K O_DIRECT? >> buffered reads will find an up to date page with zeros instead of the >> data actually on disk. >> >> This patch fixes things by leaving the page cache alone during DIO >> reads. >> >> We discovered this when our buffered IO program for distributing >> database indexes was finding zero filled blocks. I think writes >> are broken too, but I'll leave that for a separate patch because I don't >> fully understand what XFS needs to happen during a DIO write. >> >> Test program: > > Encapsulate it in a generic xfstest, please, and send it to > fstests@vger.kernel.org. This test prog was looking for races, which we really don't have. It can be much shorter to just look for the improper zeroing from a single thread. I can send it either way. [ ... ] > I guarantee you that there are applications out there that rely on > the implicit invalidation behaviour for performance. There are also > applications out that rely on it for correctness, too, because the > OS is not the only source of data in the filesystem the OS has > mounted. > > Besides, XFS's direct IO semantics are far saner, more predictable > and hence are more widely useful than the generic code. As such, > we're not going to regress semantics that have been unchanged > over 20 years just to match whatever insanity the generic Linux code > does right now. > > Go on, call me a deranged monkey on some serious mind-controlling > substances. I don't care. :) The deranged part is invalidating pos -> -1 on a huge file because of a single 512b direct read. But, if you mix O_DIRECT and buffered you get what the monkeys give you and like it. > > I think the fix should probably just be: > > - truncate_pagecache_range(VFS_I(ip), pos, -1); > + invalidate_inode_pages2_range(VFS_I(ip)->i_mapping, > + pos >> PAGE_CACHE_SHIFT, -1); > I'll retest with this in the morning. The invalidate is basically what we had before with the masking & PAGE_CACHE_SHIFT. -chris From prvs=32982dafea=clm@fb.com Fri Aug 8 21:42: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=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 ED7B27F96 for ; Fri, 8 Aug 2014 21:42:33 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id DC4B98F8066 for ; Fri, 8 Aug 2014 19:42:30 -0700 (PDT) X-ASG-Debug-ID: 1407552149-04cb6c4c951bea0001-NocioJ Received: from mx0a-00082601.pphosted.com (mx0a-00082601.pphosted.com [67.231.145.42]) by cuda.sgi.com with ESMTP id 8cGT9e64toE96I5D for ; Fri, 08 Aug 2014 19:42:29 -0700 (PDT) X-Barracuda-Envelope-From: prvs=32982dafea=clm@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 s792gSf9001021; Fri, 8 Aug 2014 19:42:28 -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=8i4EnNDDLu7wGyRDGuaFTJ1aB/6htg2XGg9Uxz9G1+g=; b=D03PRK935TTkPLo71Exsnxm81j8Iql46La4z3P8FiBxsBLK/Nw18BC/jEtB8wN0aJRcB Ld9yAEvz+HJDBMCgI6juSof09museidKqi02hIfxPkUFYAyWcNVpp9PnAdDmrxt4pvG9 MhJ2BvVWThYkT24Z0phGhIO+31rAzW3pfa4= Received: from mail.thefacebook.com (mailwest.thefacebook.com [173.252.71.148]) by mx0a-00082601.pphosted.com with ESMTP id 1nmx7h9fkw-1 (version=TLSv1/SSLv3 cipher=AES128-SHA bits=128 verify=OK); Fri, 08 Aug 2014 19:42:28 -0700 Received: from [172.23.2.80] (192.168.16.4) by mail.thefacebook.com (192.168.16.21) with Microsoft SMTP Server (TLS) id 14.3.195.1; Fri, 8 Aug 2014 19:42:26 -0700 Message-ID: <53E58A90.7060709@fb.com> Date: Fri, 8 Aug 2014 22:42:24 -0400 From: Chris Mason User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Thunderbird/24.6.0 MIME-Version: 1.0 To: Dave Chinner CC: , Eric Sandeen Subject: Re: [PATCH RFC] xfs: use invalidate_inode_pages2_range for DIO writes References: <53E4E03A.7050101@fb.com> <53E4F518.9030107@fb.com> <20140809004857.GF26465@dastard> X-ASG-Orig-Subj: Re: [PATCH RFC] xfs: use invalidate_inode_pages2_range for DIO writes In-Reply-To: <20140809004857.GF26465@dastard> Content-Type: text/plain; charset="ISO-8859-1" Content-Transfer-Encoding: 7bit X-Originating-IP: [192.168.16.4] X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10432:5.12.52,1.0.27,0.0.0000 definitions=2014-08-08_06:2014-08-08,2014-08-08,1970-01-01 signatures=0 X-Proofpoint-Spam-Details: rule=fb_default_notspam policy=fb_default score=0 kscore.is_bulkscore=7.98772165078176e-09 kscore.compositescore=0 circleOfTrustscore=0 compositescore=0.997797736942976 urlsuspect_oldscore=0.997797736942976 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=11180 rbsscore=0.997797736942976 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-1408090033 X-FB-Internal: deliver X-Barracuda-Connect: mx0a-00082601.pphosted.com[67.231.145.42] X-Barracuda-Start-Time: 1407552149 X-Barracuda-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 08/08/2014 08:48 PM, Dave Chinner wrote: > On Fri, Aug 08, 2014 at 12:04:40PM -0400, Chris Mason wrote: >> >> xfs is using truncate_pagecache_range to invalidate the page cache >> during DIO writes. The other filesystems are calling >> invalidate_inode_pages2_range >> >> truncate_pagecache_range is meant to be used when we are freeing the >> underlying data structs from disk, so it will zero any partial ranges >> in the page. This means a DIO write can zero out part of the page cache >> page, and it is possible the page will stay in cache. >> >> This one is an RFC because it is untested and because I don't understand >> how XFS is dealing with pages the truncate was unable to clear away. >> I'm not able to actually trigger zeros by mixing DIO writes with >> buffered reads. >> >> Signed-off-by: Chris Mason >> >> diff --git a/fs/xfs/xfs_file.c b/fs/xfs/xfs_file.c >> index 8d25d98..c30c112 100644 >> --- a/fs/xfs/xfs_file.c >> +++ b/fs/xfs/xfs_file.c >> @@ -638,7 +638,10 @@ xfs_file_dio_aio_write( >> pos, -1); >> if (ret) >> goto out; >> - truncate_pagecache_range(VFS_I(ip), pos, -1); >> + >> + /* what do we do if we can't invalidate the pages? */ >> + invalidate_inode_pages2_range(VFS_I(ip)->i_mapping, >> + pos >> PAGE_CACHE_SHIFT, -1); > > I don't think it can on XFS. > > We're holding the XFS_IOLOCK_EXCL, so no other syscall based IO can > dirty pages, all the pages are clean, try_to_free_buffers() will > never fail, no-one can run a truncate operation concurently, and > so on. > > So, I'd just do: > > ret = invalidate_inode_pages2_range(VFS_I(ip)->i_mapping, > pos >> PAGE_CACHE_SHIFT, -1); > WARN_ON_ONCE(ret); > ret = 0; > Since pos is page aligned I agree this should be fine. I'll leave that one to you though, since I don't have a great test case for/against it. -chris From sandeen@redhat.com Fri Aug 8 22:19: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 303617F9D for ; Fri, 8 Aug 2014 22:19:16 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 0ADCA304032 for ; Fri, 8 Aug 2014 20:19:15 -0700 (PDT) X-ASG-Debug-ID: 1407554354-04bdf06ef722a90001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id UANNhpXGkf9lVYt8 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 08 Aug 2014 20:19:14 -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 s793JAEq013767 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Fri, 8 Aug 2014 23:19:11 -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 s793J9nW004940 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES128-SHA bits=128 verify=NO); Fri, 8 Aug 2014 23:19:10 -0400 Message-ID: <53E5932E.6@redhat.com> Date: Fri, 08 Aug 2014 22:19:10 -0500 From: Eric Sandeen MIME-Version: 1.0 To: Chris Mason , Dave Chinner CC: xfs@oss.sgi.com Subject: Re: [PATCH] xfs: don't zero partial page cache pages during O_DIRECT References: <53E4E03A.7050101@fb.com> <20140809003628.GE26465@dastard> <53E5885A.9090302@fb.com> X-ASG-Orig-Subj: Re: [PATCH] xfs: don't zero partial page cache pages during O_DIRECT In-Reply-To: <53E5885A.9090302@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.26 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1407554354 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On 8/8/14, 9:32 PM, Chris Mason wrote: >> Go on, call me a deranged monkey on some serious mind-controlling >> substances. I don't care. :) Insider / obscure quote achievement unlocked! > The deranged part is invalidating pos -> -1 on a huge file because of a > single 512b direct read. But, if you mix O_DIRECT and buffered you get > what the monkeys give you and like it. Agreed, I really scratch my head at that one... -Eric From david@fromorbit.com Fri Aug 8 23:17: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 (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 8361F7FA1 for ; Fri, 8 Aug 2014 23:17:14 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 12361AC002 for ; Fri, 8 Aug 2014 21:17:10 -0700 (PDT) X-ASG-Debug-ID: 1407557824-04cb6c4c941ec50001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id HIdGpHR11qaUIW0C for ; Fri, 08 Aug 2014 21:17: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: ApUIABeg5VN5LDJ8PGdsb2JhbABagw1SV4cvpl4BAQEBAQEGnlKHUAGBCxcFAQEBATg2hAMBAQQBJxMcIxAIAw4KCSUPBSUDBwMXE4g6B8U5FxiFZIlQB4RLBZU8hm6BWIopBIxkKy8 Received: from ppp121-44-50-124.lns20.syd6.internode.on.net (HELO dastard) ([121.44.50.124]) by ipmail05.adl6.internode.on.net with ESMTP; 09 Aug 2014 13:47:03 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1XFy5U-0008T8-Ih; Sat, 09 Aug 2014 14:17:00 +1000 Date: Sat, 9 Aug 2014 14:17:00 +1000 From: Dave Chinner To: Chris Mason Cc: xfs@oss.sgi.com, Eric Sandeen Subject: Re: [PATCH] xfs: don't zero partial page cache pages during O_DIRECT Message-ID: <20140809041700.GH26465@dastard> X-ASG-Orig-Subj: Re: [PATCH] xfs: don't zero partial page cache pages during O_DIRECT References: <53E4E03A.7050101@fb.com> <20140809003628.GE26465@dastard> <53E5885A.9090302@fb.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <53E5885A.9090302@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: 1407557824 X-Barracuda-URL: http://192.48.176.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.8260 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Fri, Aug 08, 2014 at 10:32:58PM -0400, Chris Mason wrote: > > > On 08/08/2014 08:36 PM, Dave Chinner wrote: > > On Fri, Aug 08, 2014 at 10:35:38AM -0400, Chris Mason wrote: > >> > >> xfs is using truncate_pagecache_range to invalidate the page cache > >> during DIO reads. This is different from the other filesystems who only > >> invalidate pages during DIO writes. > > > > Historical oddity thanks to wrapper functions that were kept way > > longer than they should have been. > > > >> truncate_pagecache_range is meant to be used when we are freeing the > >> underlying data structs from disk, so it will zero any partial ranges > >> in the page. This means a DIO read can zero out part of the page cache > >> page, and it is possible the page will stay in cache. > > > > commit fb59581 ("xfs: remove xfs_flushinval_pages"). also removed > > the offset masks that seem to be the issue here. Classic case of a > > regression caused by removing 10+ year old code that was not clearly > > documented and didn't appear important. > > > > The real question is why isn't fsx and other corner case data > > integrity tools tripping over this? > > > > My question too. Maybe not mixing buffered/direct for partial pages? > Does fsx only do 4K O_DIRECT? No. xfstests::tests/generic/091 is supposed to cover this exact case. It runs fsx with direct IO aligned to sector boundaries amongst other things. $ ./lsqa.pl tests/generic/091 FS QA Test No. 091 fsx exercising direct IO -- sub-block sizes and concurrent buffered IO $ > > >> buffered reads will find an up to date page with zeros instead of the > >> data actually on disk. > >> > >> This patch fixes things by leaving the page cache alone during DIO > >> reads. > >> > >> We discovered this when our buffered IO program for distributing > >> database indexes was finding zero filled blocks. I think writes > >> are broken too, but I'll leave that for a separate patch because I don't > >> fully understand what XFS needs to happen during a DIO write. > >> > >> Test program: > > > > Encapsulate it in a generic xfstest, please, and send it to > > fstests@vger.kernel.org. > > This test prog was looking for races, which we really don't have. It > can be much shorter to just look for the improper zeroing from a single > thread. I can send it either way. Doesn't matter, as long as we have something that exercises this case.... > > Besides, XFS's direct IO semantics are far saner, more predictable > > and hence are more widely useful than the generic code. As such, > > we're not going to regress semantics that have been unchanged > > over 20 years just to match whatever insanity the generic Linux code > > does right now. > > > > Go on, call me a deranged monkey on some serious mind-controlling > > substances. I don't care. :) > > The deranged part is invalidating pos -> -1 on a huge file because of a > single 512b direct read. But, if you mix O_DIRECT and buffered you get > what the monkeys give you and like it. That's a historical artifact - it predates the range interfaces that Linux has grown over the years, and every time we've changed it to match teh I/O range subtle problems have arisen. THose are usually due to other bugs we knew nothing about at the time, but that's the way it goes... > > I think the fix should probably just be: > > > > - truncate_pagecache_range(VFS_I(ip), pos, -1); > > + invalidate_inode_pages2_range(VFS_I(ip)->i_mapping, > > + pos >> PAGE_CACHE_SHIFT, -1); > > > > I'll retest with this in the morning. The invalidate is basically what > we had before with the masking & PAGE_CACHE_SHIFT. Yup. Thanks for finding these issuesi, Chris! Cheers, Dave. -- Dave Chinner david@fromorbit.com From prvs=32982dafea=clm@fb.com Sat Aug 9 07:57: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=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 EF9357F89 for ; Sat, 9 Aug 2014 07: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 CEC838F8066 for ; Sat, 9 Aug 2014 05:57:07 -0700 (PDT) X-ASG-Debug-ID: 1407589026-04cbb0508c34240001-NocioJ Received: from mx0b-00082601.pphosted.com (mx0b-00082601.pphosted.com [67.231.153.30]) by cuda.sgi.com with ESMTP id 5s7okgtsuR1d979C for ; Sat, 09 Aug 2014 05:57:06 -0700 (PDT) X-Barracuda-Envelope-From: prvs=32982dafea=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 (m0004060 [127.0.0.1]) by mx0b-00082601.pphosted.com (8.14.5/8.14.5) with SMTP id s79CuNON012424; Sat, 9 Aug 2014 05:57: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=message-id : date : from : mime-version : to : subject : references : in-reply-to : content-type : content-transfer-encoding; s=facebook; bh=75hxKwQ5/n3j4J+3XG33qxOyNRPYxFr3huGp0daRMG0=; b=PuSuvS0leWl5zbOnp5uA26V2uRWevpzUyFjtYczWcoDHbvoEj6r8Z4KgR0IxM0wJXtms Q62XFQja2bxL8lHLQghAykoViuzkKoAvvKYcDu5im9KB3hgT1UNY78vyYN4sq9ekx4lb 4/aFJiX+7gwUUTSED0n6yg7oeVNdTRXpGp4= Received: from mail.thefacebook.com (mailwest.thefacebook.com [173.252.71.148]) by mx0b-00082601.pphosted.com with ESMTP id 1nn1nvu4du-1 (version=TLSv1/SSLv3 cipher=AES128-SHA bits=128 verify=OK); Sat, 09 Aug 2014 05:57:03 -0700 Received: from [172.23.2.80] (192.168.16.4) by mail.thefacebook.com (192.168.16.20) with Microsoft SMTP Server (TLS) id 14.3.195.1; Sat, 9 Aug 2014 05:57:01 -0700 Message-ID: <53E61A9C.4020807@fb.com> Date: Sat, 9 Aug 2014 08:57:00 -0400 From: Chris Mason User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Thunderbird/24.6.0 MIME-Version: 1.0 To: , Dave Chinner , Eric Sandeen Subject: [PATCH v2] xfs: don't zero partial page cache pages during O_DIRECT References: <53E4E03A.7050101@fb.com> X-ASG-Orig-Subj: [PATCH v2] xfs: don't zero partial page cache pages during O_DIRECT In-Reply-To: <53E4E03A.7050101@fb.com> Content-Type: text/plain; charset="ISO-8859-1" Content-Transfer-Encoding: 7bit X-Originating-IP: [192.168.16.4] X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10432:5.12.52,1.0.27,0.0.0000 definitions=2014-08-09_01:2014-08-08,2014-08-09,1970-01-01 signatures=0 X-Proofpoint-Spam-Details: rule=fb_default_notspam policy=fb_default score=0 kscore.is_bulkscore=1.07512548863653e-09 kscore.compositescore=0 circleOfTrustscore=0 compositescore=0.997797736942976 urlsuspect_oldscore=0.997797736942976 suspectscore=8 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=11180 rbsscore=0.997797736942976 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-1408090169 X-FB-Internal: deliver X-Barracuda-Connect: mx0b-00082601.pphosted.com[67.231.153.30] X-Barracuda-Start-Time: 1407589026 X-Barracuda-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 is using truncate_pagecache_range to invalidate the page cache during DIO reads. This is different from the other filesystems who only invalidate pages during DIO writes. truncate_pagecache_range is meant to be used when we are freeing the underlying data structs from disk, so it will zero any partial ranges in the page. This means a DIO read can zero out part of the page cache page, and it is possible the page will stay in cache. buffered reads will find an up to date page with zeros instead of the data actually on disk. This patch fixes things by using invalidate_inode_pages2_range instead. It preserves the page cache invalidation, but won't zero any pages. Signed-off-by: Chris Mason cc: stable@vger.kernel.org --- fs/xfs/xfs_file.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/fs/xfs/xfs_file.c b/fs/xfs/xfs_file.c index 1f66779..023d575 100644 --- a/fs/xfs/xfs_file.c +++ b/fs/xfs/xfs_file.c @@ -295,7 +295,8 @@ xfs_file_read_iter( xfs_rw_iunlock(ip, XFS_IOLOCK_EXCL); return ret; } - truncate_pagecache_range(VFS_I(ip), pos, -1); + invalidate_inode_pages2_range(VFS_I(ip)->i_mapping, + pos >> PAGE_CACHE_SHIFT, -1); } xfs_rw_ilock_demote(ip, XFS_IOLOCK_EXCL); } -- 1.8.1 From DY.C@epagri.sc.gov.br Sat Aug 9 09:56: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=LOTS_OF_MONEY autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 5B3D67F4E for ; Sat, 9 Aug 2014 09:56:40 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 35E19304053 for ; Sat, 9 Aug 2014 07:56:37 -0700 (PDT) X-ASG-Debug-ID: 1407596194-04cb6c4c942f440001-NocioJ Received: from smtp.epagri.sc.gov.br (smtp.epagri.sc.gov.br [200.18.9.19]) by cuda.sgi.com with ESMTP id SHEss3Xv3YMQsspn; Sat, 09 Aug 2014 07:56:35 -0700 (PDT) X-Barracuda-Envelope-From: DY.C@epagri.sc.gov.br X-Barracuda-Apparent-Source-IP: 200.18.9.19 Received: from imap.epagri.sc.gov.br (HELO pombo.epagri.sc.gov.br) ([10.20.5.14]) by smtp.epagri.sc.gov.br with ESMTP; 09 Aug 2014 11:51:30 -0300 Received: by pombo.epagri.sc.gov.br (Postfix, from userid 30) id E95002DFF66; Sat, 9 Aug 2014 11:47:51 -0300 (BRT) Received: from 156-208-255-158.static.edis.at (156-208-255-158.static.edis.at [158.255.208.156]) by webmail.epagri.sc.gov.br (Horde Framework) with HTTP; Sat, 09 Aug 2014 11:47:50 -0300 Message-ID: <20140809114750.19381wc79p8vnqfq@webmail.epagri.sc.gov.br> Date: Sat, 09 Aug 2014 11:47:50 -0300 From: "D.Y. CHAN" Reply-To: d12956chan@hk.am To: undisclosed-recipients:; Subject: I hope this =?iso-8859-1?b?ZS1t42ls?= is still in use MIME-Version: 1.0 X-ASG-Orig-Subj: I hope this =?iso-8859-1?b?ZS1t42ls?= is still in use Content-Type: text/plain; charset=ISO-8859-1; DelSp="Yes"; format="flowed" Content-Disposition: inline Content-Transfer-Encoding: quoted-printable User-Agent: Internet Messaging Program (IMP) H3 (4.3.7) X-Barracuda-Connect: smtp.epagri.sc.gov.br[200.18.9.19] X-Barracuda-Start-Time: 1407596194 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.50 X-Barracuda-Spam-Status: No, SCORE=0.50 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC1_TG070 X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.8271 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.50 BSF_SC1_TG070 Custom Rule TG070 Forgiv=E9 me if you don't find interest in this. I have a profitabl=E9 / Confid=E9ntial deal [worth 48M Dollars] to discuss = =20 with you, but I need your permission before I give d=E9tails. Thanks in adv. ---------------------------------------------------------------- This message was sent using IMP, the Internet Messaging Program. From fanael4@gmail.com Sat Aug 9 10:55: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=1.2 required=5.0 tests=FREEMAIL_ENVFROM_END_DIGIT, FREEMAIL_FROM,MISSING_HEADERS,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 E1D3E7F5E for ; Sat, 9 Aug 2014 10:55:27 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id C14468F804B for ; Sat, 9 Aug 2014 08:55:24 -0700 (PDT) X-ASG-Debug-ID: 1407599719-04bdf06ef73d0c0001-NocioJ Received: from mail-qa0-f68.google.com (mail-qa0-f68.google.com [209.85.216.68]) by cuda.sgi.com with ESMTP id zppDK11tjsaV99Fg (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Sat, 09 Aug 2014 08:55:20 -0700 (PDT) X-Barracuda-Envelope-From: fanael4@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.216.68 X-Barracuda-IPDD: Level1 [gmail.com/209.85.216.68] Received: by mail-qa0-f68.google.com with SMTP id dc16so2033777qab.11 for ; Sat, 09 Aug 2014 08:55:19 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.216.68] X-Barracuda-IPDD: Level1 [gmail.com/209.85.216.68] 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:cc :content-type; bh=9X5LfzKbwmg/+XhmsEBL0M8GeEgHYjPkTSLr5FTQ5RU=; b=PXrlUf57DqzcmgfdUrojKrep/vCVy7uvG7eCFJrCrAAaTm33UcnAz8p97MuGAoracZ pojpC9mdY4ftb45Dyb7fsJ4+9dwaCUsl3RVeqqFlMY+1wDZ+eIyXeOePpFpEmhoymD4I IdvEQ+/caBAHTk7CTm4ZepnVRXwVIvSybukdnyPjMyvsSi9LgZrJ/5bKtRIxQU03VWW7 7LGfzqC08josnvgbSKl259XhBRCENgiNDLQ/m0lbUBMQTbkmaenT0o0XarOp/AG8jy7q 5cKnIECupHQRnBoMAYMguU9fjQDU0aI0/R8BzbQ/x9itMQ4qSw9aDTeqf4+ohpcH1Z5R DPeQ== MIME-Version: 1.0 X-Received: by 10.140.25.226 with SMTP id 89mr33093325qgt.62.1407599719257; Sat, 09 Aug 2014 08:55:19 -0700 (PDT) Received: by 10.224.182.200 with HTTP; Sat, 9 Aug 2014 08:55:19 -0700 (PDT) In-Reply-To: References: <20140809005404.GG26465@dastard> Date: Sat, 9 Aug 2014 17:55:19 +0200 Message-ID: Subject: Re: Verifier fixes backported to stable kernels? From: Fanael Linithien X-ASG-Orig-Subj: Re: Verifier fixes backported to stable kernels? Cc: xfs@oss.sgi.com Content-Type: text/plain; charset=UTF-8 X-Barracuda-Connect: mail-qa0-f68.google.com[209.85.216.68] X-Barracuda-Start-Time: 1407599719 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: 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=DKIM_SIGNED, DKIM_VERIFIED, MISSING_HEADERS X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.8272 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 1.21 MISSING_HEADERS Missing To: header 2014-08-09 2:54 GMT+02:00 Dave Chinner : > What fixes are you talking about? List of commits, please, noting > whether the commit already has a "cc: " in > it or not. These are the commits: 400b9d88757c0bfbdfa97014e090ec40a31c1282 67dc288c21064b31a98a53dc64f6b9714b819fd6 (this is the only one with the cc) 5fd364fee81a7888af806e42ed8a91c845894f2d ad3714b82c631a34724da09a7daa53afcab952fa > Patch your kernel with the fixes you've identified are necessary, > then - it can take some time for fixes to propagate through the > stable process.... This is what I'm trying to avoid, out of sheer laziness. I suppose I'm going to have to do that if I want to have a working linux, though. From sandeen@sandeen.net Sat Aug 9 13:58: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=MIME_QP_LONG_LINE autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id B30B47F81 for ; Sat, 9 Aug 2014 13:58:53 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 4FF65AC001 for ; Sat, 9 Aug 2014 11:58:50 -0700 (PDT) X-ASG-Debug-ID: 1407610727-04bdf06ef9426d0001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id wgveUCamjTHWMVXX for ; Sat, 09 Aug 2014 11:58:47 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from [33.162.114.186] (unknown [172.56.33.209]) (using TLSv1 with cipher AES128-SHA (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 6DD8A63D71ED; Sat, 9 Aug 2014 13:58:46 -0500 (CDT) References: <20140809005404.GG26465@dastard> Mime-Version: 1.0 (1.0) In-Reply-To: Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: quoted-printable Message-Id: <8864B382-ABD4-484E-A1D1-C2CB96F46810@sandeen.net> Cc: "xfs@oss.sgi.com" X-Mailer: iPhone Mail (11D257) From: Eric Sandeen Subject: Re: Verifier fixes backported to stable kernels? Date: Sat, 9 Aug 2014 11:58:42 -0700 X-ASG-Orig-Subj: Re: Verifier fixes backported to stable kernels? To: Fanael Linithien X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1407610727 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.82 X-Barracuda-Spam-Status: No, SCORE=0.82 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=MIME_QP_LONG_LINE, MIME_QP_LONG_LINE_2 X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.8275 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 MIME_QP_LONG_LINE RAW: Quoted-printable line longer than 76 chars 0.82 MIME_QP_LONG_LINE_2 RAW: Quoted-printable line longer than 76 chars On Aug 9, 2014, at 8:55 AM, Fanael Linithien wrote: >=20 > 2014-08-09 2:54 GMT+02:00 Dave Chinner : >> What fixes are you talking about? List of commits, please, noting >> whether the commit already has a "cc: " in >> it or not. >=20 > These are the commits: >=20 > 400b9d88757c0bfbdfa97014e090ec40a31c1282 > 67dc288c21064b31a98a53dc64f6b9714b819fd6 (this is the only one with the cc= ) > 5fd364fee81a7888af806e42ed8a91c845894f2d > ad3714b82c631a34724da09a7daa53afcab952fa >=20 >> Patch your kernel with the fixes you've identified are necessary, >> then - it can take some time for fixes to propagate through the >> stable process.... >=20 > This is what I'm trying to avoid, out of sheer laziness. I suppose I'm > going to have to do that if I want to have a working linux, though. >=20 In what way did this "eat" your root fs? What happened? Also, are you usin= g a CRC-enabled filesystem? -Eric= From root@krios.tbi.univie.ac.at Sat Aug 9 23:25: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 (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id DBE307F80 for ; Sat, 9 Aug 2014 23:25:11 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id BAA3D304043 for ; Sat, 9 Aug 2014 21:25:08 -0700 (PDT) X-ASG-Debug-ID: 1407644705-04bdf06ef64d350001-NocioJ Received: from krios.tbi.univie.ac.at (krios.tbi.univie.ac.at [131.130.44.60]) by cuda.sgi.com with ESMTP id jIPG8a4Q3h6lLFM9 for ; Sat, 09 Aug 2014 21:25:06 -0700 (PDT) X-Barracuda-Envelope-From: root@krios.tbi.univie.ac.at X-Barracuda-Apparent-Source-IP: 131.130.44.60 Received: by krios.tbi.univie.ac.at (Postfix) id B7AF05EC03; Sun, 10 Aug 2014 06:25:02 +0200 (CEST) Delivered-To: root@krios.tbi.univie.ac.at Received: by krios.tbi.univie.ac.at (Postfix, from userid 0) id A68A35F484; Sun, 10 Aug 2014 06:25:02 +0200 (CEST) From: root@krios.tbi.univie.ac.at (Cron Daemon) To: root@krios.tbi.univie.ac.at Subject: Cron test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily ) Content-Type: text/plain; charset=UTF-8 X-ASG-Orig-Subj: Cron test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily ) X-Cron-Env: X-Cron-Env: X-Cron-Env: X-Cron-Env: Message-Id: <20140810042502.A68A35F484@krios.tbi.univie.ac.at> Date: Sun, 10 Aug 2014 06:25:02 +0200 (CEST) X-Barracuda-Connect: krios.tbi.univie.ac.at[131.130.44.60] X-Barracuda-Start-Time: 1407644706 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.70 X-Barracuda-Spam-Status: No, SCORE=0.70 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, BSF_SC0_SA_TO_FROM_ADDR_MATCH, PR0N_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.8284 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) 0.50 BSF_SC0_SA_TO_FROM_ADDR_MATCH Sender Address Matches Recipient Address /etc/cron.daily/logrotate: error: error opening /home/git/gitlab/log/application.log: Permission denied error: error opening /home/git/gitlab/log/githost.log: Permission denied error: error opening /home/git/gitlab/log/production.log: Permission denied error: error opening /home/git/gitlab/log/satellites.log: Permission denied error: error opening /home/git/gitlab/log/sidekiq.log: Permission denied error: error opening /home/git/gitlab/log/unicorn.stderr.log: Permission denied error: error opening /home/git/gitlab/log/unicorn.stdout.log: Permission denied error: error opening /home/git/gitlab-shell/gitlab-shell.log: Permission denied run-parts: /etc/cron.daily/logrotate exited with return code 1 From alex@zadarastorage.com Sun Aug 10 07:20: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 E26F57F63 for ; Sun, 10 Aug 2014 07:20:58 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 533BAAC004 for ; Sun, 10 Aug 2014 05:20:55 -0700 (PDT) X-ASG-Debug-ID: 1407673251-04cb6c4c964b390001-NocioJ Received: from mail-wg0-f41.google.com (mail-wg0-f41.google.com [74.125.82.41]) by cuda.sgi.com with ESMTP id 9svSaIahKqo5FLfh (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Sun, 10 Aug 2014 05:20:52 -0700 (PDT) X-Barracuda-Envelope-From: alex@zadarastorage.com X-Barracuda-Apparent-Source-IP: 74.125.82.41 Received: by mail-wg0-f41.google.com with SMTP id z12so7513655wgg.24 for ; Sun, 10 Aug 2014 05:20:51 -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=fi+vuMePr46cgwPkrmlSYc4E7VL68sGVQtEFNVG71EI=; b=Fxf4H62vQNBRzG58ysV8psELtpzoFx1jQsmpaNBe4XNL0S16P6IIWJ36e9pMyFKezg +mR08R9O6jVxZxDBKvT44OjEEQot2QJxTy5d8kv9BdMMZlmgZm9W7YZikLsG7MRLn/vY xRKkXH9xQocjZJJmi6K+2mCnlpEojeDmRm4QToVoHNuvianZt3If8EOBPCwTQKMQq5gM P/xn3DcM80M8IO2RDVe9gkWCBJ25Br0xLl08fwVVxHzb2hPdzd7HqHyiT7rr+PGtacpk 94XAbBVHV2Tgn7tZEemg+b6NRFS53dPdt1XLGwmh/2VlRt9hFjh3Vu+dv8z7NlQNy+Ts BM+Q== X-Gm-Message-State: ALoCoQlA6VDtJM9a/M9Ie0WoQcDBHja+bNsX97lrfc/boolykRAuWDF/Mf+do4OEkwhnjfG934DJ MIME-Version: 1.0 X-Received: by 10.194.8.35 with SMTP id o3mr45086108wja.3.1407673250990; Sun, 10 Aug 2014 05:20:50 -0700 (PDT) Received: by 10.194.15.232 with HTTP; Sun, 10 Aug 2014 05:20:50 -0700 (PDT) In-Reply-To: <20140806152042.GB39990@bfoster.bfoster> References: <20140113204314.GJ3469@dastard> <20140115014503.GQ3469@dastard> <20140119231745.GF18112@dastard> <4B2A412C75324EE9880358513C069476@alyakaslap> <9D3CBECB663B4A77B7EF74B67973310A@alyakaslap> <20140804230721.GA20518@dastard> <20140806152042.GB39990@bfoster.bfoster> Date: Sun, 10 Aug 2014 15:20:50 +0300 Message-ID: Subject: Re: use-after-free on log replay failure From: Alex Lyakas X-ASG-Orig-Subj: Re: use-after-free on log replay failure To: Brian Foster Cc: Dave Chinner , xfs@oss.sgi.com Content-Type: text/plain; charset=UTF-8 X-Barracuda-Connect: mail-wg0-f41.google.com[74.125.82.41] X-Barracuda-Start-Time: 1407673252 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=MARKETING_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.8292 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words Hi Brian, On Wed, Aug 6, 2014 at 6:20 PM, Brian Foster wrote: > On Wed, Aug 06, 2014 at 03:52:03PM +0300, Alex Lyakas wrote: >> Hello Dave and Brian, >> >> Dave, I tried the patch you suggested, but it does not fix the issue. I did >> some further digging, and it appears that _xfs_buf_ioend(schedule=1) can be >> called from xfs_buf_iorequest(), which the patch fixes, but also from >> xfs_buf_bio_end_io() which is my case. I am reproducing the issue pretty >> easily. The flow that I have is like this: >> - xlog_recover() calls xlog_find_tail(). This works alright. > > What's the purpose of a sleep here? > >> - Now I add a small sleep before calling xlog_do_recover(), and meanwhile I >> instruct my block device to return ENOSPC for any WRITE from now on. >> >> What seems to happen is that several WRITE bios are submitted and they all >> fail. When they do, they reach xfs_buf_ioend() through a stack like this: >> >> Aug 6 15:23:07 dev kernel: [ 304.410528] [56]xfs*[xfs_buf_ioend:1056] >> XFS(dm-19): Scheduling xfs_buf_iodone_work on error >> Aug 6 15:23:07 dev kernel: [ 304.410534] Pid: 56, comm: kworker/u:1 >> Tainted: G W O 3.8.13-557-generic #1382000791 >> Aug 6 15:23:07 dev kernel: [ 304.410537] Call Trace: >> Aug 6 15:23:07 dev kernel: [ 304.410587] [] >> xfs_buf_ioend+0x1a4/0x1b0 [xfs] >> Aug 6 15:23:07 dev kernel: [ 304.410621] [] >> _xfs_buf_ioend+0x25/0x30 [xfs] >> Aug 6 15:23:07 dev kernel: [ 304.410643] [] >> xfs_buf_bio_end_io+0x3d/0x50 [xfs] >> Aug 6 15:23:07 dev kernel: [ 304.410652] [] >> bio_endio+0x1d/0x40 >> ... >> >> At this point, they are scheduled to run xlog_recover_iodone through >> xfslogd_workqueue. >> The first callback that gets called, calls xfs_do_force_shutdown in stack >> like this: >> >> Aug 6 15:23:07 dev kernel: [ 304.411791] XFS (dm-19): metadata I/O error: >> block 0x3780001 ("xlog_recover_iodone") error 28 numblks 1 >> Aug 6 15:23:07 dev kernel: [ 304.413493] XFS (dm-19): >> xfs_do_force_shutdown(0x1) called from line 377 of file >> /mnt/work/alex/xfs/fs/xfs/xfs_log_recover.c. Return address = >> 0xffffffffa0526848 >> Aug 6 15:23:07 dev kernel: [ 304.413837] [] >> xfs_do_force_shutdown+0x40/0x180 [xfs] >> Aug 6 15:23:07 dev kernel: [ 304.413870] [] ? >> xlog_recover_iodone+0x48/0x70 [xfs] >> Aug 6 15:23:07 dev kernel: [ 304.413902] [] >> xlog_recover_iodone+0x48/0x70 [xfs] >> Aug 6 15:23:07 dev kernel: [ 304.413923] [] >> xfs_buf_iodone_work+0x4d/0xa0 [xfs] >> Aug 6 15:23:07 dev kernel: [ 304.413930] [] >> process_one_work+0x141/0x4a0 >> Aug 6 15:23:07 dev kernel: [ 304.413937] [] >> worker_thread+0x168/0x410 >> Aug 6 15:23:07 dev kernel: [ 304.413943] [] ? >> manage_workers+0x120/0x120 >> Aug 6 15:23:07 dev kernel: [ 304.413949] [] >> kthread+0xc0/0xd0 >> Aug 6 15:23:07 dev kernel: [ 304.413954] [] ? >> flush_kthread_worker+0xb0/0xb0 >> Aug 6 15:23:07 dev kernel: [ 304.413976] [] >> ret_from_fork+0x7c/0xb0 >> Aug 6 15:23:07 dev kernel: [ 304.413986] [] ? >> flush_kthread_worker+0xb0/0xb0 >> Aug 6 15:23:07 dev kernel: [ 304.413990] ---[ end trace 988d698520e1fa81 >> ]--- >> Aug 6 15:23:07 dev kernel: [ 304.414012] XFS (dm-19): I/O Error Detected. >> Shutting down filesystem >> Aug 6 15:23:07 dev kernel: [ 304.415936] XFS (dm-19): Please umount the >> filesystem and rectify the problem(s) >> >> But the rest of the callbacks also arrive: >> Aug 6 15:23:07 dev kernel: [ 304.417812] XFS (dm-19): metadata I/O error: >> block 0x3780002 ("xlog_recover_iodone") error 28 numblks 1 >> Aug 6 15:23:07 dev kernel: [ 304.420420] XFS (dm-19): >> xfs_do_force_shutdown(0x1) called from line 377 of file >> /mnt/work/alex/xfs/fs/xfs/xfs_log_recover.c. Return address = >> 0xffffffffa0526848 >> Aug 6 15:23:07 dev kernel: [ 304.420427] XFS (dm-19): metadata I/O error: >> block 0x3780008 ("xlog_recover_iodone") error 28 numblks 8 >> Aug 6 15:23:07 dev kernel: [ 304.422708] XFS (dm-19): >> xfs_do_force_shutdown(0x1) called from line 377 of file >> /mnt/work/alex/xfs/fs/xfs/xfs_log_recover.c. Return address = >> 0xffffffffa0526848 >> Aug 6 15:23:07 dev kernel: [ 304.422738] XFS (dm-19): metadata I/O error: >> block 0x3780010 ("xlog_recover_iodone") error 28 numblks 8 >> >> The mount sequence fails and goes back to the caller: >> Aug 6 15:23:07 dev kernel: [ 304.423438] XFS (dm-19): log mount/recovery >> failed: error 28 >> Aug 6 15:23:07 dev kernel: [ 304.423757] XFS (dm-19): log mount failed >> >> But there are still additional callbacks to deliver, which the mount >> sequence did not wait for! >> Aug 6 15:23:07 dev kernel: [ 304.425717] XFS ( @dR): >> xfs_do_force_shutdown(0x1) called from line 377 of file >> /mnt/work/alex/xfs/fs/xfs/xfs_log_recover.c. Return address = >> 0xffffffffa0526848 >> Aug 6 15:23:07 dev kernel: [ 304.425723] XFS ( @dR): metadata I/O error: >> block 0x3780018 ("xlog_recover_iodone") error 28 numblks 8 >> Aug 6 15:23:07 dev kernel: [ 304.428239] XFS ( @dR): >> xfs_do_force_shutdown(0x1) called from line 377 of file >> /mnt/work/alex/xfs/fs/xfs/xfs_log_recover.c. Return address = >> 0xffffffffa0526848 >> Aug 6 15:23:07 dev kernel: [ 304.428246] XFS ( @dR): metadata I/O error: >> block 0x37800a0 ("xlog_recover_iodone") error 28 numblks 16 >> >> Notice the junk that they are printing! Naturally, because xfs_mount >> structure has been kfreed. >> >> Finally the kernel crashes (instead of printing junk), because the xfs_mount >> structure is gone, but the callback tries to access it (printing the name): >> >> Aug 6 15:23:07 dev kernel: [ 304.430796] general protection fault: 0000 >> [#1] SMP >> Aug 6 15:23:07 dev kernel: [ 304.432035] Modules linked in: xfrm_user >> xfrm4_tunnel tunnel4 ipcomp xfrm_ipcomp esp4 ah4 iscsi_scst_tcp(O) >> scst_vdisk(O) scst(O) dm_zcache(O) dm_btrfs(O) xfs(O) btrfs(O) libcrc32c >> raid456(O) async_pq async_xor xor async_memcpy async_raid6_recov raid6_pq >> async_tx raid1(O) md_mod deflate zlib_deflate ctr twofish_generic >> twofish_x86_64_3way glue_helper lrw xts gf128mul twofish_x86_64 >> twofish_common camellia_generic serpent_generic blowfish_generic >> blowfish_x86_64 blowfish_common cast5_generic cast_common des_generic xcbc >> rmd160 sha512_generic crypto_null af_key xfrm_algo dm_round_robin kvm vfat >> fat ppdev psmouse microcode nfsd nfs_acl dm_multipath(O) serio_raw >> parport_pc nfsv4 dm_iostat(O) mac_hid i2c_piix4 auth_rpcgss nfs fscache >> lockd sunrpc lp parport floppy >> Aug 6 15:23:07 dev kernel: [ 304.432035] CPU 1 >> Aug 6 15:23:07 dev kernel: [ 304.432035] Pid: 133, comm: kworker/1:1H >> Tainted: G W O 3.8.13-557-generic #1382000791 Bochs Bochs >> Aug 6 15:23:07 dev kernel: [ 304.432035] RIP: 0010:[] >> [] strnlen+0xb/0x30 >> Aug 6 15:23:07 dev kernel: [ 304.432035] RSP: 0018:ffff880035461b08 >> EFLAGS: 00010086 >> Aug 6 15:23:07 dev kernel: [ 304.432035] RAX: 0000000000000000 RBX: >> ffffffff81e6a4e7 RCX: 0000000000000000 >> Aug 6 15:23:07 dev kernel: [ 304.432035] RDX: e4e8390a265c0000 RSI: >> ffffffffffffffff RDI: e4e8390a265c0000 >> Aug 6 15:23:07 dev kernel: [ 304.432035] RBP: ffff880035461b08 R08: >> 000000000000ffff R09: 000000000000ffff >> Aug 6 15:23:07 dev kernel: [ 304.432035] R10: 0000000000000000 R11: >> 00000000000004cd R12: e4e8390a265c0000 >> Aug 6 15:23:07 dev kernel: [ 304.432035] R13: ffffffff81e6a8c0 R14: >> 0000000000000000 R15: 000000000000ffff >> Aug 6 15:23:07 dev kernel: [ 304.432035] FS: 0000000000000000(0000) >> GS:ffff88007fc80000(0000) knlGS:0000000000000000 >> Aug 6 15:23:07 dev kernel: [ 304.432035] CS: 0010 DS: 0000 ES: 0000 CR0: >> 000000008005003b >> Aug 6 15:23:07 dev kernel: [ 304.432035] CR2: 00007fc902ffbfd8 CR3: >> 000000007702a000 CR4: 00000000000006e0 >> Aug 6 15:23:07 dev kernel: [ 304.432035] DR0: 0000000000000000 DR1: >> 0000000000000000 DR2: 0000000000000000 >> Aug 6 15:23:07 dev kernel: [ 304.432035] DR3: 0000000000000000 DR6: >> 00000000ffff0ff0 DR7: 0000000000000400 >> Aug 6 15:23:07 dev kernel: [ 304.432035] Process kworker/1:1H (pid: 133, >> threadinfo ffff880035460000, task ffff880035412e00) >> Aug 6 15:23:07 dev kernel: [ 304.432035] Stack: >> Aug 6 15:23:07 dev kernel: [ 304.432035] ffff880035461b48 >> ffffffff8133dd5e 0000000000000000 ffffffff81e6a4e7 >> Aug 6 15:23:07 dev kernel: [ 304.432035] ffffffffa0566cba >> ffff880035461c80 ffffffffa0566cba ffffffff81e6a8c0 >> Aug 6 15:23:07 dev kernel: [ 304.432035] ffff880035461bc8 >> ffffffff8133ef59 ffff880035461bc8 ffffffff81c84040 >> Aug 6 15:23:07 dev kernel: [ 304.432035] Call Trace: >> Aug 6 15:23:07 dev kernel: [ 304.432035] [] >> string.isra.4+0x3e/0xd0 >> Aug 6 15:23:07 dev kernel: [ 304.432035] [] >> vsnprintf+0x219/0x640 >> Aug 6 15:23:07 dev kernel: [ 304.432035] [] >> vscnprintf+0x11/0x30 >> Aug 6 15:23:07 dev kernel: [ 304.432035] [] >> vprintk_emit+0xc1/0x490 >> Aug 6 15:23:07 dev kernel: [ 304.432035] [] ? >> vprintk_emit+0x170/0x490 >> Aug 6 15:23:07 dev kernel: [ 304.432035] [] >> printk+0x61/0x63 >> Aug 6 15:23:07 dev kernel: [ 304.432035] [] >> __xfs_printk+0x31/0x50 [xfs] >> Aug 6 15:23:07 dev kernel: [ 304.432035] [] >> xfs_notice+0x53/0x60 [xfs] >> Aug 6 15:23:07 dev kernel: [ 304.432035] [] >> xfs_do_force_shutdown+0xf5/0x180 [xfs] >> Aug 6 15:23:07 dev kernel: [ 304.432035] [] ? >> xlog_recover_iodone+0x48/0x70 [xfs] >> Aug 6 15:23:07 dev kernel: [ 304.432035] [] >> xlog_recover_iodone+0x48/0x70 [xfs] >> Aug 6 15:23:07 dev kernel: [ 304.432035] [] >> xfs_buf_iodone_work+0x4d/0xa0 [xfs] >> Aug 6 15:23:07 dev kernel: [ 304.432035] [] >> process_one_work+0x141/0x4a0 >> Aug 6 15:23:07 dev kernel: [ 304.432035] [] >> worker_thread+0x168/0x410 >> Aug 6 15:23:07 dev kernel: [ 304.432035] [] ? >> manage_workers+0x120/0x120 >> Aug 6 15:23:07 dev kernel: [ 304.432035] [] >> kthread+0xc0/0xd0 >> Aug 6 15:23:07 dev kernel: [ 304.432035] [] ? >> flush_kthread_worker+0xb0/0xb0 >> Aug 6 15:23:07 dev kernel: [ 304.432035] [] >> ret_from_fork+0x7c/0xb0 >> Aug 6 15:23:07 dev kernel: [ 304.432035] [] ? >> flush_kthread_worker+0xb0/0xb0 >> Aug 6 15:23:07 dev kernel: [ 304.432035] Code: 31 c0 80 3f 00 55 48 89 e5 >> 74 11 48 89 f8 66 90 48 83 c0 01 80 38 00 75 f7 48 29 f8 5d c3 66 90 55 31 >> c0 48 85 f6 48 89 e5 74 23 <80> 3f 00 74 1e 48 89 f8 eb 0c 0f 1f 00 48 83 ee >> 01 80 38 00 74 >> Aug 6 15:23:07 dev kernel: [ 304.432035] RIP [] >> strnlen+0xb/0x30 >> Aug 6 15:23:07 dev kernel: [ 304.432035] RSP >> >> >> So previously you said: "So, something is corrupting memory and stamping all >> over the XFS structures." and also "given you have a bunch of out of tree >> modules loaded (and some which are experiemental) suggests that you have a >> problem with your storage...". >> >> But I believe, my analysis shows that during the mount sequence XFS does not >> wait properly for all the bios to complete, before failing the mount >> sequence back to the caller. >> > > As an experiment, what about the following? Compile tested only and not > safe for general use. > > What might help more is to see if you can create a reproducer on a > recent, clean kernel. Perhaps a metadump of your reproducer fs combined > with whatever block device ENOSPC hack you're using would do it. > > Brian > > ---8<--- > > diff --git a/fs/xfs/xfs_buf.c b/fs/xfs/xfs_buf.c > index cd7b8ca..fbcf524 100644 > --- a/fs/xfs/xfs_buf.c > +++ b/fs/xfs/xfs_buf.c > @@ -1409,19 +1409,27 @@ xfs_buf_iorequest( > * case nothing will ever complete. It returns the I/O error code, if any, or > * 0 if there was no error. > */ > -int > -xfs_buf_iowait( > - xfs_buf_t *bp) > +static int > +__xfs_buf_iowait( > + struct xfs_buf *bp, > + bool skip_error) > { > trace_xfs_buf_iowait(bp, _RET_IP_); > > - if (!bp->b_error) > + if (skip_error || !bp->b_error) > wait_for_completion(&bp->b_iowait); > > trace_xfs_buf_iowait_done(bp, _RET_IP_); > return bp->b_error; > } > > +int > +xfs_buf_iowait( > + struct xfs_buf *bp) > +{ > + return __xfs_buf_iowait(bp, false); > +} > + > xfs_caddr_t > xfs_buf_offset( > xfs_buf_t *bp, > @@ -1866,7 +1874,7 @@ xfs_buf_delwri_submit( > bp = list_first_entry(&io_list, struct xfs_buf, b_list); > > list_del_init(&bp->b_list); > - error2 = xfs_buf_iowait(bp); > + error2 = __xfs_buf_iowait(bp, true); > xfs_buf_relse(bp); > if (!error) > error = error2; > > --- I think that this patch fixes the problem. I tried reproducing it like 30 times, and it doesn't happen with this patch. Dropping this patch reproduces the problem within 1 or 2 tries. Thanks! What are next steps? How to make it "safe for general use"? Thanks, Alex. > >> Thanks, >> Alex. >> >> >> >> -----Original Message----- From: Dave Chinner >> Sent: 05 August, 2014 2:07 AM >> To: Alex Lyakas >> Cc: xfs@oss.sgi.com >> Subject: Re: use-after-free on log replay failure >> >> On Mon, Aug 04, 2014 at 02:00:05PM +0300, Alex Lyakas wrote: >> >Greetings, >> > >> >we had a log replay failure due to some errors that the underlying >> >block device returned: >> >[49133.801406] XFS (dm-95): metadata I/O error: block 0x270e8c180 >> >("xlog_recover_iodone") error 28 numblks 16 >> >[49133.802495] XFS (dm-95): log mount/recovery failed: error 28 >> >[49133.802644] XFS (dm-95): log mount failed >> >> #define ENOSPC 28 /* No space left on device */ >> >> You're getting an ENOSPC as a metadata IO error during log recovery? >> Thin provisioning problem, perhaps, and the error is occurring on >> submission rather than completion? If so: >> >> 8d6c121 xfs: fix buffer use after free on IO error >> >> Cheers, >> >> Dave. >> -- >> Dave Chinner >> david@fromorbit.com >> From 36pLnUw0JA1MGvJE38yF81MMN17v36.x97I0D9DD.D13.x97@trix.bounces.google.com Sun Aug 10 10:42:40 2014 Return-Path: <36pLnUw0JA1MGvJE38yF81MMN17v36.x97I0D9DD.D13.x97@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.5 required=5.0 tests=FREEMAIL_FROM,HTML_MESSAGE, SUBJ_ALL_CAPS,T_DKIM_INVALID autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 575AF7F63 for ; Sun, 10 Aug 2014 10:42:40 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 02CEAAC005 for ; Sun, 10 Aug 2014 08:42:36 -0700 (PDT) X-ASG-Debug-ID: 1407685354-04bdf06ef95f750001-NocioJ Received: from mail-oi0-f72.google.com (mail-oi0-f72.google.com [209.85.218.72]) by cuda.sgi.com with ESMTP id WmAUuxtM1Otu5IfA (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Sun, 10 Aug 2014 08:42:35 -0700 (PDT) X-Barracuda-Envelope-From: 36pLnUw0JA1MGvJE38yF81MMN17v36.x97I0D9DD.D13.x97@trix.bounces.google.com X-Barracuda-Apparent-Source-IP: 209.85.218.72 X-Barracuda-IPDD: Level1 [trix.bounces.google.com/209.85.218.72] Received: by mail-oi0-f72.google.com with SMTP id a141so29498243oig.11 for ; Sun, 10 Aug 2014 08:42:34 -0700 (PDT) X-Barracuda-IPDD: Level1 [trix.bounces.google.com/209.85.218.72] X-Barracuda-IPDD: Level1 [trix.bounces.google.com/209.85.218.72] 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=hy3k7Sfm4awm2QR5J6xcqmPQYzDFK+kYNJJRVLUuqQI=; b=O74axMlyWo5DfcMSiUVf7diLNSXiE0nZBl2b3zzVsT8/+pFLa0lm1RDYNbjLDqgLa5 YHuN9vRrG18WU0nz7vv6MRFrqGJtzIMccHxhtjAm5EXgqzELSoXteDa8Hwx2c/aLqRI5 RU5FpHX8+OhhS69DL9ZLRrsRMHTujsF9nQHVOQHTr3WXOKJ2uc2v9CK04PNx3RvHeLh4 CKUeE0o7aXfeMhd54bQuf/xD4T0af3e5O4812fW338aApcq9RmfsATxscibZj9cSlR7Q 2eY9sNEGrGAlZS/au5d7+zKwdpFjCXlU4grrs29iEIHAyRyaBUNZYIYjtuA9dbHLdaia 49rg== MIME-Version: 1.0 X-Received: by 10.42.21.209 with SMTP id l17mt15642557icb.8.1407685354564; Sun, 10 Aug 2014 08:42:34 -0700 (PDT) X-No-Auto-Attachment: 1 Message-ID: <20cf30434d7483b542050048498b@google.com> Date: Sun, 10 Aug 2014 15:42:34 +0000 Subject: =?UTF-8?B?VEjhu6YgVOG7pEMgVkFZIFTDjU4gQ0jhuqRQIFbDgCBUSOG6viBDSOG6pFA=?= From: vaytindung112@gmail.com X-ASG-Orig-Subj: =?UTF-8?B?VEjhu6YgVOG7pEMgVkFZIFTDjU4gQ0jhuqRQIFbDgCBUSOG6viBDSOG6pFA=?= To: xfs@oss.sgi.com Content-Type: multipart/alternative; boundary=20cf30434d748407ec050048499c X-Barracuda-Connect: mail-oi0-f72.google.com[209.85.218.72] X-Barracuda-Start-Time: 1407685354 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 2.00 X-Barracuda-Spam-Status: No, SCORE=2.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC3_MV0164, DKIM_SIGNED, DKIM_VERIFIED, HTML_MESSAGE, NO_REAL_NAME X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.8295 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 2.00 BSF_SC3_MV0164 Custom rule MV0164 --20cf30434d748407ec050048499c Content-Type: text/plain; charset=UTF-8; format=flowed; delsp=yes Content-Transfer-Encoding: base64 SOG7lCBUUuG7oiBWQVkgVuG7kE4gVFLhu7BDIFRJ4bq+UCBU4buqIE5Hw4JOIEjDgE5HDQpWQVkg VEhFTyBMxq/GoE5HIC0gQuG6ok8gSEnhu4JNIE5Iw4JOIFRI4buMIC0gVEjhurogVMONTiBE4buk TkcgLSBIw5NBIMSQxqBOIFRJ4buATiDEkEnhu4ZODQrGr1UgxJDDg0kgxJDhurZDIEJJ4buGVCBE w4BOSCBDSE8gTkfDgE5IIEdJw4FPIEThu6RDIFbDgCBZIFThur4sDQpI4buVIHRy4bujIGtow6Fj aCBow6BuZyDhu58gY8OhYyB04buJbmggVHAuSOG7kyBDaMOtIE1pbmgsIELDrG5oIETGsMahbmcs IMSQ4buTbmcgTmFpIHbDoA0KTG9uZyBBbi4gVMawIHbhuqVuIHbDoCBsw6BtIHZp4buHYyB0cuG7 sWMgdGnhur9wIHbhu5tpIE5nw6JuIGjDoG5nIGtow7RuZyB0aMO0bmcgcXVhIGPDsg0KdMOtbiBk 4bulbmcuDQpM4bujaSDDrWNoIGTDoG5oIGNobyBraMOhY2ggaMOgbmc6DQotIEtow7RuZyBj4bqn biB0w6BpIHPhuqNuIGLhuqNvIMSR4bqjbS4NCi0gTeG7qWMgY2hvIHZheSBo4bqlcCBk4bqrbjog dOG7qyAxMCB0cmnhu4d1IHThu5tpIDMwMCB0cmnhu4d1LCBnaeG6o2kgbmfDom4gdHJvbmcgdsOy bmcNCjItMyBuZ8OgeSBsw6BtIHZp4buHYy4NCi0gVGjhu51pIGjhuqFuIGNobyB2YXkgbGluaCBo b+G6oXQgdOG7qyAxMiDEkeG6v24gNDggdGjDoW5nLg0KLSBMw6NpIHN14bqldCBjaG8gdmF5IHRo 4bqlcCBjaOG7iSB04burIDAsOSUvdGjDoW5nLg0KSOG7kyBzxqEgdmF5IHbhu5FuOg0KLSBC4bqj biBwaG90byBDTU5EDQotIELhuqNuIHBob3RvIEjhu5kga2jhuql1IHRoxrDhu51uZyB0csO6L0tU MyBob+G6t2MgR2nhuqV5IHjDoWMgbmjhuq1uIHThuqFtIHRyw7ogdOG6oWkgbsahaSDhu58NCmhp 4buHbiB04bqhaS4NCi0gSOG7o3AgxJHhu5NuZyBsYW8gxJHhu5luZw0KLSBTYW8ga8OqIHTDoGkg a2hv4bqjbiB0cuG6oyBsxrDGoW5nIDMgdGjDoW5nIGfhuqduIG5o4bqldC4NCi0gTuG6v3UgbMaw xqFuZyB0aeG7gW4gbeG6t3QgdGjDrCBjaOG7iSBj4bqnbiAzIHBoaeG6v3UgbMawxqFuZyB0aMOh bmcgZ+G6p24gbmjhuqV0Lg0KTGnDqm4gaOG7hyBuaMOibiB2acOqbiB0w61uIGThu6VuZyDEkeG7 gyBiaeG6v3Qgbmhp4buBdSBoxqFuOiAwMTY0Ljk2LjY0LjM3OCAtDQowOTA2LjkzMC45MDAgKE1y Lkhvw6BuZykNCkzGsHUgw706IFHDunkga2jDoWNoIHPhur0gxJHGsOG7o2MgdMawIHbhuqVuIGhv w6BuIHRvw6BuIG1p4buFbiBwaMOtIHbDoCBraMO0bmcgcGjhuqNpIGLhu48gYuG6pXQNCmvhu7Mg Y2hpIHBow60gbsOgbyBo4bq/dC4gTmjDom4gdmnDqm4gdMawIHbhuqVuIHPhur0gaOG7lyB0cuG7 oyBraMOhY2ggaMOgbmcgdmF5IHPhu5EgdGnhu4FuDQpuaMawIG1vbmcgbXXhu5FuIHbhu5tpIGzD o2kgc3XhuqV0IHRo4bqlcCBuaOG6pXQgY8OzIHRo4buDLg0KDQoNCg0KDQoNCg0KDQpUw7RpIMSR w6MgbeG7nWkgYuG6oW4gxJFp4buBbiB2w6BvIGJp4buDdSBt4bqrdSBUSOG7piBU4bukQyBWQVkg VMONTiBDSOG6pFAgVsOAIFRI4bq+IENI4bqkUC4gxJDhu4MNCsSRaeG7gW4gdsOgbyBt4bqrdSBu w6B5LCBow6N5IHRydXkgY+G6rXA6DQpodHRwczovL2RvY3MuZ29vZ2xlLmNvbS9mb3Jtcy9kLzFh Znd3MVBrSXlYRUtpMmgwUC02NHB3ekIxMUNqMzctdnZlRjdVaFA0NHdvL3ZpZXdmb3JtP2M9MCZ3 PTEmdXNwPW1haWxfZm9ybV9saW5rDQo= --20cf30434d748407ec050048499c Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: quoted-printable
N=E1=BA=BFu b=E1=BA=A1n g=E1=BA=B7p s=E1=BB=B1 c=E1=BB=91 khi xem ho=E1=BA= =B7c g=E1=BB=ADi bi=E1=BB=83u m=E1=BA=ABu n=C3=A0y, b=E1=BA=A1n c=C3=B3 =C4= =91i=E1=BB=81n v=C3=A0o bi=E1=BB=83u m=E1=BA=ABu tr=E1=BB=B1c tuy=E1=BA=BFn= :
= https://docs.google.com/forms/d/1afww1PkIyXEKi2h0P-64pwzB11Cj37-vveF7UhP44w= o/viewform?c=3D0&w=3D1&usp=3Dmail_form_link

TH=E1=BB=A6 T=E1= =BB=A4C VAY T=C3=8DN CH=E1=BA=A4P V=C3=80 TH=E1=BA=BE CH=E1=BA=A4P

H=E1=BB=94 TR=E1=BB=A2 VAY V= =E1=BB=90N TR=E1=BB=B0C TI=E1=BA=BEP T=E1=BB=AA NG=C3=82N H=C3=80NG
VAY = THEO L=C6=AF=C6=A0NG - B=E1=BA=A2O HI=E1=BB=82M NH=C3=82N TH=E1=BB=8C - TH= =E1=BA=BA T=C3=8DN D=E1=BB=A4NG - H=C3=93A =C4=90=C6=A0N TI=E1=BB=80N =C4= =90I=E1=BB=86N
=C6=AFU =C4=90=C3=83I =C4=90=E1=BA=B6C BI=E1=BB=86T D=C3= =80NH CHO NG=C3=80NH GI=C3=81O D=E1=BB=A4C V=C3=80 Y T=E1=BA=BE,

H=E1=BB= =95 tr=E1=BB=A3 kh=C3=A1ch h=C3=A0ng =E1=BB=9F c=C3=A1c t=E1=BB=89nh Tp.H= =E1=BB=93 Ch=C3=AD Minh, B=C3=ACnh D=C6=B0=C6=A1ng, =C4=90=E1=BB=93ng Nai v= =C3=A0 Long An. T=C6=B0 v=E1=BA=A5n v=C3=A0 l=C3=A0m vi=E1=BB=87c tr=E1=BB= =B1c ti=E1=BA=BFp v=E1=BB=9Bi Ng=C3=A2n h=C3=A0ng kh=C3=B4ng th=C3=B4ng qua= c=C3=B2 t=C3=ADn d=E1=BB=A5ng.

L=E1=BB=A3i =C3=ADch d=C3=A0nh cho kh=C3= =A1ch h=C3=A0ng:
- Kh=C3=B4ng c=E1=BA=A7n t=C3=A0i s=E1=BA=A3n b=E1=BA= =A3o =C4=91=E1=BA=A3m.
- M=E1=BB=A9c cho vay h=E1=BA=A5p d=E1=BA=ABn: t= =E1=BB=AB 10 tri=E1=BB=87u t=E1=BB=9Bi 300 tri=E1=BB=87u, gi=E1=BA=A3i ng= =C3=A2n trong v=C3=B2ng 2-3 ng=C3=A0y l=C3=A0m vi=E1=BB=87c.
- Th=E1=BB= =9Di h=E1=BA=A1n cho vay linh ho=E1=BA=A1t t=E1=BB=AB 12 =C4=91=E1=BA=BFn 4= 8 th=C3=A1ng.
- L=C3=A3i su=E1=BA=A5t cho vay th=E1=BA=A5p ch=E1=BB=89 t= =E1=BB=AB 0,9%/th=C3=A1ng.

H=E1=BB=93 s=C6=A1 vay v=E1=BB=91n:
- B=E1= =BA=A3n photo CMND
- B=E1=BA=A3n photo H=E1=BB=99 kh=E1=BA=A9u th=C6=B0= =E1=BB=9Dng tr=C3=BA/KT3 ho=E1=BA=B7c Gi=E1=BA=A5y x=C3=A1c nh=E1=BA=ADn t= =E1=BA=A1m tr=C3=BA t=E1=BA=A1i n=C6=A1i =E1=BB=9F hi=E1=BB=87n t=E1=BA=A1i= .
- H=E1=BB=A3p =C4=91=E1=BB=93ng lao =C4=91=E1=BB=99ng
- Sao k=C3= =AA t=C3=A0i kho=E1=BA=A3n tr=E1=BA=A3 l=C6=B0=C6=A1ng 3 th=C3=A1ng g=E1=BA= =A7n nh=E1=BA=A5t.
- N=E1=BA=BFu l=C6=B0=C6=A1ng ti=E1=BB=81n m=E1=BA=B7= t th=C3=AC ch=E1=BB=89 c=E1=BA=A7n 3 phi=E1=BA=BFu l=C6=B0=C6=A1ng th=C3=A1= ng g=E1=BA=A7n nh=E1=BA=A5t.

Li=C3=AAn h=E1=BB=87 nh=C3=A2n vi=C3=AAn t= =C3=ADn d=E1=BB=A5ng =C4=91=E1=BB=83 bi=E1=BA=BFt nhi=E1=BB=81u h=C6=A1n: 0= 164.96.64.378 - 0906.930.900 (Mr.Ho=C3=A0ng)

L=C6=B0u =C3=BD: Q=C3=BAy kh= =C3=A1ch s=E1=BA=BD =C4=91=C6=B0=E1=BB=A3c t=C6=B0 v=E1=BA=A5n ho=C3=A0n to= =C3=A0n mi=E1=BB=85n ph=C3=AD v=C3=A0 kh=C3=B4ng ph=E1=BA=A3i b=E1=BB=8F b= =E1=BA=A5t k=E1=BB=B3 chi ph=C3=AD n=C3=A0o h=E1=BA=BFt. Nh=C3=A2n vi=C3=AA= n t=C6=B0 v=E1=BA=A5n s=E1=BA=BD h=E1=BB=97 tr=E1=BB=A3 kh=C3=A1ch h=C3=A0n= g vay s=E1=BB=91 ti=E1=BB=81n nh=C6=B0 mong mu=E1=BB=91n v=E1=BB=9Bi l=C3= =A3i su=E1=BA=A5t th=E1=BA=A5p nh=E1=BA=A5t c=C3=B3 th=E1=BB=83.

    = Kh=C3=B4ng bao gi=E1=BB=9D g=E1=BB=ADi m=E1=BA=ADt kh=E1=BA=A9u th=C3=B4ng = qua Google Bi=E1=BB=83u m=E1=BA=ABu.
= =C4=90=C6=B0=C6=A1=CC=A3c h=C3=B4=CC=83 tr=C6=A1=CC=A3 b=C6=A1=CC=89i
3D"Google
N=E1=BB=99i dung n=C3=A0y kh= =C3=B4ng ph=E1=BA=A3i do Google t=E1=BA=A1o ra hay x=C3=A1c nh=E1=BA=ADn.
B=C3=A1o c=C3=A1o L=E1=BA=A1m d=E1=BB=A5ng - =C4=90i=C3=AA=CC= =80u khoa=CC=89n Di=CC=A3ch vu=CC=A3 - =C4=90i= =E1=BB=81u kho=E1=BA=A3n B=E1=BB=95 sung

<= /html> --20cf30434d748407ec050048499c-- From alex@zadarastorage.com Sun Aug 10 11:26: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 (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 074397F63 for ; Sun, 10 Aug 2014 11:26:32 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id EA2DB8F8033 for ; Sun, 10 Aug 2014 09:26:28 -0700 (PDT) X-ASG-Debug-ID: 1407687986-04cbb0508b5ef00001-NocioJ Received: from mail-wi0-f170.google.com (mail-wi0-f170.google.com [209.85.212.170]) by cuda.sgi.com with ESMTP id yx8WjB0sdJZMCSRB (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Sun, 10 Aug 2014 09:26:26 -0700 (PDT) X-Barracuda-Envelope-From: alex@zadarastorage.com X-Barracuda-Apparent-Source-IP: 209.85.212.170 Received: by mail-wi0-f170.google.com with SMTP id f8so4542922wiw.3 for ; Sun, 10 Aug 2014 09:26:25 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:in-reply-to:references:date :message-id:subject:from:to:cc:content-type; bh=BY3giEHTug6kLGaoimr2cQzklZFTJoORTpne1HB0Bs4=; b=GKRLtiYGLTXAVRAXsIFmYFS6e/2YF07OERw0hXGoeJS5/Tg430FzdDEuaYLtg4JwOK q7GbLGHV5S2Ut4o2yhDgSnlqETJM0J/fzsbQn4P+iscOzzuU7YV6ezn8HpYokpR90dRS RS9LLLPuPZOANqFzqHue35XIaZPyACBBXzWhShwXBFx6lZzMRrXtUOuEZySHHG/ppUyg Km+xGtwch0fCme/sIqxV03ZMbr4BZYc4VREB3aU5ZMRUFLCvaL3EHyTAzUYzomztA+Uy lds4rfMtb2hcEcz3HNlHsbksBCcsDKGG3/REK/y3dHu0/MBYD0WrhGnMWtX9cUM4qF3n JxHw== X-Gm-Message-State: ALoCoQlq7HpCHOD41zyAnJ5TRZMZVpcdJiVMdBXyzyYoNuLRi3FNKxRpbp5fPGvsu4nvF/NhYL3O MIME-Version: 1.0 X-Received: by 10.180.92.73 with SMTP id ck9mr19081394wib.54.1407687984593; Sun, 10 Aug 2014 09:26:24 -0700 (PDT) Received: by 10.194.15.232 with HTTP; Sun, 10 Aug 2014 09:26:24 -0700 (PDT) In-Reply-To: <20140806123215.GJ20518@dastard> References: <20140113204314.GJ3469@dastard> <20140115014503.GQ3469@dastard> <20140119231745.GF18112@dastard> <4B2A412C75324EE9880358513C069476@alyakaslap> <9D3CBECB663B4A77B7EF74B67973310A@alyakaslap> <20140804230721.GA20518@dastard> <20140806123215.GJ20518@dastard> Date: Sun, 10 Aug 2014 19:26:24 +0300 Message-ID: Subject: Re: use-after-free on log replay failure From: Alex Lyakas X-ASG-Orig-Subj: Re: use-after-free on log replay failure To: Dave Chinner Cc: xfs@oss.sgi.com Content-Type: text/plain; charset=UTF-8 X-Barracuda-Connect: mail-wi0-f170.google.com[209.85.212.170] X-Barracuda-Start-Time: 1407687986 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=MARKETING_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.8296 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words Hello Dave, On Wed, Aug 6, 2014 at 3:32 PM, Dave Chinner wrote: > On Wed, Aug 06, 2014 at 01:05:34PM +0300, Alex Lyakas wrote: >> Hi Dave, >> >> On Tue, Aug 5, 2014 at 2:07 AM, Dave Chinner wrote: >> > On Mon, Aug 04, 2014 at 02:00:05PM +0300, Alex Lyakas wrote: >> >> Greetings, >> >> >> >> we had a log replay failure due to some errors that the underlying >> >> block device returned: >> >> [49133.801406] XFS (dm-95): metadata I/O error: block 0x270e8c180 >> >> ("xlog_recover_iodone") error 28 numblks 16 >> >> [49133.802495] XFS (dm-95): log mount/recovery failed: error 28 >> >> [49133.802644] XFS (dm-95): log mount failed >> > >> > #define ENOSPC 28 /* No space left on device */ >> > >> > You're getting an ENOSPC as a metadata IO error during log recovery? >> > Thin provisioning problem, perhaps, >> Yes, it is a thin provisioning problem (which I already know the cause for). >> >> > and the error is occurring on >> > submission rather than completion? If so: >> > >> > 8d6c121 xfs: fix buffer use after free on IO error >> I am not sure what do you mean by "submission rather than completion". >> Do you mean that xfs_buf_ioapply_map() returns without submitting any >> bios? > > No, that the bio submission results in immediate failure (e.g. the > device goes away, so submission results in ENODEV). Hence when > _xfs_buf_ioapply() releases it's IO reference itis the only > remaining reference to the buffer and so completion processing is > run immediately. i.e. inline from the submission path. > > Normally IO errors are reported through the bio in IO completion > interrupt context. i.e the IO is completed by the hardware and the > error status is attached to bio, which is then completed and we get > into XFS that way. The IO submision context is long gone at this > point.... > >> In that case, no, bios are submitted to the block device, and it >> fails them through a different context with ENOSPC error. I will still >> try the patch you mentioned, because it also looks relevant to another >> question I addressed to you earlier in: >> http://oss.sgi.com/archives/xfs/2013-11/msg00648.html > > No, that's a different problem. > > 9c23ecc xfs: unmount does not wait for shutdown during unmount Yes, this patch appears to fix the problem that I reported in the past. XFS survives the unmount and kmemleak is also happy. Thanks! Is this patch safe to apply to 3.8.13? Thanks, Alex. > > Cheers, > > Dave. > -- > Dave Chinner > david@fromorbit.com From david@fromorbit.com Sun Aug 10 23: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 F1B227F4E for ; Sun, 10 Aug 2014 23:32:28 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id E07D38F8037 for ; Sun, 10 Aug 2014 21:32:28 -0700 (PDT) X-ASG-Debug-ID: 1407731542-04cb6c4c94632c0001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id g6J0dYevm6dUIfFt for ; Sun, 10 Aug 2014 21:32:23 -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: AisJAF9G6FN5LDJ8PGdsb2JhbABagw2BKYIohQemYAEBAQEBAQamIwGBERcFAQEBATg2hAQBBTocIxAIAxgJJQ8FJQMHGhOIQcBlFxiFZIlQB4RMBZwumGorLw Received: from ppp121-44-50-124.lns20.syd6.internode.on.net (HELO dastard) ([121.44.50.124]) by ipmail06.adl6.internode.on.net with ESMTP; 11 Aug 2014 14:02:22 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1XGhHP-0005BJ-KK; Mon, 11 Aug 2014 14:32:19 +1000 Date: Mon, 11 Aug 2014 14:32:19 +1000 From: Dave Chinner To: Fanael Linithien Cc: xfs@oss.sgi.com Subject: Re: Verifier fixes backported to stable kernels? Message-ID: <20140811043219.GJ26465@dastard> X-ASG-Orig-Subj: Re: Verifier fixes backported to stable kernels? References: <20140809005404.GG26465@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1407731543 X-Barracuda-URL: http://192.48.176.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.8311 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Sat, Aug 09, 2014 at 05:55:19PM +0200, Fanael Linithien wrote: > 2014-08-09 2:54 GMT+02:00 Dave Chinner : > > What fixes are you talking about? List of commits, please, noting > > whether the commit already has a "cc: " in > > it or not. > > These are the commits: > > 400b9d88757c0bfbdfa97014e090ec40a31c1282 > 67dc288c21064b31a98a53dc64f6b9714b819fd6 (this is the only one with the cc) > 5fd364fee81a7888af806e42ed8a91c845894f2d > ad3714b82c631a34724da09a7daa53afcab952fa Ok, but please use the "one-line format" when quoting commits. I.e. this: $ git log --oneline -n 4 ad3714b ad3714b xfs: dquot recovery needs verifiers 5fd364f xfs: quotacheck leaves dquot buffers without verifiers 67dc288 xfs: ensure verifiers are attached to recovered buffers 400b9d8 xfs: catch buffers written without verifiers attached is much more informative to the reader without a git tree to look up commits. As it is, those commits have not yet been sent to Linus, hence they won't yet be accepted by the stable kernel folk. And because they haven't been sent to Linus yet, I can redo the commits in that topic branch with the needed stable tags. I've got to add a couple more fixes that need to go to stable, too, so a pull req won't happen for a couple of days yet.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Mon Aug 11 02:17: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 9E1F97F4E for ; Mon, 11 Aug 2014 02:17:02 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 6E9728F8035 for ; Mon, 11 Aug 2014 00:16:59 -0700 (PDT) X-ASG-Debug-ID: 1407741417-04bdf06ef67a260001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id FwEDMqwnRir03Tl6 for ; Mon, 11 Aug 2014 00:16:57 -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: AisJAEFt6FN5LDJ8PGdsb2JhbABagw2BKYIohQemXgEBAQEBAQamIwGBFBcFAQEBATg2hAQBBTocIxAIAxgJJQ8FJQMHGhOIQcBjFxiFZIlQB4RMBZwumGorL4EFBw Received: from ppp121-44-50-124.lns20.syd6.internode.on.net (HELO dastard) ([121.44.50.124]) by ipmail06.adl6.internode.on.net with ESMTP; 11 Aug 2014 16:46:56 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1XGjqH-0005WU-Nr; Mon, 11 Aug 2014 17:16:29 +1000 Date: Mon, 11 Aug 2014 17:16:29 +1000 From: Dave Chinner To: Fanael Linithien Cc: xfs@oss.sgi.com Subject: Re: Verifier fixes backported to stable kernels? Message-ID: <20140811071629.GK26465@dastard> X-ASG-Orig-Subj: Re: Verifier fixes backported to stable kernels? References: <20140809005404.GG26465@dastard> <20140811043219.GJ26465@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140811043219.GJ26465@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: 1407741417 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.8314 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Mon, Aug 11, 2014 at 02:32:19PM +1000, Dave Chinner wrote: > On Sat, Aug 09, 2014 at 05:55:19PM +0200, Fanael Linithien wrote: > > 2014-08-09 2:54 GMT+02:00 Dave Chinner : > > > What fixes are you talking about? List of commits, please, noting > > > whether the commit already has a "cc: " in > > > it or not. > > > > These are the commits: > > > > 400b9d88757c0bfbdfa97014e090ec40a31c1282 > > 67dc288c21064b31a98a53dc64f6b9714b819fd6 (this is the only one with the cc) > > 5fd364fee81a7888af806e42ed8a91c845894f2d > > ad3714b82c631a34724da09a7daa53afcab952fa > > Ok, but please use the "one-line format" when quoting commits. > > I.e. this: > > $ git log --oneline -n 4 ad3714b > ad3714b xfs: dquot recovery needs verifiers > 5fd364f xfs: quotacheck leaves dquot buffers without verifiers > 67dc288 xfs: ensure verifiers are attached to recovered buffers > 400b9d8 xfs: catch buffers written without verifiers attached Actually, I'm not going to send this last patch back to older, stable kernels. I really don't want to have to port random patches back to older kernels to avoid it generating false positives. Cheers, Dave. -- Dave Chinner david@fromorbit.com From bfoster@redhat.com Mon Aug 11 08:21: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 (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 647E67F3F for ; Mon, 11 Aug 2014 08:21:05 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 2A9AB8F8035 for ; Mon, 11 Aug 2014 06:21:05 -0700 (PDT) X-ASG-Debug-ID: 1407763260-04cb6c4c9379690001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id ttKTKPDEnWJMXgWe (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 11 Aug 2014 06:21: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 s7BDKx5I024858 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Mon, 11 Aug 2014 09:20:59 -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 s7BDKwXu017519; Mon, 11 Aug 2014 09:20:58 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id C36CC12577C; Mon, 11 Aug 2014 09:20:57 -0400 (EDT) Date: Mon, 11 Aug 2014 09:20:57 -0400 From: Brian Foster To: Alex Lyakas Cc: xfs@oss.sgi.com Subject: Re: use-after-free on log replay failure Message-ID: <20140811132057.GA1186@bfoster.bfoster> X-ASG-Orig-Subj: Re: use-after-free on log replay failure References: <20140115014503.GQ3469@dastard> <20140119231745.GF18112@dastard> <4B2A412C75324EE9880358513C069476@alyakaslap> <9D3CBECB663B4A77B7EF74B67973310A@alyakaslap> <20140804230721.GA20518@dastard> <20140806152042.GB39990@bfoster.bfoster> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.23 (2014-03-12) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.26 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1407763260 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Sun, Aug 10, 2014 at 03:20:50PM +0300, Alex Lyakas wrote: > Hi Brian, > > On Wed, Aug 6, 2014 at 6:20 PM, Brian Foster wrote: > > On Wed, Aug 06, 2014 at 03:52:03PM +0300, Alex Lyakas wrote: > >> Hello Dave and Brian, > >> > >> Dave, I tried the patch you suggested, but it does not fix the issue. I did > >> some further digging, and it appears that _xfs_buf_ioend(schedule=1) can be > >> called from xfs_buf_iorequest(), which the patch fixes, but also from > >> xfs_buf_bio_end_io() which is my case. I am reproducing the issue pretty > >> easily. The flow that I have is like this: > >> - xlog_recover() calls xlog_find_tail(). This works alright. > > > > What's the purpose of a sleep here? > > > >> - Now I add a small sleep before calling xlog_do_recover(), and meanwhile I > >> instruct my block device to return ENOSPC for any WRITE from now on. > >> > >> What seems to happen is that several WRITE bios are submitted and they all > >> fail. When they do, they reach xfs_buf_ioend() through a stack like this: > >> > >> Aug 6 15:23:07 dev kernel: [ 304.410528] [56]xfs*[xfs_buf_ioend:1056] > >> XFS(dm-19): Scheduling xfs_buf_iodone_work on error > >> Aug 6 15:23:07 dev kernel: [ 304.410534] Pid: 56, comm: kworker/u:1 > >> Tainted: G W O 3.8.13-557-generic #1382000791 > >> Aug 6 15:23:07 dev kernel: [ 304.410537] Call Trace: > >> Aug 6 15:23:07 dev kernel: [ 304.410587] [] > >> xfs_buf_ioend+0x1a4/0x1b0 [xfs] > >> Aug 6 15:23:07 dev kernel: [ 304.410621] [] > >> _xfs_buf_ioend+0x25/0x30 [xfs] > >> Aug 6 15:23:07 dev kernel: [ 304.410643] [] > >> xfs_buf_bio_end_io+0x3d/0x50 [xfs] > >> Aug 6 15:23:07 dev kernel: [ 304.410652] [] > >> bio_endio+0x1d/0x40 > >> ... > >> > >> At this point, they are scheduled to run xlog_recover_iodone through > >> xfslogd_workqueue. > >> The first callback that gets called, calls xfs_do_force_shutdown in stack > >> like this: > >> > >> Aug 6 15:23:07 dev kernel: [ 304.411791] XFS (dm-19): metadata I/O error: > >> block 0x3780001 ("xlog_recover_iodone") error 28 numblks 1 > >> Aug 6 15:23:07 dev kernel: [ 304.413493] XFS (dm-19): > >> xfs_do_force_shutdown(0x1) called from line 377 of file > >> /mnt/work/alex/xfs/fs/xfs/xfs_log_recover.c. Return address = > >> 0xffffffffa0526848 > >> Aug 6 15:23:07 dev kernel: [ 304.413837] [] > >> xfs_do_force_shutdown+0x40/0x180 [xfs] > >> Aug 6 15:23:07 dev kernel: [ 304.413870] [] ? > >> xlog_recover_iodone+0x48/0x70 [xfs] > >> Aug 6 15:23:07 dev kernel: [ 304.413902] [] > >> xlog_recover_iodone+0x48/0x70 [xfs] > >> Aug 6 15:23:07 dev kernel: [ 304.413923] [] > >> xfs_buf_iodone_work+0x4d/0xa0 [xfs] > >> Aug 6 15:23:07 dev kernel: [ 304.413930] [] > >> process_one_work+0x141/0x4a0 > >> Aug 6 15:23:07 dev kernel: [ 304.413937] [] > >> worker_thread+0x168/0x410 > >> Aug 6 15:23:07 dev kernel: [ 304.413943] [] ? > >> manage_workers+0x120/0x120 > >> Aug 6 15:23:07 dev kernel: [ 304.413949] [] > >> kthread+0xc0/0xd0 > >> Aug 6 15:23:07 dev kernel: [ 304.413954] [] ? > >> flush_kthread_worker+0xb0/0xb0 > >> Aug 6 15:23:07 dev kernel: [ 304.413976] [] > >> ret_from_fork+0x7c/0xb0 > >> Aug 6 15:23:07 dev kernel: [ 304.413986] [] ? > >> flush_kthread_worker+0xb0/0xb0 > >> Aug 6 15:23:07 dev kernel: [ 304.413990] ---[ end trace 988d698520e1fa81 > >> ]--- > >> Aug 6 15:23:07 dev kernel: [ 304.414012] XFS (dm-19): I/O Error Detected. > >> Shutting down filesystem > >> Aug 6 15:23:07 dev kernel: [ 304.415936] XFS (dm-19): Please umount the > >> filesystem and rectify the problem(s) > >> > >> But the rest of the callbacks also arrive: > >> Aug 6 15:23:07 dev kernel: [ 304.417812] XFS (dm-19): metadata I/O error: > >> block 0x3780002 ("xlog_recover_iodone") error 28 numblks 1 > >> Aug 6 15:23:07 dev kernel: [ 304.420420] XFS (dm-19): > >> xfs_do_force_shutdown(0x1) called from line 377 of file > >> /mnt/work/alex/xfs/fs/xfs/xfs_log_recover.c. Return address = > >> 0xffffffffa0526848 > >> Aug 6 15:23:07 dev kernel: [ 304.420427] XFS (dm-19): metadata I/O error: > >> block 0x3780008 ("xlog_recover_iodone") error 28 numblks 8 > >> Aug 6 15:23:07 dev kernel: [ 304.422708] XFS (dm-19): > >> xfs_do_force_shutdown(0x1) called from line 377 of file > >> /mnt/work/alex/xfs/fs/xfs/xfs_log_recover.c. Return address = > >> 0xffffffffa0526848 > >> Aug 6 15:23:07 dev kernel: [ 304.422738] XFS (dm-19): metadata I/O error: > >> block 0x3780010 ("xlog_recover_iodone") error 28 numblks 8 > >> > >> The mount sequence fails and goes back to the caller: > >> Aug 6 15:23:07 dev kernel: [ 304.423438] XFS (dm-19): log mount/recovery > >> failed: error 28 > >> Aug 6 15:23:07 dev kernel: [ 304.423757] XFS (dm-19): log mount failed > >> > >> But there are still additional callbacks to deliver, which the mount > >> sequence did not wait for! > >> Aug 6 15:23:07 dev kernel: [ 304.425717] XFS ( @dR): > >> xfs_do_force_shutdown(0x1) called from line 377 of file > >> /mnt/work/alex/xfs/fs/xfs/xfs_log_recover.c. Return address = > >> 0xffffffffa0526848 > >> Aug 6 15:23:07 dev kernel: [ 304.425723] XFS ( @dR): metadata I/O error: > >> block 0x3780018 ("xlog_recover_iodone") error 28 numblks 8 > >> Aug 6 15:23:07 dev kernel: [ 304.428239] XFS ( @dR): > >> xfs_do_force_shutdown(0x1) called from line 377 of file > >> /mnt/work/alex/xfs/fs/xfs/xfs_log_recover.c. Return address = > >> 0xffffffffa0526848 > >> Aug 6 15:23:07 dev kernel: [ 304.428246] XFS ( @dR): metadata I/O error: > >> block 0x37800a0 ("xlog_recover_iodone") error 28 numblks 16 > >> > >> Notice the junk that they are printing! Naturally, because xfs_mount > >> structure has been kfreed. > >> > >> Finally the kernel crashes (instead of printing junk), because the xfs_mount > >> structure is gone, but the callback tries to access it (printing the name): > >> > >> Aug 6 15:23:07 dev kernel: [ 304.430796] general protection fault: 0000 > >> [#1] SMP > >> Aug 6 15:23:07 dev kernel: [ 304.432035] Modules linked in: xfrm_user > >> xfrm4_tunnel tunnel4 ipcomp xfrm_ipcomp esp4 ah4 iscsi_scst_tcp(O) > >> scst_vdisk(O) scst(O) dm_zcache(O) dm_btrfs(O) xfs(O) btrfs(O) libcrc32c > >> raid456(O) async_pq async_xor xor async_memcpy async_raid6_recov raid6_pq > >> async_tx raid1(O) md_mod deflate zlib_deflate ctr twofish_generic > >> twofish_x86_64_3way glue_helper lrw xts gf128mul twofish_x86_64 > >> twofish_common camellia_generic serpent_generic blowfish_generic > >> blowfish_x86_64 blowfish_common cast5_generic cast_common des_generic xcbc > >> rmd160 sha512_generic crypto_null af_key xfrm_algo dm_round_robin kvm vfat > >> fat ppdev psmouse microcode nfsd nfs_acl dm_multipath(O) serio_raw > >> parport_pc nfsv4 dm_iostat(O) mac_hid i2c_piix4 auth_rpcgss nfs fscache > >> lockd sunrpc lp parport floppy > >> Aug 6 15:23:07 dev kernel: [ 304.432035] CPU 1 > >> Aug 6 15:23:07 dev kernel: [ 304.432035] Pid: 133, comm: kworker/1:1H > >> Tainted: G W O 3.8.13-557-generic #1382000791 Bochs Bochs > >> Aug 6 15:23:07 dev kernel: [ 304.432035] RIP: 0010:[] > >> [] strnlen+0xb/0x30 > >> Aug 6 15:23:07 dev kernel: [ 304.432035] RSP: 0018:ffff880035461b08 > >> EFLAGS: 00010086 > >> Aug 6 15:23:07 dev kernel: [ 304.432035] RAX: 0000000000000000 RBX: > >> ffffffff81e6a4e7 RCX: 0000000000000000 > >> Aug 6 15:23:07 dev kernel: [ 304.432035] RDX: e4e8390a265c0000 RSI: > >> ffffffffffffffff RDI: e4e8390a265c0000 > >> Aug 6 15:23:07 dev kernel: [ 304.432035] RBP: ffff880035461b08 R08: > >> 000000000000ffff R09: 000000000000ffff > >> Aug 6 15:23:07 dev kernel: [ 304.432035] R10: 0000000000000000 R11: > >> 00000000000004cd R12: e4e8390a265c0000 > >> Aug 6 15:23:07 dev kernel: [ 304.432035] R13: ffffffff81e6a8c0 R14: > >> 0000000000000000 R15: 000000000000ffff > >> Aug 6 15:23:07 dev kernel: [ 304.432035] FS: 0000000000000000(0000) > >> GS:ffff88007fc80000(0000) knlGS:0000000000000000 > >> Aug 6 15:23:07 dev kernel: [ 304.432035] CS: 0010 DS: 0000 ES: 0000 CR0: > >> 000000008005003b > >> Aug 6 15:23:07 dev kernel: [ 304.432035] CR2: 00007fc902ffbfd8 CR3: > >> 000000007702a000 CR4: 00000000000006e0 > >> Aug 6 15:23:07 dev kernel: [ 304.432035] DR0: 0000000000000000 DR1: > >> 0000000000000000 DR2: 0000000000000000 > >> Aug 6 15:23:07 dev kernel: [ 304.432035] DR3: 0000000000000000 DR6: > >> 00000000ffff0ff0 DR7: 0000000000000400 > >> Aug 6 15:23:07 dev kernel: [ 304.432035] Process kworker/1:1H (pid: 133, > >> threadinfo ffff880035460000, task ffff880035412e00) > >> Aug 6 15:23:07 dev kernel: [ 304.432035] Stack: > >> Aug 6 15:23:07 dev kernel: [ 304.432035] ffff880035461b48 > >> ffffffff8133dd5e 0000000000000000 ffffffff81e6a4e7 > >> Aug 6 15:23:07 dev kernel: [ 304.432035] ffffffffa0566cba > >> ffff880035461c80 ffffffffa0566cba ffffffff81e6a8c0 > >> Aug 6 15:23:07 dev kernel: [ 304.432035] ffff880035461bc8 > >> ffffffff8133ef59 ffff880035461bc8 ffffffff81c84040 > >> Aug 6 15:23:07 dev kernel: [ 304.432035] Call Trace: > >> Aug 6 15:23:07 dev kernel: [ 304.432035] [] > >> string.isra.4+0x3e/0xd0 > >> Aug 6 15:23:07 dev kernel: [ 304.432035] [] > >> vsnprintf+0x219/0x640 > >> Aug 6 15:23:07 dev kernel: [ 304.432035] [] > >> vscnprintf+0x11/0x30 > >> Aug 6 15:23:07 dev kernel: [ 304.432035] [] > >> vprintk_emit+0xc1/0x490 > >> Aug 6 15:23:07 dev kernel: [ 304.432035] [] ? > >> vprintk_emit+0x170/0x490 > >> Aug 6 15:23:07 dev kernel: [ 304.432035] [] > >> printk+0x61/0x63 > >> Aug 6 15:23:07 dev kernel: [ 304.432035] [] > >> __xfs_printk+0x31/0x50 [xfs] > >> Aug 6 15:23:07 dev kernel: [ 304.432035] [] > >> xfs_notice+0x53/0x60 [xfs] > >> Aug 6 15:23:07 dev kernel: [ 304.432035] [] > >> xfs_do_force_shutdown+0xf5/0x180 [xfs] > >> Aug 6 15:23:07 dev kernel: [ 304.432035] [] ? > >> xlog_recover_iodone+0x48/0x70 [xfs] > >> Aug 6 15:23:07 dev kernel: [ 304.432035] [] > >> xlog_recover_iodone+0x48/0x70 [xfs] > >> Aug 6 15:23:07 dev kernel: [ 304.432035] [] > >> xfs_buf_iodone_work+0x4d/0xa0 [xfs] > >> Aug 6 15:23:07 dev kernel: [ 304.432035] [] > >> process_one_work+0x141/0x4a0 > >> Aug 6 15:23:07 dev kernel: [ 304.432035] [] > >> worker_thread+0x168/0x410 > >> Aug 6 15:23:07 dev kernel: [ 304.432035] [] ? > >> manage_workers+0x120/0x120 > >> Aug 6 15:23:07 dev kernel: [ 304.432035] [] > >> kthread+0xc0/0xd0 > >> Aug 6 15:23:07 dev kernel: [ 304.432035] [] ? > >> flush_kthread_worker+0xb0/0xb0 > >> Aug 6 15:23:07 dev kernel: [ 304.432035] [] > >> ret_from_fork+0x7c/0xb0 > >> Aug 6 15:23:07 dev kernel: [ 304.432035] [] ? > >> flush_kthread_worker+0xb0/0xb0 > >> Aug 6 15:23:07 dev kernel: [ 304.432035] Code: 31 c0 80 3f 00 55 48 89 e5 > >> 74 11 48 89 f8 66 90 48 83 c0 01 80 38 00 75 f7 48 29 f8 5d c3 66 90 55 31 > >> c0 48 85 f6 48 89 e5 74 23 <80> 3f 00 74 1e 48 89 f8 eb 0c 0f 1f 00 48 83 ee > >> 01 80 38 00 74 > >> Aug 6 15:23:07 dev kernel: [ 304.432035] RIP [] > >> strnlen+0xb/0x30 > >> Aug 6 15:23:07 dev kernel: [ 304.432035] RSP > >> > >> > >> So previously you said: "So, something is corrupting memory and stamping all > >> over the XFS structures." and also "given you have a bunch of out of tree > >> modules loaded (and some which are experiemental) suggests that you have a > >> problem with your storage...". > >> > >> But I believe, my analysis shows that during the mount sequence XFS does not > >> wait properly for all the bios to complete, before failing the mount > >> sequence back to the caller. > >> > > > > As an experiment, what about the following? Compile tested only and not > > safe for general use. > > > > What might help more is to see if you can create a reproducer on a > > recent, clean kernel. Perhaps a metadump of your reproducer fs combined > > with whatever block device ENOSPC hack you're using would do it. > > > > Brian > > > > ---8<--- > > > > diff --git a/fs/xfs/xfs_buf.c b/fs/xfs/xfs_buf.c > > index cd7b8ca..fbcf524 100644 > > --- a/fs/xfs/xfs_buf.c > > +++ b/fs/xfs/xfs_buf.c > > @@ -1409,19 +1409,27 @@ xfs_buf_iorequest( > > * case nothing will ever complete. It returns the I/O error code, if any, or > > * 0 if there was no error. > > */ > > -int > > -xfs_buf_iowait( > > - xfs_buf_t *bp) > > +static int > > +__xfs_buf_iowait( > > + struct xfs_buf *bp, > > + bool skip_error) > > { > > trace_xfs_buf_iowait(bp, _RET_IP_); > > > > - if (!bp->b_error) > > + if (skip_error || !bp->b_error) > > wait_for_completion(&bp->b_iowait); > > > > trace_xfs_buf_iowait_done(bp, _RET_IP_); > > return bp->b_error; > > } > > > > +int > > +xfs_buf_iowait( > > + struct xfs_buf *bp) > > +{ > > + return __xfs_buf_iowait(bp, false); > > +} > > + > > xfs_caddr_t > > xfs_buf_offset( > > xfs_buf_t *bp, > > @@ -1866,7 +1874,7 @@ xfs_buf_delwri_submit( > > bp = list_first_entry(&io_list, struct xfs_buf, b_list); > > > > list_del_init(&bp->b_list); > > - error2 = xfs_buf_iowait(bp); > > + error2 = __xfs_buf_iowait(bp, true); > > xfs_buf_relse(bp); > > if (!error) > > error = error2; > > > > --- > I think that this patch fixes the problem. I tried reproducing it like > 30 times, and it doesn't happen with this patch. Dropping this patch > reproduces the problem within 1 or 2 tries. Thanks! > What are next steps? How to make it "safe for general use"? > Ok, thanks for testing. I think that implicates the caller bypassing the expected blocking with the right sequence of log recovery I/Os and device failure. TBH, I'd still like to see the specifics, if possible. Could you come up with a generic reproducer for this? I think a metadump of the fs with the dirty log plus whatever device failure simulation hack you're using would suffice. The ideal fix is not yet clear to me. Technically, we could always find a way to customize this particular path to rely on b_iowait since that appears safe, but that could just be a band aid over a larger problem. I'll need to step back and stare at this code some more to try and understand the layering better, then follow up with something when things are more clear. Brian > Thanks, > Alex. > > > > > > > > >> Thanks, > >> Alex. > >> > >> > >> > >> -----Original Message----- From: Dave Chinner > >> Sent: 05 August, 2014 2:07 AM > >> To: Alex Lyakas > >> Cc: xfs@oss.sgi.com > >> Subject: Re: use-after-free on log replay failure > >> > >> On Mon, Aug 04, 2014 at 02:00:05PM +0300, Alex Lyakas wrote: > >> >Greetings, > >> > > >> >we had a log replay failure due to some errors that the underlying > >> >block device returned: > >> >[49133.801406] XFS (dm-95): metadata I/O error: block 0x270e8c180 > >> >("xlog_recover_iodone") error 28 numblks 16 > >> >[49133.802495] XFS (dm-95): log mount/recovery failed: error 28 > >> >[49133.802644] XFS (dm-95): log mount failed > >> > >> #define ENOSPC 28 /* No space left on device */ > >> > >> You're getting an ENOSPC as a metadata IO error during log recovery? > >> Thin provisioning problem, perhaps, and the error is occurring on > >> submission rather than completion? If so: > >> > >> 8d6c121 xfs: fix buffer use after free on IO error > >> > >> Cheers, > >> > >> Dave. > >> -- > >> Dave Chinner > >> david@fromorbit.com > >> > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From bfoster@redhat.com Mon Aug 11 08:29: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 (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 2328A7F4E for ; Mon, 11 Aug 2014 08:29:32 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id E66018F8059 for ; Mon, 11 Aug 2014 06:29:31 -0700 (PDT) X-ASG-Debug-ID: 1407763770-04cb6c4c96799c0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id LQfHpExHioFPUH9Z (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 11 Aug 2014 06:29:30 -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 s7BDTKM0009558 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Mon, 11 Aug 2014 09:29:20 -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 s7BDTKZ5026106; Mon, 11 Aug 2014 09:29:20 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 77D2712577C; Mon, 11 Aug 2014 09:29:19 -0400 (EDT) Date: Mon, 11 Aug 2014 09:29:19 -0400 From: Brian Foster To: Chris Mason Cc: xfs@oss.sgi.com, Dave Chinner , Eric Sandeen Subject: Re: [PATCH v2] xfs: don't zero partial page cache pages during O_DIRECT Message-ID: <20140811132919.GB1186@bfoster.bfoster> X-ASG-Orig-Subj: Re: [PATCH v2] xfs: don't zero partial page cache pages during O_DIRECT References: <53E4E03A.7050101@fb.com> <53E61A9C.4020807@fb.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <53E61A9C.4020807@fb.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: 1407763770 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Sat, Aug 09, 2014 at 08:57:00AM -0400, Chris Mason wrote: > > xfs is using truncate_pagecache_range to invalidate the page cache > during DIO reads. This is different from the other filesystems who only > invalidate pages during DIO writes. > > truncate_pagecache_range is meant to be used when we are freeing the > underlying data structs from disk, so it will zero any partial ranges in > the page. This means a DIO read can zero out part of the page cache > page, and it is possible the page will stay in cache. > > buffered reads will find an up to date page with zeros instead of the > data actually on disk. > > This patch fixes things by using invalidate_inode_pages2_range instead. > It preserves the page cache invalidation, but won't zero any pages. > > Signed-off-by: Chris Mason > cc: stable@vger.kernel.org > > --- I can't say I grok the risk of removing the invalidation entirely, but this is certainly a more isolated fix: Reviewed-by: Brian Foster > fs/xfs/xfs_file.c | 3 ++- > 1 file changed, 2 insertions(+), 1 deletion(-) > > diff --git a/fs/xfs/xfs_file.c b/fs/xfs/xfs_file.c > index 1f66779..023d575 100644 > --- a/fs/xfs/xfs_file.c > +++ b/fs/xfs/xfs_file.c > @@ -295,7 +295,8 @@ xfs_file_read_iter( > xfs_rw_iunlock(ip, XFS_IOLOCK_EXCL); > return ret; > } > - truncate_pagecache_range(VFS_I(ip), pos, -1); > + invalidate_inode_pages2_range(VFS_I(ip)->i_mapping, > + pos >> PAGE_CACHE_SHIFT, -1); > } > xfs_rw_ilock_demote(ip, XFS_IOLOCK_EXCL); > } > -- > 1.8.1 > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From robin.listas@gmail.com Mon Aug 11 09:23: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=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 3844A7F3F for ; Mon, 11 Aug 2014 09:23:22 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 0C12C304062 for ; Mon, 11 Aug 2014 07:23:22 -0700 (PDT) X-ASG-Debug-ID: 1407766996-04cbb0508c907e0001-NocioJ Received: from mail-we0-f177.google.com (mail-we0-f177.google.com [74.125.82.177]) by cuda.sgi.com with ESMTP id VYrTUFTDFDFBoj1d (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Mon, 11 Aug 2014 07:23:17 -0700 (PDT) X-Barracuda-Envelope-From: robin.listas@gmail.com X-Barracuda-Apparent-Source-IP: 74.125.82.177 Received: by mail-we0-f177.google.com with SMTP id w62so8468046wes.8 for ; Mon, 11 Aug 2014 07:23:16 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=sender:date:from:to:subject:in-reply-to:message-id:references :user-agent:mime-version:content-type; bh=hpFMYvfXhEZh/VlRixuqwPovb4OR57PeON1Cti0rZWU=; b=wM7qpFC66fhpIfoE9q79obCMQVTRZaivfKGFc4T/8GeTKAfl+Hxc/MBeBELLXZNavo PLYm+2du0daEs21M7ZN4LewFzCIUQYU9NG9dHWM1rRX7NXBsOnTNH0btesdN30QMpD5P s7jSCYZjWTB96Vv8D8aMXQmW1i8fSicvzU06BlKAlRtYV7Y142S9ElfRNA6cNXwTavUD 9nlaR2UwyWXMsVY2/lXCg7BL47xT5iR2Ut3M7i2fUwB7xZEfA4+xZ/orXalpan+9Jc3r i0DJFvYwsI1nb70sE5m8lmAalM9RlIVe2oyNBmA7jHq22QtHgBnL5xXS+uW+sphlCJYP OtVA== X-Received: by 10.180.89.100 with SMTP id bn4mr26431392wib.34.1407766996377; Mon, 11 Aug 2014 07:23:16 -0700 (PDT) Received: from minas-tirith.valinor (177.Red-79-159-63.staticIP.rima-tde.net. [79.159.63.177]) by mx.google.com with ESMTPSA id e3sm2038756wjp.4.2014.08.11.07.23.14 for (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 11 Aug 2014 07:23:15 -0700 (PDT) Sender: Carlos Robinson Received: from localhost (localhost [127.0.0.1]) by minas-tirith.valinor (Postfix) with ESMTP id E1C1918245D for ; Mon, 11 Aug 2014 16:23:10 +0200 (CEST) Date: Mon, 11 Aug 2014 16:23:01 +0200 (CEST) From: "Carlos E. R." X-X-Sender: cer@minas-tirith.valinor To: XFS mailing list Subject: Subject : Happened again, 20140811 -- Got "Internal error XFS_WANT_CORRUPTED_GOTO". Filesystem needs reformatting to correct issue. In-Reply-To: X-ASG-Orig-Subj: Subject : Happened again, 20140811 -- Got "Internal error XFS_WANT_CORRUPTED_GOTO". Filesystem needs reformatting to correct issue. Message-ID: References: User-Agent: Alpine 2.11 (LSU 23 2013-08-11) MIME-Version: 1.0 Content-Type: MULTIPART/MIXED; BOUNDARY="-1463779071-1278469637-1407766990=:2447" X-Barracuda-Connect: mail-we0-f177.google.com[74.125.82.177] X-Barracuda-Start-Time: 1407766997 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.8321 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 This message is in MIME format. The first part should be readable text, while the remaining parts are likely unreadable without MIME-aware tools. ---1463779071-1278469637-1407766990=:2447 Content-Type: TEXT/PLAIN; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8BIT -----BEGIN PGP SIGNED MESSAGE----- Hash: SHA256 El 2014-07-02 a las 11:57 +0200, Carlos E. R. escribió: > I got this error: Happened again, I'm on middle of recovery procedures, and using my laptop to post. The system did not "die", I could still use xterms owned by root. So I tried to use xfs_metadump before rebooting, but it refused, said that the partition was mounted (and I know from previous times that umounting fails or locks the machine). It also said that it could not intialize the XFS library. So I logged out, and issued "reboot" on tty1 as root. No go, it got stuck somewhere, and I had to hit the physical reset button on the machine. I have not looked at the logs yet. I am now running the machine off a live usb stick (13.1 XFCE rescue system) to avoid the automatics to fsck the home partition, and I already obtained a xfs_metadump of it. I post this in case you have some suggestion before I nuke the partition (rsync, reformat, etc). It shold take some hours. - -- Cheers Carlos E. R. (from 13.1 x86_64 "Bottle" (Minas Tirith)) -----BEGIN PGP SIGNATURE----- Version: GnuPG v2.0.22 (GNU/Linux) iF4EAREIAAYFAlPo0c4ACgkQja8UbcUWM1wIewD/eEwnzZpDjJLuytDOD9bqiypF ly6QCDckRvc2rVuCbwcA/0IX5tXGhAHr6izQvWol3F4RoxLk0uf74Ayn8lvSlDU0 =WAIZ -----END PGP SIGNATURE----- ---1463779071-1278469637-1407766990=:2447-- From bfoster@redhat.com Mon Aug 11 09:44: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 D7F1C7F3F for ; Mon, 11 Aug 2014 09:44:10 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 3D960AC004 for ; Mon, 11 Aug 2014 07:44:07 -0700 (PDT) X-ASG-Debug-ID: 1407768245-04cbb0508d926a0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id ZogptlbFC3ArOz5T (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 11 Aug 2014 07:44: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-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 s7BEi2Rn015747 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Mon, 11 Aug 2014 10:44:02 -0400 Received: from laptop.bfoster (vpn-58-175.rdu2.redhat.com [10.10.58.175]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s7BEi0cZ019507 (version=TLSv1/SSLv3 cipher=AES128-GCM-SHA256 bits=128 verify=NO); Mon, 11 Aug 2014 10:44:02 -0400 Date: Mon, 11 Aug 2014 10:44:00 -0400 From: Brian Foster To: "Carlos E. R." Cc: XFS mailing list Subject: Re: Subject : Happened again, 20140811 -- Got "Internal error XFS_WANT_CORRUPTED_GOTO". Filesystem needs reformatting to correct issue. Message-ID: <20140811144359.GA10217@laptop.bfoster> X-ASG-Orig-Subj: Re: Subject : Happened again, 20140811 -- Got "Internal error XFS_WANT_CORRUPTED_GOTO". Filesystem needs reformatting to correct issue. References: MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: User-Agent: Mutt/1.5.23 (2014-03-12) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.24 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1407768245 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Mon, Aug 11, 2014 at 04:23:01PM +0200, Carlos E. R. wrote: > -----BEGIN PGP SIGNED MESSAGE----- > Hash: SHA256 > > > > El 2014-07-02 a las 11:57 +0200, Carlos E. R. escribió: > > >I got this error: > > Happened again, I'm on middle of recovery procedures, and using my laptop to > post. > > > The system did not "die", I could still use xterms owned by root. So I tried > to use xfs_metadump before rebooting, but it refused, said that the > partition was mounted (and I know from previous times that umounting fails > or locks the machine). It also said that it could not intialize the XFS > library. > > So I logged out, and issued "reboot" on tty1 as root. No go, it got stuck > somewhere, and I had to hit the physical reset button on the machine. I have > not looked at the logs yet. > > I am now running the machine off a live usb stick (13.1 XFCE rescue system) > to avoid the automatics to fsck the home partition, and I already obtained a > xfs_metadump of it. > > I post this in case you have some suggestion before I nuke the partition > (rsync, reformat, etc). It shold take some hours. > Assuming you already have a pre-repair metadump, I'd suggest to xfs_repair, capture and post the repair output to the list and leave it at that (for now at least). I think you mentioned previously that the problem hits more frequently at this point, so I wonder if you could try to reproduce and get a better idea of what might contribute to the failure. For example, can you actively reproduce at this point? Perhaps get some work going on all of the applications you typically have running and run some hibernation cycles..? While a reformat might spare you from the issue for a bit, it's going to make it that much harder to get more information on what's going on. Brian > - -- Cheers > Carlos E. R. > > (from 13.1 x86_64 "Bottle" (Minas Tirith)) > -----BEGIN PGP SIGNATURE----- > Version: GnuPG v2.0.22 (GNU/Linux) > > iF4EAREIAAYFAlPo0c4ACgkQja8UbcUWM1wIewD/eEwnzZpDjJLuytDOD9bqiypF > ly6QCDckRvc2rVuCbwcA/0IX5tXGhAHr6izQvWol3F4RoxLk0uf74Ayn8lvSlDU0 > =WAIZ > -----END PGP SIGNATURE----- > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From tinguely@sgi.com Mon Aug 11 09:58: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=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 C64507F3F for ; Mon, 11 Aug 2014 09:58:01 -0500 (CDT) Received: from dhcp-128-162-232-117.americas.sgi.com (dhcp-128-162-232-117.americas.sgi.com [128.162.232.117]) by relay1.corp.sgi.com (Postfix) with ESMTP id 946908F8037 for ; Mon, 11 Aug 2014 07:57:58 -0700 (PDT) Message-ID: <53E8D9F6.7080704@sgi.com> Date: Mon, 11 Aug 2014 09:57:58 -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: Subject : Happened again, 20140811 -- Got "Internal error XFS_WANT_CORRUPTED_GOTO". Filesystem needs reformatting to correct issue. References: In-Reply-To: Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 8bit On 08/11/14 09:23, Carlos E. R. wrote: > -----BEGIN PGP SIGNED MESSAGE----- > Hash: SHA256 > > > > El 2014-07-02 a las 11:57 +0200, Carlos E. R. escribió: > >> I got this error: > > Happened again, I'm on middle of recovery procedures, and using my > laptop to post. > > > The system did not "die", I could still use xterms owned by root. So I > tried to use xfs_metadump before rebooting, but it refused, said that > the partition was mounted (and I know from previous times that umounting > fails or locks the machine). It also said that it could not intialize > the XFS library. > > So I logged out, and issued "reboot" on tty1 as root. No go, it got > stuck somewhere, and I had to hit the physical reset button on the > machine. I have not looked at the logs yet. > > I am now running the machine off a live usb stick (13.1 XFCE rescue > system) to avoid the automatics to fsck the home partition, and I > already obtained a xfs_metadump of it. > > I post this in case you have some suggestion before I nuke the partition > (rsync, reformat, etc). It shold take some hours. > > - -- Cheers > Carlos E. R. Where in the filesystem did the XFS_WANT_CORRUPTED_GOTO happen? I am interested in the metadata dump. Also, some one hit back to back duplicate block allocation XFS_WANT_CORRUPTED_GOTO bugs, you may want to do a metadata dump before and after the xfs_repair in case you hit it again soon. If this is a duplicate block allocation, some user blocks will have overwritten the metadata. --Mark. From robin.listas@gmail.com Mon Aug 11 09:59: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=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 C20B67F3F for ; Mon, 11 Aug 2014 09:59:01 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 7CE448F8040 for ; Mon, 11 Aug 2014 07:59:01 -0700 (PDT) X-ASG-Debug-ID: 1407769138-04bdf06ef6946e0001-NocioJ Received: from mail-we0-f171.google.com (mail-we0-f171.google.com [74.125.82.171]) by cuda.sgi.com with ESMTP id yPCEYs8fA5OSaBfm (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Mon, 11 Aug 2014 07:58:59 -0700 (PDT) X-Barracuda-Envelope-From: robin.listas@gmail.com X-Barracuda-Apparent-Source-IP: 74.125.82.171 Received: by mail-we0-f171.google.com with SMTP id p10so8791280wes.16 for ; Mon, 11 Aug 2014 07:58:58 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=sender:date:from:to:subject:in-reply-to:message-id:references :user-agent:mime-version:content-type:content-id; bh=cok1WZrJ/LlU6aSPQGP4Zl7uSz6VSr4o3TT/Lr3721o=; b=K9hAG/hJYOlBzolf/8aTmOuXwiphwjYrpNdqYR9eKy5QP06XcAZQGOHJ81cCxDL226 Mfn8SIxoMaDhm7CutW7g6aHiUqqsiGWWVSUSVZebdPl5FSIyQZyTijuaBQ3uFlFtawkI cr66CNi2Pah3g25/wO366p6vBc7ohfFOE4bFNgMthc9VGTakVniHDJApTZxLUiZd9Ijy jPY/PWK4gp1xTB2t9MFzC6xo89RpuPUZ4guh82YnEPOZ25aT0eb0qCTo2fKY/Y3WVzbr 1SlulpVorGuWzQ3xN8qf0ESdDXcW5mZmXp55A27IwdwKQkpWai6VZdQ+nJD6CzwhEwAt LQQg== X-Received: by 10.194.21.200 with SMTP id x8mr55651730wje.81.1407769138497; Mon, 11 Aug 2014 07:58:58 -0700 (PDT) Received: from minas-tirith.valinor (177.Red-79-159-63.staticIP.rima-tde.net. [79.159.63.177]) by mx.google.com with ESMTPSA id z5sm2139126wje.49.2014.08.11.07.58.57 for (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 11 Aug 2014 07:58:57 -0700 (PDT) Sender: Carlos Robinson Received: from localhost (localhost [127.0.0.1]) by minas-tirith.valinor (Postfix) with ESMTP id 9830F18245D for ; Mon, 11 Aug 2014 16:58:55 +0200 (CEST) Date: Mon, 11 Aug 2014 16:58:47 +0200 (CEST) From: "Carlos E. R." X-X-Sender: cer@minas-tirith.valinor To: XFS mailing list Subject: Re: Subject : Happened again, 20140811 -- Got "Internal error XFS_WANT_CORRUPTED_GOTO". Filesystem needs reformatting to correct issue. In-Reply-To: <20140811144359.GA10217@laptop.bfoster> X-ASG-Orig-Subj: Re: Subject : Happened again, 20140811 -- Got "Internal error XFS_WANT_CORRUPTED_GOTO". Filesystem needs reformatting to correct issue. Message-ID: References: <20140811144359.GA10217@laptop.bfoster> User-Agent: Alpine 2.11 (LSU 23 2013-08-11) MIME-Version: 1.0 Content-Type: MULTIPART/MIXED; BOUNDARY="-1463779071-1121377066-1407769065=:7326" Content-ID: X-Barracuda-Connect: mail-we0-f171.google.com[74.125.82.171] X-Barracuda-Start-Time: 1407769139 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.8322 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 This message is in MIME format. The first part should be readable text, while the remaining parts are likely unreadable without MIME-aware tools. ---1463779071-1121377066-1407769065=:7326 Content-Type: TEXT/PLAIN; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8BIT Content-ID: -----BEGIN PGP SIGNED MESSAGE----- Hash: SHA256 Content-ID: El 2014-08-11 a las 10:44 -0400, Brian Foster escribió: >> I post this in case you have some suggestion before I nuke the partition >> (rsync, reformat, etc). It shold take some hours. >> > > Assuming you already have a pre-repair metadump, I'd suggest to > xfs_repair, capture and post the repair output to the list and leave it > at that (for now at least). I think you mentioned previously that the > problem hits more frequently at this point, so I wonder if you could try > to reproduce and get a better idea of what might contribute to the > failure. > > For example, can you actively reproduce at this point? Perhaps get some > work going on all of the applications you typically have running and run > some hibernation cycles..? While a reformat might spare you from the > issue for a bit, it's going to make it that much harder to get more > information on what's going on. Ok, will do. I will create a backup of my partition, with xfsdump, after attempting repair of the partition, and reboot, and see (without the reformat cycle). At this instant I'm doing a full dd of the partition, just in case it becomes useful. - -- Cheers Carlos E. R. (from 13.1 x86_64 "Bottle" (Minas Tirith)) -----BEGIN PGP SIGNATURE----- Version: GnuPG v2.0.22 (GNU/Linux) iF4EAREIAAYFAlPo2i8ACgkQja8UbcUWM1wj3AD/T1eMkxiQUYSa6OBHvmTNj64g cF6Gi5Gjv/dsF4aIcL0A/0vHz3bFmvhzh7D/2ugvb84tj8NtHC1QWPrY6Lbw4FmW =8+lJ -----END PGP SIGNATURE----- ---1463779071-1121377066-1407769065=:7326-- From robin.listas@gmail.com Mon Aug 11 10:35: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=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 2C1BD7F3F for ; Mon, 11 Aug 2014 10:35:09 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 6DB2AAC003 for ; Mon, 11 Aug 2014 08:35:08 -0700 (PDT) X-ASG-Debug-ID: 1407771299-04cb6c4c9580890001-NocioJ Received: from mail-we0-f172.google.com (mail-we0-f172.google.com [74.125.82.172]) by cuda.sgi.com with ESMTP id hpVFA7EReDLHaOjb (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Mon, 11 Aug 2014 08:35:00 -0700 (PDT) X-Barracuda-Envelope-From: robin.listas@gmail.com X-Barracuda-Apparent-Source-IP: 74.125.82.172 Received: by mail-we0-f172.google.com with SMTP id x48so8810342wes.3 for ; Mon, 11 Aug 2014 08:34:59 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=sender:date:from:to:subject:in-reply-to:message-id:references :user-agent:mime-version:content-type; bh=KHvtjeK1gWoAWYZ8q/2ikauKidsv+ldkBohdPOJyxgk=; b=0jraqxtERgU7FE1NLaNG0JqDQ4A+R103FQ4TtnXz9J7SFNueSU5JuxcvZBAtMKWf21 QxM6cTu75IY1UP1b8qYqddsHPPk97aL+X6StG9unRNNZVG2OkN4htgrupsm9RW4R+Tia 2VEgQy5V2j4ryZv/BROMp1dvYGULhvXepIiFFZYbvE6+aOWJdGoinaZOgLKc9D6fHrpy rAHaQzOgeSn5wUiRi1Jx7AKsjG3G1benKP4wWr94B+2HeNDSIdU04J8t6tbxqqY8vudT bo93u4nX3J1WlaNO6VKqDbv410Em2Q5YcFhLL2J3mDSq2aM0QAI1i9KF1YlOJlkrogkU vksA== X-Received: by 10.180.73.235 with SMTP id o11mr26512928wiv.41.1407771299588; Mon, 11 Aug 2014 08:34:59 -0700 (PDT) Received: from minas-tirith.valinor (177.Red-79-159-63.staticIP.rima-tde.net. [79.159.63.177]) by mx.google.com with ESMTPSA id mw4sm45075734wic.20.2014.08.11.08.34.56 for (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 11 Aug 2014 08:34:58 -0700 (PDT) Sender: Carlos Robinson Received: from localhost (localhost [127.0.0.1]) by minas-tirith.valinor (Postfix) with ESMTP id 71C6B185A7D for ; Mon, 11 Aug 2014 17:34:54 +0200 (CEST) Date: Mon, 11 Aug 2014 17:34:46 +0200 (CEST) From: "Carlos E. R." X-X-Sender: cer@minas-tirith.valinor To: XFS mailing list Subject: Re: Subject : Happened again, 20140811 -- Got "Internal error XFS_WANT_CORRUPTED_GOTO". Filesystem needs reformatting to correct issue. In-Reply-To: <53E8D9F6.7080704@sgi.com> X-ASG-Orig-Subj: Re: Subject : Happened again, 20140811 -- Got "Internal error XFS_WANT_CORRUPTED_GOTO". Filesystem needs reformatting to correct issue. Message-ID: References: <53E8D9F6.7080704@sgi.com> User-Agent: Alpine 2.11 (LSU 23 2013-08-11) MIME-Version: 1.0 Content-Type: MULTIPART/MIXED; BOUNDARY="-1463779071-1326823490-1407771294=:7326" X-Barracuda-Connect: mail-we0-f172.google.com[74.125.82.172] X-Barracuda-Start-Time: 1407771300 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.32 X-Barracuda-Spam-Status: No, SCORE=0.32 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED, URI_HEX X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.8322 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.32 URI_HEX URI: URI hostname has long hexadecimal sequence This message is in MIME format. The first part should be readable text, while the remaining parts are likely unreadable without MIME-aware tools. ---1463779071-1326823490-1407771294=:7326 Content-Type: TEXT/PLAIN; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8BIT -----BEGIN PGP SIGNED MESSAGE----- Hash: SHA256 El 2014-08-11 a las 09:57 -0500, Mark Tinguely escribió: > On 08/11/14 09:23, Carlos E. R. wrote: > Where in the filesystem did the XFS_WANT_CORRUPTED_GOTO happen? This time? Did not look at the log yet. Let me see... Here is the full log of the event. It starts prior to hibernating, all things nominal. And ends on shutdown (had to hit reset button, despite what log says). If you want to see entries prior to that, since boot, I can do that. <3.6> 2014-08-11 05:15:01 Telcontar systemd 1 - - Starting Session 556 of user news. <3.6> 2014-08-11 05:18:01 Telcontar systemd 1 - - Starting Session 557 of user news. <3.6> 2014-08-11 05:20:01 Telcontar systemd 1 - - Starting Session 558 of user cer. <3.4> 2014-08-11 05:22:25 Telcontar pm-utils - - - Hibernating the system now (04)... <3.5> 2014-08-11 05:22:25 Telcontar pm-utils - - - There appears not be any pending nntp post to be sent. I just checked :-) <1.5> 2014-08-11 05:22:25 Telcontar network 5840 - - redirecting to "systemctl --signal=9 kill network.service" <3.5> 2014-08-11 05:22:25 Telcontar systemd 1 - - network@eth0.service: main process exited, code=killed, status=9/KILL <3.6> 2014-08-11 05:22:25 Telcontar systemd 1 - - Stopping LSB: Network time protocol daemon (ntpd)... <3.6> 2014-08-11 05:22:25 Telcontar ntp 5867 - - Shutting down network time protocol daemon (NTPD)..done <3.6> 2014-08-11 05:22:25 Telcontar systemd 1 - - Stopped LSB: Network time protocol daemon (ntpd). <3.4> 2014-08-11 05:22:25 Telcontar pm-utils - - - Hibernating (95)... <0.7> 2014-08-11 05:22:30 Telcontar kernel - - - [73220.857511] PM: Marking nosave pages: [mem 0x0009f000-0x000fffff] <0.7> 2014-08-11 05:22:30 Telcontar kernel - - - [73220.857516] PM: Marking nosave pages: [mem 0xbff90000-0xffffffff] <0.7> 2014-08-11 05:22:30 Telcontar kernel - - - [73220.858132] PM: Basic memory bitmaps created <0.4> 2014-08-11 15:17:18 Telcontar kernel - - - [73221.946553] Syncing filesystems ... done. <0.4> 2014-08-11 15:17:18 Telcontar kernel - - - [73222.682396] Freezing user space processes ... (elapsed 0.002 seconds) done. <0.6> 2014-08-11 15:17:18 Telcontar kernel - - - [73222.685031] PM: Preallocating image memory... done (allocated 1140745 pages) <0.6> 2014-08-11 15:17:18 Telcontar kernel - - - [73228.046524] PM: Allocated 4562980 kbytes in 5.36 seconds (851.30 MB/s) <0.4> 2014-08-11 15:17:18 Telcontar kernel - - - [73228.046645] Freezing remaining freezable tasks ... (elapsed 0.001 seconds) done. <0.4> 2014-08-11 15:17:18 Telcontar kernel - - - [73228.048553] Suspending console(s) (use no_console_suspend to debug) <0.6> 2014-08-11 15:17:18 Telcontar kernel - - - [73228.049663] serial 00:05: disabled <0.6> 2014-08-11 15:17:18 Telcontar kernel - - - [73228.260091] PM: freeze of devices complete after 211.420 msecs <0.6> 2014-08-11 15:17:18 Telcontar kernel - - - [73228.260391] PM: late freeze of devices complete after 0.298 msecs <0.6> 2014-08-11 15:17:18 Telcontar kernel - - - [73228.260939] PM: noirq freeze of devices complete after 0.545 msecs <0.4> 2014-08-11 15:17:18 Telcontar kernel - - - [73228.260940] Disabling non-boot CPUs ... <0.6> 2014-08-11 15:17:18 Telcontar kernel - - - [73228.262294] smpboot: CPU 1 is now offline <0.6> 2014-08-11 15:17:18 Telcontar kernel - - - [73228.264134] smpboot: CPU 2 is now offline <0.5> 2014-08-11 15:17:18 Telcontar kernel - - - [73228.265056] Broke affinity for irq 16 <0.6> 2014-08-11 15:17:18 Telcontar kernel - - - [73228.266103] smpboot: CPU 3 is now offline <0.6> 2014-08-11 15:17:18 Telcontar kernel - - - [73228.266614] PM: Creating hibernation image: <0.6> 2014-08-11 15:17:18 Telcontar kernel - - - [73228.267097] PM: Need to copy 920142 pages <0.7> 2014-08-11 15:17:18 Telcontar kernel - - - [73228.267097] PM: Normal pages needed: 920142 + 1024, available pages: 1176633 <0.6> 2014-08-11 15:17:18 Telcontar kernel - - - [73228.267097] microcode: CPU0 sig=0x1067a, pf=0x10, revision=0xa0b <0.6> 2014-08-11 15:17:18 Telcontar kernel - - - [73228.267097] Enabling non-boot CPUs ... <0.6> 2014-08-11 15:17:18 Telcontar kernel - - - [73228.267097] smpboot: Booting Node 0 Processor 1 APIC 0x1 <0.6> 2014-08-11 15:17:18 Telcontar kernel - - - [73228.280111] microcode: CPU1 sig=0x1067a, pf=0x10, revision=0xa0b <0.6> 2014-08-11 15:17:18 Telcontar kernel - - - [73228.280300] CPU1 is up <0.6> 2014-08-11 15:17:18 Telcontar kernel - - - [73228.280425] smpboot: Booting Node 0 Processor 2 APIC 0x2 <0.6> 2014-08-11 15:17:18 Telcontar kernel - - - [73228.293688] microcode: CPU2 sig=0x1067a, pf=0x10, revision=0xa0b <0.6> 2014-08-11 15:17:18 Telcontar kernel - - - [73228.293828] CPU2 is up <0.6> 2014-08-11 15:17:18 Telcontar kernel - - - [73228.293918] smpboot: Booting Node 0 Processor 3 APIC 0x3 <0.6> 2014-08-11 15:17:18 Telcontar kernel - - - [73228.307216] microcode: CPU3 sig=0x1067a, pf=0x10, revision=0xa0b <0.6> 2014-08-11 15:17:18 Telcontar kernel - - - [73228.307358] CPU3 is up <0.6> 2014-08-11 15:17:18 Telcontar kernel - - - [73228.335219] PM: noirq restore of devices complete after 22.779 msecs <0.6> 2014-08-11 15:17:18 Telcontar kernel - - - [73228.335354] PM: early restore of devices complete after 0.110 msecs <0.7> 2014-08-11 15:17:18 Telcontar kernel - - - [73228.508789] uhci_hcd 0000:00:1a.0: setting latency timer to 64 <0.4> 2014-08-11 15:17:18 Telcontar kernel - - - [73228.508809] usb usb3: root hub lost power or was reset <0.7> 2014-08-11 15:17:18 Telcontar kernel - - - [73228.508819] uhci_hcd 0000:00:1a.1: setting latency timer to 64 <0.4> 2014-08-11 15:17:18 Telcontar kernel - - - [73228.508836] usb usb4: root hub lost power or was reset <0.7> 2014-08-11 15:17:18 Telcontar kernel - - - [73228.508844] uhci_hcd 0000:00:1a.2: setting latency timer to 64 <0.4> 2014-08-11 15:17:18 Telcontar kernel - - - [73228.508861] usb usb5: root hub lost power or was reset <0.7> 2014-08-11 15:17:18 Telcontar kernel - - - [73228.508871] ehci-pci 0000:00:1a.7: setting latency timer to 64 <0.4> 2014-08-11 15:17:18 Telcontar kernel - - - [73228.508889] usb usb1: root hub lost power or was reset <0.7> 2014-08-11 15:17:18 Telcontar kernel - - - [73228.510138] uhci_hcd 0000:00:1d.0: setting latency timer to 64 <0.4> 2014-08-11 15:17:18 Telcontar kernel - - - [73228.510159] usb usb6: root hub lost power or was reset <0.7> 2014-08-11 15:17:18 Telcontar kernel - - - [73228.510168] uhci_hcd 0000:00:1d.1: setting latency timer to 64 <0.4> 2014-08-11 15:17:18 Telcontar kernel - - - [73228.510187] usb usb7: root hub lost power or was reset <0.7> 2014-08-11 15:17:18 Telcontar kernel - - - [73228.510196] uhci_hcd 0000:00:1d.2: setting latency timer to 64 <0.4> 2014-08-11 15:17:18 Telcontar kernel - - - [73228.510215] usb usb8: root hub lost power or was reset <0.7> 2014-08-11 15:17:18 Telcontar kernel - - - [73228.510225] ehci-pci 0000:00:1d.7: setting latency timer to 64 <0.4> 2014-08-11 15:17:18 Telcontar kernel - - - [73228.510235] usb usb2: root hub lost power or was reset <0.7> 2014-08-11 15:17:18 Telcontar kernel - - - [73228.512778] ehci-pci 0000:00:1a.7: cache line size of 32 is not supported <0.7> 2014-08-11 15:17:18 Telcontar kernel - - - [73228.512784] pci 0000:00:1e.0: setting latency timer to 64 <0.7> 2014-08-11 15:17:18 Telcontar kernel - - - [73228.512879] ata_piix 0000:00:1f.2: setting latency timer to 64 <0.7> 2014-08-11 15:17:18 Telcontar kernel - - - [73228.512934] ata_piix 0000:00:1f.5: setting latency timer to 64 <0.7> 2014-08-11 15:17:18 Telcontar kernel - - - [73228.514123] ehci-pci 0000:00:1d.7: cache line size of 32 is not supported <0.3> 2014-08-11 15:17:18 Telcontar kernel - - - [73228.611029] pciehp 0000:00:1c.3:pcie04: Device 0000:05:00.0 already exists at 0000:05:00, cannot hot-add <0.3> 2014-08-11 15:17:18 Telcontar kernel - - - [73228.611032] pciehp 0000:00:1c.0:pcie04: Device 0000:02:00.0 already exists at 0000:02:00, cannot hot-add <0.3> 2014-08-11 15:17:18 Telcontar kernel - - - [73228.611035] pciehp 0000:00:1c.2:pcie04: Device 0000:04:00.0 already exists at 0000:04:00, cannot hot-add <0.3> 2014-08-11 15:17:18 Telcontar kernel - - - [73228.611036] pciehp 0000:00:1c.3:pcie04: Cannot add device at 0000:05:00 <0.3> 2014-08-11 15:17:18 Telcontar kernel - - - [73228.611037] pciehp 0000:00:1c.0:pcie04: Cannot add device at 0000:02:00 <0.3> 2014-08-11 15:17:18 Telcontar kernel - - - [73228.611039] pciehp 0000:00:1c.2:pcie04: Cannot add device at 0000:04:00 <0.3> 2014-08-11 15:17:18 Telcontar kernel - - - [73228.611061] pciehp 0000:00:1c.4:pcie04: Device 0000:06:00.0 already exists at 0000:06:00, cannot hot-add <0.3> 2014-08-11 15:17:18 Telcontar kernel - - - [73228.611062] pciehp 0000:00:1c.4:pcie04: Cannot add device at 0000:06:00 <0.3> 2014-08-11 15:17:18 Telcontar kernel - - - [73228.611086] pciehp 0000:00:1c.5:pcie04: Device 0000:07:00.0 already exists at 0000:07:00, cannot hot-add <0.3> 2014-08-11 15:17:18 Telcontar kernel - - - [73228.611087] pciehp 0000:00:1c.5:pcie04: Cannot add device at 0000:07:00 <0.7> 2014-08-11 15:17:18 Telcontar kernel - - - [73228.611172] pata_jmicron 0000:05:00.1: setting latency timer to 64 <0.7> 2014-08-11 15:17:18 Telcontar kernel - - - [73228.611249] pata_jmicron 0000:04:00.1: setting latency timer to 64 <0.6> 2014-08-11 15:17:18 Telcontar kernel - - - [73228.614064] serial 00:05: activated <0.6> 2014-08-11 15:17:18 Telcontar kernel - - - [73228.775267] r8169 0000:06:00.0 eth0: link down <0.6> 2014-08-11 15:17:18 Telcontar kernel - - - [73228.837013] ata11: SATA link down (SStatus 0 SControl 300) <0.6> 2014-08-11 15:17:18 Telcontar kernel - - - [73228.837220] r8169 0000:07:00.0 eth1: link down <0.6> 2014-08-11 15:17:18 Telcontar kernel - - - [73228.916030] ata2: SATA link down (SStatus 0 SControl 300) <0.6> 2014-08-11 15:17:18 Telcontar kernel - - - [73228.916069] ata1: SATA link down (SStatus 0 SControl 300) <0.6> 2014-08-11 15:17:18 Telcontar kernel - - - [73228.920031] ata4: SATA link down (SStatus 0 SControl 300) <0.6> 2014-08-11 15:17:18 Telcontar kernel - - - [73228.930018] usb 1-2: reset high-speed USB device number 3 using ehci-pci <0.6> 2014-08-11 15:17:18 Telcontar kernel - - - [73228.988036] ata12: SATA link up 1.5 Gbps (SStatus 113 SControl 300) <0.6> 2014-08-11 15:17:18 Telcontar kernel - - - [73228.991149] ata12.00: ACPI cmd ef/03:45:00:00:00:a0 (SET FEATURES) filtered out <0.6> 2014-08-11 15:17:18 Telcontar kernel - - - [73228.991151] ata12.00: ACPI cmd ef/03:0c:00:00:00:a0 (SET FEATURES) filtered out <0.6> 2014-08-11 15:17:18 Telcontar kernel - - - [73228.991152] ata12.00: ACPI cmd f5/00:00:00:00:00:00 (SECURITY FREEZE LOCK) filtered out <0.6> 2014-08-11 15:17:18 Telcontar kernel - - - [73228.997133] ata12.00: configured for UDMA/100 <0.5> 2014-08-11 15:17:18 Telcontar kernel - - - [73229.069020] firewire_core 0000:08:02.0: rediscovered device fw0 <0.6> 2014-08-11 15:17:18 Telcontar kernel - - - [73229.074017] ata3: SATA link up 3.0 Gbps (SStatus 123 SControl 300) <0.6> 2014-08-11 15:17:18 Telcontar kernel - - - [73229.076182] ata3.00: configured for UDMA/133 <0.5> 2014-08-11 15:17:18 Telcontar kernel - - - [73229.076210] sd 2:0:0:0: [sda] Starting disk <0.6> 2014-08-11 15:17:18 Telcontar kernel - - - [73229.146014] usb 2-5: reset high-speed USB device number 2 using ehci-pci <0.6> 2014-08-11 15:17:18 Telcontar kernel - - - [73229.284050] ata9.00: SATA link up 3.0 Gbps (SStatus 123 SControl 300) <0.6> 2014-08-11 15:17:18 Telcontar kernel - - - [73229.284060] ata9.01: SATA link up 3.0 Gbps (SStatus 123 SControl 300) <0.6> 2014-08-11 15:17:18 Telcontar kernel - - - [73229.284167] ata10.00: SATA link up 3.0 Gbps (SStatus 123 SControl 300) <0.6> 2014-08-11 15:17:18 Telcontar kernel - - - [73229.284177] ata10.01: SATA link up 3.0 Gbps (SStatus 123 SControl 300) <0.6> 2014-08-11 15:17:18 Telcontar kernel - - - [73229.287190] ata9.01: ACPI cmd ef/03:45:00:00:00:b0 (SET FEATURES) filtered out <0.6> 2014-08-11 15:17:18 Telcontar kernel - - - [73229.287191] ata9.01: ACPI cmd ef/03:0c:00:00:00:b0 (SET FEATURES) filtered out <0.6> 2014-08-11 15:17:18 Telcontar kernel - - - [73229.287241] ata10.01: ACPI cmd ef/03:45:00:00:00:b0 (SET FEATURES) filtered out <0.6> 2014-08-11 15:17:18 Telcontar kernel - - - [73229.287242] ata10.01: ACPI cmd ef/03:0c:00:00:00:b0 (SET FEATURES) filtered out <0.7> 2014-08-11 15:17:18 Telcontar kernel - - - [73229.287362] ata9.01: ACPI cmd c6/00:10:00:00:00:b0 (SET MULTIPLE MODE) succeeded <0.6> 2014-08-11 15:17:18 Telcontar kernel - - - [73229.287364] ata9.01: ACPI cmd f5/00:00:00:00:00:00 (SECURITY FREEZE LOCK) filtered out <0.7> 2014-08-11 15:17:18 Telcontar kernel - - - [73229.287457] ata10.01: ACPI cmd c6/00:10:00:00:00:b0 (SET MULTIPLE MODE) succeeded <0.6> 2014-08-11 15:17:18 Telcontar kernel - - - [73229.287459] ata10.01: ACPI cmd f5/00:00:00:00:00:00 (SECURITY FREEZE LOCK) filtered out <0.6> 2014-08-11 15:17:18 Telcontar kernel - - - [73229.293185] ata10.00: ACPI cmd ef/03:45:00:00:00:a0 (SET FEATURES) filtered out <0.6> 2014-08-11 15:17:18 Telcontar kernel - - - [73229.293186] ata10.00: ACPI cmd ef/03:0c:00:00:00:a0 (SET FEATURES) filtered out <0.6> 2014-08-11 15:17:18 Telcontar kernel - - - [73229.293236] ata9.00: ACPI cmd ef/03:45:00:00:00:a0 (SET FEATURES) filtered out <0.6> 2014-08-11 15:17:18 Telcontar kernel - - - [73229.293237] ata9.00: ACPI cmd ef/03:0c:00:00:00:a0 (SET FEATURES) filtered out <0.7> 2014-08-11 15:17:18 Telcontar kernel - - - [73229.293378] ata10.00: ACPI cmd c6/00:10:00:00:00:a0 (SET MULTIPLE MODE) succeeded <0.6> 2014-08-11 15:17:18 Telcontar kernel - - - [73229.293379] ata10.00: ACPI cmd f5/00:00:00:00:00:00 (SECURITY FREEZE LOCK) filtered out <0.7> 2014-08-11 15:17:18 Telcontar kernel - - - [73229.293443] ata9.00: ACPI cmd c6/00:10:00:00:00:a0 (SET MULTIPLE MODE) succeeded <0.6> 2014-08-11 15:17:18 Telcontar kernel - - - [73229.293445] ata9.00: ACPI cmd f5/00:00:00:00:00:00 (SECURITY FREEZE LOCK) filtered out <0.6> 2014-08-11 15:17:18 Telcontar kernel - - - [73229.302319] ata9.00: configured for UDMA/133 <0.6> 2014-08-11 15:17:18 Telcontar kernel - - - [73229.308304] ata9.01: configured for UDMA/133 <0.5> 2014-08-11 15:17:18 Telcontar kernel - - - [73229.308337] sd 8:0:0:0: [sdb] Starting disk <0.5> 2014-08-11 15:17:18 Telcontar kernel - - - [73229.308338] sd 8:0:1:0: [sdc] Starting disk <0.6> 2014-08-11 15:17:18 Telcontar kernel - - - [73229.318322] ata10.00: configured for UDMA/133 <0.6> 2014-08-11 15:17:18 Telcontar kernel - - - [73229.324321] ata10.01: configured for UDMA/133 <0.5> 2014-08-11 15:17:18 Telcontar kernel - - - [73229.324351] sd 9:0:1:0: [sde] Starting disk <0.5> 2014-08-11 15:17:18 Telcontar kernel - - - [73229.324352] sd 9:0:0:0: [sdd] Starting disk <0.6> 2014-08-11 15:17:18 Telcontar kernel - - - [73229.512018] usb 3-1: reset low-speed USB device number 2 using uhci_hcd <0.6> 2014-08-11 15:17:18 Telcontar kernel - - - [73230.057013] usb 8-2: reset low-speed USB device number 2 using uhci_hcd <0.6> 2014-08-11 15:17:18 Telcontar kernel - - - [73230.408094] usb 2-5.4: reset high-speed USB device number 4 using ehci-pci <0.6> 2014-08-11 15:17:18 Telcontar kernel - - - [73230.798419] r8169 0000:06:00.0 eth0: link up <0.6> 2014-08-11 15:17:18 Telcontar kernel - - - [73231.245103] PM: restore of devices complete after 2736.365 msecs <0.4> 2014-08-11 15:17:18 Telcontar kernel - - - [73231.514298] Restarting kernel threads ... done. <0.4> 2014-08-11 15:17:18 Telcontar kernel - - - [73231.518736] Restarting tasks ... done. <0.7> 2014-08-11 15:17:18 Telcontar kernel - - - [73231.562307] PM: Basic memory bitmaps freed <3.4> 2014-08-11 15:17:19 Telcontar rtkit-daemon 4535 - - The canary thread is apparently starving. Taking action. <3.6> 2014-08-11 15:17:19 Telcontar rtkit-daemon 4535 - - Demoting known real-time threads. <3.5> 2014-08-11 15:17:19 Telcontar rtkit-daemon 4535 - - Successfully demoted thread 4541 of process 4534 (/usr/bin/pulseaudio). <3.5> 2014-08-11 15:17:19 Telcontar rtkit-daemon 4535 - - Successfully demoted thread 4540 of process 4534 (/usr/bin/pulseaudio). <3.5> 2014-08-11 15:17:19 Telcontar rtkit-daemon 4535 - - Successfully demoted thread 4534 of process 4534 (/usr/bin/pulseaudio). <3.5> 2014-08-11 15:17:19 Telcontar rtkit-daemon 4535 - - Demoted 3 threads. <0.1> 2014-08-11 15:17:22 Telcontar kernel - - - [73235.439809] XFS: Internal error XFS_WANT_CORRUPTED_GOTO at line 1602 of file /home/abuild/rpmbuild/BUILD/kernel-desktop-3.1 <0.1> 2014-08-11 15:17:22 Telcontar kernel - - - [73235.439809]. <0.4> 2014-08-11 15:17:22 Telcontar kernel - - - [73235.440155] CPU: 0 PID: 6255 Comm: kworker/0:7 Tainted: P O 3.11.10-17-desktop #1 <0.4> 2014-08-11 15:17:22 Telcontar kernel - - - [73235.440322] Hardware name: MICRO-STAR INTERNATIONAL CO.,LTD MS-7516/MS-7516, BIOS V1.5 10/10/2008 <0.4> 2014-08-11 15:17:22 Telcontar kernel - - - [73235.440361] Workqueue: xfs-eofblocks/sdd5 xfs_eofblocks_worker [xfs] <0.4> 2014-08-11 15:17:22 Telcontar kernel - - - [73235.440364] 0000000000000001 ffffffff815a0402 000000000010c9d3 ffffffffa0c38996 <0.4> 2014-08-11 15:17:22 Telcontar kernel - - - [73235.440365] ffff880211412b00 ffff88023448dd80 ffff88023fb95cb0 0000000000000001 <0.4> 2014-08-11 15:17:22 Telcontar kernel - - - [73235.440366] 0000000000000000 0000000100000000 0000000000000000 0000000000000001 <0.4> 2014-08-11 15:17:22 Telcontar kernel - - - [73235.440367] Call Trace: <0.4> 2014-08-11 15:17:22 Telcontar kernel - - - [73235.440377] [] dump_trace+0x88/0x310 <0.4> 2014-08-11 15:17:22 Telcontar kernel - - - [73235.440380] [] show_stack_log_lvl+0xd0/0x1d0 <0.4> 2014-08-11 15:17:22 Telcontar kernel - - - [73235.440382] [] show_stack+0x1c/0x50 <0.4> 2014-08-11 15:17:22 Telcontar kernel - - - [73235.440385] [] dump_stack+0x50/0x89 <0.4> 2014-08-11 15:17:22 Telcontar kernel - - - [73235.440399] [] xfs_free_ag_extent+0x226/0x860 [xfs] <0.4> 2014-08-11 15:17:22 Telcontar kernel - - - [73235.440442] [] xfs_free_extent+0xb9/0xf0 [xfs] <0.4> 2014-08-11 15:17:22 Telcontar kernel - - - [73235.440484] [] xfs_bmap_finish+0x11e/0x170 [xfs] <0.4> 2014-08-11 15:17:22 Telcontar kernel - - - [73235.440534] [] xfs_itruncate_extents+0x190/0x340 [xfs] <0.4> 2014-08-11 15:17:22 Telcontar kernel - - - [73235.440597] [] xfs_free_eofblocks+0x1e3/0x260 [xfs] <0.4> 2014-08-11 15:17:22 Telcontar kernel - - - [73235.440633] [] xfs_inode_free_eofblocks+0x6f/0x150 [xfs] <0.4> 2014-08-11 15:17:22 Telcontar kernel - - - [73235.440662] [] xfs_inode_ag_walk.isra.10+0x1c2/0x310 [xfs] <0.4> 2014-08-11 15:17:22 Telcontar kernel - - - [73235.440690] [] xfs_inode_ag_iterator_tag+0x6e/0xb0 [xfs] <0.4> 2014-08-11 15:17:22 Telcontar kernel - - - [73235.440718] [] xfs_eofblocks_worker+0x12/0x20 [xfs] <0.4> 2014-08-11 15:17:22 Telcontar kernel - - - [73235.440737] [] process_one_work+0x168/0x490 <0.4> 2014-08-11 15:17:22 Telcontar kernel - - - [73235.440739] [] worker_thread+0x114/0x3a0 <0.4> 2014-08-11 15:17:22 Telcontar kernel - - - [73235.440742] [] kthread+0xaf/0xc0 <0.4> 2014-08-11 15:17:22 Telcontar kernel - - - [73235.440746] [] ret_from_fork+0x7c/0xb0 <0.5> 2014-08-11 15:17:22 Telcontar kernel - - - [73235.440751] XFS (sdd5): xfs_do_force_shutdown(0x8) called from line 916 of file /home/abuild/rpmbuild/BUILD/kernel-desktop- <0.1> 2014-08-11 15:17:22 Telcontar kernel - - - [73235.498979] XFS (sdd5): Corruption of in-memory data detected. Shutting down filesystem <0.1> 2014-08-11 15:17:22 Telcontar kernel - - - [73235.499136] XFS (sdd5): Please umount the filesystem and rectify the problem(s) <3.6> 2014-08-11 15:17:22 Telcontar systemd 1 - - Time has been changed <3.6> 2014-08-11 15:17:27 Telcontar acpid - - - 1 client rule loaded <3.4> 2014-08-11 15:17:29 Telcontar pm-utils - - - Thawing (95)... <3.5> 2014-08-11 15:17:30 Telcontar dbus 1020 - - [system] Activating service name='org.freedesktop.PackageKit' (using servicehelper) <3.6> 2014-08-11 15:17:30 Telcontar systemd 1 - - Starting LSB: Network time protocol daemon (ntpd)... <0.4> 2014-08-11 15:17:30 Telcontar kernel - - - [73244.256012] XFS (sdd5): xfs_log_force: error 5 returned. <3.5> 2014-08-11 15:17:31 Telcontar dbus 1020 - - [system] Activated service 'org.freedesktop.PackageKit' failed: Cannot launch daemon, file not found or permissions invalid <1.5> 2014-08-11 15:17:31 Telcontar network 6315 - - redirecting to "systemctl restart network.service" <3.6> 2014-08-11 15:17:32 Telcontar systemd 1 - - Stopping ifup managed network interface eth1... <3.6> 2014-08-11 15:17:32 Telcontar systemd 1 - - Stopping ifup managed network interface eth0... <3.6> 2014-08-11 15:17:32 Telcontar systemd 1 - - Stopping LSB: Configure network interfaces and set up routing... <3.6> 2014-08-11 15:17:32 Telcontar systemd 1 - - Starting LSB: Configure network interfaces and set up routing... <3.6> 2014-08-11 15:17:32 Telcontar ifdown 6352 - - touch: cannot touch ‘/dev/.sysconfig/network/tmp/if-eth0.6352’: No such file or directory <3.6> 2014-08-11 15:17:32 Telcontar ifdown 6352 - - scripts/functions: line 1221: /dev/.sysconfig/network/tmp/if-eth0.6352.tmp: No such file or directory <3.6> 2014-08-11 15:17:32 Telcontar ifdown 6352 - - scripts/functions: line 1239: /dev/.sysconfig/network/tmp/if-eth0.6352.tmp: No such file or directory <3.6> 2014-08-11 15:17:32 Telcontar ifdown 6352 - - cat: /dev/.sysconfig/network/tmp/if-eth0.6352: No such file or directory <3.6> 2014-08-11 15:17:34 Telcontar ntp 6314 - - 11 Aug 15:17:34 sntp[6505]: Started sntp <3.6> 2014-08-11 15:17:34 Telcontar ifdown 6352 - - eth0 device: Realtek Semiconductor Co., Ltd. RTL8111/8168/8411 PCI Express Gigabit Ethernet Controller (rev 02) <1.5> 2014-08-11 15:17:34 Telcontar ifdown 6352 - - eth0 device: Realtek Semiconductor Co., Ltd. RTL8111/8168/8411 PCI Express Gigabit Ethernet Controller (rev 02) <3.6> 2014-08-11 15:17:34 Telcontar ifdown 6351 - - eth1 device: Realtek Semiconductor Co., Ltd. RTL8111/8168/8411 PCI Express Gigabit Ethernet Controller (rev 02) <1.5> 2014-08-11 15:17:34 Telcontar ifdown 6351 - - eth1 device: Realtek Semiconductor Co., Ltd. RTL8111/8168/8411 PCI Express Gigabit Ethernet Controller (rev 02) <3.6> 2014-08-11 15:17:34 Telcontar network 6384 - - Setting up network interfaces: <3.6> 2014-08-11 15:17:34 Telcontar network 6384 - - lo <1.5> 2014-08-11 15:17:34 Telcontar ifup 6924 - - lo <1.5> 2014-08-11 15:17:35 Telcontar ifup 6924 - - lo <1.5> 2014-08-11 15:17:35 Telcontar ifup 6924 - - IP address: 127.0.0.1/8 <3.6> 2014-08-11 15:17:35 Telcontar network 6384 - - lo IP address: 127.0.0.1/8 <1.5> 2014-08-11 15:17:35 Telcontar ifup 6924 - -. <16.3> 2014-08-11 15:17:38 Telcontar dhcpcd 7162 - - eth1: dhcpcd not running <16.6> 2014-08-11 15:17:38 Telcontar dhcpcd 7162 - - eth1: exiting <3.5> 2014-08-11 15:17:38 Telcontar systemd 1 - - Unit network@eth0.service entered failed state. <3.6> 2014-08-11 15:17:38 Telcontar systemd 1 - - Starting ifup managed network interface eth0... <3.6> 2014-08-11 15:17:38 Telcontar avahi-daemon 1007 - - Interface eth0.IPv6 no longer relevant for mDNS. <3.6> 2014-08-11 15:17:38 Telcontar avahi-daemon 1007 - - Leaving mDNS multicast group on interface eth0.IPv6 with address fc00::14. <3.6> 2014-08-11 15:17:38 Telcontar avahi-daemon 1007 - - Interface eth0.IPv4 no longer relevant for mDNS. <3.6> 2014-08-11 15:17:38 Telcontar avahi-daemon 1007 - - Leaving mDNS multicast group on interface eth0.IPv4 with address 192.168.1.14. <3.6> 2014-08-11 15:17:38 Telcontar avahi-daemon 1007 - - Withdrawing address record for fc00::14 on eth0. <3.6> 2014-08-11 15:17:38 Telcontar avahi-daemon 1007 - - Withdrawing address record for 192.168.1.14 on eth0. <3.6> 2014-08-11 15:17:38 Telcontar ifup 7226 - - eth0 device: Realtek Semiconductor Co., Ltd. RTL8111/8168/8411 PCI Express Gigabit Ethernet Controller (rev 02) <1.5> 2014-08-11 15:17:38 Telcontar ifup 7226 - - eth0 device: Realtek Semiconductor Co., Ltd. RTL8111/8168/8411 PCI Express Gigabit Ethernet Controller (rev 02) <0.6> 2014-08-11 15:17:38 Telcontar kernel - - - [73251.792336] r8169 0000:06:00.0 eth0: link down <0.6> 2014-08-11 15:17:38 Telcontar kernel - - - [73251.792353] r8169 0000:06:00.0 eth0: link down <0.6> 2014-08-11 15:17:38 Telcontar kernel - - - [73251.792366] IPv6: ADDRCONF(NETDEV_UP): eth0: link is not ready <3.6> 2014-08-11 15:17:38 Telcontar avahi-daemon 1007 - - Joining mDNS multicast group on interface eth0.IPv4 with address 192.168.1.14. <3.6> 2014-08-11 15:17:38 Telcontar avahi-daemon 1007 - - New relevant interface eth0.IPv4 for mDNS. <3.6> 2014-08-11 15:17:38 Telcontar avahi-daemon 1007 - - Registering new address record for 192.168.1.14 on eth0.IPv4. <3.6> 2014-08-11 15:17:39 Telcontar systemd 1 - - Starting ifup managed network interface eth1... <3.6> 2014-08-11 15:17:39 Telcontar ifplugd(eth1) 7541 - - ifplugd 0.28 initializing. <0.6> 2014-08-11 15:17:39 Telcontar kernel - - - [73252.646313] r8169 0000:07:00.0 eth1: link down <0.6> 2014-08-11 15:17:39 Telcontar kernel - - - [73252.646341] IPv6: ADDRCONF(NETDEV_UP): eth1: link is not ready <3.6> 2014-08-11 15:17:39 Telcontar ifplugd(eth1) 7541 - - Using interface eth1/00:21:85:16:2D:0C with driver (version: 2.3LK-NAPI) <3.6> 2014-08-11 15:17:39 Telcontar ifplugd(eth1) 7541 - - Using detection mode: SIOCETHTOOL <3.6> 2014-08-11 15:17:39 Telcontar ifplugd(eth1) 7541 - - Initialization complete, link beat not detected. <1.5> 2014-08-11 15:17:39 Telcontar ifup 7521 - - eth1 device: Realtek Semiconductor Co., Ltd. RTL8111/8168/8411 PCI Express Gigabit Ethernet Controller (rev 02) <1.5> 2014-08-11 15:17:39 Telcontar ifup 7521 - - eth1 is controlled by ifplugd <3.6> 2014-08-11 15:17:39 Telcontar ifup 7521 - - eth1 device: Realtek Semiconductor Co., Ltd. RTL8111/8168/8411 PCI Express Gigabit Ethernet Controller (rev 02) <3.6> 2014-08-11 15:17:39 Telcontar ifup 7521 - - eth1 is controlled by ifplugd <3.6> 2014-08-11 15:17:39 Telcontar systemd 1 - - Started ifup managed network interface eth1. <0.6> 2014-08-11 15:17:40 Telcontar kernel - - - [73253.958299] r8169 0000:06:00.0 eth0: link up <0.6> 2014-08-11 15:17:40 Telcontar kernel - - - [73253.958306] IPv6: ADDRCONF(NETDEV_CHANGE): eth0: link becomes ready <3.6> 2014-08-11 15:17:41 Telcontar avahi-daemon 1007 - - Joining mDNS multicast group on interface eth0.IPv6 with address fe80::221:85ff:fe16:2d0b. <3.6> 2014-08-11 15:17:41 Telcontar avahi-daemon 1007 - - New relevant interface eth0.IPv6 for mDNS. <3.6> 2014-08-11 15:17:41 Telcontar avahi-daemon 1007 - - Registering new address record for fe80::221:85ff:fe16:2d0b on eth0.*. <3.6> 2014-08-11 15:17:42 Telcontar avahi-daemon 1007 - - Leaving mDNS multicast group on interface eth0.IPv6 with address fe80::221:85ff:fe16:2d0b. <3.6> 2014-08-11 15:17:42 Telcontar avahi-daemon 1007 - - Joining mDNS multicast group on interface eth0.IPv6 with address fc00::14. <3.6> 2014-08-11 15:17:42 Telcontar avahi-daemon 1007 - - Registering new address record for fc00::14 on eth0.*. <3.6> 2014-08-11 15:17:42 Telcontar avahi-daemon 1007 - - Withdrawing address record for fe80::221:85ff:fe16:2d0b on eth0. <3.6> 2014-08-11 15:17:44 Telcontar ntp 6314 - - 11 Aug 15:17:44 sntp[6505]: Received no useable packet from 192.168.1.15! <3.6> 2014-08-11 15:17:44 Telcontar ntp 6314 - - 11 Aug 15:17:44 sntp[7926]: Started sntp <3.6> 2014-08-11 15:17:44 Telcontar systemd 1 - - Time has been changed <3.6> 2014-08-11 15:17:44 Telcontar ntp 6314 - - 2014-08-11 15:17:44.656291 (-0100) -0.112718 +/- 0.037338 secs <3.6> 2014-08-11 15:17:44 Telcontar ntp 6314 - - 2014-08-11 15:17:44.604369 (-0100) +0.0081 +/- 0.069473 secs <3.6> 2014-08-11 15:17:44 Telcontar ntp 6314 - - Time synchronized with 0.pool.ntp.org <4.6> 2014-08-11 15:17:45 Telcontar SuSEfirewall2 - - - Setting up rules from /etc/sysconfig/SuSEfirewall2 ... <4.6> 2014-08-11 15:17:45 Telcontar SuSEfirewall2 - - - using default zone 'ext' for interface eth1 <4.6> 2014-08-11 15:17:45 Telcontar SuSEfirewall2 - - - Firewall customary rules loaded from /etc/sysconfig/scripts/SuSEfirewall2-custom <3.5> 2014-08-11 15:17:45 Telcontar ntpd 7991 - - ntpd 4.2.6p5@1.2349-o Tue Jul 22 08:26:41 UTC 2014 (1) <3.6> 2014-08-11 15:17:45 Telcontar ntp 6314 - - Starting network time protocol daemon (NTPD)..done <3.6> 2014-08-11 15:17:44 Telcontar systemd 1 - - Time has been changed <3.6> 2014-08-11 15:17:45 Telcontar systemd 1 - - Started LSB: Network time protocol daemon (ntpd). <3.5> 2014-08-11 15:17:45 Telcontar ntpd 8017 - - proto: precision = 1.613 usec <3.7> 2014-08-11 15:17:46 Telcontar ntpd 8017 - - ntp_io: estimated max descriptors: 1024, initial socket boundary: 16 <3.6> 2014-08-11 15:17:46 Telcontar ntpd 8017 - - Listen and drop on 0 v4wildcard 0.0.0.0 UDP 123 <3.6> 2014-08-11 15:17:46 Telcontar ntpd 8017 - - Listen and drop on 1 v6wildcard :: UDP 123 <3.6> 2014-08-11 15:17:46 Telcontar ntpd 8017 - - Listen normally on 2 lo 127.0.0.1 UDP 123 <3.6> 2014-08-11 15:17:46 Telcontar ntpd 8017 - - Listen normally on 3 eth0 192.168.1.14 UDP 123 <3.6> 2014-08-11 15:17:46 Telcontar ntpd 8017 - - Listen normally on 4 lo ::1 UDP 123 <3.6> 2014-08-11 15:17:46 Telcontar ntpd 8017 - - Listen normally on 5 eth0 fe80::221:85ff:fe16:2d0b UDP 123 <3.6> 2014-08-11 15:17:46 Telcontar ntpd 8017 - - Listen normally on 6 eth0 fc00::14 UDP 123 <3.6> 2014-08-11 15:17:46 Telcontar ntpd 8017 - - peers refreshed <3.6> 2014-08-11 15:17:46 Telcontar ntpd 8017 - - Listening on routing socket on fd #23 for interface updates <3.5> 2014-08-11 15:17:46 Telcontar ntpd 8017 - - logging to file /var/log/ntp <4.6> 2014-08-11 15:17:48 Telcontar SuSEfirewall2 - - - Firewall rules successfully set <3.6> 2014-08-11 15:17:48 Telcontar avahi-autoipd(eth0) 8434 - - Found user 'avahi-autoipd' (UID 495) and group 'avahi-autoipd' (GID 491). <3.6> 2014-08-11 15:17:48 Telcontar avahi-autoipd(eth0) 8434 - - Successfully called chroot(). <3.6> 2014-08-11 15:17:48 Telcontar avahi-autoipd(eth0) 8434 - - Successfully dropped root privileges. <3.6> 2014-08-11 15:17:48 Telcontar avahi-autoipd(eth0) 8434 - - Starting with address 169.254.3.89 <3.6> 2014-08-11 15:17:48 Telcontar avahi-autoipd(eth0) 8434 - - Routable address already assigned, sleeping. <3.6> 2014-08-11 15:17:50 Telcontar systemd 1 - - Started ifup managed network interface eth0. <3.6> 2014-08-11 15:17:50 Telcontar systemd 1 - - Started ifup managed network interface eth1. <3.6> 2014-08-11 15:17:50 Telcontar network 6384 - - ..done..done..done ppp0 Startmode is 'manual' -> skipping <1.5> 2014-08-11 15:17:50 Telcontar ifup 8500 - - ppp0 Startmode is 'manual' -> skipping <3.6> 2014-08-11 15:17:50 Telcontar network 6384 - - ..skippedSetting up service network . . . . . . . . . . . . ...done <3.6> 2014-08-11 15:17:50 Telcontar systemd 1 - - Started LSB: Configure network interfaces and set up routing. <3.4> 2014-08-11 15:17:52 Telcontar pm-utils - - - Thawing the system now (04)... <0.6> 2014-08-11 15:17:55 Telcontar kernel - - - [73268.481672] Chrome_ChildThr[5680]: segfault at 0 ip 00007ffcedf71598 sp 00007ffce1821410 error 6 in libmozalloc.so[7ffcedf7 <0.4> 2014-08-11 15:18:00 Telcontar kernel - - - [73274.336014] XFS (sdd5): xfs_log_force: error 5 returned. <3.6> 2014-08-11 15:18:01 Telcontar systemd 1 - - Starting Session 559 of user news. <3.4> 2014-08-11 15:18:16 Telcontar router - - - (Thawing 04) Logging the current IP= 79.159.63.177 <0.4> 2014-08-11 15:18:31 Telcontar kernel - - - [73304.416012] XFS (sdd5): xfs_log_force: error 5 returned. <0.4> 2014-08-11 15:19:01 Telcontar kernel - - - [73334.496014] XFS (sdd5): xfs_log_force: error 5 returned. <0.4> 2014-08-11 15:19:31 Telcontar kernel - - - [73364.576016] XFS (sdd5): xfs_log_force: error 5 returned. <0.4> 2014-08-11 15:20:01 Telcontar kernel - - - [73394.656015] XFS (sdd5): xfs_log_force: error 5 returned. <3.6> 2014-08-11 15:20:01 Telcontar systemd 1 - - Starting Session 560 of user cer. <0.4> 2014-08-11 15:20:31 Telcontar kernel - - - [73424.736049] XFS (sdd5): xfs_log_force: error 5 returned. <0.4> 2014-08-11 15:21:01 Telcontar kernel - - - [73454.816016] XFS (sdd5): xfs_log_force: error 5 returned. <0.4> 2014-08-11 15:21:31 Telcontar kernel - - - [73484.896015] XFS (sdd5): xfs_log_force: error 5 returned. <0.4> 2014-08-11 15:22:01 Telcontar kernel - - - [73514.976016] XFS (sdd5): xfs_log_force: error 5 returned. <0.4> 2014-08-11 15:22:31 Telcontar kernel - - - [73545.056018] XFS (sdd5): xfs_log_force: error 5 returned. <3.6> 2014-08-11 15:23:01 Telcontar systemd 1 - - Starting Session 561 of user news. <0.4> 2014-08-11 15:23:01 Telcontar kernel - - - [73575.136025] XFS (sdd5): xfs_log_force: error 5 returned. <0.4> 2014-08-11 15:23:31 Telcontar kernel - - - [73605.216014] XFS (sdd5): xfs_log_force: error 5 returned. <3.6> 2014-08-11 15:23:52 Telcontar smartd 1013 - - Device: /dev/sdb [SAT], Temperature changed -5 Celsius to 33 Celsius (Min/Max 19/38) <0.4> 2014-08-11 15:24:01 Telcontar kernel - - - [73635.296078] XFS (sdd5): xfs_log_force: error 5 returned. <0.4> 2014-08-11 15:24:32 Telcontar kernel - - - [73665.376020] XFS (sdd5): xfs_log_force: error 5 returned. <3.6> 2014-08-11 15:25:01 Telcontar systemd 1 - - Starting Session 562 of user news. <0.4> 2014-08-11 15:25:02 Telcontar kernel - - - [73695.456011] XFS (sdd5): xfs_log_force: error 5 returned. <0.4> 2014-08-11 15:25:32 Telcontar kernel - - - [73725.536015] XFS (sdd5): xfs_log_force: error 5 returned. <0.4> 2014-08-11 15:26:02 Telcontar kernel - - - [73755.616017] XFS (sdd5): xfs_log_force: error 5 returned. <0.4> 2014-08-11 15:26:32 Telcontar kernel - - - [73785.696017] XFS (sdd5): xfs_log_force: error 5 returned. <0.4> 2014-08-11 15:27:02 Telcontar kernel - - - [73815.776016] XFS (sdd5): xfs_log_force: error 5 returned. <0.4> 2014-08-11 15:27:32 Telcontar kernel - - - [73845.856021] XFS (sdd5): xfs_log_force: error 5 returned. <3.6> 2014-08-11 15:28:01 Telcontar systemd 1 - - Starting Session 563 of user news. <0.4> 2014-08-11 15:28:02 Telcontar kernel - - - [73875.936014] XFS (sdd5): xfs_log_force: error 5 returned. <0.4> 2014-08-11 15:28:32 Telcontar kernel - - - [73906.016015] XFS (sdd5): xfs_log_force: error 5 returned. <0.4> 2014-08-11 15:29:02 Telcontar kernel - - - [73936.096017] XFS (sdd5): xfs_log_force: error 5 returned. <0.4> 2014-08-11 15:29:32 Telcontar kernel - - - [73966.176012] XFS (sdd5): xfs_log_force: error 5 returned. <3.6> 2014-08-11 15:30:01 Telcontar systemd 1 - - Starting Session 564 of user root. <3.6> 2014-08-11 15:30:01 Telcontar systemd 1 - - Starting Session 565 of user cer. <1.6> 2014-08-11 15:30:01 Telcontar run-crons 8974 - - suse.de-snapper: OK <4.5> 2014-08-11 15:30:01 Telcontar su - - - (to root) root on (null) <10.3> 2014-08-11 15:30:01 Telcontar su - - - pam_systemd(su-l:session): pam_putenv: delete non-existent entry; XDG_RUNTIME_DIR <0.4> 2014-08-11 15:30:02 Telcontar kernel - - - [73996.256010] XFS (sdd5): xfs_log_force: error 5 returned. <0.4> 2014-08-11 15:30:32 Telcontar kernel - - - [74026.336013] XFS (sdd5): xfs_log_force: error 5 returned. <0.4> 2014-08-11 15:31:03 Telcontar kernel - - - [74056.416012] XFS (sdd5): xfs_log_force: error 5 returned. <0.4> 2014-08-11 15:31:33 Telcontar kernel - - - [74086.496011] XFS (sdd5): xfs_log_force: error 5 returned. <4.5> 2014-08-11 15:31:59 Telcontar gnome-keyring-daemon 4381 - - Gkm: couldn't stat directory: /home/cer/.gnome2/keyrings: Input/output error <4.4> 2014-08-11 15:32:00 Telcontar gnome-keyring-daemon 4381 - - GLib-GObject: invalid unclassed pointer in cast to 'GkmObject' <4.3> 2014-08-11 15:32:00 Telcontar gnome-keyring-daemon 4381 - - Gkm: gkm_object_expose_full: assertion 'GKM_IS_OBJECT (self)' failed <4.5> 2014-08-11 15:32:00 Telcontar gnome-keyring-daemon 4381 - - Gkm: couldn't stat directory: /home/cer/.gnome2/keyrings: Input/output error <4.5> 2014-08-11 15:32:00 Telcontar gnome-keyring-daemon 4381 - - Gkm: couldn't stat directory: /home/cer/.gnome2/keyrings: Input/output error <4.4> 2014-08-11 15:32:00 Telcontar gnome-keyring-daemon 4381 - - Gkm: couldn't create temporary file for: /home/cer/.gnome2/keyrings/login.keyring: Input/output error <4.4> 2014-08-11 15:32:00 Telcontar gnome-keyring-daemon 4381 - - couldn't create login keyring: An error occurred on the device <10.3> 2014-08-11 15:32:00 Telcontar unix2_chkpwd - - - gkr-pam: the password for the login keyring was invalid. <0.4> 2014-08-11 15:32:03 Telcontar kernel - - - [74116.576018] XFS (sdd5): xfs_log_force: error 5 returned. <0.4> 2014-08-11 15:32:33 Telcontar kernel - - - [74146.656011] XFS (sdd5): xfs_log_force: error 5 returned. <3.6> 2014-08-11 15:33:01 Telcontar systemd 1 - - Starting Session 566 of user news. <0.4> 2014-08-11 15:33:03 Telcontar kernel - - - [74176.736068] XFS (sdd5): xfs_log_force: error 5 returned. <0.4> 2014-08-11 15:33:33 Telcontar kernel - - - [74206.816012] XFS (sdd5): xfs_log_force: error 5 returned. <0.4> 2014-08-11 15:34:03 Telcontar kernel - - - [74236.896017] XFS (sdd5): xfs_log_force: error 5 returned. <0.4> 2014-08-11 15:34:33 Telcontar kernel - - - [74266.976014] XFS (sdd5): xfs_log_force: error 5 returned. <3.6> 2014-08-11 15:35:01 Telcontar systemd 1 - - Starting Session 567 of user news. <0.4> 2014-08-11 15:35:03 Telcontar kernel - - - [74297.056012] XFS (sdd5): xfs_log_force: error 5 returned. <0.4> 2014-08-11 15:35:33 Telcontar kernel - - - [74327.136015] XFS (sdd5): xfs_log_force: error 5 returned. <1.6> 2014-08-11 15:35:56 Telcontar run-crons 8974 - - leafnode: OK <3.6> 2014-08-11 15:35:56 Telcontar systemd 1 - - Reloading System Logging Service. <3.6> 2014-08-11 15:35:57 Telcontar systemd 1 - - Reloaded System Logging Service. <5.6> 2014-08-11 15:35:57 Telcontar rsyslogd - - - [origin software="rsyslogd" swVersion="7.4.7" x-pid="1081" x-info="http://www.rsyslog.com"] rsyslogd was HUPed <3.6> 2014-08-11 15:36:02 Telcontar systemd 1 - - Reloading System Logging Service. <3.6> 2014-08-11 15:36:02 Telcontar systemd 1 - - Reloaded System Logging Service. <0.4> 2014-08-11 15:36:03 Telcontar kernel - - - [74357.216013] XFS (sdd5): xfs_log_force: error 5 returned. <1.6> 2014-08-11 15:36:06 Telcontar run-crons 8974 - - logrotate: OK <3.2> 2014-08-11 15:36:06 Telcontar mdadm 9290 - - DegradedArray event detected on md device /dev/md0 <1.6> 2014-08-11 15:36:06 Telcontar run-crons 8974 - - mdadm: OK <4.5> 2014-08-11 15:36:06 Telcontar su - - - (to root) root on (null) <1.4> 2014-08-11 15:36:25 Telcontar run-crons 8974 - - mlocate.cron returned 143 <1.6> 2014-08-11 15:36:25 Telcontar run-crons 8974 - - packagekit-background.cron: OK <1.6> 2014-08-11 15:36:26 Telcontar run-crons 8974 - - suse-clean_catman: OK <0.4> 2014-08-11 15:36:33 Telcontar kernel - - - [74387.296018] XFS (sdd5): xfs_log_force: error 5 returned. <1.6> 2014-08-11 15:36:41 Telcontar run-crons 8974 - - suse-do_mandb: OK <1.6> 2014-08-11 15:36:57 Telcontar run-crons 8974 - - suse-texlive: OK <1.6> 2014-08-11 15:36:57 Telcontar run-crons 8974 - - suse.cron-sa-update: OK <1.6> 2014-08-11 15:36:58 Telcontar run-crons 8974 - - suse.de-backup-rc.config: OK <0.4> 2014-08-11 15:37:04 Telcontar kernel - - - [74417.376010] XFS (sdd5): xfs_log_force: error 5 returned. <1.6> 2014-08-11 15:37:34 Telcontar run-crons 8974 - - suse.de-backup-rpmdb: OK <0.4> 2014-08-11 15:37:34 Telcontar kernel - - - [74447.456013] XFS (sdd5): xfs_log_force: error 5 returned. <1.6> 2014-08-11 15:37:34 Telcontar run-crons 8974 - - suse.de-check-battery: OK <1.6> 2014-08-11 15:37:34 Telcontar run-crons 8974 - - suse.de-cron-local: OK <1.6> 2014-08-11 15:37:34 Telcontar run-crons 8974 - - suse.de-faxcron: OK <1.6> 2014-08-11 15:37:34 Telcontar run-crons 8974 - - suse.de-snapper: OK <3.6> 2014-08-11 15:38:01 Telcontar systemd 1 - - Starting Session 568 of user news. <0.4> 2014-08-11 15:38:04 Telcontar kernel - - - [74477.536013] XFS (sdd5): xfs_log_force: error 5 returned. <0.4> 2014-08-11 15:38:34 Telcontar kernel - - - [74507.616019] XFS (sdd5): xfs_log_force: error 5 returned. <0.4> 2014-08-11 15:39:04 Telcontar kernel - - - [74537.696013] XFS (sdd5): xfs_log_force: error 5 returned. <0.4> 2014-08-11 15:39:34 Telcontar kernel - - - [74567.776014] XFS (sdd5): xfs_log_force: error 5 returned. <3.6> 2014-08-11 15:40:01 Telcontar systemd 1 - - Starting Session 569 of user cer. <0.4> 2014-08-11 15:40:04 Telcontar kernel - - - [74597.856013] XFS (sdd5): xfs_log_force: error 5 returned. <0.4> 2014-08-11 15:40:34 Telcontar kernel - - - [74627.936021] XFS (sdd5): xfs_log_force: error 5 returned. <0.4> 2014-08-11 15:41:04 Telcontar kernel - - - [74658.016012] XFS (sdd5): xfs_log_force: error 5 returned. <0.4> 2014-08-11 15:41:34 Telcontar kernel - - - [74688.096019] XFS (sdd5): xfs_log_force: error 5 returned. <0.4> 2014-08-11 15:42:04 Telcontar kernel - - - [74718.176018] XFS (sdd5): xfs_log_force: error 5 returned. <0.4> 2014-08-11 15:42:34 Telcontar kernel - - - [74748.256017] XFS (sdd5): xfs_log_force: error 5 returned. <3.6> 2014-08-11 15:43:01 Telcontar systemd 1 - - Starting Session 570 of user news. <0.4> 2014-08-11 15:43:04 Telcontar kernel - - - [74778.336012] XFS (sdd5): xfs_log_force: error 5 returned. <0.4> 2014-08-11 15:43:35 Telcontar kernel - - - [74808.416013] XFS (sdd5): xfs_log_force: error 5 returned. <0.4> 2014-08-11 15:44:05 Telcontar kernel - - - [74838.496014] XFS (sdd5): xfs_log_force: error 5 returned. <0.4> 2014-08-11 15:44:35 Telcontar kernel - - - [74868.576013] XFS (sdd5): xfs_log_force: error 5 returned. <3.6> 2014-08-11 15:45:01 Telcontar systemd 1 - - Starting Session 571 of user root. <3.6> 2014-08-11 15:45:01 Telcontar systemd 1 - - Starting Session 572 of user news. <0.4> 2014-08-11 15:45:05 Telcontar kernel - - - [74898.656019] XFS (sdd5): xfs_log_force: error 5 returned. <0.4> 2014-08-11 15:45:35 Telcontar kernel - - - [74928.736017] XFS (sdd5): xfs_log_force: error 5 returned. <0.4> 2014-08-11 15:46:05 Telcontar kernel - - - [74958.816015] XFS (sdd5): xfs_log_force: error 5 returned. <0.4> 2014-08-11 15:46:35 Telcontar kernel - - - [74988.896026] XFS (sdd5): xfs_log_force: error 5 returned. <0.4> 2014-08-11 15:47:05 Telcontar kernel - - - [75018.976014] XFS (sdd5): xfs_log_force: error 5 returned. <0.4> 2014-08-11 15:47:35 Telcontar kernel - - - [75049.056013] XFS (sdd5): xfs_log_force: error 5 returned. <3.6> 2014-08-11 15:48:01 Telcontar systemd 1 - - Starting Session 573 of user news. <0.4> 2014-08-11 15:48:05 Telcontar kernel - - - [75079.136016] XFS (sdd5): xfs_log_force: error 5 returned. <0.4> 2014-08-11 15:48:35 Telcontar kernel - - - [75109.216014] XFS (sdd5): xfs_log_force: error 5 returned. <0.4> 2014-08-11 15:49:05 Telcontar kernel - - - [75139.296014] XFS (sdd5): xfs_log_force: error 5 returned. <0.4> 2014-08-11 15:49:36 Telcontar kernel - - - [75169.376013] XFS (sdd5): xfs_log_force: error 5 returned. <0.4> 2014-08-11 15:50:06 Telcontar kernel - - - [75199.456012] XFS (sdd5): xfs_log_force: error 5 returned. <0.4> 2014-08-11 15:50:36 Telcontar kernel - - - [75229.536011] XFS (sdd5): xfs_log_force: error 5 returned. <0.4> 2014-08-11 15:51:06 Telcontar kernel - - - [75259.616013] XFS (sdd5): xfs_log_force: error 5 returned. <0.6> 2014-08-11 15:51:09 Telcontar kernel - - - [75262.721354] xfce4-session[4520]: segfault at 8 ip 00000000004164dc sp 00007fffdc291dc0 error 4 in xfce4-session[400000+2b00 <4.6> 2014-08-11 15:51:18 Telcontar systemd-logind 1021 - - Removed session 8. <10.5> 2014-08-11 15:51:18 Telcontar polkitd 4314 - - Unregistered Authentication Agent for unix-session:10 (system bus name :1.69, object path /org/gnome/PolicyKit1/Authenti <0.7> 2014-08-11 15:51:28 Telcontar kernel - - - [75282.132776] nvidia 0000:01:00.0: irq 48 for MSI/MSI-X <3.6> 2014-08-11 15:51:29 Telcontar acpid - - - 1 client rule loaded <4.6> 2014-08-11 15:51:30 Telcontar systemd-logind 1021 - - Removed session 10. <0.6> 2014-08-11 15:51:30 Telcontar kernel - - - [75284.176020] usb 1-6: new high-speed USB device number 4 using ehci-pci <3.6> 2014-08-11 15:51:30 Telcontar systemd 1 - - Starting Session 574 of user lightdm. <4.6> 2014-08-11 15:51:30 Telcontar systemd-logind 1021 - - New session 574 of user lightdm. <4.6> 2014-08-11 15:51:30 Telcontar systemd-logind 1021 - - Linked /tmp/.X11-unix/X0 to /run/user/127/X11-display. <0.6> 2014-08-11 15:51:30 Telcontar kernel - - - [75284.291822] usb 1-6: New USB device found, idVendor=8564, idProduct=1000 <0.6> 2014-08-11 15:51:30 Telcontar kernel - - - [75284.291825] usb 1-6: New USB device strings: Mfr=1, Product=2, SerialNumber=3 <0.6> 2014-08-11 15:51:30 Telcontar kernel - - - [75284.291828] usb 1-6: Product: Mass Storage Device <0.6> 2014-08-11 15:51:30 Telcontar kernel - - - [75284.291829] usb 1-6: Manufacturer: JetFlash <0.6> 2014-08-11 15:51:30 Telcontar kernel - - - [75284.291831] usb 1-6: SerialNumber: 346YLQ4L0G5H8S2F <1.6> 2014-08-11 15:51:31 Telcontar mtp-probe - - - checking bus 1, device 4: "/sys/devices/pci0000:00/0000:00:1a.7/usb1/1-6" <1.6> 2014-08-11 15:51:31 Telcontar mtp-probe - - - bus: 1, device: 4 was not an MTP device <0.6> 2014-08-11 15:51:31 Telcontar kernel - - - [75284.667399] usb-storage 1-6:1.0: USB Mass Storage device detected <0.6> 2014-08-11 15:51:31 Telcontar kernel - - - [75284.667502] scsi12 : usb-storage 1-6:1.0 <0.6> 2014-08-11 15:51:31 Telcontar kernel - - - [75284.667606] usbcore: registered new interface driver usb-storage <0.5> 2014-08-11 15:51:32 Telcontar kernel - - - [75285.794904] scsi 12:0:0:0: Direct-Access JetFlash Transcend 4GB 1100 PQ: 0 ANSI: 4 <0.6> 2014-08-11 15:51:32 Telcontar kernel - - - [75285.794976] scsi 12:0:0:0: alua: supports implicit and explicit TPGS <0.6> 2014-08-11 15:51:32 Telcontar kernel - - - [75285.796262] scsi 12:0:0:0: alua: No target port descriptors found <0.3> 2014-08-11 15:51:32 Telcontar kernel - - - [75285.796265] scsi 12:0:0:0: alua: not attached <0.5> 2014-08-11 15:51:32 Telcontar kernel - - - [75285.796396] sd 12:0:0:0: Attached scsi generic sg6 type 0 <0.5> 2014-08-11 15:51:32 Telcontar kernel - - - [75285.796888] sd 12:0:0:0: [sdf] 7913472 512-byte logical blocks: (4.05 GB/3.77 GiB) <0.5> 2014-08-11 15:51:32 Telcontar kernel - - - [75285.797634] sd 12:0:0:0: [sdf] Write Protect is off <0.7> 2014-08-11 15:51:32 Telcontar kernel - - - [75285.797637] sd 12:0:0:0: [sdf] Mode Sense: 43 00 00 00 <0.3> 2014-08-11 15:51:32 Telcontar kernel - - - [75285.798386] sd 12:0:0:0: [sdf] No Caching mode page found <0.3> 2014-08-11 15:51:32 Telcontar kernel - - - [75285.798388] sd 12:0:0:0: [sdf] Assuming drive cache: write through <0.3> 2014-08-11 15:51:32 Telcontar kernel - - - [75285.801508] sd 12:0:0:0: [sdf] No Caching mode page found <0.3> 2014-08-11 15:51:32 Telcontar kernel - - - [75285.801511] sd 12:0:0:0: [sdf] Assuming drive cache: write through <0.6> 2014-08-11 15:51:32 Telcontar kernel - - - [75285.802147] sdf: sdf1 sdf2 sdf3 <0.3> 2014-08-11 15:51:32 Telcontar kernel - - - [75285.805642] sd 12:0:0:0: [sdf] No Caching mode page found <0.3> 2014-08-11 15:51:32 Telcontar kernel - - - [75285.805645] sd 12:0:0:0: [sdf] Assuming drive cache: write through <0.5> 2014-08-11 15:51:32 Telcontar kernel - - - [75285.805648] sd 12:0:0:0: [sdf] Attached SCSI removable disk <0.4> 2014-08-11 15:51:36 Telcontar kernel - - - [75289.696019] XFS (sdd5): xfs_log_force: error 5 returned. <3.6> 2014-08-11 15:51:41 Telcontar systemd 1 - - Starting Getty on tty2... <3.6> 2014-08-11 15:51:41 Telcontar systemd 1 - - Started Getty on tty2. <3.6> 2014-08-11 15:51:42 Telcontar systemd 1 - - Starting Getty on tty3... <3.6> 2014-08-11 15:51:42 Telcontar systemd 1 - - Started Getty on tty3. <3.6> 2014-08-11 15:51:43 Telcontar systemd 1 - - Starting Getty on tty6... <3.6> 2014-08-11 15:51:43 Telcontar systemd 1 - - Started Getty on tty6. <3.6> 2014-08-11 15:51:44 Telcontar systemd 1 - - Starting Getty on tty5... <3.6> 2014-08-11 15:51:44 Telcontar systemd 1 - - Started Getty on tty5. <3.6> 2014-08-11 15:51:45 Telcontar systemd 1 - - Starting Getty on tty4... <3.6> 2014-08-11 15:51:45 Telcontar systemd 1 - - Started Getty on tty4. <0.4> 2014-08-11 15:52:06 Telcontar kernel - - - [75319.776023] XFS (sdd5): xfs_log_force: error 5 returned. <3.6> 2014-08-11 15:52:08 Telcontar systemd 1 - - Unmounting /data/raid... <3.6> 2014-08-11 15:52:08 Telcontar systemd 1 - - Unmounting /data/cripta... <3.6> 2014-08-11 15:52:08 Telcontar systemd 1 - - Stopping /sys/devices/virtual/block/dm-0. <3.6> 2014-08-11 15:52:08 Telcontar systemd 1 - - message repeated 5 times: [ Stopping /sys/devices/virtual/block/dm-0.] <3.6> 2014-08-11 15:52:08 Telcontar systemd 1 - - Stopping Session 574 of user lightdm. <3.6> 2014-08-11 15:52:08 Telcontar systemd 1 - - Stopped Session 574 of user lightdm. <3.6> 2014-08-11 15:52:08 Telcontar systemd 1 - - Stopping Session 7 of user root. <3.6> 2014-08-11 15:52:08 Telcontar systemd 1 - - Stopped Session 7 of user root. <3.6> 2014-08-11 15:52:08 Telcontar systemd 1 - - Stopping user-0.slice. <3.6> 2014-08-11 15:52:08 Telcontar systemd 1 - - Removed slice user-0.slice. <3.6> 2014-08-11 15:52:08 Telcontar systemd 1 - - Stopping Stop Read-Ahead Data Collection 10s After Completed Startup. <3.6> 2014-08-11 15:52:08 Telcontar systemd 1 - - Stopped Stop Read-Ahead Data Collection 10s After Completed Startup. <3.6> 2014-08-11 15:52:08 Telcontar systemd 1 - - Stopping User Manager for 1000... <3.6> 2014-08-11 15:52:08 Telcontar systemd 1 - - Stopping User Manager for 9... <3.6> 2014-08-11 15:52:08 Telcontar systemd 1 - - Stopping User Manager for 127... <3.6> 2014-08-11 15:52:08 Telcontar systemd 1 - - Stopping CUPS Printing Service... <3.6> 2014-08-11 15:52:08 Telcontar systemd 1 - - Stopping ifup managed network interface eth1... <3.6> 2014-08-11 15:52:08 Telcontar systemd 1 - - Stopping ifup managed network interface eth0... <3.6> 2014-08-11 15:17:44 Telcontar systemd 4377 - - message repeated 14 times: [ Time has been changed] <3.3> 2014-08-11 15:52:08 Telcontar systemd 4377 - - Failed to enqueue exit.target job: Unit exit.target failed to load: Input/output error. <3.6> 2014-08-11 15:52:08 Telcontar systemd 1 - - Stopping Graphical Interface. <3.6> 2014-08-11 15:52:08 Telcontar systemd 1 - - Stopped target Graphical Interface. <3.6> 2014-08-11 15:52:08 Telcontar systemd 1 - - Stopping LSB: X Display Manager... <3.6> 2014-08-11 15:52:08 Telcontar systemd 1 - - Stopping helloworld.service... <3.6> 2014-08-11 15:52:08 Telcontar systemd 1 - - Stopped helloworld.service. <3.6> 2014-08-11 15:52:08 Telcontar systemd 1 - - Stopping Multi-User System. <3.6> 2014-08-11 15:52:08 Telcontar systemd 1 - - Stopped target Multi-User System. <3.6> 2014-08-11 15:52:08 Telcontar systemd 1 - - Stopping LSB: virus scanner daemon... <3.6> 2014-08-11 15:52:08 Telcontar systemd 1 - - Stopping LSB: Start the hddtemp daemon... <3.6> 2014-08-11 15:52:08 Telcontar systemd 1 - - Stopping LSB: mdadmd daemon monitoring MD devices... <3.6> 2014-08-11 15:52:08 Telcontar systemd 1 - - Stopping LSB: This services starts and stops the USB Arbitrator.... <3.6> 2014-08-11 15:52:08 Telcontar systemd 1 - - Stopping LSB: Supports the direct execution of binary formats.... <3.6> 2014-08-11 15:52:08 Telcontar systemd 1 - - Stopping LSB: irqbalance daemon providing irq balancing on MP-machines... <3.6> 2014-08-11 15:52:09 Telcontar systemd 1 - - Stopping LSB: Set up analog joysticks... <0.4> 2014-08-11 15:52:10 Telcontar kernel - - - [75323.547122] nfsd: last server has exited, flushing export cache <5.6> 2014-08-11 15:36:02 Telcontar rsyslogd - - - [origin software="rsyslogd" swVersion="7.4.7" x-pid="1081" x-info="http://www.rsyslog.com"] rsyslogd was HUPed <5.6> 2014-08-11 15:52:11 Telcontar rsyslogd - - - [origin software="rsyslogd" swVersion="7.4.7" x-pid="1081" x-info="http://www.rsyslog.com"] exiting on signal 15. 2014-08-11 15:52:12+02:00 - Halting the system now =========================================== uptime: 15:52pm up 1 day 20:54, 1 user, load average: 5.94, 2.47, 1.22 > I am interested in the metadata dump. Ok, sure, no problem. I'm working on that, but I need to have lunch first ;-) > Also, some one hit back to back duplicate block allocation > XFS_WANT_CORRUPTED_GOTO bugs, you may want to do a metadata dump before and > after the xfs_repair in case you hit it again soon. I already have a metadata dump, and I have not attempted to repair yet (I'm doing a full dd copy of partition, and it is 400 Gigs). I will obtain another metadadump after repair, and I can upload both to google drive. But first I need sustenance :-) (At least this time I do not have any pressing thing to do on the computer...) - -- Cheers Carlos E. R. (from 13.1 x86_64 "Bottle" (Minas Tirith)) -----BEGIN PGP SIGNATURE----- Version: GnuPG v2.0.22 (GNU/Linux) iF0EAREIAAYFAlPo4p4ACgkQja8UbcUWM1wGAADxAVuTUPkxG+LO29VzehJ8cSPV uItG/Puu2KbqUeCyXwD/cgu/+F7vhEeU9WEbNP5eifhmyu0T3ByDMtuKp55Rj7A= =CgSx -----END PGP SIGNATURE----- ---1463779071-1326823490-1407771294=:7326-- From bfoster@redhat.com Mon Aug 11 11:14: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 B8E2F7F3F for ; Mon, 11 Aug 2014 11:14:57 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 860238F8037 for ; Mon, 11 Aug 2014 09:14:54 -0700 (PDT) X-ASG-Debug-ID: 1407773691-04cb6c4c9382090001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id I7FZc85RPtE95Lm1 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 11 Aug 2014 09:14: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-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 s7BGEmvs031981 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Mon, 11 Aug 2014 12:14:48 -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 s7BGElHT010048; Mon, 11 Aug 2014 12:14:47 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 1BEA112577C; Mon, 11 Aug 2014 12:14:46 -0400 (EDT) Date: Mon, 11 Aug 2014 12:14:46 -0400 From: Brian Foster To: "Carlos E. R." Cc: XFS mailing list Subject: Re: Subject : Happened again, 20140811 -- Got "Internal error XFS_WANT_CORRUPTED_GOTO". Filesystem needs reformatting to correct issue. Message-ID: <20140811161445.GA7696@bfoster.bfoster> X-ASG-Orig-Subj: Re: Subject : Happened again, 20140811 -- Got "Internal error XFS_WANT_CORRUPTED_GOTO". Filesystem needs reformatting to correct issue. References: <53E8D9F6.7080704@sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: User-Agent: Mutt/1.5.23 (2014-03-12) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.26 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1407773692 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Mon, Aug 11, 2014 at 05:34:46PM +0200, Carlos E. R. wrote: > -----BEGIN PGP SIGNED MESSAGE----- > Hash: SHA256 > > > > El 2014-08-11 a las 09:57 -0500, Mark Tinguely escribió: > >On 08/11/14 09:23, Carlos E. R. wrote: > > >Where in the filesystem did the XFS_WANT_CORRUPTED_GOTO happen? > > This time? > Did not look at the log yet. Let me see... > > Here is the full log of the event. It starts prior to hibernating, all > things nominal. And ends on shutdown (had to hit reset button, despite what > log says). If you want to see entries prior to that, since boot, I can do > that. > > ... > <0.1> 2014-08-11 15:17:22 Telcontar kernel - - - [73235.439809] XFS: Internal error XFS_WANT_CORRUPTED_GOTO at line 1602 of file /home/abuild/rpmbuild/BUILD/kernel-desktop-3.1 > <0.1> 2014-08-11 15:17:22 Telcontar kernel - - - [73235.439809]. > <0.4> 2014-08-11 15:17:22 Telcontar kernel - - - [73235.440155] CPU: 0 PID: 6255 Comm: kworker/0:7 Tainted: P O 3.11.10-17-desktop #1 > <0.4> 2014-08-11 15:17:22 Telcontar kernel - - - [73235.440322] Hardware name: MICRO-STAR INTERNATIONAL CO.,LTD MS-7516/MS-7516, BIOS V1.5 10/10/2008 > <0.4> 2014-08-11 15:17:22 Telcontar kernel - - - [73235.440361] Workqueue: xfs-eofblocks/sdd5 xfs_eofblocks_worker [xfs] > <0.4> 2014-08-11 15:17:22 Telcontar kernel - - - [73235.440364] 0000000000000001 ffffffff815a0402 000000000010c9d3 ffffffffa0c38996 > <0.4> 2014-08-11 15:17:22 Telcontar kernel - - - [73235.440365] ffff880211412b00 ffff88023448dd80 ffff88023fb95cb0 0000000000000001 > <0.4> 2014-08-11 15:17:22 Telcontar kernel - - - [73235.440366] 0000000000000000 0000000100000000 0000000000000000 0000000000000001 > <0.4> 2014-08-11 15:17:22 Telcontar kernel - - - [73235.440367] Call Trace: > <0.4> 2014-08-11 15:17:22 Telcontar kernel - - - [73235.440377] [] dump_trace+0x88/0x310 > <0.4> 2014-08-11 15:17:22 Telcontar kernel - - - [73235.440380] [] show_stack_log_lvl+0xd0/0x1d0 > <0.4> 2014-08-11 15:17:22 Telcontar kernel - - - [73235.440382] [] show_stack+0x1c/0x50 > <0.4> 2014-08-11 15:17:22 Telcontar kernel - - - [73235.440385] [] dump_stack+0x50/0x89 > <0.4> 2014-08-11 15:17:22 Telcontar kernel - - - [73235.440399] [] xfs_free_ag_extent+0x226/0x860 [xfs] > <0.4> 2014-08-11 15:17:22 Telcontar kernel - - - [73235.440442] [] xfs_free_extent+0xb9/0xf0 [xfs] > <0.4> 2014-08-11 15:17:22 Telcontar kernel - - - [73235.440484] [] xfs_bmap_finish+0x11e/0x170 [xfs] > <0.4> 2014-08-11 15:17:22 Telcontar kernel - - - [73235.440534] [] xfs_itruncate_extents+0x190/0x340 [xfs] > <0.4> 2014-08-11 15:17:22 Telcontar kernel - - - [73235.440597] [] xfs_free_eofblocks+0x1e3/0x260 [xfs] > <0.4> 2014-08-11 15:17:22 Telcontar kernel - - - [73235.440633] [] xfs_inode_free_eofblocks+0x6f/0x150 [xfs] > <0.4> 2014-08-11 15:17:22 Telcontar kernel - - - [73235.440662] [] xfs_inode_ag_walk.isra.10+0x1c2/0x310 [xfs] > <0.4> 2014-08-11 15:17:22 Telcontar kernel - - - [73235.440690] [] xfs_inode_ag_iterator_tag+0x6e/0xb0 [xfs] > <0.4> 2014-08-11 15:17:22 Telcontar kernel - - - [73235.440718] [] xfs_eofblocks_worker+0x12/0x20 [xfs] > <0.4> 2014-08-11 15:17:22 Telcontar kernel - - - [73235.440737] [] process_one_work+0x168/0x490 > <0.4> 2014-08-11 15:17:22 Telcontar kernel - - - [73235.440739] [] worker_thread+0x114/0x3a0 > <0.4> 2014-08-11 15:17:22 Telcontar kernel - - - [73235.440742] [] kthread+0xaf/0xc0 > <0.4> 2014-08-11 15:17:22 Telcontar kernel - - - [73235.440746] [] ret_from_fork+0x7c/0xb0 > <0.5> 2014-08-11 15:17:22 Telcontar kernel - - - [73235.440751] XFS (sdd5): xfs_do_force_shutdown(0x8) called from line 916 of file /home/abuild/rpmbuild/BUILD/kernel-desktop- > <0.1> 2014-08-11 15:17:22 Telcontar kernel - - - [73235.498979] XFS (sdd5): Corruption of in-memory data detected. Shutting down filesystem > <0.1> 2014-08-11 15:17:22 Telcontar kernel - - - [73235.499136] XFS (sdd5): Please umount the filesystem and rectify the problem(s) This reminds me that it might be interesting to tune the eofblocks scanner to be more aggressive and see if that helps reproduce. This thread that's running here normally runs every 5 minutes by default, but it can be tuned to run at a user-defined interval via the following /proc file: # cat /proc/sys/fs/xfs/speculative_prealloc_lifetime 300 I wonder if setting it to 30s or so ('echo 30 > /proc/...') and running some hibernation cycles would help... Brian > <3.6> 2014-08-11 15:17:22 Telcontar systemd 1 - - Time has been changed > <3.6> 2014-08-11 15:17:27 Telcontar acpid - - - 1 client rule loaded > <3.4> 2014-08-11 15:17:29 Telcontar pm-utils - - - Thawing (95)... > <3.5> 2014-08-11 15:17:30 Telcontar dbus 1020 - - [system] Activating service name='org.freedesktop.PackageKit' (using servicehelper) > <3.6> 2014-08-11 15:17:30 Telcontar systemd 1 - - Starting LSB: Network time protocol daemon (ntpd)... > <0.4> 2014-08-11 15:17:30 Telcontar kernel - - - [73244.256012] XFS (sdd5): xfs_log_force: error 5 returned. > <3.5> 2014-08-11 15:17:31 Telcontar dbus 1020 - - [system] Activated service 'org.freedesktop.PackageKit' failed: Cannot launch daemon, file not found or permissions invalid > <1.5> 2014-08-11 15:17:31 Telcontar network 6315 - - redirecting to "systemctl restart network.service" > <3.6> 2014-08-11 15:17:32 Telcontar systemd 1 - - Stopping ifup managed network interface eth1... > <3.6> 2014-08-11 15:17:32 Telcontar systemd 1 - - Stopping ifup managed network interface eth0... > <3.6> 2014-08-11 15:17:32 Telcontar systemd 1 - - Stopping LSB: Configure network interfaces and set up routing... > <3.6> 2014-08-11 15:17:32 Telcontar systemd 1 - - Starting LSB: Configure network interfaces and set up routing... > <3.6> 2014-08-11 15:17:32 Telcontar ifdown 6352 - - touch: cannot touch ‘/dev/.sysconfig/network/tmp/if-eth0.6352’: No such file or directory > <3.6> 2014-08-11 15:17:32 Telcontar ifdown 6352 - - scripts/functions: line 1221: /dev/.sysconfig/network/tmp/if-eth0.6352.tmp: No such file or directory > <3.6> 2014-08-11 15:17:32 Telcontar ifdown 6352 - - scripts/functions: line 1239: /dev/.sysconfig/network/tmp/if-eth0.6352.tmp: No such file or directory > <3.6> 2014-08-11 15:17:32 Telcontar ifdown 6352 - - cat: /dev/.sysconfig/network/tmp/if-eth0.6352: No such file or directory > <3.6> 2014-08-11 15:17:34 Telcontar ntp 6314 - - 11 Aug 15:17:34 sntp[6505]: Started sntp > <3.6> 2014-08-11 15:17:34 Telcontar ifdown 6352 - - eth0 device: Realtek Semiconductor Co., Ltd. RTL8111/8168/8411 PCI Express Gigabit Ethernet Controller (rev 02) > <1.5> 2014-08-11 15:17:34 Telcontar ifdown 6352 - - eth0 device: Realtek Semiconductor Co., Ltd. RTL8111/8168/8411 PCI Express Gigabit Ethernet Controller (rev 02) > <3.6> 2014-08-11 15:17:34 Telcontar ifdown 6351 - - eth1 device: Realtek Semiconductor Co., Ltd. RTL8111/8168/8411 PCI Express Gigabit Ethernet Controller (rev 02) > <1.5> 2014-08-11 15:17:34 Telcontar ifdown 6351 - - eth1 device: Realtek Semiconductor Co., Ltd. RTL8111/8168/8411 PCI Express Gigabit Ethernet Controller (rev 02) > <3.6> 2014-08-11 15:17:34 Telcontar network 6384 - - Setting up network interfaces: > <3.6> 2014-08-11 15:17:34 Telcontar network 6384 - - lo > <1.5> 2014-08-11 15:17:34 Telcontar ifup 6924 - - lo > <1.5> 2014-08-11 15:17:35 Telcontar ifup 6924 - - lo > <1.5> 2014-08-11 15:17:35 Telcontar ifup 6924 - - IP address: 127.0.0.1/8 > <3.6> 2014-08-11 15:17:35 Telcontar network 6384 - - lo IP address: 127.0.0.1/8 > <1.5> 2014-08-11 15:17:35 Telcontar ifup 6924 - -. > <16.3> 2014-08-11 15:17:38 Telcontar dhcpcd 7162 - - eth1: dhcpcd not running > <16.6> 2014-08-11 15:17:38 Telcontar dhcpcd 7162 - - eth1: exiting > <3.5> 2014-08-11 15:17:38 Telcontar systemd 1 - - Unit network@eth0.service entered failed state. > <3.6> 2014-08-11 15:17:38 Telcontar systemd 1 - - Starting ifup managed network interface eth0... > <3.6> 2014-08-11 15:17:38 Telcontar avahi-daemon 1007 - - Interface eth0.IPv6 no longer relevant for mDNS. > <3.6> 2014-08-11 15:17:38 Telcontar avahi-daemon 1007 - - Leaving mDNS multicast group on interface eth0.IPv6 with address fc00::14. > <3.6> 2014-08-11 15:17:38 Telcontar avahi-daemon 1007 - - Interface eth0.IPv4 no longer relevant for mDNS. > <3.6> 2014-08-11 15:17:38 Telcontar avahi-daemon 1007 - - Leaving mDNS multicast group on interface eth0.IPv4 with address 192.168.1.14. > <3.6> 2014-08-11 15:17:38 Telcontar avahi-daemon 1007 - - Withdrawing address record for fc00::14 on eth0. > <3.6> 2014-08-11 15:17:38 Telcontar avahi-daemon 1007 - - Withdrawing address record for 192.168.1.14 on eth0. > <3.6> 2014-08-11 15:17:38 Telcontar ifup 7226 - - eth0 device: Realtek Semiconductor Co., Ltd. RTL8111/8168/8411 PCI Express Gigabit Ethernet Controller (rev 02) > <1.5> 2014-08-11 15:17:38 Telcontar ifup 7226 - - eth0 device: Realtek Semiconductor Co., Ltd. RTL8111/8168/8411 PCI Express Gigabit Ethernet Controller (rev 02) > <0.6> 2014-08-11 15:17:38 Telcontar kernel - - - [73251.792336] r8169 0000:06:00.0 eth0: link down > <0.6> 2014-08-11 15:17:38 Telcontar kernel - - - [73251.792353] r8169 0000:06:00.0 eth0: link down > <0.6> 2014-08-11 15:17:38 Telcontar kernel - - - [73251.792366] IPv6: ADDRCONF(NETDEV_UP): eth0: link is not ready > <3.6> 2014-08-11 15:17:38 Telcontar avahi-daemon 1007 - - Joining mDNS multicast group on interface eth0.IPv4 with address 192.168.1.14. > <3.6> 2014-08-11 15:17:38 Telcontar avahi-daemon 1007 - - New relevant interface eth0.IPv4 for mDNS. > <3.6> 2014-08-11 15:17:38 Telcontar avahi-daemon 1007 - - Registering new address record for 192.168.1.14 on eth0.IPv4. > <3.6> 2014-08-11 15:17:39 Telcontar systemd 1 - - Starting ifup managed network interface eth1... > <3.6> 2014-08-11 15:17:39 Telcontar ifplugd(eth1) 7541 - - ifplugd 0.28 initializing. > <0.6> 2014-08-11 15:17:39 Telcontar kernel - - - [73252.646313] r8169 0000:07:00.0 eth1: link down > <0.6> 2014-08-11 15:17:39 Telcontar kernel - - - [73252.646341] IPv6: ADDRCONF(NETDEV_UP): eth1: link is not ready > <3.6> 2014-08-11 15:17:39 Telcontar ifplugd(eth1) 7541 - - Using interface eth1/00:21:85:16:2D:0C with driver (version: 2.3LK-NAPI) > <3.6> 2014-08-11 15:17:39 Telcontar ifplugd(eth1) 7541 - - Using detection mode: SIOCETHTOOL > <3.6> 2014-08-11 15:17:39 Telcontar ifplugd(eth1) 7541 - - Initialization complete, link beat not detected. > <1.5> 2014-08-11 15:17:39 Telcontar ifup 7521 - - eth1 device: Realtek Semiconductor Co., Ltd. RTL8111/8168/8411 PCI Express Gigabit Ethernet Controller (rev 02) > <1.5> 2014-08-11 15:17:39 Telcontar ifup 7521 - - eth1 is controlled by ifplugd > <3.6> 2014-08-11 15:17:39 Telcontar ifup 7521 - - eth1 device: Realtek Semiconductor Co., Ltd. RTL8111/8168/8411 PCI Express Gigabit Ethernet Controller (rev 02) > <3.6> 2014-08-11 15:17:39 Telcontar ifup 7521 - - eth1 is controlled by ifplugd > <3.6> 2014-08-11 15:17:39 Telcontar systemd 1 - - Started ifup managed network interface eth1. > <0.6> 2014-08-11 15:17:40 Telcontar kernel - - - [73253.958299] r8169 0000:06:00.0 eth0: link up > <0.6> 2014-08-11 15:17:40 Telcontar kernel - - - [73253.958306] IPv6: ADDRCONF(NETDEV_CHANGE): eth0: link becomes ready > <3.6> 2014-08-11 15:17:41 Telcontar avahi-daemon 1007 - - Joining mDNS multicast group on interface eth0.IPv6 with address fe80::221:85ff:fe16:2d0b. > <3.6> 2014-08-11 15:17:41 Telcontar avahi-daemon 1007 - - New relevant interface eth0.IPv6 for mDNS. > <3.6> 2014-08-11 15:17:41 Telcontar avahi-daemon 1007 - - Registering new address record for fe80::221:85ff:fe16:2d0b on eth0.*. > <3.6> 2014-08-11 15:17:42 Telcontar avahi-daemon 1007 - - Leaving mDNS multicast group on interface eth0.IPv6 with address fe80::221:85ff:fe16:2d0b. > <3.6> 2014-08-11 15:17:42 Telcontar avahi-daemon 1007 - - Joining mDNS multicast group on interface eth0.IPv6 with address fc00::14. > <3.6> 2014-08-11 15:17:42 Telcontar avahi-daemon 1007 - - Registering new address record for fc00::14 on eth0.*. > <3.6> 2014-08-11 15:17:42 Telcontar avahi-daemon 1007 - - Withdrawing address record for fe80::221:85ff:fe16:2d0b on eth0. > <3.6> 2014-08-11 15:17:44 Telcontar ntp 6314 - - 11 Aug 15:17:44 sntp[6505]: Received no useable packet from 192.168.1.15! > <3.6> 2014-08-11 15:17:44 Telcontar ntp 6314 - - 11 Aug 15:17:44 sntp[7926]: Started sntp > <3.6> 2014-08-11 15:17:44 Telcontar systemd 1 - - Time has been changed > <3.6> 2014-08-11 15:17:44 Telcontar ntp 6314 - - 2014-08-11 15:17:44.656291 (-0100) -0.112718 +/- 0.037338 secs > <3.6> 2014-08-11 15:17:44 Telcontar ntp 6314 - - 2014-08-11 15:17:44.604369 (-0100) +0.0081 +/- 0.069473 secs > <3.6> 2014-08-11 15:17:44 Telcontar ntp 6314 - - Time synchronized with 0.pool.ntp.org > <4.6> 2014-08-11 15:17:45 Telcontar SuSEfirewall2 - - - Setting up rules from /etc/sysconfig/SuSEfirewall2 ... > <4.6> 2014-08-11 15:17:45 Telcontar SuSEfirewall2 - - - using default zone 'ext' for interface eth1 > <4.6> 2014-08-11 15:17:45 Telcontar SuSEfirewall2 - - - Firewall customary rules loaded from /etc/sysconfig/scripts/SuSEfirewall2-custom > <3.5> 2014-08-11 15:17:45 Telcontar ntpd 7991 - - ntpd 4.2.6p5@1.2349-o Tue Jul 22 08:26:41 UTC 2014 (1) > <3.6> 2014-08-11 15:17:45 Telcontar ntp 6314 - - Starting network time protocol daemon (NTPD)..done > <3.6> 2014-08-11 15:17:44 Telcontar systemd 1 - - Time has been changed > <3.6> 2014-08-11 15:17:45 Telcontar systemd 1 - - Started LSB: Network time protocol daemon (ntpd). > <3.5> 2014-08-11 15:17:45 Telcontar ntpd 8017 - - proto: precision = 1.613 usec > <3.7> 2014-08-11 15:17:46 Telcontar ntpd 8017 - - ntp_io: estimated max descriptors: 1024, initial socket boundary: 16 > <3.6> 2014-08-11 15:17:46 Telcontar ntpd 8017 - - Listen and drop on 0 v4wildcard 0.0.0.0 UDP 123 > <3.6> 2014-08-11 15:17:46 Telcontar ntpd 8017 - - Listen and drop on 1 v6wildcard :: UDP 123 > <3.6> 2014-08-11 15:17:46 Telcontar ntpd 8017 - - Listen normally on 2 lo 127.0.0.1 UDP 123 > <3.6> 2014-08-11 15:17:46 Telcontar ntpd 8017 - - Listen normally on 3 eth0 192.168.1.14 UDP 123 > <3.6> 2014-08-11 15:17:46 Telcontar ntpd 8017 - - Listen normally on 4 lo ::1 UDP 123 > <3.6> 2014-08-11 15:17:46 Telcontar ntpd 8017 - - Listen normally on 5 eth0 fe80::221:85ff:fe16:2d0b UDP 123 > <3.6> 2014-08-11 15:17:46 Telcontar ntpd 8017 - - Listen normally on 6 eth0 fc00::14 UDP 123 > <3.6> 2014-08-11 15:17:46 Telcontar ntpd 8017 - - peers refreshed > <3.6> 2014-08-11 15:17:46 Telcontar ntpd 8017 - - Listening on routing socket on fd #23 for interface updates > <3.5> 2014-08-11 15:17:46 Telcontar ntpd 8017 - - logging to file /var/log/ntp > <4.6> 2014-08-11 15:17:48 Telcontar SuSEfirewall2 - - - Firewall rules successfully set > <3.6> 2014-08-11 15:17:48 Telcontar avahi-autoipd(eth0) 8434 - - Found user 'avahi-autoipd' (UID 495) and group 'avahi-autoipd' (GID 491). > <3.6> 2014-08-11 15:17:48 Telcontar avahi-autoipd(eth0) 8434 - - Successfully called chroot(). > <3.6> 2014-08-11 15:17:48 Telcontar avahi-autoipd(eth0) 8434 - - Successfully dropped root privileges. > <3.6> 2014-08-11 15:17:48 Telcontar avahi-autoipd(eth0) 8434 - - Starting with address 169.254.3.89 > <3.6> 2014-08-11 15:17:48 Telcontar avahi-autoipd(eth0) 8434 - - Routable address already assigned, sleeping. > <3.6> 2014-08-11 15:17:50 Telcontar systemd 1 - - Started ifup managed network interface eth0. > <3.6> 2014-08-11 15:17:50 Telcontar systemd 1 - - Started ifup managed network interface eth1. > <3.6> 2014-08-11 15:17:50 Telcontar network 6384 - - ..done..done..done ppp0 Startmode is 'manual' -> skipping > <1.5> 2014-08-11 15:17:50 Telcontar ifup 8500 - - ppp0 Startmode is 'manual' -> skipping > <3.6> 2014-08-11 15:17:50 Telcontar network 6384 - - ..skippedSetting up service network . . . . . . . . . . . . ...done > <3.6> 2014-08-11 15:17:50 Telcontar systemd 1 - - Started LSB: Configure network interfaces and set up routing. > <3.4> 2014-08-11 15:17:52 Telcontar pm-utils - - - Thawing the system now (04)... > <0.6> 2014-08-11 15:17:55 Telcontar kernel - - - [73268.481672] Chrome_ChildThr[5680]: segfault at 0 ip 00007ffcedf71598 sp 00007ffce1821410 error 6 in libmozalloc.so[7ffcedf7 > <0.4> 2014-08-11 15:18:00 Telcontar kernel - - - [73274.336014] XFS (sdd5): xfs_log_force: error 5 returned. > <3.6> 2014-08-11 15:18:01 Telcontar systemd 1 - - Starting Session 559 of user news. > <3.4> 2014-08-11 15:18:16 Telcontar router - - - (Thawing 04) Logging the current IP= 79.159.63.177 > <0.4> 2014-08-11 15:18:31 Telcontar kernel - - - [73304.416012] XFS (sdd5): xfs_log_force: error 5 returned. > <0.4> 2014-08-11 15:19:01 Telcontar kernel - - - [73334.496014] XFS (sdd5): xfs_log_force: error 5 returned. > <0.4> 2014-08-11 15:19:31 Telcontar kernel - - - [73364.576016] XFS (sdd5): xfs_log_force: error 5 returned. > <0.4> 2014-08-11 15:20:01 Telcontar kernel - - - [73394.656015] XFS (sdd5): xfs_log_force: error 5 returned. > <3.6> 2014-08-11 15:20:01 Telcontar systemd 1 - - Starting Session 560 of user cer. > <0.4> 2014-08-11 15:20:31 Telcontar kernel - - - [73424.736049] XFS (sdd5): xfs_log_force: error 5 returned. > <0.4> 2014-08-11 15:21:01 Telcontar kernel - - - [73454.816016] XFS (sdd5): xfs_log_force: error 5 returned. > <0.4> 2014-08-11 15:21:31 Telcontar kernel - - - [73484.896015] XFS (sdd5): xfs_log_force: error 5 returned. > <0.4> 2014-08-11 15:22:01 Telcontar kernel - - - [73514.976016] XFS (sdd5): xfs_log_force: error 5 returned. > <0.4> 2014-08-11 15:22:31 Telcontar kernel - - - [73545.056018] XFS (sdd5): xfs_log_force: error 5 returned. > <3.6> 2014-08-11 15:23:01 Telcontar systemd 1 - - Starting Session 561 of user news. > <0.4> 2014-08-11 15:23:01 Telcontar kernel - - - [73575.136025] XFS (sdd5): xfs_log_force: error 5 returned. > <0.4> 2014-08-11 15:23:31 Telcontar kernel - - - [73605.216014] XFS (sdd5): xfs_log_force: error 5 returned. > <3.6> 2014-08-11 15:23:52 Telcontar smartd 1013 - - Device: /dev/sdb [SAT], Temperature changed -5 Celsius to 33 Celsius (Min/Max 19/38) > <0.4> 2014-08-11 15:24:01 Telcontar kernel - - - [73635.296078] XFS (sdd5): xfs_log_force: error 5 returned. > <0.4> 2014-08-11 15:24:32 Telcontar kernel - - - [73665.376020] XFS (sdd5): xfs_log_force: error 5 returned. > <3.6> 2014-08-11 15:25:01 Telcontar systemd 1 - - Starting Session 562 of user news. > <0.4> 2014-08-11 15:25:02 Telcontar kernel - - - [73695.456011] XFS (sdd5): xfs_log_force: error 5 returned. > <0.4> 2014-08-11 15:25:32 Telcontar kernel - - - [73725.536015] XFS (sdd5): xfs_log_force: error 5 returned. > <0.4> 2014-08-11 15:26:02 Telcontar kernel - - - [73755.616017] XFS (sdd5): xfs_log_force: error 5 returned. > <0.4> 2014-08-11 15:26:32 Telcontar kernel - - - [73785.696017] XFS (sdd5): xfs_log_force: error 5 returned. > <0.4> 2014-08-11 15:27:02 Telcontar kernel - - - [73815.776016] XFS (sdd5): xfs_log_force: error 5 returned. > <0.4> 2014-08-11 15:27:32 Telcontar kernel - - - [73845.856021] XFS (sdd5): xfs_log_force: error 5 returned. > <3.6> 2014-08-11 15:28:01 Telcontar systemd 1 - - Starting Session 563 of user news. > <0.4> 2014-08-11 15:28:02 Telcontar kernel - - - [73875.936014] XFS (sdd5): xfs_log_force: error 5 returned. > <0.4> 2014-08-11 15:28:32 Telcontar kernel - - - [73906.016015] XFS (sdd5): xfs_log_force: error 5 returned. > <0.4> 2014-08-11 15:29:02 Telcontar kernel - - - [73936.096017] XFS (sdd5): xfs_log_force: error 5 returned. > <0.4> 2014-08-11 15:29:32 Telcontar kernel - - - [73966.176012] XFS (sdd5): xfs_log_force: error 5 returned. > <3.6> 2014-08-11 15:30:01 Telcontar systemd 1 - - Starting Session 564 of user root. > <3.6> 2014-08-11 15:30:01 Telcontar systemd 1 - - Starting Session 565 of user cer. > <1.6> 2014-08-11 15:30:01 Telcontar run-crons 8974 - - suse.de-snapper: OK > <4.5> 2014-08-11 15:30:01 Telcontar su - - - (to root) root on (null) > <10.3> 2014-08-11 15:30:01 Telcontar su - - - pam_systemd(su-l:session): pam_putenv: delete non-existent entry; XDG_RUNTIME_DIR > <0.4> 2014-08-11 15:30:02 Telcontar kernel - - - [73996.256010] XFS (sdd5): xfs_log_force: error 5 returned. > <0.4> 2014-08-11 15:30:32 Telcontar kernel - - - [74026.336013] XFS (sdd5): xfs_log_force: error 5 returned. > <0.4> 2014-08-11 15:31:03 Telcontar kernel - - - [74056.416012] XFS (sdd5): xfs_log_force: error 5 returned. > <0.4> 2014-08-11 15:31:33 Telcontar kernel - - - [74086.496011] XFS (sdd5): xfs_log_force: error 5 returned. > <4.5> 2014-08-11 15:31:59 Telcontar gnome-keyring-daemon 4381 - - Gkm: couldn't stat directory: /home/cer/.gnome2/keyrings: Input/output error > <4.4> 2014-08-11 15:32:00 Telcontar gnome-keyring-daemon 4381 - - GLib-GObject: invalid unclassed pointer in cast to 'GkmObject' > <4.3> 2014-08-11 15:32:00 Telcontar gnome-keyring-daemon 4381 - - Gkm: gkm_object_expose_full: assertion 'GKM_IS_OBJECT (self)' failed > <4.5> 2014-08-11 15:32:00 Telcontar gnome-keyring-daemon 4381 - - Gkm: couldn't stat directory: /home/cer/.gnome2/keyrings: Input/output error > <4.5> 2014-08-11 15:32:00 Telcontar gnome-keyring-daemon 4381 - - Gkm: couldn't stat directory: /home/cer/.gnome2/keyrings: Input/output error > <4.4> 2014-08-11 15:32:00 Telcontar gnome-keyring-daemon 4381 - - Gkm: couldn't create temporary file for: /home/cer/.gnome2/keyrings/login.keyring: Input/output error > <4.4> 2014-08-11 15:32:00 Telcontar gnome-keyring-daemon 4381 - - couldn't create login keyring: An error occurred on the device > <10.3> 2014-08-11 15:32:00 Telcontar unix2_chkpwd - - - gkr-pam: the password for the login keyring was invalid. > <0.4> 2014-08-11 15:32:03 Telcontar kernel - - - [74116.576018] XFS (sdd5): xfs_log_force: error 5 returned. > <0.4> 2014-08-11 15:32:33 Telcontar kernel - - - [74146.656011] XFS (sdd5): xfs_log_force: error 5 returned. > <3.6> 2014-08-11 15:33:01 Telcontar systemd 1 - - Starting Session 566 of user news. > <0.4> 2014-08-11 15:33:03 Telcontar kernel - - - [74176.736068] XFS (sdd5): xfs_log_force: error 5 returned. > <0.4> 2014-08-11 15:33:33 Telcontar kernel - - - [74206.816012] XFS (sdd5): xfs_log_force: error 5 returned. > <0.4> 2014-08-11 15:34:03 Telcontar kernel - - - [74236.896017] XFS (sdd5): xfs_log_force: error 5 returned. > <0.4> 2014-08-11 15:34:33 Telcontar kernel - - - [74266.976014] XFS (sdd5): xfs_log_force: error 5 returned. > <3.6> 2014-08-11 15:35:01 Telcontar systemd 1 - - Starting Session 567 of user news. > <0.4> 2014-08-11 15:35:03 Telcontar kernel - - - [74297.056012] XFS (sdd5): xfs_log_force: error 5 returned. > <0.4> 2014-08-11 15:35:33 Telcontar kernel - - - [74327.136015] XFS (sdd5): xfs_log_force: error 5 returned. > <1.6> 2014-08-11 15:35:56 Telcontar run-crons 8974 - - leafnode: OK > <3.6> 2014-08-11 15:35:56 Telcontar systemd 1 - - Reloading System Logging Service. > <3.6> 2014-08-11 15:35:57 Telcontar systemd 1 - - Reloaded System Logging Service. > <5.6> 2014-08-11 15:35:57 Telcontar rsyslogd - - - [origin software="rsyslogd" swVersion="7.4.7" x-pid="1081" x-info="http://www.rsyslog.com"] rsyslogd was HUPed > <3.6> 2014-08-11 15:36:02 Telcontar systemd 1 - - Reloading System Logging Service. > <3.6> 2014-08-11 15:36:02 Telcontar systemd 1 - - Reloaded System Logging Service. > <0.4> 2014-08-11 15:36:03 Telcontar kernel - - - [74357.216013] XFS (sdd5): xfs_log_force: error 5 returned. > <1.6> 2014-08-11 15:36:06 Telcontar run-crons 8974 - - logrotate: OK > <3.2> 2014-08-11 15:36:06 Telcontar mdadm 9290 - - DegradedArray event detected on md device /dev/md0 > <1.6> 2014-08-11 15:36:06 Telcontar run-crons 8974 - - mdadm: OK > <4.5> 2014-08-11 15:36:06 Telcontar su - - - (to root) root on (null) > <1.4> 2014-08-11 15:36:25 Telcontar run-crons 8974 - - mlocate.cron returned 143 > <1.6> 2014-08-11 15:36:25 Telcontar run-crons 8974 - - packagekit-background.cron: OK > <1.6> 2014-08-11 15:36:26 Telcontar run-crons 8974 - - suse-clean_catman: OK > <0.4> 2014-08-11 15:36:33 Telcontar kernel - - - [74387.296018] XFS (sdd5): xfs_log_force: error 5 returned. > <1.6> 2014-08-11 15:36:41 Telcontar run-crons 8974 - - suse-do_mandb: OK > <1.6> 2014-08-11 15:36:57 Telcontar run-crons 8974 - - suse-texlive: OK > <1.6> 2014-08-11 15:36:57 Telcontar run-crons 8974 - - suse.cron-sa-update: OK > <1.6> 2014-08-11 15:36:58 Telcontar run-crons 8974 - - suse.de-backup-rc.config: OK > <0.4> 2014-08-11 15:37:04 Telcontar kernel - - - [74417.376010] XFS (sdd5): xfs_log_force: error 5 returned. > <1.6> 2014-08-11 15:37:34 Telcontar run-crons 8974 - - suse.de-backup-rpmdb: OK > <0.4> 2014-08-11 15:37:34 Telcontar kernel - - - [74447.456013] XFS (sdd5): xfs_log_force: error 5 returned. > <1.6> 2014-08-11 15:37:34 Telcontar run-crons 8974 - - suse.de-check-battery: OK > <1.6> 2014-08-11 15:37:34 Telcontar run-crons 8974 - - suse.de-cron-local: OK > <1.6> 2014-08-11 15:37:34 Telcontar run-crons 8974 - - suse.de-faxcron: OK > <1.6> 2014-08-11 15:37:34 Telcontar run-crons 8974 - - suse.de-snapper: OK > <3.6> 2014-08-11 15:38:01 Telcontar systemd 1 - - Starting Session 568 of user news. > <0.4> 2014-08-11 15:38:04 Telcontar kernel - - - [74477.536013] XFS (sdd5): xfs_log_force: error 5 returned. > <0.4> 2014-08-11 15:38:34 Telcontar kernel - - - [74507.616019] XFS (sdd5): xfs_log_force: error 5 returned. > <0.4> 2014-08-11 15:39:04 Telcontar kernel - - - [74537.696013] XFS (sdd5): xfs_log_force: error 5 returned. > <0.4> 2014-08-11 15:39:34 Telcontar kernel - - - [74567.776014] XFS (sdd5): xfs_log_force: error 5 returned. > <3.6> 2014-08-11 15:40:01 Telcontar systemd 1 - - Starting Session 569 of user cer. > <0.4> 2014-08-11 15:40:04 Telcontar kernel - - - [74597.856013] XFS (sdd5): xfs_log_force: error 5 returned. > <0.4> 2014-08-11 15:40:34 Telcontar kernel - - - [74627.936021] XFS (sdd5): xfs_log_force: error 5 returned. > <0.4> 2014-08-11 15:41:04 Telcontar kernel - - - [74658.016012] XFS (sdd5): xfs_log_force: error 5 returned. > <0.4> 2014-08-11 15:41:34 Telcontar kernel - - - [74688.096019] XFS (sdd5): xfs_log_force: error 5 returned. > <0.4> 2014-08-11 15:42:04 Telcontar kernel - - - [74718.176018] XFS (sdd5): xfs_log_force: error 5 returned. > <0.4> 2014-08-11 15:42:34 Telcontar kernel - - - [74748.256017] XFS (sdd5): xfs_log_force: error 5 returned. > <3.6> 2014-08-11 15:43:01 Telcontar systemd 1 - - Starting Session 570 of user news. > <0.4> 2014-08-11 15:43:04 Telcontar kernel - - - [74778.336012] XFS (sdd5): xfs_log_force: error 5 returned. > <0.4> 2014-08-11 15:43:35 Telcontar kernel - - - [74808.416013] XFS (sdd5): xfs_log_force: error 5 returned. > <0.4> 2014-08-11 15:44:05 Telcontar kernel - - - [74838.496014] XFS (sdd5): xfs_log_force: error 5 returned. > <0.4> 2014-08-11 15:44:35 Telcontar kernel - - - [74868.576013] XFS (sdd5): xfs_log_force: error 5 returned. > <3.6> 2014-08-11 15:45:01 Telcontar systemd 1 - - Starting Session 571 of user root. > <3.6> 2014-08-11 15:45:01 Telcontar systemd 1 - - Starting Session 572 of user news. > <0.4> 2014-08-11 15:45:05 Telcontar kernel - - - [74898.656019] XFS (sdd5): xfs_log_force: error 5 returned. > <0.4> 2014-08-11 15:45:35 Telcontar kernel - - - [74928.736017] XFS (sdd5): xfs_log_force: error 5 returned. > <0.4> 2014-08-11 15:46:05 Telcontar kernel - - - [74958.816015] XFS (sdd5): xfs_log_force: error 5 returned. > <0.4> 2014-08-11 15:46:35 Telcontar kernel - - - [74988.896026] XFS (sdd5): xfs_log_force: error 5 returned. > <0.4> 2014-08-11 15:47:05 Telcontar kernel - - - [75018.976014] XFS (sdd5): xfs_log_force: error 5 returned. > <0.4> 2014-08-11 15:47:35 Telcontar kernel - - - [75049.056013] XFS (sdd5): xfs_log_force: error 5 returned. > <3.6> 2014-08-11 15:48:01 Telcontar systemd 1 - - Starting Session 573 of user news. > <0.4> 2014-08-11 15:48:05 Telcontar kernel - - - [75079.136016] XFS (sdd5): xfs_log_force: error 5 returned. > <0.4> 2014-08-11 15:48:35 Telcontar kernel - - - [75109.216014] XFS (sdd5): xfs_log_force: error 5 returned. > <0.4> 2014-08-11 15:49:05 Telcontar kernel - - - [75139.296014] XFS (sdd5): xfs_log_force: error 5 returned. > <0.4> 2014-08-11 15:49:36 Telcontar kernel - - - [75169.376013] XFS (sdd5): xfs_log_force: error 5 returned. > <0.4> 2014-08-11 15:50:06 Telcontar kernel - - - [75199.456012] XFS (sdd5): xfs_log_force: error 5 returned. > <0.4> 2014-08-11 15:50:36 Telcontar kernel - - - [75229.536011] XFS (sdd5): xfs_log_force: error 5 returned. > <0.4> 2014-08-11 15:51:06 Telcontar kernel - - - [75259.616013] XFS (sdd5): xfs_log_force: error 5 returned. > <0.6> 2014-08-11 15:51:09 Telcontar kernel - - - [75262.721354] xfce4-session[4520]: segfault at 8 ip 00000000004164dc sp 00007fffdc291dc0 error 4 in xfce4-session[400000+2b00 > <4.6> 2014-08-11 15:51:18 Telcontar systemd-logind 1021 - - Removed session 8. > <10.5> 2014-08-11 15:51:18 Telcontar polkitd 4314 - - Unregistered Authentication Agent for unix-session:10 (system bus name :1.69, object path /org/gnome/PolicyKit1/Authenti > <0.7> 2014-08-11 15:51:28 Telcontar kernel - - - [75282.132776] nvidia 0000:01:00.0: irq 48 for MSI/MSI-X > <3.6> 2014-08-11 15:51:29 Telcontar acpid - - - 1 client rule loaded > <4.6> 2014-08-11 15:51:30 Telcontar systemd-logind 1021 - - Removed session 10. > <0.6> 2014-08-11 15:51:30 Telcontar kernel - - - [75284.176020] usb 1-6: new high-speed USB device number 4 using ehci-pci > <3.6> 2014-08-11 15:51:30 Telcontar systemd 1 - - Starting Session 574 of user lightdm. > <4.6> 2014-08-11 15:51:30 Telcontar systemd-logind 1021 - - New session 574 of user lightdm. > <4.6> 2014-08-11 15:51:30 Telcontar systemd-logind 1021 - - Linked /tmp/.X11-unix/X0 to /run/user/127/X11-display. > <0.6> 2014-08-11 15:51:30 Telcontar kernel - - - [75284.291822] usb 1-6: New USB device found, idVendor=8564, idProduct=1000 > <0.6> 2014-08-11 15:51:30 Telcontar kernel - - - [75284.291825] usb 1-6: New USB device strings: Mfr=1, Product=2, SerialNumber=3 > <0.6> 2014-08-11 15:51:30 Telcontar kernel - - - [75284.291828] usb 1-6: Product: Mass Storage Device > <0.6> 2014-08-11 15:51:30 Telcontar kernel - - - [75284.291829] usb 1-6: Manufacturer: JetFlash > <0.6> 2014-08-11 15:51:30 Telcontar kernel - - - [75284.291831] usb 1-6: SerialNumber: 346YLQ4L0G5H8S2F > <1.6> 2014-08-11 15:51:31 Telcontar mtp-probe - - - checking bus 1, device 4: "/sys/devices/pci0000:00/0000:00:1a.7/usb1/1-6" > <1.6> 2014-08-11 15:51:31 Telcontar mtp-probe - - - bus: 1, device: 4 was not an MTP device > <0.6> 2014-08-11 15:51:31 Telcontar kernel - - - [75284.667399] usb-storage 1-6:1.0: USB Mass Storage device detected > <0.6> 2014-08-11 15:51:31 Telcontar kernel - - - [75284.667502] scsi12 : usb-storage 1-6:1.0 > <0.6> 2014-08-11 15:51:31 Telcontar kernel - - - [75284.667606] usbcore: registered new interface driver usb-storage > <0.5> 2014-08-11 15:51:32 Telcontar kernel - - - [75285.794904] scsi 12:0:0:0: Direct-Access JetFlash Transcend 4GB 1100 PQ: 0 ANSI: 4 > <0.6> 2014-08-11 15:51:32 Telcontar kernel - - - [75285.794976] scsi 12:0:0:0: alua: supports implicit and explicit TPGS > <0.6> 2014-08-11 15:51:32 Telcontar kernel - - - [75285.796262] scsi 12:0:0:0: alua: No target port descriptors found > <0.3> 2014-08-11 15:51:32 Telcontar kernel - - - [75285.796265] scsi 12:0:0:0: alua: not attached > <0.5> 2014-08-11 15:51:32 Telcontar kernel - - - [75285.796396] sd 12:0:0:0: Attached scsi generic sg6 type 0 > <0.5> 2014-08-11 15:51:32 Telcontar kernel - - - [75285.796888] sd 12:0:0:0: [sdf] 7913472 512-byte logical blocks: (4.05 GB/3.77 GiB) > <0.5> 2014-08-11 15:51:32 Telcontar kernel - - - [75285.797634] sd 12:0:0:0: [sdf] Write Protect is off > <0.7> 2014-08-11 15:51:32 Telcontar kernel - - - [75285.797637] sd 12:0:0:0: [sdf] Mode Sense: 43 00 00 00 > <0.3> 2014-08-11 15:51:32 Telcontar kernel - - - [75285.798386] sd 12:0:0:0: [sdf] No Caching mode page found > <0.3> 2014-08-11 15:51:32 Telcontar kernel - - - [75285.798388] sd 12:0:0:0: [sdf] Assuming drive cache: write through > <0.3> 2014-08-11 15:51:32 Telcontar kernel - - - [75285.801508] sd 12:0:0:0: [sdf] No Caching mode page found > <0.3> 2014-08-11 15:51:32 Telcontar kernel - - - [75285.801511] sd 12:0:0:0: [sdf] Assuming drive cache: write through > <0.6> 2014-08-11 15:51:32 Telcontar kernel - - - [75285.802147] sdf: sdf1 sdf2 sdf3 > <0.3> 2014-08-11 15:51:32 Telcontar kernel - - - [75285.805642] sd 12:0:0:0: [sdf] No Caching mode page found > <0.3> 2014-08-11 15:51:32 Telcontar kernel - - - [75285.805645] sd 12:0:0:0: [sdf] Assuming drive cache: write through > <0.5> 2014-08-11 15:51:32 Telcontar kernel - - - [75285.805648] sd 12:0:0:0: [sdf] Attached SCSI removable disk > <0.4> 2014-08-11 15:51:36 Telcontar kernel - - - [75289.696019] XFS (sdd5): xfs_log_force: error 5 returned. > <3.6> 2014-08-11 15:51:41 Telcontar systemd 1 - - Starting Getty on tty2... > <3.6> 2014-08-11 15:51:41 Telcontar systemd 1 - - Started Getty on tty2. > <3.6> 2014-08-11 15:51:42 Telcontar systemd 1 - - Starting Getty on tty3... > <3.6> 2014-08-11 15:51:42 Telcontar systemd 1 - - Started Getty on tty3. > <3.6> 2014-08-11 15:51:43 Telcontar systemd 1 - - Starting Getty on tty6... > <3.6> 2014-08-11 15:51:43 Telcontar systemd 1 - - Started Getty on tty6. > <3.6> 2014-08-11 15:51:44 Telcontar systemd 1 - - Starting Getty on tty5... > <3.6> 2014-08-11 15:51:44 Telcontar systemd 1 - - Started Getty on tty5. > <3.6> 2014-08-11 15:51:45 Telcontar systemd 1 - - Starting Getty on tty4... > <3.6> 2014-08-11 15:51:45 Telcontar systemd 1 - - Started Getty on tty4. > <0.4> 2014-08-11 15:52:06 Telcontar kernel - - - [75319.776023] XFS (sdd5): xfs_log_force: error 5 returned. > <3.6> 2014-08-11 15:52:08 Telcontar systemd 1 - - Unmounting /data/raid... > <3.6> 2014-08-11 15:52:08 Telcontar systemd 1 - - Unmounting /data/cripta... > <3.6> 2014-08-11 15:52:08 Telcontar systemd 1 - - Stopping /sys/devices/virtual/block/dm-0. > <3.6> 2014-08-11 15:52:08 Telcontar systemd 1 - - message repeated 5 times: [ Stopping /sys/devices/virtual/block/dm-0.] > <3.6> 2014-08-11 15:52:08 Telcontar systemd 1 - - Stopping Session 574 of user lightdm. > <3.6> 2014-08-11 15:52:08 Telcontar systemd 1 - - Stopped Session 574 of user lightdm. > <3.6> 2014-08-11 15:52:08 Telcontar systemd 1 - - Stopping Session 7 of user root. > <3.6> 2014-08-11 15:52:08 Telcontar systemd 1 - - Stopped Session 7 of user root. > <3.6> 2014-08-11 15:52:08 Telcontar systemd 1 - - Stopping user-0.slice. > <3.6> 2014-08-11 15:52:08 Telcontar systemd 1 - - Removed slice user-0.slice. > <3.6> 2014-08-11 15:52:08 Telcontar systemd 1 - - Stopping Stop Read-Ahead Data Collection 10s After Completed Startup. > <3.6> 2014-08-11 15:52:08 Telcontar systemd 1 - - Stopped Stop Read-Ahead Data Collection 10s After Completed Startup. > <3.6> 2014-08-11 15:52:08 Telcontar systemd 1 - - Stopping User Manager for 1000... > <3.6> 2014-08-11 15:52:08 Telcontar systemd 1 - - Stopping User Manager for 9... > <3.6> 2014-08-11 15:52:08 Telcontar systemd 1 - - Stopping User Manager for 127... > <3.6> 2014-08-11 15:52:08 Telcontar systemd 1 - - Stopping CUPS Printing Service... > <3.6> 2014-08-11 15:52:08 Telcontar systemd 1 - - Stopping ifup managed network interface eth1... > <3.6> 2014-08-11 15:52:08 Telcontar systemd 1 - - Stopping ifup managed network interface eth0... > <3.6> 2014-08-11 15:17:44 Telcontar systemd 4377 - - message repeated 14 times: [ Time has been changed] > <3.3> 2014-08-11 15:52:08 Telcontar systemd 4377 - - Failed to enqueue exit.target job: Unit exit.target failed to load: Input/output error. > <3.6> 2014-08-11 15:52:08 Telcontar systemd 1 - - Stopping Graphical Interface. > <3.6> 2014-08-11 15:52:08 Telcontar systemd 1 - - Stopped target Graphical Interface. > <3.6> 2014-08-11 15:52:08 Telcontar systemd 1 - - Stopping LSB: X Display Manager... > <3.6> 2014-08-11 15:52:08 Telcontar systemd 1 - - Stopping helloworld.service... > <3.6> 2014-08-11 15:52:08 Telcontar systemd 1 - - Stopped helloworld.service. > <3.6> 2014-08-11 15:52:08 Telcontar systemd 1 - - Stopping Multi-User System. > <3.6> 2014-08-11 15:52:08 Telcontar systemd 1 - - Stopped target Multi-User System. > <3.6> 2014-08-11 15:52:08 Telcontar systemd 1 - - Stopping LSB: virus scanner daemon... > <3.6> 2014-08-11 15:52:08 Telcontar systemd 1 - - Stopping LSB: Start the hddtemp daemon... > <3.6> 2014-08-11 15:52:08 Telcontar systemd 1 - - Stopping LSB: mdadmd daemon monitoring MD devices... > <3.6> 2014-08-11 15:52:08 Telcontar systemd 1 - - Stopping LSB: This services starts and stops the USB Arbitrator.... > <3.6> 2014-08-11 15:52:08 Telcontar systemd 1 - - Stopping LSB: Supports the direct execution of binary formats.... > <3.6> 2014-08-11 15:52:08 Telcontar systemd 1 - - Stopping LSB: irqbalance daemon providing irq balancing on MP-machines... > <3.6> 2014-08-11 15:52:09 Telcontar systemd 1 - - Stopping LSB: Set up analog joysticks... > <0.4> 2014-08-11 15:52:10 Telcontar kernel - - - [75323.547122] nfsd: last server has exited, flushing export cache > <5.6> 2014-08-11 15:36:02 Telcontar rsyslogd - - - [origin software="rsyslogd" swVersion="7.4.7" x-pid="1081" x-info="http://www.rsyslog.com"] rsyslogd was HUPed > <5.6> 2014-08-11 15:52:11 Telcontar rsyslogd - - - [origin software="rsyslogd" swVersion="7.4.7" x-pid="1081" x-info="http://www.rsyslog.com"] exiting on signal 15. > 2014-08-11 15:52:12+02:00 - Halting the system now =========================================== uptime: 15:52pm up 1 day 20:54, 1 user, load average: 5.94, 2.47, 1.22 > > > > >I am interested in the metadata dump. > > Ok, sure, no problem. I'm working on that, but I need to have lunch first ;-) > > > >Also, some one hit back to back duplicate block allocation > >XFS_WANT_CORRUPTED_GOTO bugs, you may want to do a metadata dump before > >and after the xfs_repair in case you hit it again soon. > > I already have a metadata dump, and I have not attempted to repair yet (I'm > doing a full dd copy of partition, and it is 400 Gigs). I will obtain > another metadadump after repair, and I can upload both to google drive. > > But first I need sustenance :-) > > (At least this time I do not have any pressing thing to do on the > computer...) > > - -- Cheers > Carlos E. R. > > (from 13.1 x86_64 "Bottle" (Minas Tirith)) > > -----BEGIN PGP SIGNATURE----- > Version: GnuPG v2.0.22 (GNU/Linux) > > iF0EAREIAAYFAlPo4p4ACgkQja8UbcUWM1wGAADxAVuTUPkxG+LO29VzehJ8cSPV > uItG/Puu2KbqUeCyXwD/cgu/+F7vhEeU9WEbNP5eifhmyu0T3ByDMtuKp55Rj7A= > =CgSx > -----END PGP SIGNATURE----- > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From fanael4@gmail.com Mon Aug 11 11: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=1.2 required=5.0 tests=FREEMAIL_ENVFROM_END_DIGIT, FREEMAIL_FROM,MISSING_HEADERS,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 B63017F4E for ; Mon, 11 Aug 2014 11: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 35BD6AC005 for ; Mon, 11 Aug 2014 09:19:08 -0700 (PDT) X-ASG-Debug-ID: 1407773946-04cbb0508a96cf0001-NocioJ Received: from mail-qc0-f193.google.com (mail-qc0-f193.google.com [209.85.216.193]) by cuda.sgi.com with ESMTP id lTiZk0OVILucQ9lg (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Mon, 11 Aug 2014 09:19:06 -0700 (PDT) X-Barracuda-Envelope-From: fanael4@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.216.193 X-Barracuda-IPDD: Level1 [gmail.com/209.85.216.193] Received: by mail-qc0-f193.google.com with SMTP id c9so689622qcz.4 for ; Mon, 11 Aug 2014 09:19:06 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.216.193] X-Barracuda-IPDD: Level1 [gmail.com/209.85.216.193] 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:cc :content-type:content-transfer-encoding; bh=92lLuJgme+AV/X1KQwGISmYlCULJY/j1YEGiWc+STOc=; b=ZOqbeeoE/o+BCrJSFglMaigs850Llq3YJGgLDH/GS7/U1F7T7JpH7NZ1P5lSrFS/J8 ZzIOb6kfbeEVOghGNZ5S2fAsGCZiczx7bYV/CNpZVN7mUiVe1yuMCJj3MhoAIJejb6mS k+O6sXkwVh+9QW7oJFExvYYxo8YPiYBBXoXZKtOA40W5j+3hlSaliFrPLo3zXFlaWXZm mfNimPXKUgI2P+SpCkTD99dzNKnpiHRnTxEEE68FLtnGeQnIaNYxtDecb2RE9KnpSoWk g4TOO7uQ1W7g+CbIwIiXbCOYqwCh5NhtNHINPLZBG95gBIyWEbEn9pxhATROYX4J/ak/ f6SA== MIME-Version: 1.0 X-Received: by 10.140.104.213 with SMTP id a79mr29805644qgf.46.1407773946079; Mon, 11 Aug 2014 09:19:06 -0700 (PDT) Received: by 10.224.182.200 with HTTP; Mon, 11 Aug 2014 09:19:06 -0700 (PDT) In-Reply-To: References: <20140809005404.GG26465@dastard> <20140811043219.GJ26465@dastard> Date: Mon, 11 Aug 2014 18:19:06 +0200 Message-ID: Subject: Re: Verifier fixes backported to stable kernels? From: Fanael Linithien X-ASG-Orig-Subj: Re: Verifier fixes backported to stable kernels? Cc: xfs@oss.sgi.com Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable X-Barracuda-Connect: mail-qc0-f193.google.com[209.85.216.193] X-Barracuda-Start-Time: 1407773946 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 1.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=DKIM_SIGNED, DKIM_VERIFIED, MISSING_HEADERS X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.8326 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 1.21 MISSING_HEADERS Missing To: header > 2014-08-11 6:32 GMT+02:00 Dave Chinner : > Ok, but please use the "one-line format" when quoting commits. > > I.e. this: > > $ git log --oneline -n 4 ad3714b > [=E2=80=A6] > > is much more informative to the reader without a git tree to look up > commits. Okay, I'll try to remember. > As it is, those commits have not yet been sent to Linus, hence they > won't yet be accepted by the stable kernel folk. And because they > haven't been sent to Linus yet, I can redo the commits in that topic > branch with the needed stable tags. I've got to add a couple more > fixes that need to go to stable, too, so a pull req won't happen for > a couple of days yet.... Okay, so I really need to patch it manually. From robin.listas@gmail.com Mon Aug 11 12:05: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=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 F11EE7F3F for ; Mon, 11 Aug 2014 12:05:25 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id CC98B8F8040 for ; Mon, 11 Aug 2014 10:05:22 -0700 (PDT) X-ASG-Debug-ID: 1407776717-04cbb0508d9a1a0001-NocioJ Received: from mail-we0-f181.google.com (mail-we0-f181.google.com [74.125.82.181]) by cuda.sgi.com with ESMTP id PKjEIh7BJHWQqnTK (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Mon, 11 Aug 2014 10:05:18 -0700 (PDT) X-Barracuda-Envelope-From: robin.listas@gmail.com X-Barracuda-Apparent-Source-IP: 74.125.82.181 Received: by mail-we0-f181.google.com with SMTP id k48so8698380wev.26 for ; Mon, 11 Aug 2014 10:05:17 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=sender:date:from:to:subject:in-reply-to:message-id:references :user-agent:mime-version:content-type; bh=Q96VhsAFi2kT6RZU/CyBW4V/obSq7vOAbDhNwj/SEFQ=; b=vZltelNfXQo+PoJdUpC6y2yKbtmW5X3uwkw9Ag6X3CHbtruI4P3apHES8aXLOBqJA6 CNDaDfzkLAARuVkRZzIpCjS60sHaa+IUmZ3Uz9C9QEahLsEsTTgU/cLQ0QP9I6fb43VF 0IqAcSzKmDCOK62oUg2O8oNnPP9E2kQgveTxUySx7qjDofWx0GTMt86blrvfc3jddYPr DUg0X18upNkQO7Lh9CmsguL5E5KePmpW2aW319go467s413QPwmNr5xbeXFKthi3iSFe 83JecYOPg4iE9CkzDHGkKbKQTS0nMdKz0XO62gCjyt+sZFGiu9vMtKCjkr19oUtMfFQM 3kjw== X-Received: by 10.194.121.65 with SMTP id li1mr56645118wjb.10.1407776717141; Mon, 11 Aug 2014 10:05:17 -0700 (PDT) Received: from minas-tirith.valinor (177.Red-79-159-63.staticIP.rima-tde.net. [79.159.63.177]) by mx.google.com with ESMTPSA id ge8sm45952177wib.4.2014.08.11.10.05.15 for (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 11 Aug 2014 10:05:16 -0700 (PDT) Sender: Carlos Robinson Received: from localhost (localhost [127.0.0.1]) by minas-tirith.valinor (Postfix) with ESMTP id A2FC4185A7D for ; Mon, 11 Aug 2014 19:05:13 +0200 (CEST) Date: Mon, 11 Aug 2014 19:05:00 +0200 (CEST) From: "Carlos E. R." X-X-Sender: cer@minas-tirith.valinor To: XFS mailing list Subject: Re: Subject : Happened again, 20140811 -- Got "Internal error XFS_WANT_CORRUPTED_GOTO". Filesystem needs reformatting to correct issue. In-Reply-To: X-ASG-Orig-Subj: Re: Subject : Happened again, 20140811 -- Got "Internal error XFS_WANT_CORRUPTED_GOTO". Filesystem needs reformatting to correct issue. Message-ID: References: <20140811144359.GA10217@laptop.bfoster> User-Agent: Alpine 2.11 (LSU 23 2013-08-11) MIME-Version: 1.0 Content-Type: MULTIPART/MIXED; BOUNDARY="-1463779071-664183082-1407776713=:7326" X-Barracuda-Connect: mail-we0-f181.google.com[74.125.82.181] X-Barracuda-Start-Time: 1407776717 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.8327 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 This message is in MIME format. The first part should be readable text, while the remaining parts are likely unreadable without MIME-aware tools. ---1463779071-664183082-1407776713=:7326 Content-Type: TEXT/PLAIN; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8BIT -----BEGIN PGP SIGNED MESSAGE----- Hash: SHA256 El 2014-08-11 a las 16:58 +0200, Carlos E. R. escribió: > Ok, will do. > > I will create a backup of my partition, with xfsdump, after attempting > repair of the partition, and reboot, and see (without the reformat cycle). > > At this instant I'm doing a full dd of the partition, just in case it > becomes useful. linux:/run/media/linux/d_storage/xfs_disaster_home/20140811 # xfs_repair -V xfs_repair version 3.1.11 It is a live system, so I acan't update it. If I boot from the main system, that has a more modern xfs_repair, systemd will attempt mount and automated repair, and we will not get any logs. linux:/run/media/linux/d_storage/xfs_disaster_home/20140811 # xfs_repair -v /dev/sdd5 Phase 1 - find and verify superblock... - block cache size set to 753952 entries Phase 2 - using internal log - zero log... zero_log: head block 65662 tail block 65607 ERROR: The filesystem has valuable metadata changes in a log which needs to be replayed. Mount the filesystem to replay the log, and unmount it before re-running xfs_repair. If you are unable to mount the filesystem, then use the -L option to destroy the log and attempt a repair. Note that destroying the log may cause corruption -- please attempt a mount of the filesystem before doing this. linux:/run/media/linux/d_storage/xfs_disaster_home/20140811 # linux:/run/media/linux/d_storage/xfs_disaster_home/20140811 # mount -v /dev/sdd5 mnt/ mount: /dev/sdd5 mounted on /run/media/linux/d_storage/xfs_disaster_home/20140811/mnt. linux:/run/media/linux/d_storage/xfs_disaster_home/20140811 # umount mnt linux:/run/media/linux/d_storage/xfs_disaster_home/20140811 # dmesg: [10266.034290] XFS (sdd5): Mounting Filesystem [10266.073739] XFS (sdd5): Starting recovery (logdev: internal) [10266.690325] XFS (sdd5): Ending recovery (logdev: internal) linux@linux:~> dmesg --ctime [Mon Aug 11 16:47:12 2014] XFS (sdd5): Mounting Filesystem [Mon Aug 11 16:47:12 2014] XFS (sdd5): Starting recovery (logdev: internal) [Mon Aug 11 16:47:12 2014] XFS (sdd5): Ending recovery (logdev: internal) linux@linux:~> linux:/run/media/linux/d_storage/xfs_disaster_home/20140811 # xfs_repair -v /dev/sdd5 Phase 1 - find and verify superblock... - block cache size set to 753952 entries Phase 2 - using internal log - zero log... zero_log: head block 65700 tail block 65700 - scan filesystem freespace and inode maps... block (1,12608397-12608397) multiply claimed by cnt space tree, state - 2 agf_freeblks 27745492, counted 27745496 in ag 1 sb_fdblocks 115565042, counted 115565046 - found root inode chunk Phase 3 - for each AG... - scan and clear agi unlinked lists... - process known inodes and perform inode discovery... - agno = 0 - agno = 1 - agno = 2 - agno = 3 - process newly discovered inodes... Phase 4 - check for duplicate blocks... - setting up duplicate extent list... - check for inodes claiming duplicate blocks... - agno = 2 - agno = 1 - agno = 3 - agno = 0 Phase 5 - rebuild AG headers and trees... - agno = 0 - agno = 1 - agno = 2 - agno = 3 - reset superblock... Phase 6 - check inode connectivity... - resetting contents of realtime bitmap and summary inodes - traversing filesystem ... - agno = 0 - agno = 1 - agno = 2 - agno = 3 - traversal finished ... - moving disconnected inodes to lost+found ... Phase 7 - verify and correct link counts... XFS_REPAIR Summary Mon Aug 11 16:48:08 2014 Phase Start End Duration Phase 1: 08/11 16:47:49 08/11 16:47:49 Phase 2: 08/11 16:47:49 08/11 16:47:52 3 seconds Phase 3: 08/11 16:47:52 08/11 16:48:07 15 seconds Phase 4: 08/11 16:48:07 08/11 16:48:07 Phase 5: 08/11 16:48:07 08/11 16:48:07 Phase 6: 08/11 16:48:07 08/11 16:48:07 Phase 7: 08/11 16:48:07 08/11 16:48:07 Total run time: 18 seconds done linux:/run/media/linux/d_storage/xfs_disaster_home/20140811 # I don't understand all it says, but aparently it does not detect any problem. dmesg doesn't have any more entries. Now I'm going to create an xfsdump of it, and reboot, without rebuilding. Then I'll upload the metadata to google drive. - -- Cheers Carlos E. R. (from 13.1 x86_64 "Bottle" (Minas Tirith)) -----BEGIN PGP SIGNATURE----- Version: GnuPG v2.0.22 (GNU/Linux) iF4EAREIAAYFAlPo98kACgkQja8UbcUWM1y78wD+MznL/4Ht53XAOw+CN/4ThhqQ P4cN85akyVugU+T6zusA/313Z3PHezJe2oUTx1dFpQpV8Lf+LSgtlHVZ0M4xL+sz =/iid -----END PGP SIGNATURE----- ---1463779071-664183082-1407776713=:7326-- From robin.listas@gmail.com Mon Aug 11 12:09: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=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 3B2477F3F for ; Mon, 11 Aug 2014 12:09:08 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id E90828F8052 for ; Mon, 11 Aug 2014 10:09:07 -0700 (PDT) X-ASG-Debug-ID: 1407776945-04bdf06ef79bd90001-NocioJ Received: from mail-wi0-f172.google.com (mail-wi0-f172.google.com [209.85.212.172]) by cuda.sgi.com with ESMTP id 13SuzWmPPoePdbM6 (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Mon, 11 Aug 2014 10:09:05 -0700 (PDT) X-Barracuda-Envelope-From: robin.listas@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.212.172 X-Barracuda-IPDD: Level1 [gmail.com/209.85.212.172] Received: by mail-wi0-f172.google.com with SMTP id n3so4596605wiv.17 for ; Mon, 11 Aug 2014 10:09:04 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.212.172] X-Barracuda-IPDD: Level1 [gmail.com/209.85.212.172] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=sender:date:from:to:subject:in-reply-to:message-id:references :user-agent:mime-version:content-type:content-id; bh=567PNAHofymfooHot3kW2wopKyBAZAToiyHWKFtkWC8=; b=KhUAOV9OyEDDh/zdBVe0mh4zKi/L4xylaoJmDDOp60r0ss+igIkKppoESXqnUD8+VR UD3S94e56gvMSqXMnH23vikiyDphzcXHzw713zPHfqovMsACqlT6rsWyE/0uiFlQBmfl YZLGgJF74XxyWznzKcWX9KTH3XR/aA0vJSj2B/KcX6FyLsp9SwND2xgb8k1LFgLGbvhp k0htlFQLXSkA2TBylm5r+72SamLkwySf01MXIJG2CZUjKW93ZUsL8Hk1hx/0XdDAauh6 z88JFEdS076mPlQL0XiELGyE7+74mtZZax7FtPMv0S6fPr9rgXIhXJIdPHSFkH6XrPb4 qpQQ== X-Received: by 10.180.105.6 with SMTP id gi6mr26561895wib.81.1407776944767; Mon, 11 Aug 2014 10:09:04 -0700 (PDT) Received: from minas-tirith.valinor (177.Red-79-159-63.staticIP.rima-tde.net. [79.159.63.177]) by mx.google.com with ESMTPSA id u7sm45992739wif.3.2014.08.11.10.09.03 for (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 11 Aug 2014 10:09:04 -0700 (PDT) Sender: Carlos Robinson Received: from localhost (localhost [127.0.0.1]) by minas-tirith.valinor (Postfix) with ESMTP id E2D02185A7D for ; Mon, 11 Aug 2014 19:09:01 +0200 (CEST) Date: Mon, 11 Aug 2014 19:08:53 +0200 (CEST) From: "Carlos E. R." X-X-Sender: cer@minas-tirith.valinor To: XFS mailing list Subject: Re: Subject : Happened again, 20140811 -- Got "Internal error XFS_WANT_CORRUPTED_GOTO". Filesystem needs reformatting to correct issue. In-Reply-To: <20140811161445.GA7696@bfoster.bfoster> X-ASG-Orig-Subj: Re: Subject : Happened again, 20140811 -- Got "Internal error XFS_WANT_CORRUPTED_GOTO". Filesystem needs reformatting to correct issue. Message-ID: References: <53E8D9F6.7080704@sgi.com> <20140811161445.GA7696@bfoster.bfoster> User-Agent: Alpine 2.11 (LSU 23 2013-08-11) MIME-Version: 1.0 Content-Type: MULTIPART/MIXED; BOUNDARY="-1463779071-1568027554-1407776878=:7326" Content-ID: X-Barracuda-Connect: mail-wi0-f172.google.com[209.85.212.172] X-Barracuda-Start-Time: 1407776945 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.8327 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 This message is in MIME format. The first part should be readable text, while the remaining parts are likely unreadable without MIME-aware tools. ---1463779071-1568027554-1407776878=:7326 Content-Type: TEXT/PLAIN; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8BIT Content-ID: -----BEGIN PGP SIGNED MESSAGE----- Hash: SHA256 Content-ID: El 2014-08-11 a las 12:14 -0400, Brian Foster escribió: > On Mon, Aug 11, 2014 at 05:34:46PM +0200, Carlos E. R. wrote: > This reminds me that it might be interesting to tune the eofblocks > scanner to be more aggressive and see if that helps reproduce. This > thread that's running here normally runs every 5 minutes by default, but > it can be tuned to run at a user-defined interval via the following > /proc file: > > # cat /proc/sys/fs/xfs/speculative_prealloc_lifetime > 300 > > I wonder if setting it to 30s or so ('echo 30 > /proc/...') and running > some hibernation cycles would help... Ok, I can try that. - -- Cheers Carlos E. R. (from 13.1 x86_64 "Bottle" (Minas Tirith)) -----BEGIN PGP SIGNATURE----- Version: GnuPG v2.0.22 (GNU/Linux) iF4EAREIAAYFAlPo+K0ACgkQja8UbcUWM1zxVgD+LFcJ3OBRJhn9LVrwFxf98H1u n7ubtexF8XXKWcUdjv0A/Ail1kzWxIgQkevunUQ/3UnbthtWqnyniHP4qKVUWv8m =AauB -----END PGP SIGNATURE----- ---1463779071-1568027554-1407776878=:7326-- From BATV+54fbffd5884d93615064+4005+infradead.org+hch@bombadil.srs.infradead.org Mon Aug 11 13:02: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 50A547F3F for ; Mon, 11 Aug 2014 13:02:39 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id D0BE8AC002 for ; Mon, 11 Aug 2014 11:02:35 -0700 (PDT) X-ASG-Debug-ID: 1407780153-04bdf06ef9a0e00001-NocioJ Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.9]) by cuda.sgi.com with ESMTP id DAyAkUnRpvkKzfzx (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 11 Aug 2014 11:02:33 -0700 (PDT) X-Barracuda-Envelope-From: BATV+54fbffd5884d93615064+4005+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 1XGtvP-000077-6g; Mon, 11 Aug 2014 18:02:27 +0000 Date: Mon, 11 Aug 2014 11:02:27 -0700 From: Christoph Hellwig To: Jan ??ul??k , Dave Chinner Cc: Brian Foster , Eric Sandeen , XFS mail list Subject: Re: symlink loop for /lib64/libhandle.so Message-ID: <20140811180227.GA30281@infradead.org> X-ASG-Orig-Subj: Re: symlink loop for /lib64/libhandle.so References: <1404898212.7231.12.camel@jtulak> <20140709132836.GA65226@bfoster.bfoster> <20140710134851.GA26652@infradead.org> <1405009872.31068.22.camel@jtulak> <53BEC1E7.1070904@sandeen.net> <1405075678.28203.56.camel@jtulak> <1405325087.3196.6.camel@jtulak> <20140714082607.GA19882@infradead.org> <20140715154857.GA14716@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140715154857.GA14716@infradead.org> User-Agent: Mutt/1.5.23 (2014-03-12) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: bombadil.infradead.org[198.137.202.9] X-Barracuda-Start-Time: 1407780153 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.8329 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Dave, can you pick up this patch for xfsprogs? On Tue, Jul 15, 2014 at 08:48:57AM -0700, Christoph Hellwig wrote: > Hi Jan, > > there were still some small isues with the patch format, I've attached > a version of your patch that has the expected format. > > Note that I also changed it to only check the canonical names instead of > testing the passed in one and the one readlink was called on. This > should be enough I think, but please test that it still works for you. > > Thanks for tracking this down! > From: Jan Tulak > Subject: [PATCH] libhandle: fix instalation for symlinked /usr > > Canonicalize the pathnames for PKG_LIB_DIR and PKG_ROOT_LIB_DIR before > checking if they are the same. This is required for Fedora which doesn't > have a separate /usr/lib directory anymore. > > Reported-by: Jan Tulak > Signed-off-by: Jan Tulak > > diff --git a/include/buildmacros b/include/buildmacros > index 7a01880..4e4e8fa 100644 > --- a/include/buildmacros > +++ b/include/buildmacros > @@ -76,10 +76,11 @@ INSTALL_LTLIB_DEV = \ > ../$(INSTALL) -m 644 $(LIBNAME).lai $(PKG_LIB_DIR)/$(LIBNAME).la ; \ > ../$(INSTALL) -m 755 -d $(PKG_ROOT_LIB_DIR); \ > ../$(INSTALL) -T so_base $(LIBNAME).lai $(PKG_ROOT_LIB_DIR); \ > - if test "x$(PKG_LIB_DIR)" != "x$(PKG_ROOT_LIB_DIR)" ; then \ > - ../$(INSTALL) -S $(PKG_LIB_DIR)/$(LIBNAME).a $(PKG_ROOT_LIB_DIR)/$(LIBNAME).a; \ > - ../$(INSTALL) -S $(PKG_LIB_DIR)/$(LIBNAME).la $(PKG_ROOT_LIB_DIR)/$(LIBNAME).la; \ > - ../$(INSTALL) -S $(PKG_ROOT_LIB_DIR)/$(LIBNAME).so $(PKG_LIB_DIR)/$(LIBNAME).so; \ > + if [ "x$(shell readlink -f $(PKG_LIB_DIR))" != \ > + "x$(shell readlink -f $(PKG_ROOT_LIB_DIR))"; ]; then \ > + ../$(INSTALL) -S $(PKG_LIB_DIR)/$(LIBNAME).a $(PKG_ROOT_LIB_DIR)/$(LIBNAME).a; \ > + ../$(INSTALL) -S $(PKG_LIB_DIR)/$(LIBNAME).la $(PKG_ROOT_LIB_DIR)/$(LIBNAME).la; \ > + ../$(INSTALL) -S $(PKG_ROOT_LIB_DIR)/$(LIBNAME).so $(PKG_LIB_DIR)/$(LIBNAME).so; \ > fi > else > INSTALL_LTLIB_DEV = $(INSTALL_LTLIB_STATIC) > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs ---end quoted text--- From BATV+54fbffd5884d93615064+4005+infradead.org+hch@bombadil.srs.infradead.org Mon Aug 11 13:03: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 114347F3F for ; Mon, 11 Aug 2014 13:03:28 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id E2B928F8064 for ; Mon, 11 Aug 2014 11:03:24 -0700 (PDT) X-ASG-Debug-ID: 1407780200-04cb6c4c9489330001-NocioJ Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.9]) by cuda.sgi.com with ESMTP id sZ5Huxapez8XIFCj (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 11 Aug 2014 11:03:20 -0700 (PDT) X-Barracuda-Envelope-From: BATV+54fbffd5884d93615064+4005+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 1XGtwF-0000Mu-UN; Mon, 11 Aug 2014 18:03:19 +0000 Date: Mon, 11 Aug 2014 11:03:19 -0700 From: Christoph Hellwig To: Brian Foster Cc: xfs@oss.sgi.com Subject: Re: [PATCH 1/2] xfs: don't log inode unless extent shift makes extent modifications Message-ID: <20140811180319.GA469@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 1/2] xfs: don't log inode unless extent shift makes extent modifications References: <1407523766-62233-1-git-send-email-bfoster@redhat.com> <1407523766-62233-2-git-send-email-bfoster@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1407523766-62233-2-git-send-email-bfoster@redhat.com> User-Agent: Mutt/1.5.23 (2014-03-12) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: bombadil.infradead.org[198.137.202.9] X-Barracuda-Start-Time: 1407780200 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.8328 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Looks good, Reviewed-by: Christoph Hellwig From BATV+54fbffd5884d93615064+4005+infradead.org+hch@bombadil.srs.infradead.org Mon Aug 11 13:03: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 (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 1CD017F3F for ; Mon, 11 Aug 2014 13:03:47 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id DE119304043 for ; Mon, 11 Aug 2014 11:03:46 -0700 (PDT) X-ASG-Debug-ID: 1407780225-04bdf06ef6a1000001-NocioJ Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.9]) by cuda.sgi.com with ESMTP id 7Hs4saKMazVrE2bx (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 11 Aug 2014 11:03:45 -0700 (PDT) X-Barracuda-Envelope-From: BATV+54fbffd5884d93615064+4005+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 1XGtwf-0000Um-C3; Mon, 11 Aug 2014 18:03:45 +0000 Date: Mon, 11 Aug 2014 11:03:45 -0700 From: Christoph Hellwig To: Brian Foster Cc: xfs@oss.sgi.com Subject: Re: [PATCH 2/2] xfs: hole the inode lock across a full file collapse Message-ID: <20140811180345.GB469@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 2/2] xfs: hole the inode lock across a full file collapse References: <1407523766-62233-1-git-send-email-bfoster@redhat.com> <1407523766-62233-3-git-send-email-bfoster@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1407523766-62233-3-git-send-email-bfoster@redhat.com> User-Agent: Mutt/1.5.23 (2014-03-12) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: bombadil.infradead.org[198.137.202.9] X-Barracuda-Start-Time: 1407780225 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-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.8329 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Looks good, Reviewed-by: Christoph Hellwig From tinguely@sgi.com Mon Aug 11 16:27: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 7F51F7F3F for ; Mon, 11 Aug 2014 16:27:16 -0500 (CDT) Received: from dhcp-128-162-232-117.americas.sgi.com (dhcp-128-162-232-117.americas.sgi.com [128.162.232.117]) by relay1.corp.sgi.com (Postfix) with ESMTP id 46C5E8F8037; Mon, 11 Aug 2014 14:27:13 -0700 (PDT) Message-ID: <53E93530.4070902@sgi.com> Date: Mon, 11 Aug 2014 16:27:12 -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: "Carlos E. R." CC: XFS mailing list Subject: Re: Subject : Happened again, 20140811 -- Got "Internal error XFS_WANT_CORRUPTED_GOTO". Filesystem needs reformatting to correct issue. References: <53E8D9F6.7080704@sgi.com> In-Reply-To: Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 8bit On 08/11/14 10:34, Carlos E. R. wrote: > -----BEGIN PGP SIGNED MESSAGE----- > Hash: SHA256 > > > > El 2014-08-11 a las 09:57 -0500, Mark Tinguely escribió: >> On 08/11/14 09:23, Carlos E. R. wrote: > >> Where in the filesystem did the XFS_WANT_CORRUPTED_GOTO happen? > > This time? > Did not look at the log yet. Let me see... > > Here is the full log of the event. It starts prior to hibernating, all > things nominal. And ends on shutdown (had to hit reset button, despite > what log says). If you want to see entries prior to that, since boot, I > can do that. > ... so XFS gave a forced shutdown after the machine came back from hibernation. After replaying the log, there were no errors in xfs_repair. We should have quiesced the metadata/log before freezing xfs. Was there a lot of items in the log? --Mark. From robin.listas@gmail.com Mon Aug 11 16:32: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,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 5E6407F50 for ; Mon, 11 Aug 2014 16:32:16 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 338A38F8037 for ; Mon, 11 Aug 2014 14:32:16 -0700 (PDT) X-ASG-Debug-ID: 1407792733-04cb6c4c9593fa0001-NocioJ Received: from mail-wg0-f50.google.com (mail-wg0-f50.google.com [74.125.82.50]) by cuda.sgi.com with ESMTP id gA7mabcdz7a9oiY5 (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Mon, 11 Aug 2014 14:32:14 -0700 (PDT) X-Barracuda-Envelope-From: robin.listas@gmail.com X-Barracuda-Apparent-Source-IP: 74.125.82.50 Received: by mail-wg0-f50.google.com with SMTP id n12so8904048wgh.21 for ; Mon, 11 Aug 2014 14:32:13 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=sender:date:from:to:subject:in-reply-to:message-id:references :user-agent:mime-version:content-type; bh=WBFd37kZHbciN3Atl3Tpshb/djvGSvgUOL7M2jPjatc=; b=wi3gyVD6hxDyWiJ8ZMic7sbH7y43NxsaruJrYUe4JpR4kqNuWtq+6zDGPMU5bBqxK7 ey100t1kWGLkj8ufct4EFKPqeP4n3MALAPrykKGJdPuL3Cnv/HbeeRSJt7ahiJAGQm0E SZat4YDxYhCbDy1A21dDOtQ0e+jn4oZ83IlO8JRQl7jFmkVj14rhut+i35toZJzf2Euj l2GhMEvKo+QvHvkdTVklgQMtj0Mc8e4z7RKXaNyTj53QOBqm7byBMxWT9xMplgxBQoCc m0xUeT5WYdfOpurMuzbuk3wuu71fyIn95OiwtGvjURZE6HMn4PhKYcirkW6/4QVKXom4 fmCA== X-Received: by 10.180.20.14 with SMTP id j14mr25460957wie.48.1407792733312; Mon, 11 Aug 2014 14:32:13 -0700 (PDT) Received: from minas-tirith.valinor (177.Red-79-159-63.staticIP.rima-tde.net. [79.159.63.177]) by mx.google.com with ESMTPSA id a4sm48194434wie.21.2014.08.11.14.32.11 for (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 11 Aug 2014 14:32:12 -0700 (PDT) Sender: Carlos Robinson Received: from localhost (localhost [127.0.0.1]) by minas-tirith.valinor (Postfix) with ESMTP id 62866183EEA for ; Mon, 11 Aug 2014 23:32:10 +0200 (CEST) Date: Mon, 11 Aug 2014 23:31:44 +0200 (CEST) From: "Carlos E. R." X-X-Sender: cer@minas-tirith.valinor To: XFS mailing list Subject: Re: Subject : Happened again, 20140811 -- Got "Internal error XFS_WANT_CORRUPTED_GOTO". Filesystem needs reformatting to correct issue. In-Reply-To: X-ASG-Orig-Subj: Re: Subject : Happened again, 20140811 -- Got "Internal error XFS_WANT_CORRUPTED_GOTO". Filesystem needs reformatting to correct issue. Message-ID: References: <20140811144359.GA10217@laptop.bfoster> User-Agent: Alpine 2.11 (LSU 23 2013-08-11) MIME-Version: 1.0 Content-Type: MULTIPART/MIXED; BOUNDARY="-1463779071-1142169509-1407792730=:17839" X-Barracuda-Connect: mail-wg0-f50.google.com[74.125.82.50] X-Barracuda-Start-Time: 1407792734 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.8336 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 This message is in MIME format. The first part should be readable text, while the remaining parts are likely unreadable without MIME-aware tools. ---1463779071-1142169509-1407792730=:17839 Content-Type: TEXT/PLAIN; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8BIT -----BEGIN PGP SIGNED MESSAGE----- Hash: SHA256 El 2014-08-11 a las 19:05 +0200, Carlos E. R. escribió: > linux:/run/media/linux/d_storage/xfs_disaster_home/20140811 # xfs_repair -V > xfs_repair version 3.1.11 > > It is a live system, so I acan't update it. If I boot from the main ... > Now I'm going to create an xfsdump of it, and reboot, without rebuilding. > Then I'll upload the metadata to google drive. I have just booted the main system, in text mode, logged as root. Look: Telcontar:/data/storage_d/xfs_disaster_home/20140811 # time xfs_metadump -g -w /dev/sdc5 tgtfile_20140811_obfus_after_repair_bis Copied 231552 of 231552 inodes (3 of 4 AGs) xfs_metadump: invalid dqblk inode number (-1) Copying log real 0m20.044s user 0m1.527s sys 0m1.174s Telcontar:/data/storage_d/xfs_disaster_home/20140811 # Telcontar:/data/storage_d/xfs_disaster_home/20140811 # xfs_metadump -V xfs_metadump version 3.2.1 And that was after running xfs_repair 3.2.1, which found nothing... Does that give any ideas? - -- Cheers Carlos E. R. (from 13.1 x86_64 "Bottle" (Minas Tirith)) -----BEGIN PGP SIGNATURE----- Version: GnuPG v2.0.22 (GNU/Linux) iF4EAREIAAYFAlPpNloACgkQja8UbcUWM1xa/wD/XzXCXoTni1LL13iBgD7XzTrv 1D6PLaMyIYsLiE9K0PYA/j7sXcWkvZV27fpfIdlU4ECyid6iULLdlQN4oSE56O2C =rZOy -----END PGP SIGNATURE----- ---1463779071-1142169509-1407792730=:17839-- From robin.listas@gmail.com Mon Aug 11 16:50: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=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 290B17F53 for ; Mon, 11 Aug 2014 16:50:36 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id CB63F304053 for ; Mon, 11 Aug 2014 14:50:35 -0700 (PDT) X-ASG-Debug-ID: 1407793833-04bdf06ef8ad7a0001-NocioJ Received: from mail-we0-f182.google.com (mail-we0-f182.google.com [74.125.82.182]) by cuda.sgi.com with ESMTP id ztK7qYRjsy3iutFV (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Mon, 11 Aug 2014 14:50:34 -0700 (PDT) X-Barracuda-Envelope-From: robin.listas@gmail.com X-Barracuda-Apparent-Source-IP: 74.125.82.182 Received: by mail-we0-f182.google.com with SMTP id k48so9153443wev.41 for ; Mon, 11 Aug 2014 14:50:32 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=sender:date:from:to:subject:in-reply-to:message-id:references :user-agent:mime-version:content-type; bh=0T+FZEQTHDaUMNX4iJ5+IeRV+oV7JAImpFbf1Ca0YIw=; b=dZLTmeIslbxeXmRdhEy0lMgOcWq3QNoIIDhXJq6VCmrwnjS6xnRxoqpabfjHCurrtj x2C1IxZyP9Tu/+gPHE7cy0aVrskIKwFfkbNz62sJlurVYUNrq84tKzrHQoWFNO0KIQNv XQS2GNHae0VXCCquIsYdVir1qeBXUnaKHqF/pX3+ol/DEFs0wpvCyz94yMAdx5T9exMu t7ZOE5Bn3cwdzHSe4QoctSeUa+OAFCBfh3Dlpea2y6W9V6JyWC0d53T2Ufprn7JqlXU6 kVgWZjGYTgVQi/ayi5Owzv+Qy/BKCb5UgzI9qgyR61gak9OGx+ncTKlEAArjxc+dFhgJ 0ndQ== X-Received: by 10.180.211.71 with SMTP id na7mr23869197wic.14.1407793832873; Mon, 11 Aug 2014 14:50:32 -0700 (PDT) Received: from minas-tirith.valinor (177.Red-79-159-63.staticIP.rima-tde.net. [79.159.63.177]) by mx.google.com with ESMTPSA id u7sm48403569wif.3.2014.08.11.14.50.31 for (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 11 Aug 2014 14:50:32 -0700 (PDT) Sender: Carlos Robinson Received: from localhost (localhost [127.0.0.1]) by minas-tirith.valinor (Postfix) with ESMTP id E6BAB183EEA for ; Mon, 11 Aug 2014 23:50:29 +0200 (CEST) Date: Mon, 11 Aug 2014 23:50:20 +0200 (CEST) From: "Carlos E. R." X-X-Sender: cer@minas-tirith.valinor To: XFS mailing list Subject: Re: Subject : Happened again, 20140811 -- Got "Internal error XFS_WANT_CORRUPTED_GOTO". Filesystem needs reformatting to correct issue. In-Reply-To: <53E93530.4070902@sgi.com> X-ASG-Orig-Subj: Re: Subject : Happened again, 20140811 -- Got "Internal error XFS_WANT_CORRUPTED_GOTO". Filesystem needs reformatting to correct issue. Message-ID: References: <53E8D9F6.7080704@sgi.com> <53E93530.4070902@sgi.com> User-Agent: Alpine 2.11 (LSU 23 2013-08-11) MIME-Version: 1.0 Content-Type: MULTIPART/MIXED; BOUNDARY="-1463779071-481454962-1407793829=:17839" X-Barracuda-Connect: mail-we0-f182.google.com[74.125.82.182] X-Barracuda-Start-Time: 1407793833 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.8337 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 This message is in MIME format. The first part should be readable text, while the remaining parts are likely unreadable without MIME-aware tools. ---1463779071-481454962-1407793829=:17839 Content-Type: TEXT/PLAIN; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8BIT -----BEGIN PGP SIGNED MESSAGE----- Hash: SHA256 El 2014-08-11 a las 16:27 -0500, Mark Tinguely escribió: > On 08/11/14 10:34, Carlos E. R. wrote: > > so XFS gave a forced shutdown after the machine came back from hibernation. > After replaying the log, there were no errors in xfs_repair. > > We should have quiesced the metadata/log before freezing xfs. Was there a lot > of items in the log? Sorry, what log? The /var/log/messages file? I posted it in full, from before the hibernation to powerdown. - -- Cheers Carlos E. R. (from 13.1 x86_64 "Bottle" (Minas Tirith)) -----BEGIN PGP SIGNATURE----- Version: GnuPG v2.0.22 (GNU/Linux) iF4EAREIAAYFAlPpOqUACgkQja8UbcUWM1xpewD/XaCmyL60x0lqs8PuoA9xfSTn 8CNxtpVX78L3O/1RsdYA/3U9CIA0uOCI9Lk4t0KO5xiLLjCZi/+AlvUtAbCfCQCB =VEcc -----END PGP SIGNATURE----- ---1463779071-481454962-1407793829=:17839-- From david@fromorbit.com Mon Aug 11 16: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 (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 34E147F55 for ; Mon, 11 Aug 2014 16:52:13 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 005678F8066 for ; Mon, 11 Aug 2014 14:52:12 -0700 (PDT) X-ASG-Debug-ID: 1407793930-04cb6c4c9394a90001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id cGYTkmKdcD9TTof7 for ; Mon, 11 Aug 2014 14:52: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: AjMLAO456VN5LDJ8PGdsb2JhbABagw2IWKZ9AQEBAQEBBqYjAYERFwUBAQEBODaEAwEBBAEnExwjBQsIAw4KCSUPBSUDBxoTiDoHw1QXGIVkiVAHhEwFnC6Yaisv Received: from ppp121-44-50-124.lns20.syd6.internode.on.net (HELO dastard) ([121.44.50.124]) by ipmail06.adl6.internode.on.net with ESMTP; 12 Aug 2014 07:22:08 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1XGxVf-0007dr-9W; Tue, 12 Aug 2014 07:52:07 +1000 Date: Tue, 12 Aug 2014 07:52:07 +1000 From: Dave Chinner To: Brian Foster Cc: Alex Lyakas , xfs@oss.sgi.com Subject: Re: use-after-free on log replay failure Message-ID: <20140811215207.GS20518@dastard> X-ASG-Orig-Subj: Re: use-after-free on log replay failure References: <20140115014503.GQ3469@dastard> <20140119231745.GF18112@dastard> <4B2A412C75324EE9880358513C069476@alyakaslap> <9D3CBECB663B4A77B7EF74B67973310A@alyakaslap> <20140804230721.GA20518@dastard> <20140806152042.GB39990@bfoster.bfoster> <20140811132057.GA1186@bfoster.bfoster> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140811132057.GA1186@bfoster.bfoster> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1407793930 X-Barracuda-URL: http://192.48.176.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.8337 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words On Mon, Aug 11, 2014 at 09:20:57AM -0400, Brian Foster wrote: > On Sun, Aug 10, 2014 at 03:20:50PM +0300, Alex Lyakas wrote: > > On Wed, Aug 6, 2014 at 6:20 PM, Brian Foster wrote: > > > On Wed, Aug 06, 2014 at 03:52:03PM +0300, Alex Lyakas wrote: ..... > > >> But I believe, my analysis shows that during the mount sequence XFS does not > > >> wait properly for all the bios to complete, before failing the mount > > >> sequence back to the caller. > > >> > > > > > > As an experiment, what about the following? Compile tested only and not > > > safe for general use. ... > > > diff --git a/fs/xfs/xfs_buf.c b/fs/xfs/xfs_buf.c > > > index cd7b8ca..fbcf524 100644 > > > --- a/fs/xfs/xfs_buf.c > > > +++ b/fs/xfs/xfs_buf.c > > > @@ -1409,19 +1409,27 @@ xfs_buf_iorequest( > > > * case nothing will ever complete. It returns the I/O error code, if any, or > > > * 0 if there was no error. > > > */ > > > -int > > > -xfs_buf_iowait( > > > - xfs_buf_t *bp) > > > +static int > > > +__xfs_buf_iowait( > > > + struct xfs_buf *bp, > > > + bool skip_error) > > > { > > > trace_xfs_buf_iowait(bp, _RET_IP_); > > > > > > - if (!bp->b_error) > > > + if (skip_error || !bp->b_error) > > > wait_for_completion(&bp->b_iowait); > > > > > > trace_xfs_buf_iowait_done(bp, _RET_IP_); > > > return bp->b_error; > > > } > > > > > > +int > > > +xfs_buf_iowait( > > > + struct xfs_buf *bp) > > > +{ > > > + return __xfs_buf_iowait(bp, false); > > > +} > > > + > > > xfs_caddr_t > > > xfs_buf_offset( > > > xfs_buf_t *bp, > > > @@ -1866,7 +1874,7 @@ xfs_buf_delwri_submit( > > > bp = list_first_entry(&io_list, struct xfs_buf, b_list); > > > > > > list_del_init(&bp->b_list); > > > - error2 = xfs_buf_iowait(bp); > > > + error2 = __xfs_buf_iowait(bp, true); > > > xfs_buf_relse(bp); > > > if (!error) > > > error = error2; Not waiting here on buffer error should not matter. Any buffer that is under IO and requires completion should be referenced, and that means it should be caught and waited on by xfs_wait_buftarg() in the mount failure path after log recovery fails. > > > --- > > I think that this patch fixes the problem. I tried reproducing it like > > 30 times, and it doesn't happen with this patch. Dropping this patch > > reproduces the problem within 1 or 2 tries. Thanks! > > What are next steps? How to make it "safe for general use"? > > > > Ok, thanks for testing. I think that implicates the caller bypassing the > expected blocking with the right sequence of log recovery I/Os and > device failure. TBH, I'd still like to see the specifics, if possible. > Could you come up with a generic reproducer for this? I think a metadump > of the fs with the dirty log plus whatever device failure simulation > hack you're using would suffice. The real issue is we don't know exactly what code is being tested (it's 3.8 + random bug fix backports + custom code). Even if we have a reproducer there's no guarantee it will reproduce on a current kernel. IOWs, we are stumbling around in the dark bashing our heads against everything in the room, and that just wastes everyone's time. We need a reproducer that triggers on a current, unmodified kernel release. You can use dm-faulty to error out all writes just like you are doing with your custom code. See xfstests::tests/generic/321 and common/dmflakey for to do this. Ideally the reproducer is in a form that xfstests can use.... If you can't reproduce it on an upstream kernel, then git bisect is your friend. It will find the commit that fixed the problem you are seeing.... > The ideal fix is not yet clear to me. We are not even that far along - the root cause of the bug is not at all clear to me. :/ Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Mon Aug 11 16:56: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 096087F57 for ; Mon, 11 Aug 2014 16:56:02 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id C359330404E for ; Mon, 11 Aug 2014 14:56:01 -0700 (PDT) X-ASG-Debug-ID: 1407794158-04bdf06ef7adbc0001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id vQgSHQXrv69PLqSC for ; Mon, 11 Aug 2014 14:55: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: AjILAEc76VN5LDJ8PGdsb2JhbABagw2IWKZ9AQEBAQEBBqYjAYERFwUBAQEBODaEBAEFOhwjEAgDDgoJJQ8FJQMHGhOIQcNUFxiFZIlQB4RMBZwumGorLw Received: from ppp121-44-50-124.lns20.syd6.internode.on.net (HELO dastard) ([121.44.50.124]) by ipmail06.adl6.internode.on.net with ESMTP; 12 Aug 2014 07:25:58 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1XGxZN-0007ed-KX; Tue, 12 Aug 2014 07:55:57 +1000 Date: Tue, 12 Aug 2014 07:55:57 +1000 From: Dave Chinner To: Brian Foster Cc: xfs@oss.sgi.com Subject: Re: [PATCH 0/2] xfs: for-next file collapse bug fixes Message-ID: <20140811215557.GT20518@dastard> X-ASG-Orig-Subj: Re: [PATCH 0/2] xfs: for-next file collapse bug fixes References: <1407523766-62233-1-git-send-email-bfoster@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1407523766-62233-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: 1407794159 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.8337 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Fri, Aug 08, 2014 at 02:49:24PM -0400, Brian Foster wrote: > Hi all, > > I've seen collapse range fall over during some recent stress testing. > I'm running fsx and 16 fsstress threads in parallel to reproduce. Note > that the fsstress workload doesn't need to be on the same fs (I suspect > a sync() is a trigger). These patches are what has fallen out so far... > > The first patch stems from the fact that the error caused an fs shutdown > that appeared to be unnecessary. I was initially going to skip the inode > log on any error, but on closer inspection it seems like we expect to > abort/shutdown if something has in fact been changed, so this modifies > the code to reduce that shutdown window. The second patch deals with the > actual collapse failure by fixing up the locking. > > Note that I still reproduced at least one collapse failure even with > these fixes, so there could be more at play here with the > implementation: > > XFS: Internal error XFS_WANT_CORRUPTED_GOTO at line 5535 of file fs/xfs/libxfs/xfs_bmap.c. Caller xfs_collapse_file_space+0x1af/0x280 [xfs] > > This took significantly longer to reproduce and I don't yet have a feel > for how reproducible it is in general. In the meantime, these two seemed > relatively straightforward and incremental... They look good, but it's too late for the 3.17 merge window. However, given that we've got other fixes that need to go to 3.17 but are also too late (Chris Mason's direct IO invalidation fixes) I'll plan these for 3.17-rc2 or so. Cheers, Dave. -- Dave Chinner david@fromorbit.com From tinguely@sgi.com Mon Aug 11 16:56: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 (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 72D1A7F5A for ; Mon, 11 Aug 2014 16:56:58 -0500 (CDT) Received: from dhcp-128-162-232-117.americas.sgi.com (dhcp-128-162-232-117.americas.sgi.com [128.162.232.117]) by relay1.corp.sgi.com (Postfix) with ESMTP id 4185A8F8065 for ; Mon, 11 Aug 2014 14:56:58 -0700 (PDT) Message-ID: <53E93C29.1020103@sgi.com> Date: Mon, 11 Aug 2014 16:56:57 -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: Subject : Happened again, 20140811 -- Got "Internal error XFS_WANT_CORRUPTED_GOTO". Filesystem needs reformatting to correct issue. References: <53E8D9F6.7080704@sgi.com> <53E93530.4070902@sgi.com> In-Reply-To: Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 8bit On 08/11/14 16:50, Carlos E. R. wrote: > -----BEGIN PGP SIGNED MESSAGE----- > Hash: SHA256 > > > > El 2014-08-11 a las 16:27 -0500, Mark Tinguely escribió: >> On 08/11/14 10:34, Carlos E. R. wrote: > >> >> so XFS gave a forced shutdown after the machine came back from >> hibernation. After replaying the log, there were no errors in xfs_repair. >> >> We should have quiesced the metadata/log before freezing xfs. Was >> there a lot of items in the log? > > Sorry, what log? The /var/log/messages file? I posted it in full, from > before the hibernation to powerdown. > > - -- Cheers > Carlos E. R. Sorry, I was referring to the XFS log. If you had a metadata dump before mounting/xfs_repair, then you can display the xfs log using the xfs_logprint. --Mark. From robin.listas@gmail.com Mon Aug 11 17:01: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 (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 1C8E17F55 for ; Mon, 11 Aug 2014 17:01:37 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 9BF33AC002 for ; Mon, 11 Aug 2014 15:01:33 -0700 (PDT) X-ASG-Debug-ID: 1407794491-04bdf06ef9ae000001-NocioJ Received: from mail-we0-f179.google.com (mail-we0-f179.google.com [74.125.82.179]) by cuda.sgi.com with ESMTP id oF9VxXVcUBpGACNG (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Mon, 11 Aug 2014 15:01:31 -0700 (PDT) X-Barracuda-Envelope-From: robin.listas@gmail.com X-Barracuda-Apparent-Source-IP: 74.125.82.179 Received: by mail-we0-f179.google.com with SMTP id u57so9167000wes.38 for ; Mon, 11 Aug 2014 15:01:30 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=sender:date:from:to:subject:in-reply-to:message-id:references :user-agent:mime-version:content-type:content-id; bh=IKQ7gLTJ6qvS6A8UVGFYAtMH0mY0rCJ7mOw/JkmsAJc=; b=0qs9QVK6uaPrjjO6tlQ368Rmvd8qwGTYYyqAP6xrQDHROFgVUTI3O4ytK5NwTLzMqu bRFacOIdIIfqlqqikdCP3QylydUWgUUn+FytOJkkS2g896rfuk9JP80OEqsOBhAu1kpr Zz88yxyQJzhFrOmJs3ZUzrSbRmtNf4GsN59bwPlQMuziMPmwLbHCU+DL7waQCnSp7TYX ijMEUCcLXGTHRB7SJDOHlT7k1/fhFGsDbdZlvbMzONhkTaZsxvpDeY0kRFaHwF2s8c2g KNJGjZYKnE49TSfL3VSZipd6w16tNNVBl4PsPwsNNbMKqepntf4HgVA3ZD+VOGUmWoHB ejLQ== X-Received: by 10.194.110.201 with SMTP id ic9mr577543wjb.60.1407794490746; Mon, 11 Aug 2014 15:01:30 -0700 (PDT) Received: from minas-tirith.valinor (177.Red-79-159-63.staticIP.rima-tde.net. [79.159.63.177]) by mx.google.com with ESMTPSA id ex2sm48438588wic.24.2014.08.11.15.01.29 for (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 11 Aug 2014 15:01:30 -0700 (PDT) Sender: Carlos Robinson Received: from localhost (localhost [127.0.0.1]) by minas-tirith.valinor (Postfix) with ESMTP id BF2C5183EEA for ; Tue, 12 Aug 2014 00:01:27 +0200 (CEST) Date: Tue, 12 Aug 2014 00:01:16 +0200 (CEST) From: "Carlos E. R." X-X-Sender: cer@minas-tirith.valinor To: XFS mailing list Subject: Re: Subject : Happened again, 20140811 -- Got "Internal error XFS_WANT_CORRUPTED_GOTO". Filesystem needs reformatting to correct issue. In-Reply-To: <53E938CC.4010103@sgi.com> X-ASG-Orig-Subj: Re: Subject : Happened again, 20140811 -- Got "Internal error XFS_WANT_CORRUPTED_GOTO". Filesystem needs reformatting to correct issue. Message-ID: References: <20140811144359.GA10217@laptop.bfoster> <53E938CC.4010103@sgi.com> User-Agent: Alpine 2.11 (LSU 23 2013-08-11) MIME-Version: 1.0 Content-Type: MULTIPART/MIXED; BOUNDARY="-1463779071-1124162502-1407793872=:17839" Content-ID: X-Barracuda-Connect: mail-we0-f179.google.com[74.125.82.179] X-Barracuda-Start-Time: 1407794491 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.8337 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 This message is in MIME format. The first part should be readable text, while the remaining parts are likely unreadable without MIME-aware tools. ---1463779071-1124162502-1407793872=:17839 Content-Type: TEXT/PLAIN; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8BIT Content-ID: -----BEGIN PGP SIGNED MESSAGE----- Hash: SHA256 Content-ID: El 2014-08-11 a las 16:42 -0500, Mark Tinguely escribió: > On 08/11/14 16:31, Carlos E. R. wrote: >> Does that give any ideas? > Which version of Linux? Telcontar:~ # cat /etc/os-release NAME=openSUSE VERSION="13.1 (Bottle)" VERSION_ID="13.1" PRETTY_NAME="openSUSE 13.1 (Bottle) (x86_64)" ID=opensuse ANSI_COLOR="0;32" CPE_NAME="cpe:/o:opensuse:opensuse:13.1" BUG_REPORT_URL="https://bugs.opensuse.org" HOME_URL="https://opensuse.org/" ID_LIKE="suse" Telcontar:~ # Telcontar:~ # uname -a Linux Telcontar 3.11.10-17-desktop #1 SMP PREEMPT Mon Jun 16 15:28:13 UTC 2014 (fba7c1f) x86_64 x86_64 x86_64 GNU/Linux Telcontar:~ # rpm -q xfsprogs xfsprogs-3.2.1-40.1.x86_64 > Did you get a metadata dump before the xfs_repair? Yes, sure. I said so on another post. I'm on the process of starting up the machine, when I noticed that error: xfs_metadump: invalid dqblk inode number (-1) being the first time I see that error, I'm wondering if going ahead with mounting and using, as explained on other posts today, or wait for different instructions from you people. I'll try meanwhile to upload the metadata files using another machine. - -- Cheers Carlos E. R. (from 13.1 x86_64 "Bottle" (Minas Tirith)) -----BEGIN PGP SIGNATURE----- Version: GnuPG v2.0.22 (GNU/Linux) iF4EAREIAAYFAlPpPTcACgkQja8UbcUWM1wm3wD+KTezrh+/SRAFFIVGCeJcHkgE MeJ5PMzceqDlUDOb4Q0A/jO8O5TkHCS1oDqI3zfdIExTUiel1GAcbMDNkk501Cf+ =6qE9 -----END PGP SIGNATURE----- ---1463779071-1124162502-1407793872=:17839-- From robin.listas@gmail.com Mon Aug 11 17:36: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 11BDF7F53 for ; Mon, 11 Aug 2014 17:36:48 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id E2F3D30404E for ; Mon, 11 Aug 2014 15:36:44 -0700 (PDT) X-ASG-Debug-ID: 1407796602-04cbb0508dae370001-NocioJ Received: from mail-wi0-f177.google.com (mail-wi0-f177.google.com [209.85.212.177]) by cuda.sgi.com with ESMTP id NHqwAdnAE6CPJOk5 (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Mon, 11 Aug 2014 15:36:43 -0700 (PDT) X-Barracuda-Envelope-From: robin.listas@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.212.177 X-Barracuda-IPDD: Level1 [gmail.com/209.85.212.177] Received: by mail-wi0-f177.google.com with SMTP id ho1so4933782wib.16 for ; Mon, 11 Aug 2014 15:36:42 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.212.177] X-Barracuda-IPDD: Level1 [gmail.com/209.85.212.177] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=sender:date:from:to:subject:in-reply-to:message-id:references :user-agent:mime-version:content-type:content-id; bh=F4sjoEpzCNjKWBghgkhZGYselSmOsi3hyaetBF4HueY=; b=mFO9QaCmxwsdbcqYuguvw6GNFINWW7PPEx7HfY+oMcWuOk95w/URCkqJrxbzvIQ4y0 +PztDJ22o1Y1EyTlASFXQcvg3N9NMt6Tyf0KiLvsa3V3BgDQPuQQbr1jF3OwcnOiaI/4 DXaON+b1LcN4V6Tg6pAxC2P9NO9Lh5IkhgA+nQgLpOzY+UD7trDZN9nb9m83Hi22LuHw vR97UypKm+Hubw15C6z5FEuaGu72t7a69XRHIJVbWKZA9va71xmZS2leZ6EAaY8HAp+q uNIveBDF7/ZQLsMUf/t6ELCiwXUKGhu9W0DVA+/rVvpk2NVvqk1weYO86YX6DnRDCC3E vJiA== X-Received: by 10.194.174.4 with SMTP id bo4mr717701wjc.84.1407796602102; Mon, 11 Aug 2014 15:36:42 -0700 (PDT) Received: from minas-tirith.valinor (177.Red-79-159-63.staticIP.rima-tde.net. [79.159.63.177]) by mx.google.com with ESMTPSA id dc3sm48756451wib.9.2014.08.11.15.36.40 for (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 11 Aug 2014 15:36:41 -0700 (PDT) Sender: Carlos Robinson Received: from localhost (localhost [127.0.0.1]) by minas-tirith.valinor (Postfix) with ESMTP id EB380183EEA for ; Tue, 12 Aug 2014 00:36:38 +0200 (CEST) Date: Tue, 12 Aug 2014 00:36:31 +0200 (CEST) From: "Carlos E. R." X-X-Sender: cer@minas-tirith.valinor To: XFS mailing list Subject: Re: Subject : Happened again, 20140811 -- Got "Internal error XFS_WANT_CORRUPTED_GOTO". Filesystem needs reformatting to correct issue. In-Reply-To: <53E93C29.1020103@sgi.com> X-ASG-Orig-Subj: Re: Subject : Happened again, 20140811 -- Got "Internal error XFS_WANT_CORRUPTED_GOTO". Filesystem needs reformatting to correct issue. Message-ID: References: <53E8D9F6.7080704@sgi.com> <53E93530.4070902@sgi.com> <53E93C29.1020103@sgi.com> User-Agent: Alpine 2.11 (LSU 23 2013-08-11) MIME-Version: 1.0 Content-Type: MULTIPART/MIXED; BOUNDARY="-1463779071-366605848-1407795555=:17839" Content-ID: X-Barracuda-Connect: mail-wi0-f177.google.com[209.85.212.177] X-Barracuda-Start-Time: 1407796602 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.8337 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 This message is in MIME format. The first part should be readable text, while the remaining parts are likely unreadable without MIME-aware tools. ---1463779071-366605848-1407795555=:17839 Content-Type: TEXT/PLAIN; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8BIT Content-ID: -----BEGIN PGP SIGNED MESSAGE----- Hash: SHA256 Content-ID: El 2014-08-11 a las 16:56 -0500, Mark Tinguely escribió: > On 08/11/14 16:50, Carlos E. R. wrote: >>> We should have quiesced the metadata/log before freezing xfs. Was >>> there a lot of items in the log? >> >> Sorry, what log? The /var/log/messages file? I posted it in full, from >> before the hibernation to powerdown. >> > > Sorry, I was referring to the XFS log. > > If you had a metadata dump before mounting/xfs_repair, then you can display > the xfs log using the xfs_logprint. Ah! Ok :-) Telcontar:/data/storage_d/xfs_disaster_home/20140811 # xfs_logprint -f tgtfile_20140811 xfs_logprint: data device: 0xffffffffffffffff log device: 0xffffffffffffffff daddr: 0 length: 820476 cycle: 3 version: 2 lsn: 3,65730 tail_lsn: 3,65561 length of Log Record: 1024 prev offset: 65667 num ops: 10 uuid: 3a35756d-1b63-4b9b-9b3a-c12c8951b678 format: little endian linuxh_size: 32768 - ---------------------------------------------------------------------------- Oper (0): tid: b80486ac len: 0 clientid: TRANS flags: START - ---------------------------------------------------------------------------- Oper (1): tid: b80486ac len: 16 clientid: TRANS flags: none TRAN: type: CHECKPOINT tid: b80486ac num_items: 7 - ---------------------------------------------------------------------------- Oper (2): tid: b80486ac len: 56 clientid: TRANS flags: none INODE: #regs: 3 ino: 0x20fcbc83 flags: 0x5 dsize: 96 blkno: 264281664 len: 16 boff: 768 Oper (3): tid: b80486ac len: 96 clientid: TRANS flags: none INODE CORE magic 0x494e mode 0100644 version 2 format 2 nlink 1 uid 1000 gid 100 atime 0x53b9d2fd mtime 0x53c05b34 ctime 0x53c05b34 size 0x90f8 nblocks 0xa extsize 0x0 nextents 0x6 naextents 0x0 forkoff 0 dmevmask 0x0 dmstate 0x0 flags 0x0 gen 0xd2610167 Oper (4): tid: b80486ac len: 96 clientid: TRANS flags: none EXTENTS inode data - ---------------------------------------------------------------------------- Oper (5): tid: b80486ac len: 56 clientid: TRANS flags: none INODE: #regs: 2 ino: 0x6048329c flags: 0x1 dsize: 0 blkno: 770365760 len: 16 boff: 7168 Oper (6): tid: b80486ac len: 96 clientid: TRANS flags: none INODE CORE magic 0x494e mode 0100600 version 2 format 2 nlink 1 uid 1000 gid 100 atime 0x53c05b25 mtime 0x53c05b34 ctime 0x53c05b34 size 0x0 nblocks 0x0 extsize 0x0 nextents 0x0 naextents 0x0 forkoff 0 dmevmask 0x0 dmstate 0x0 flags 0x0 gen 0x69e7b261 - ---------------------------------------------------------------------------- Oper (7): tid: b80486ac len: 56 clientid: TRANS flags: none INODE: #regs: 2 ino: 0x600814ef flags: 0x1 dsize: 0 blkno: 768264816 len: 16 boff: 3840 Oper (8): tid: b80486ac len: 96 clientid: TRANS flags: none INODE CORE magic 0x494e mode 0100600 version 2 format 2 nlink 1 uid 1000 gid 100 atime 0x53b6ef00 mtime 0x53c05b34 ctime 0x53c05b34 size 0x1 nblocks 0x1 extsize 0x0 nextents 0x1 naextents 0x0 forkoff 0 dmevmask 0x0 dmstate 0x0 flags 0x0 gen 0x97ccc0ee - ---------------------------------------------------------------------------- Oper (9): tid: b80486ac len: 0 clientid: TRANS flags: COMMIT ============================================================================ cycle: 3 version: 2 lsn: 3,65733 tail_lsn: 3,65561 length of Log Record: 32256 prev offset: 65730 num ops: 176 uuid: 3a35756d-1b63-4b9b-9b3a-c12c8951b678 format: little endian linux h_size: 32768 ********************************************************************** * ERROR: data block=379316 * ********************************************************************** Bad data in log Telcontar:/data/storage_d/xfs_disaster_home/20140811 # But I have no idea what any of that means. Notice that the metadata was obtained using tools version 3.1.11, but the print above was made using tools version 3.2.1 - in case that has any relevance. And, same operation on the metadata obtained after running repairs: Telcontar:/data/storage_d/xfs_disaster_home/20140811 # xfs_logprint -f tgtfile_20140811_after_repair xfs_logprint: data device: 0xffffffffffffffff log device: 0xffffffffffffffff daddr: 0 length: 820428 Log inconsistent or not a log (last==0, first!=1) xfs_logprint: after 7 zeroed blocks ********************************************************************** * ERROR: found data after zeroed blocks block=13 * ********************************************************************** Bad log - data after zeroed blocks Telcontar:/data/storage_d/xfs_disaster_home/20140811 # xfs_logprint -f tgtfile_20140811_after_repair_bis xfs_logprint: data device: 0xffffffffffffffff log device: 0xffffffffffffffff daddr: 0 length: 820428 Log inconsistent or not a log (last==0, first!=1) xfs_logprint: after 7 zeroed blocks ********************************************************************** * ERROR: found data after zeroed blocks block=13 * ********************************************************************** Bad log - data after zeroed blocks Telcontar:/data/storage_d/xfs_disaster_home/20140811 # Telcontar:/data/storage_d/xfs_disaster_home/20140811 # file tgtfile_20140811* tgtfile_20140811: XFS filesystem metadump image tgtfile_20140811_after_repair: XFS filesystem metadump image tgtfile_20140811_after_repair_bis: XFS filesystem metadump image tgtfile_20140811_obfus: XFS filesystem metadump image tgtfile_20140811_obfus_after_repair: XFS filesystem metadump image tgtfile_20140811_obfus_after_repair_bis: XFS filesystem metadump image Telcontar:/data/storage_d/xfs_disaster_home/20140811 # tgtfile_20140811 is the metadata obtained before any mount or repairs, using tools 3.1.11. tgtfile_20140811_after_repair is the metadata obtained after mount and repair, using tools 3.1.11. tgtfile_20140811_after_repair_bis is the metadata obtained after mount and repair, using tools 3.2.1 I will now attempt to upload the three obfuscated files. Sizes are quite different, after compression: Telcontar:/data/storage_d/xfs_disaster_home/20140811/tmp # ls -lh total 51M 26M Aug 11 16:21 tgtfile_20140811_obfus.xz 13M Aug 11 18:54 tgtfile_20140811_obfus_after_repair.xz 13M Aug 11 23:16 tgtfile_20140811_obfus_after_repair_bis.xz but all of them are about 401M before compression. The upload will take long, my ADSL upload is 0.3M/s at most. - -- Cheers Carlos E. R. (from 13.1 x86_64 "Bottle" (Minas Tirith)) -----BEGIN PGP SIGNATURE----- Version: GnuPG v2.0.22 (GNU/Linux) iF4EAREIAAYFAlPpRXYACgkQja8UbcUWM1zsXwD/aGq1sLIqPi6U7nOTeB66B5CO dTpXM/WZtk2gJl7JhvwBAIOeh+TkHN1+rdOQj3z80KG17IuOHpu/wrrPlZ+YqMPR =3JHj -----END PGP SIGNATURE----- ---1463779071-366605848-1407795555=:17839-- From robin.listas@gmail.com Mon Aug 11 19:17: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=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 578CB7F61 for ; Mon, 11 Aug 2014 19:17:25 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 2AC4B8F8037 for ; Mon, 11 Aug 2014 17:17:22 -0700 (PDT) X-ASG-Debug-ID: 1407802634-04cb6c4c939aa50001-NocioJ Received: from mail-we0-f175.google.com (mail-we0-f175.google.com [74.125.82.175]) by cuda.sgi.com with ESMTP id 4WgZxznjgmF6GrD7 (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Mon, 11 Aug 2014 17:17:14 -0700 (PDT) X-Barracuda-Envelope-From: robin.listas@gmail.com X-Barracuda-Apparent-Source-IP: 74.125.82.175 Received: by mail-we0-f175.google.com with SMTP id t60so9069849wes.6 for ; Mon, 11 Aug 2014 17:17:13 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=sender:date:from:to:subject:in-reply-to:message-id:references :user-agent:mime-version:content-type:content-id; bh=WmfjflTRhZSi1m8+Qk4+IysarzN3yHItSGf/jnlKngw=; b=fMcQrcgEwTx+2pZjOOMs2/5wRg3vpM3BX3GVgQyeeEOrf9WjjA0ltJhilwqtyy0UKV DI3bRkBCKX8NOdaQLdws2e3mCWjt8OS8TYfm3yqT2pI3fkSoraA3DVTQoqpj5SrL19YH zXYVomUXxkIg1SKcxEebFQYB0ujLp099Db7U+2GThz+RPue36ppPVFKFBRUOOWozU5Uc C7G0q1zRTqGsG7szkoF6U7AnSU2EiDhLGFYiIlTeg0pQAZZAghpjdDGKx15MJkLu5hoE GqNAnRJSu1/z9KIodnFDKfIcmoqxxS5MOKRSCBrSnWZivkkLuMnihvY/DXSSMhRjx7AB MgMA== X-Received: by 10.180.93.104 with SMTP id ct8mr28615642wib.30.1407802633880; Mon, 11 Aug 2014 17:17:13 -0700 (PDT) Received: from minas-tirith.valinor (177.Red-79-159-63.staticIP.rima-tde.net. [79.159.63.177]) by mx.google.com with ESMTPSA id wi9sm5183691wjc.23.2014.08.11.17.17.12 for (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 11 Aug 2014 17:17:13 -0700 (PDT) Sender: Carlos Robinson Received: from localhost (localhost [127.0.0.1]) by minas-tirith.valinor (Postfix) with ESMTP id A05E5182668 for ; Tue, 12 Aug 2014 02:17:10 +0200 (CEST) Date: Tue, 12 Aug 2014 02:17:00 +0200 (CEST) From: "Carlos E. R." X-X-Sender: cer@minas-tirith.valinor To: XFS mailing list Subject: Re: Subject : Happened again, 20140811 -- Got "Internal error XFS_WANT_CORRUPTED_GOTO". Filesystem needs reformatting to correct issue. In-Reply-To: X-ASG-Orig-Subj: Re: Subject : Happened again, 20140811 -- Got "Internal error XFS_WANT_CORRUPTED_GOTO". Filesystem needs reformatting to correct issue. Message-ID: References: <53E8D9F6.7080704@sgi.com> <53E93530.4070902@sgi.com> <53E93C29.1020103@sgi.com> User-Agent: Alpine 2.11 (LSU 23 2013-08-11) MIME-Version: 1.0 Content-Type: MULTIPART/MIXED; BOUNDARY="-1463779071-1850205973-1407800504=:21410" Content-ID: X-Barracuda-Connect: mail-we0-f175.google.com[74.125.82.175] X-Barracuda-Start-Time: 1407802634 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.8343 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 This message is in MIME format. The first part should be readable text, while the remaining parts are likely unreadable without MIME-aware tools. ---1463779071-1850205973-1407800504=:21410 Content-Type: TEXT/PLAIN; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8BIT Content-ID: -----BEGIN PGP SIGNED MESSAGE----- Hash: SHA256 Content-ID: El 2014-08-12 a las 00:36 +0200, Carlos E. R. escribió: > El 2014-08-11 a las 16:56 -0500, Mark Tinguely escribió: > but all of them are about 401M before compression. The upload will take > long, my ADSL upload is 0.3M/s at most. I have shared (view) on google drive a folder with the three files. Both Brian Foster and Mark Tinguely should have got a link on the mail from me. If somebody else wants access, just tell me. - -- Cheers Carlos E. R. (from 13.1 x86_64 "Bottle" (Minas Tirith)) -----BEGIN PGP SIGNATURE----- Version: GnuPG v2.0.22 (GNU/Linux) iF4EAREIAAYFAlPpXQYACgkQja8UbcUWM1wQ9gEAl1WI24UDArdlWHh3J2ih3AV3 nMTwDRqTrT0Rk2BJOB8A/1BOzzn3/IX16sPCsYoqGEyXNHcNXWBHENShlyWzJGUr =W+BG -----END PGP SIGNATURE----- ---1463779071-1850205973-1407800504=:21410-- From david@fromorbit.com Mon Aug 11 20:17: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 (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 315ED7F63 for ; Mon, 11 Aug 2014 20:17:59 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id E5C06304032 for ; Mon, 11 Aug 2014 18:17:58 -0700 (PDT) X-ASG-Debug-ID: 1407806275-04bdf06ef6b4da0001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id qaMW2Wn2wU4adZ2s for ; Mon, 11 Aug 2014 18:17:56 -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: AvkYAKVq6VN5LDJ8PGdsb2JhbABagw2BKYcwpnkGoDqFawGBExcFAQEBATg2hAQBBScTHCMQCAMOCgklDwUlAwcaE4hBw3sXGIVkiGxkB4RMBZwyjAIEjGQrL4EF Received: from ppp121-44-50-124.lns20.syd6.internode.on.net (HELO dastard) ([121.44.50.124]) by ipmail05.adl6.internode.on.net with ESMTP; 12 Aug 2014 10:47:45 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1XH0id-000862-Fj; Tue, 12 Aug 2014 11:17:43 +1000 Date: Tue, 12 Aug 2014 11:17:43 +1000 From: Dave Chinner To: Chris Mason Cc: xfs@oss.sgi.com, Eric Sandeen Subject: Re: [PATCH v2] xfs: don't zero partial page cache pages during O_DIRECT Message-ID: <20140812011743.GU20518@dastard> X-ASG-Orig-Subj: Re: [PATCH v2] xfs: don't zero partial page cache pages during O_DIRECT References: <53E4E03A.7050101@fb.com> <53E61A9C.4020807@fb.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <53E61A9C.4020807@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: 1407806275 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.8345 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Sat, Aug 09, 2014 at 08:57:00AM -0400, Chris Mason wrote: > > xfs is using truncate_pagecache_range to invalidate the page cache > during DIO reads. This is different from the other filesystems who only > invalidate pages during DIO writes. > > truncate_pagecache_range is meant to be used when we are freeing the > underlying data structs from disk, so it will zero any partial ranges in > the page. This means a DIO read can zero out part of the page cache > page, and it is possible the page will stay in cache. > > buffered reads will find an up to date page with zeros instead of the > data actually on disk. > > This patch fixes things by using invalidate_inode_pages2_range instead. > It preserves the page cache invalidation, but won't zero any pages. > > Signed-off-by: Chris Mason > cc: stable@vger.kernel.org > > --- > fs/xfs/xfs_file.c | 3 ++- > 1 file changed, 2 insertions(+), 1 deletion(-) > > diff --git a/fs/xfs/xfs_file.c b/fs/xfs/xfs_file.c > index 1f66779..023d575 100644 > --- a/fs/xfs/xfs_file.c > +++ b/fs/xfs/xfs_file.c > @@ -295,7 +295,8 @@ xfs_file_read_iter( > xfs_rw_iunlock(ip, XFS_IOLOCK_EXCL); > return ret; > } > - truncate_pagecache_range(VFS_I(ip), pos, -1); > + invalidate_inode_pages2_range(VFS_I(ip)->i_mapping, > + pos >> PAGE_CACHE_SHIFT, -1); > } > xfs_rw_ilock_demote(ip, XFS_IOLOCK_EXCL); > } I added the WARN_ON_ONCE(ret) check to this and I am seeing it fire occasionally. It always fires immediately before some other ASSERT() they fires with a block map/page cache inconsistency. It usually fires in a test that runs fsx or fsstress. The fsx failures are new regressions caused by this patch. e.g. generic/263 hasn't failed for months on any of my systems and this patch causes it to fail reliably on my 1k block size test config. I'm going to assume at this point that this is uncovering some other existing bug, but it means I'm not going to push this fix until I understand what is actually happening here. It is possible that what I'm seeing is related to Brian's collapse range bug fixes, but until I applied this direct IO patch I'd never seen fsx throw ASSERTs in xfs_bmap_shift_extents().... Either way, more testing and understanding is needed. Cheers, Dave. -- Dave Chinner david@fromorbit.com From felipemonteiro.carvalho@gmail.com Tue Aug 12 05:50: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=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 39F0B7F3F for ; Tue, 12 Aug 2014 05:50:00 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id D9DF48F8052 for ; Tue, 12 Aug 2014 03:49:59 -0700 (PDT) X-ASG-Debug-ID: 1407840598-04bdf06ef9ca9e0001-NocioJ Received: from mail-pa0-f51.google.com (mail-pa0-f51.google.com [209.85.220.51]) by cuda.sgi.com with ESMTP id xke5evgA7D6fyMo3 (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Tue, 12 Aug 2014 03:49:58 -0700 (PDT) X-Barracuda-Envelope-From: felipemonteiro.carvalho@gmail.com X-Barracuda-RBL-Trusted-Forwarder: 209.85.220.51 Received: by mail-pa0-f51.google.com with SMTP id ey11so12829860pad.38 for ; Tue, 12 Aug 2014 03:49:58 -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=KPl5yhBWG+Bq6qCaIh9cOSLNahTF39twd8Ff5pa9c68=; b=dMteqAsOZFpBhXYgy6eOCIpOfsLqf7oeJAxaQVaf8gLxXIxTO+55Itv2G8evgmbqsv DnqaFyY8h7MwwQYMeGmfdYEeLNmlAf3FG/yh6BxBUwu+6mGsVFhPZOufkafbLMq9shkk x5mzQqQ/DmbEYqlGke0Jg+6dpEQgDvuamtGd9BZCEje07RpIYOUNy6GjvdyICXyjkwHi yvBHaphw8o8gY3BoDaCJPn9Jk1lON9RKKA9F5+al3Ne7lkuT/j4nOeVttxPmX5CXN3lc ILRVvkB4OI2Qn/xmpYU0WGB3UnOFTocma7SQTBFTavZAg6mx7+ppAxx03ciCG3QVS2XL Oxww== X-Barracuda-BBL-IP: nil MIME-Version: 1.0 X-Received: by 10.70.103.132 with SMTP id fw4mr3512016pdb.99.1407840598140; Tue, 12 Aug 2014 03:49:58 -0700 (PDT) Received: by 10.66.164.69 with HTTP; Tue, 12 Aug 2014 03:49:58 -0700 (PDT) Date: Tue, 12 Aug 2014 12:49:58 +0200 Message-ID: Subject: Location of backup superblocks From: Felipe Monteiro de Carvalho X-ASG-Orig-Subj: Location of backup superblocks To: xfs@oss.sgi.com Content-Type: text/plain; charset=UTF-8 X-Barracuda-Connect: mail-pa0-f51.google.com[209.85.220.51] X-Barracuda-Start-Time: 1407840598 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.8358 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 trying to recover a XFS partition (or series of partitions) where the main superblock was corrupted, and I see that there are multiple superblock copies. I'd like to guess the partition start and size also. I see that the partition size can be calculated with sb_blocksize* sb_dblocks But what about the partition start? I think I can guess it based in the position of the found superblocks. Any ideas where is the code that writes to disk those backup superblocks? So far to me it looks like that their position is calculated as disk_size / 4 rounded (nearest rounding?) to a multiple of sb_blocksize, but having the exact code part would be better of course =) Or even better, a list of backup superblock positions... thanks, -- Felipe Monteiro de Carvalho From bfoster@redhat.com Tue Aug 12 07:03: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 7688B7F3F for ; Tue, 12 Aug 2014 07:03:51 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id EEEB2AC006 for ; Tue, 12 Aug 2014 05:03:50 -0700 (PDT) X-ASG-Debug-ID: 1407845025-04cb6c4c93af850001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id gDWOw4wlVdjwCR2Q (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 12 Aug 2014 05:03:46 -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 s7CC3hdd004879 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Tue, 12 Aug 2014 08:03:43 -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 s7CC3gVg015899; Tue, 12 Aug 2014 08:03:42 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id E7A2E12577C; Tue, 12 Aug 2014 08:03:41 -0400 (EDT) Date: Tue, 12 Aug 2014 08:03:41 -0400 From: Brian Foster To: Dave Chinner Cc: Alex Lyakas , xfs@oss.sgi.com Subject: Re: use-after-free on log replay failure Message-ID: <20140812120341.GA46654@bfoster.bfoster> X-ASG-Orig-Subj: Re: use-after-free on log replay failure References: <20140119231745.GF18112@dastard> <4B2A412C75324EE9880358513C069476@alyakaslap> <9D3CBECB663B4A77B7EF74B67973310A@alyakaslap> <20140804230721.GA20518@dastard> <20140806152042.GB39990@bfoster.bfoster> <20140811132057.GA1186@bfoster.bfoster> <20140811215207.GS20518@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140811215207.GS20518@dastard> User-Agent: Mutt/1.5.23 (2014-03-12) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.27 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1407845025 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Tue, Aug 12, 2014 at 07:52:07AM +1000, Dave Chinner wrote: > On Mon, Aug 11, 2014 at 09:20:57AM -0400, Brian Foster wrote: > > On Sun, Aug 10, 2014 at 03:20:50PM +0300, Alex Lyakas wrote: > > > On Wed, Aug 6, 2014 at 6:20 PM, Brian Foster wrote: > > > > On Wed, Aug 06, 2014 at 03:52:03PM +0300, Alex Lyakas wrote: > ..... > > > >> But I believe, my analysis shows that during the mount sequence XFS does not > > > >> wait properly for all the bios to complete, before failing the mount > > > >> sequence back to the caller. > > > >> > > > > > > > > As an experiment, what about the following? Compile tested only and not > > > > safe for general use. > ... > > > > diff --git a/fs/xfs/xfs_buf.c b/fs/xfs/xfs_buf.c > > > > index cd7b8ca..fbcf524 100644 > > > > --- a/fs/xfs/xfs_buf.c > > > > +++ b/fs/xfs/xfs_buf.c > > > > @@ -1409,19 +1409,27 @@ xfs_buf_iorequest( > > > > * case nothing will ever complete. It returns the I/O error code, if any, or > > > > * 0 if there was no error. > > > > */ > > > > -int > > > > -xfs_buf_iowait( > > > > - xfs_buf_t *bp) > > > > +static int > > > > +__xfs_buf_iowait( > > > > + struct xfs_buf *bp, > > > > + bool skip_error) > > > > { > > > > trace_xfs_buf_iowait(bp, _RET_IP_); > > > > > > > > - if (!bp->b_error) > > > > + if (skip_error || !bp->b_error) > > > > wait_for_completion(&bp->b_iowait); > > > > > > > > trace_xfs_buf_iowait_done(bp, _RET_IP_); > > > > return bp->b_error; > > > > } > > > > > > > > +int > > > > +xfs_buf_iowait( > > > > + struct xfs_buf *bp) > > > > +{ > > > > + return __xfs_buf_iowait(bp, false); > > > > +} > > > > + > > > > xfs_caddr_t > > > > xfs_buf_offset( > > > > xfs_buf_t *bp, > > > > @@ -1866,7 +1874,7 @@ xfs_buf_delwri_submit( > > > > bp = list_first_entry(&io_list, struct xfs_buf, b_list); > > > > > > > > list_del_init(&bp->b_list); > > > > - error2 = xfs_buf_iowait(bp); > > > > + error2 = __xfs_buf_iowait(bp, true); > > > > xfs_buf_relse(bp); > > > > if (!error) > > > > error = error2; > > Not waiting here on buffer error should not matter. Any buffer that > is under IO and requires completion should be referenced, and that > means it should be caught and waited on by xfs_wait_buftarg() in the > mount failure path after log recovery fails. > I think that assumes the I/O is successful. Looking through xlog_recover_buffer_pass2() as an example, we read the buffer which should return with b_hold == 1. The delwri queue increments the hold and we xfs_buf_relse() in the return path (i.e., buffer is now held by the delwri queue awaiting submission). Sometime later we delwri_submit()... xfs_buf_iorequest() does an xfs_buf_hold() and xfs_buf_rele() within that single function. The delwri_submit() releases its hold after xfs_buf_iowait(), which I guess at that point bp should go onto the lru (b_hold back to 1 in xfs_buf_rele(). Indeed, the caller has lost scope of the buffer at this point. So unless I miss something or got the lifecycle wrong here, which is easily possible ;), this all hinges on xfs_buf_iowait(). That's where the last hold forcing the buffer to stay around goes away. xfs_buftarg_wait_rele() will dispose the buffer if b_hold == 1. If xfs_buf_iowait() is racy in the event of I/O errors via the bio callback, I think this path is susceptible just the same. > > > > --- > > > I think that this patch fixes the problem. I tried reproducing it like > > > 30 times, and it doesn't happen with this patch. Dropping this patch > > > reproduces the problem within 1 or 2 tries. Thanks! > > > What are next steps? How to make it "safe for general use"? > > > > > > > Ok, thanks for testing. I think that implicates the caller bypassing the > > expected blocking with the right sequence of log recovery I/Os and > > device failure. TBH, I'd still like to see the specifics, if possible. > > Could you come up with a generic reproducer for this? I think a metadump > > of the fs with the dirty log plus whatever device failure simulation > > hack you're using would suffice. > > The real issue is we don't know exactly what code is being tested > (it's 3.8 + random bug fix backports + custom code). Even if we have > a reproducer there's no guarantee it will reproduce on a current > kernel. IOWs, we are stumbling around in the dark bashing our heads > against everything in the room, and that just wastes everyone's > time. > > We need a reproducer that triggers on a current, unmodified > kernel release. You can use dm-faulty to error out all writes just > like you are doing with your custom code. See > xfstests::tests/generic/321 and common/dmflakey for to do this. > Ideally the reproducer is in a form that xfstests can use.... > > If you can't reproduce it on an upstream kernel, then git bisect is > your friend. It will find the commit that fixed the problem you are > seeing.... > Ugh, yeah. The fact that this was customized as such apparently went over my head. I agree completely. This needs to be genericized to a pristine, preferably current kernel. The experiment patch could be papering over something completely different. > > The ideal fix is not yet clear to me. > > We are not even that far along - the root cause of the bug is not at > all clear to me. :/ > Yeah.. the above was just the theory that motivated the experiment in the previously posted patch. It of course remains a theory until we can see the race in action. I was referring to the potential fix for the raciness of xfs_buf_iowait() with regard to bio errors and the wq iodone handling, while still asking for a reproducer to confirm the actual problem. FWIW, I'm not too high on changes in the buf management code, even a smallish behavior change, without a real trace of some sort that documents the problem and justifies the change. Brian > Cheers, > > Dave. > -- > Dave Chinner > david@fromorbit.com From alex@zadarastorage.com Tue Aug 12 07:39: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 A6F327F3F for ; Tue, 12 Aug 2014 07:39:10 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 476C28F8064 for ; Tue, 12 Aug 2014 05:39:06 -0700 (PDT) X-ASG-Debug-ID: 1407847143-04bdf06ef9cdb70001-NocioJ Received: from mail-wi0-f176.google.com (mail-wi0-f176.google.com [209.85.212.176]) by cuda.sgi.com with ESMTP id NGbryybMz9D3K9my (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Tue, 12 Aug 2014 05:39:04 -0700 (PDT) X-Barracuda-Envelope-From: alex@zadarastorage.com X-Barracuda-Apparent-Source-IP: 209.85.212.176 Received: by mail-wi0-f176.google.com with SMTP id bs8so5781754wib.3 for ; Tue, 12 Aug 2014 05:39:02 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:message-id:from:to:cc:references:in-reply-to :subject:date:mime-version:content-type:importance; bh=CZchVlgxFUArt26yo+DGB9DiOoGImYWYwPHuPMJUkHk=; b=ImS9uaTdgMgNtFD7GllfsU1lE+yojvdDwo8zJ+hgBVD8ABmjmHnqNqbyPL/XQ9EkOA cnylj7aKZWFDeVtFqW89UA0ZmNaukXVPVO3HMXAdMJQRaiqPMTC8rOYtVpYF9mEXxXZ4 +DLZ77pYeKRpZjOucSZ/s8ZXgSY0CW0PFGt3Xf0wYLCmoaun4Xve+u9lnDo1nqfswa9W vVj5BVhlPS81/DBx1vvawGNPMqxZczEUl90rDbPGcflBPAzHLepOXlP06TlLo9J/ojy7 qcsIEao+5J00LOD92XsOfMeHJO6x3PzL9wcymCQmTBMgI28LgQ07t26UMMvU38wYiJgq lt4w== X-Gm-Message-State: ALoCoQnd+u34ljQbM1gcwidDAGXTwJ2QpPzvSB95kLcOlKfTb+eIucHwGz2WRTbvzIY2eKeOuCjR X-Received: by 10.180.90.11 with SMTP id bs11mr26907688wib.47.1407847142499; Tue, 12 Aug 2014 05:39:02 -0700 (PDT) Received: from alyakaslap (bzq-169-168-31-234.red.bezeqint.net. [31.168.169.234]) by mx.google.com with ESMTPSA id dc3sm55840161wib.9.2014.08.12.05.39.00 for (version=TLSv1 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Tue, 12 Aug 2014 05:39:01 -0700 (PDT) Message-ID: From: "Alex Lyakas" To: "Brian Foster" , "Dave Chinner" Cc: References: <20140119231745.GF18112@dastard> <4B2A412C75324EE9880358513C069476@alyakaslap> <9D3CBECB663B4A77B7EF74B67973310A@alyakaslap> <20140804230721.GA20518@dastard> <20140806152042.GB39990@bfoster.bfoster> <20140811132057.GA1186@bfoster.bfoster> <20140811215207.GS20518@dastard> <20140812120341.GA46654@bfoster.bfoster> In-Reply-To: <20140812120341.GA46654@bfoster.bfoster> Subject: Re: use-after-free on log replay failure Date: Tue, 12 Aug 2014 15:39:02 +0300 X-ASG-Orig-Subj: Re: use-after-free on log replay failure MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="----=_NextPart_000_0039_01CFB643.8B14BD50" X-Priority: 3 X-MSMail-Priority: Normal Importance: Normal X-Mailer: Microsoft Windows Live Mail 15.4.3555.308 X-MimeOLE: Produced By Microsoft MimeOLE V15.4.3555.308 X-Barracuda-Connect: mail-wi0-f176.google.com[209.85.212.176] X-Barracuda-Start-Time: 1407847143 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Barracuda-BRTS-Status: 1 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, MARKETING_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.8360 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header This is a multi-part message in MIME format. ------=_NextPart_000_0039_01CFB643.8B14BD50 Content-Type: text/plain; format=flowed; charset="iso-8859-1"; reply-type=original Content-Transfer-Encoding: 7bit Hello Dave, Brian, I will describe a generic reproduction that you ask for. It was performed on pristine XFS code from 3.8.13, taken from here: git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git top commit being: commit dbf932a9b316d5b29b3e220e5a30e7a165ad2992 Author: Greg Kroah-Hartman Date: Sat May 11 13:57:46 2013 -0700 Linux 3.8.13 I made a single (I swear!) code change in XFS: diff --git a/fs/xfs/xfs_log_recover.c b/fs/xfs/xfs_log_recover.c index 96fcbb8..d756bf6 100644 --- a/fs/xfs/xfs_log_recover.c +++ b/fs/xfs/xfs_log_recover.c @@ -3736,6 +3736,9 @@ xlog_recover( if ((error = xlog_find_tail(log, &head_blk, &tail_blk))) return error; + xfs_notice(log->l_mp, "Sleep 10s before xlog_do_recover"); + msleep(10000); + if (tail_blk != head_blk) { /* There used to be a comment here: * Fresh XFS was formatted on a 20 GB block device within a VM, using: mkfs.xfs -f -K /dev/vde -p /etc/zadara/xfs.protofile and: root@vc-00-00-1383-dev:~# cat /etc/zadara/xfs.protofile dummy : bootfilename, not used, backward compatibility 0 0 : numbers of blocks and inodes, not used, backward compatibility d--777 0 0 : set 777 perms for the root dir $ $ I mounted XFS with the following options: rw,sync,noatime,wsync,attr2,inode64,noquota 0 0 I started a couple of processes writing files sequentially onto this mount point, and after few seconds crashed the VM. When the VM came up, I took the metadump file and placed it in: https://drive.google.com/file/d/0ByBy89zr3kJNa0ZpdmZFS242RVU/edit?usp=sharing Then I set up the following Device Mapper target onto /dev/vde: dmsetup create VDE --table "0 41943040 linear-custom /dev/vde 0" I am attaching the code (and Makefile) of dm-linear-custom target. It is exact copy of dm-linear, except that it has a module parameter. With the parameter set to 0, this is an identity mapping onto /dev/vde. If the parameter is set to non-0, all WRITE bios are failed with ENOSPC. There is a workqueue to fail them in a different context (not sure if really needed, but that's what our "real" custom block device does). Now I did: mount -o noatime,sync /dev/mapper/VDE /mnt/xfs The log recovery flow went into the sleep that I added, and then I did: echo 1 > /sys/module/dm_linear_custom/parameters/fail_writes Problem reproduced: Aug 12 14:23:04 vc-00-00-1383-dev kernel: [ 175.000657] XFS (dm-0): Mounting Filesystem Aug 12 14:23:04 vc-00-00-1383-dev kernel: [ 175.026991] XFS (dm-0): Sleep 10s before xlog_do_recover Aug 12 14:23:14 vc-00-00-1383-dev kernel: [ 185.028113] XFS (dm-0): Starting recovery (logdev: internal) Aug 12 14:23:18 vc-00-00-1383-dev kernel: [ 188.556622] XFS (dm-0): metadata I/O error: block 0x2 ("xlog_recover_iodone") error 28 numblks 1 Aug 12 14:23:18 vc-00-00-1383-dev kernel: [ 188.556675] XFS (dm-0): metadata I/O error: block 0x40 ("xlog_recover_iodone") error 28 numblks 16 Aug 12 14:23:18 vc-00-00-1383-dev kernel: [ 188.556680] XFS (dm-0): xfs_do_force_shutdown(0x1) called from line 377 of file /mnt/work/alex/linux-stable/source/fs/xfs/xfs_log_recover.c. Return address = 0xffffffffa0349f68 Aug 12 14:23:18 vc-00-00-1383-dev kernel: [ 188.556683] XFS (dm-0): I/O Error Detected. Shutting down filesystem Aug 12 14:23:18 vc-00-00-1383-dev kernel: [ 188.556684] XFS (dm-0): Please umount the filesystem and rectify the problem(s) Aug 12 14:23:18 vc-00-00-1383-dev kernel: [ 188.556766] XFS (dm-0): metadata I/O error: block 0xa00002 ("xlog_recover_iodone") error 5 numblks 1 Aug 12 14:23:18 vc-00-00-1383-dev kernel: [ 188.556769] XFS (dm-0): xfs_do_force_shutdown(0x1) called from line 377 of file /mnt/work/alex/linux-stable/source/fs/xfs/xfs_log_recover.c. Return address = 0xffffffffa0349f68 Aug 12 14:23:18 vc-00-00-1383-dev kernel: [ 188.556771] XFS (dm-0): metadata I/O error: block 0xa00008 ("xlog_recover_iodone") error 5 numblks 8 Aug 12 14:23:18 vc-00-00-1383-dev kernel: [ 188.556774] XFS (dm-0): xfs_do_force_shutdown(0x1) called from line 377 of file /mnt/work/alex/linux-stable/source/fs/xfs/xfs_log_recover.c. Return address = 0xffffffffa0349f68 Aug 12 14:23:18 vc-00-00-1383-dev kernel: [ 188.556776] XFS (dm-0): metadata I/O error: block 0xa00010 ("xlog_recover_iodone") error 5 numblks 8 Aug 12 14:23:18 vc-00-00-1383-dev kernel: [ 188.556779] XFS (dm-0): xfs_do_force_shutdown(0x1) called from line 377 of file /mnt/work/alex/linux-stable/source/fs/xfs/xfs_log_recover.c. Return address = 0xffffffffa0349f68 Aug 12 14:23:18 vc-00-00-1383-dev kernel: [ 188.556781] XFS (dm-0): metadata I/O error: block 0xa00018 ("xlog_recover_iodone") error 5 numblks 8 Aug 12 14:23:18 vc-00-00-1383-dev kernel: [ 188.556783] XFS (dm-0): xfs_do_force_shutdown(0x1) called from line 377 of file /mnt/work/alex/linux-stable/source/fs/xfs/xfs_log_recover.c. Return address = 0xffffffffa0349f68 Aug 12 14:23:18 vc-00-00-1383-dev kernel: [ 188.556785] XFS (dm-0): metadata I/O error: block 0xa00040 ("xlog_recover_iodone") error 5 numblks 16 Aug 12 14:23:18 vc-00-00-1383-dev kernel: [ 188.556788] XFS (dm-0): xfs_do_force_shutdown(0x1) called from line 377 of file /mnt/work/alex/linux-stable/source/fs/xfs/xfs_log_recover.c. Return address = 0xffffffffa0349f68 Aug 12 14:23:18 vc-00-00-1383-dev kernel: [ 188.556790] XFS (dm-0): metadata I/O error: block 0xa00050 ("xlog_recover_iodone") error 5 numblks 16 Aug 12 14:23:18 vc-00-00-1383-dev kernel: [ 188.556793] XFS (dm-0): xfs_do_force_shutdown(0x1) called from line 377 of file /mnt/work/alex/linux-stable/source/fs/xfs/xfs_log_recover.c. Return address = 0xffffffffa0349f68 Aug 12 14:23:18 vc-00-00-1383-dev kernel: [ 188.556880] XFS (dm-0): metadata I/O error: block 0xa00001 ("xlog_recover_iodone") error 28 numblks 1 Aug 12 14:23:18 vc-00-00-1383-dev kernel: [ 188.556884] XFS (dm-0): xfs_do_force_shutdown(0x1) called from line 377 of file /mnt/work/alex/linux-stable/source/fs/xfs/xfs_log_recover.c. Return address = 0xffffffffa0349f68 Aug 12 14:23:18 vc-00-00-1383-dev kernel: [ 188.556977] XFS (dm-0): log mount/recovery failed: error 28 Aug 12 14:23:18 vc-00-00-1383-dev kernel: [ 188.557215] XFS (dm-0): log mount failed Aug 12 14:23:18 vc-00-00-1383-dev kernel: [ 188.573194] XFS (): xfs_do_force_shutdown(0x1) called from line 377 of file /mnt/work/alex/linux-stable/source/fs/xfs/xfs_log_recover.c. Return address = 0xffffffffa0349f68 Aug 12 14:23:18 vc-00-00-1383-dev kernel: [ 188.573214] XFS (): metadata I/O error: block 0x18 ("xlog_recover_iodone") error 28 numblks 8 Aug 12 14:23:18 vc-00-00-1383-dev kernel: [ 188.574685] XFS (): xfs_do_force_shutdown(0x1) called from line 377 of file /mnt/work/alex/linux-stable/source/fs/xfs/xfs_log_recover.c. Return address = 0xffffffffa0349f68 As you see, after mount completes, IO callbacks are still arriving and printing junk (empty string in this case). Immediately after that kernel dies. Is this description generic enough? Thanks, Alex. -----Original Message----- From: Brian Foster Sent: 12 August, 2014 3:03 PM To: Dave Chinner Cc: Alex Lyakas ; xfs@oss.sgi.com Subject: Re: use-after-free on log replay failure On Tue, Aug 12, 2014 at 07:52:07AM +1000, Dave Chinner wrote: > On Mon, Aug 11, 2014 at 09:20:57AM -0400, Brian Foster wrote: > > On Sun, Aug 10, 2014 at 03:20:50PM +0300, Alex Lyakas wrote: > > > On Wed, Aug 6, 2014 at 6:20 PM, Brian Foster > > > wrote: > > > > On Wed, Aug 06, 2014 at 03:52:03PM +0300, Alex Lyakas wrote: > ..... > > > >> But I believe, my analysis shows that during the mount sequence XFS > > > >> does not > > > >> wait properly for all the bios to complete, before failing the > > > >> mount > > > >> sequence back to the caller. > > > >> > > > > > > > > As an experiment, what about the following? Compile tested only and > > > > not > > > > safe for general use. > ... > > > > diff --git a/fs/xfs/xfs_buf.c b/fs/xfs/xfs_buf.c > > > > index cd7b8ca..fbcf524 100644 > > > > --- a/fs/xfs/xfs_buf.c > > > > +++ b/fs/xfs/xfs_buf.c > > > > @@ -1409,19 +1409,27 @@ xfs_buf_iorequest( > > > > * case nothing will ever complete. It returns the I/O error code, > > > > if any, or > > > > * 0 if there was no error. > > > > */ > > > > -int > > > > -xfs_buf_iowait( > > > > - xfs_buf_t *bp) > > > > +static int > > > > +__xfs_buf_iowait( > > > > + struct xfs_buf *bp, > > > > + bool skip_error) > > > > { > > > > trace_xfs_buf_iowait(bp, _RET_IP_); > > > > > > > > - if (!bp->b_error) > > > > + if (skip_error || !bp->b_error) > > > > wait_for_completion(&bp->b_iowait); > > > > > > > > trace_xfs_buf_iowait_done(bp, _RET_IP_); > > > > return bp->b_error; > > > > } > > > > > > > > +int > > > > +xfs_buf_iowait( > > > > + struct xfs_buf *bp) > > > > +{ > > > > + return __xfs_buf_iowait(bp, false); > > > > +} > > > > + > > > > xfs_caddr_t > > > > xfs_buf_offset( > > > > xfs_buf_t *bp, > > > > @@ -1866,7 +1874,7 @@ xfs_buf_delwri_submit( > > > > bp = list_first_entry(&io_list, struct xfs_buf, > > > > b_list); > > > > > > > > list_del_init(&bp->b_list); > > > > - error2 = xfs_buf_iowait(bp); > > > > + error2 = __xfs_buf_iowait(bp, true); > > > > xfs_buf_relse(bp); > > > > if (!error) > > > > error = error2; > > Not waiting here on buffer error should not matter. Any buffer that > is under IO and requires completion should be referenced, and that > means it should be caught and waited on by xfs_wait_buftarg() in the > mount failure path after log recovery fails. > I think that assumes the I/O is successful. Looking through xlog_recover_buffer_pass2() as an example, we read the buffer which should return with b_hold == 1. The delwri queue increments the hold and we xfs_buf_relse() in the return path (i.e., buffer is now held by the delwri queue awaiting submission). Sometime later we delwri_submit()... xfs_buf_iorequest() does an xfs_buf_hold() and xfs_buf_rele() within that single function. The delwri_submit() releases its hold after xfs_buf_iowait(), which I guess at that point bp should go onto the lru (b_hold back to 1 in xfs_buf_rele(). Indeed, the caller has lost scope of the buffer at this point. So unless I miss something or got the lifecycle wrong here, which is easily possible ;), this all hinges on xfs_buf_iowait(). That's where the last hold forcing the buffer to stay around goes away. xfs_buftarg_wait_rele() will dispose the buffer if b_hold == 1. If xfs_buf_iowait() is racy in the event of I/O errors via the bio callback, I think this path is susceptible just the same. > > > > --- > > > I think that this patch fixes the problem. I tried reproducing it like > > > 30 times, and it doesn't happen with this patch. Dropping this patch > > > reproduces the problem within 1 or 2 tries. Thanks! > > > What are next steps? How to make it "safe for general use"? > > > > > > > Ok, thanks for testing. I think that implicates the caller bypassing the > > expected blocking with the right sequence of log recovery I/Os and > > device failure. TBH, I'd still like to see the specifics, if possible. > > Could you come up with a generic reproducer for this? I think a metadump > > of the fs with the dirty log plus whatever device failure simulation > > hack you're using would suffice. > > The real issue is we don't know exactly what code is being tested > (it's 3.8 + random bug fix backports + custom code). Even if we have > a reproducer there's no guarantee it will reproduce on a current > kernel. IOWs, we are stumbling around in the dark bashing our heads > against everything in the room, and that just wastes everyone's > time. > > We need a reproducer that triggers on a current, unmodified > kernel release. You can use dm-faulty to error out all writes just > like you are doing with your custom code. See > xfstests::tests/generic/321 and common/dmflakey for to do this. > Ideally the reproducer is in a form that xfstests can use.... > > If you can't reproduce it on an upstream kernel, then git bisect is > your friend. It will find the commit that fixed the problem you are > seeing.... > Ugh, yeah. The fact that this was customized as such apparently went over my head. I agree completely. This needs to be genericized to a pristine, preferably current kernel. The experiment patch could be papering over something completely different. > > The ideal fix is not yet clear to me. > > We are not even that far along - the root cause of the bug is not at > all clear to me. :/ > Yeah.. the above was just the theory that motivated the experiment in the previously posted patch. It of course remains a theory until we can see the race in action. I was referring to the potential fix for the raciness of xfs_buf_iowait() with regard to bio errors and the wq iodone handling, while still asking for a reproducer to confirm the actual problem. FWIW, I'm not too high on changes in the buf management code, even a smallish behavior change, without a real trace of some sort that documents the problem and justifies the change. Brian > Cheers, > > Dave. > -- > Dave Chinner > david@fromorbit.com ------=_NextPart_000_0039_01CFB643.8B14BD50 Content-Type: application/octet-stream; name="dm-linear-custom.c" Content-Transfer-Encoding: quoted-printable Content-Disposition: attachment; filename="dm-linear-custom.c" /*=0A= * Copyright (C) 2001-2003 Sistina Software (UK) Limited.=0A= *=0A= * This file is released under the GPL.=0A= */=0A= =0A= #include =0A= #include =0A= #include =0A= #include =0A= #include =0A= #include =0A= =0A= #define DM_MSG_PREFIX "linear-custom"=0A= =0A= /*=0A= * Linear: maps a linear range of a device.=0A= */=0A= struct linear_c {=0A= struct dm_dev *dev;=0A= sector_t start;=0A= };=0A= =0A= unsigned int fail_writes =3D 0;=0A= module_param_named(fail_writes, fail_writes, uint, S_IWUSR|S_IRUSR | = S_IRGRP | S_IROTH);=0A= MODULE_PARM_DESC(fail_writes, "When set to non-0, all writes will be = failed with ENOSPC");=0A= =0A= static struct workqueue_struct *fail_writes_wq;=0A= =0A= struct fail_writes_work {=0A= struct work_struct work;=0A= struct bio *bio;=0A= };=0A= =0A= /*=0A= * Construct a linear mapping: =0A= */=0A= static int linear_ctr(struct dm_target *ti, unsigned int argc, char = **argv)=0A= {=0A= struct linear_c *lc;=0A= unsigned long long tmp;=0A= char dummy;=0A= =0A= if (argc !=3D 2) {=0A= ti->error =3D "Invalid argument count";=0A= return -EINVAL;=0A= }=0A= =0A= lc =3D kmalloc(sizeof(*lc), GFP_KERNEL);=0A= if (lc =3D=3D NULL) {=0A= ti->error =3D "dm-linear: Cannot allocate linear context";=0A= return -ENOMEM;=0A= }=0A= =0A= if (sscanf(argv[1], "%llu%c", &tmp, &dummy) !=3D 1) {=0A= ti->error =3D "dm-linear: Invalid device sector";=0A= goto bad;=0A= }=0A= lc->start =3D tmp;=0A= =0A= if (dm_get_device(ti, argv[0], dm_table_get_mode(ti->table), &lc->dev)) = {=0A= ti->error =3D "dm-linear: Device lookup failed";=0A= goto bad;=0A= }=0A= =0A= ti->num_flush_requests =3D 1;=0A= ti->num_discard_requests =3D 1;=0A= ti->num_write_same_requests =3D 1;=0A= ti->private =3D lc;=0A= return 0;=0A= =0A= bad:=0A= kfree(lc);=0A= return -EINVAL;=0A= }=0A= =0A= static void linear_dtr(struct dm_target *ti)=0A= {=0A= struct linear_c *lc =3D (struct linear_c *) ti->private;=0A= =0A= dm_put_device(ti, lc->dev);=0A= kfree(lc);=0A= }=0A= =0A= static sector_t linear_map_sector(struct dm_target *ti, sector_t = bi_sector)=0A= {=0A= struct linear_c *lc =3D ti->private;=0A= =0A= return lc->start + dm_target_offset(ti, bi_sector);=0A= }=0A= =0A= static void linear_map_bio(struct dm_target *ti, struct bio *bio)=0A= {=0A= struct linear_c *lc =3D ti->private;=0A= =0A= bio->bi_bdev =3D lc->dev->bdev;=0A= if (bio_sectors(bio))=0A= bio->bi_sector =3D linear_map_sector(ti, bio->bi_sector);=0A= }=0A= =0A= void linear_fail_write(struct work_struct *work)=0A= {=0A= struct fail_writes_work *w =3D container_of(work, struct = fail_writes_work, work);=0A= =0A= bio_endio(w->bio, -ENOSPC);=0A= kfree(w);=0A= }=0A= =0A= static int linear_map(struct dm_target *ti, struct bio *bio)=0A= {=0A= if (bio_rw(bio)=3D=3D WRITE && fail_writes) {=0A= struct fail_writes_work *w =3D kmalloc(sizeof(struct = fail_writes_work), GFP_NOIO);=0A= if (w) {=0A= bool queued =3D false;=0A= =0A= INIT_WORK(&w->work, linear_fail_write);=0A= w->bio =3D bio;=0A= queued =3D queue_work(fail_writes_wq, &w->work);=0A= if (queued)=0A= return DM_MAPIO_SUBMITTED;=0A= =0A= kfree(w);=0A= }=0A= }=0A= =0A= linear_map_bio(ti, bio);=0A= =0A= return DM_MAPIO_REMAPPED;=0A= }=0A= =0A= static void linear_status(struct dm_target *ti, status_type_t type,=0A= unsigned status_flags, char *result, unsigned maxlen)=0A= {=0A= struct linear_c *lc =3D (struct linear_c *) ti->private;=0A= =0A= switch (type) {=0A= case STATUSTYPE_INFO:=0A= result[0] =3D '\0';=0A= break;=0A= =0A= case STATUSTYPE_TABLE:=0A= snprintf(result, maxlen, "%s %llu", lc->dev->name,=0A= (unsigned long long)lc->start);=0A= break;=0A= }=0A= }=0A= =0A= static int linear_ioctl(struct dm_target *ti, unsigned int cmd,=0A= unsigned long arg)=0A= {=0A= struct linear_c *lc =3D (struct linear_c *) ti->private;=0A= struct dm_dev *dev =3D lc->dev;=0A= int r =3D 0;=0A= =0A= /*=0A= * Only pass ioctls through if the device sizes match exactly.=0A= */=0A= if (lc->start ||=0A= ti->len !=3D i_size_read(dev->bdev->bd_inode) >> SECTOR_SHIFT)=0A= r =3D scsi_verify_blk_ioctl(NULL, cmd);=0A= =0A= return r ? : __blkdev_driver_ioctl(dev->bdev, dev->mode, cmd, arg);=0A= }=0A= =0A= static int linear_merge(struct dm_target *ti, struct bvec_merge_data = *bvm,=0A= struct bio_vec *biovec, int max_size)=0A= {=0A= struct linear_c *lc =3D ti->private;=0A= struct request_queue *q =3D bdev_get_queue(lc->dev->bdev);=0A= =0A= if (!q->merge_bvec_fn)=0A= return max_size;=0A= =0A= bvm->bi_bdev =3D lc->dev->bdev;=0A= bvm->bi_sector =3D linear_map_sector(ti, bvm->bi_sector);=0A= =0A= return min(max_size, q->merge_bvec_fn(q, bvm, biovec));=0A= }=0A= =0A= static int linear_iterate_devices(struct dm_target *ti,=0A= iterate_devices_callout_fn fn, void *data)=0A= {=0A= struct linear_c *lc =3D ti->private;=0A= =0A= return fn(ti, lc->dev, lc->start, ti->len, data);=0A= }=0A= =0A= static struct target_type linearc_target =3D {=0A= .name =3D "linear-custom",=0A= .version =3D {1, 2, 1},=0A= .module =3D THIS_MODULE,=0A= .ctr =3D linear_ctr,=0A= .dtr =3D linear_dtr,=0A= .map =3D linear_map,=0A= .status =3D linear_status,=0A= .ioctl =3D linear_ioctl,=0A= .merge =3D linear_merge,=0A= .iterate_devices =3D linear_iterate_devices,=0A= };=0A= =0A= int dm_linear_custom_init(void)=0A= {=0A= int r =3D 0;=0A= =0A= DMINFO("Going to register target: %s", linearc_target.name);=0A= r =3D dm_register_target(&linearc_target);=0A= if (r < 0) {=0A= DMERR("register failed %d", r);=0A= goto out;=0A= }=0A= =0A= fail_writes_wq =3D alloc_workqueue("dm_linear_custom_fail_writes_WQ",=0A= WQ_NON_REENTRANT | WQ_UNBOUND | WQ_MEM_RECLAIM, =0A= 0/*max_active*/);=0A= if (fail_writes_wq =3D=3D NULL) {=0A= r =3D -ENOMEM;=0A= goto out_unreg_target;=0A= }=0A= =0A= return 0;=0A= =0A= out_unreg_target:=0A= dm_unregister_target(&linearc_target);=0A= out:=0A= return r;=0A= }=0A= =0A= void dm_linear_custom_exit(void)=0A= {=0A= if (fail_writes_wq) {=0A= /* actually destroy_workqueue() also does drain_workqueue */=0A= flush_workqueue(fail_writes_wq);=0A= destroy_workqueue(fail_writes_wq);=0A= fail_writes_wq =3D NULL;=0A= }=0A= =0A= dm_unregister_target(&linearc_target);=0A= }=0A= =0A= module_init(dm_linear_custom_init);=0A= module_exit(dm_linear_custom_exit);=0A= =0A= MODULE_AUTHOR("Zadara Storage ");=0A= MODULE_DESCRIPTION("A modified dm-linear for BrianF");=0A= MODULE_LICENSE("GPL");=0A= =0A= ------=_NextPart_000_0039_01CFB643.8B14BD50 Content-Type: application/octet-stream; name="Makefile" Content-Transfer-Encoding: quoted-printable Content-Disposition: attachment; filename="Makefile" obj-m +=3D dm-linear-custom.o=0A= =0A= ccflags-y +=3D -Wall # Enable most warning messages=0A= ccflags-y +=3D -Werror # Error out the compiler on warnings=0A= =0A= KVERSION =3D $(shell uname -r)=0A= DM_LC_DIR=3D$(shell pwd)=0A= DM_LC_KO=3Ddm-linear-custom.ko=0A= =0A= default:=0A= $(MAKE) -C /lib/modules/$(KVERSION)/build M=3D$(DM_LC_DIR) = EXTRA_CFLAGS=3D-g modules=0A= =0A= clean:=0A= $(MAKE) -C /lib/modules/$(KVERSION)/build M=3D$(DM_LC_DIR) clean=0A= =0A= =0A= ------=_NextPart_000_0039_01CFB643.8B14BD50-- From david@fromorbit.com Tue Aug 12 07:53: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 E2C9E7F3F for ; Tue, 12 Aug 2014 07:53:34 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id BEC4F304048 for ; Tue, 12 Aug 2014 05:53:31 -0700 (PDT) X-ASG-Debug-ID: 1407848008-04cbb0508bce820001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id qg1smTeJVNOOEpoC for ; Tue, 12 Aug 2014 05:53:28 -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: AvwGAAkN6lN5LDJ8/2dsb2JhbABagw1SV4IprC4GBZ5Rh1CBFRd3hGAjGCQ0BSUDNIhBxR8YhWSJA02EUwWGEI8zhnWBWJMng24rL4EH Received: from ppp121-44-50-124.lns20.syd6.internode.on.net (HELO dastard) ([121.44.50.124]) by ipmail07.adl2.internode.on.net with ESMTP; 12 Aug 2014 22:23:26 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1XHBZh-0001DT-BG; Tue, 12 Aug 2014 22:53:13 +1000 Date: Tue, 12 Aug 2014 22:53:13 +1000 From: Dave Chinner To: torvalds@linux-foundation.org Cc: akpm@linux-foundation.org, linux-kernel@vger.kernel.org, xfs@oss.sgi.com Subject: [GIT PULL] xfs: updates for 3.17-rc1 Message-ID: <20140812125313.GX20518@dastard> X-ASG-Orig-Subj: [GIT PULL] xfs: updates for 3.17-rc1 MIME-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha1; protocol="application/pgp-signature"; boundary="tMbDGjvJuJijemkf" 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: 1407848008 X-Barracuda-URL: http://192.48.176.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.8361 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header --tMbDGjvJuJijemkf Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-Transfer-Encoding: quoted-printable Hi Linus, Can you please pull the XFS changes from the tree below? The diffstat is kind of noisy because of the restructuring of the code to make kernel/userspace code sharing simpler, along with an XFS wide change to use the standard negative error return convention (at last!). The rest of the changes are noted in the tag below. FYI, this will be the last pull request I will send you from a tree on oss.sgi.com. I'm moving everything XFS related over to kernel.org so future pull requests should come from there. -Dave. The following changes since commit a497c3ba1d97fc69c1e78e7b96435ba8c2cb42ee: Linux 3.16-rc2 (2014-06-21 19:02:54 -1000) are available in the git repository at: git://oss.sgi.com/xfs/xfs.git tags/xfs-for-linus-3.17-rc1 for you to fetch changes up to 645f9857213476407d8ed1b59619fdff7128d3e6: Merge branch 'xfs-misc-fixes-3.17-2' into for-next (2014-08-04 13:55:27 += 1000) ---------------------------------------------------------------- xfs: update for 3.17-rc1 This update contains: o conversion of the XFS core to pass negative error numbers o restructing of core XFS code that is shared with userspace to fs/xfs/libx= fs o introduction of sysfs interface for XFS o bulkstat refactoring o demand driven speculative preallocation removal o XFS now always requires 64 bit sectors to be configured o metadata verifier changes to ensure CRCs are calculated during log recove= ry o various minor code cleanups o miscellaneous bug fixes ---------------------------------------------------------------- Brian Foster (11): xfs: fix a couple error sequence jumps in xfs_mountfs() xfs: add a sysfs kset xfs: add xfs_mount sysfs kobject xfs: add xlog sysfs kobject and attribute handlers xfs: add log attributes for log lsn and grant head data xfs: document log sysfs attributes in testing ABI xfs: add scan owner field to xfs_eofblocks xfs: support a union-based filter for eofblocks scans xfs: run an eofblocks scan on ENOSPC/EDQUOT xfs: squash prealloc while over quota free space as well xfs: fix rounding error of fiemap length parameter Christoph Hellwig (2): xfs: remove xfs_bulkstat_single xfs: require 64-bit sector_t Dave Chinner (22): xfs: create libxfs infrastructure libxfs: move header files libxfs: move source files xfs: global error sign conversion Revert "xfs: block allocation work needs to be kswapd aware" xfs: refine the allocation stack switch xfs: null unused quota inodes when quota is on Merge branch 'xfs-libxfs-restructure' into for-next xfs: catch buffers written without verifiers attached xfs: ensure verifiers are attached to recovered buffers xfs: quotacheck leaves dquot buffers without verifiers xfs: dquot recovery needs verifiers xfs: kill VN_DIRTY() xfs: kill VN_CACHED xfs: kill VN_MAPPED xfs: kill xfs_vnode.h xfs: fix swapext ilock deadlock xfs: flush both inodes in xfs_swap_extents Merge branch 'xfs-quota-eofblocks-scan' into for-next Merge branch 'xfs-misc-fixes-3.17-1' into for-next Merge branch 'xfs-bulkstat-refactor' into for-next Merge branch 'xfs-misc-fixes-3.17-2' into for-next Eric Sandeen (5): xfs: return is not a function xfs: Nuke XFS_ERROR macro xfs: allow inode allocations in post-growfs disk space xfs: tidy up xfs_set_inode32 xfs: avoid false quotacheck after unclean shutdown Jie Liu (11): xfs: remove redundant stat assignment in xfs_bulkstat_one_int xfs: consolidate xfs_inumbers xfs: fix error handling at xfs_inumbers xfs: remove redundant user buffer count checks at xfs_bulkstat xfs: fix error handling at xfs_bulkstat xfs: introduce xfs_bulkstat_ichunk_ra xfs: introduce xfs_bulkstat_grab_ichunk xfs: mark xfs_qm_quotacheck as static xfs: remove XFS_IS_OQUOTA_ON macros xfs: fix uflags detection at xfs_fs_rm_xquota xfs: introduce xfs_bulkstat_ag_ichunk Mark Tinguely (1): xfs: fix cil push sequence after log recovery kbuild test robot (1): xfs: fix coccinelle warnings Documentation/ABI/testing/sysfs-fs-xfs | 39 ++ fs/xfs/Kconfig | 1 + fs/xfs/Makefile | 71 ++-- fs/xfs/{ =3D> libxfs}/xfs_ag.h | 0 fs/xfs/{ =3D> libxfs}/xfs_alloc.c | 20 +- fs/xfs/{ =3D> libxfs}/xfs_alloc.h | 0 fs/xfs/{ =3D> libxfs}/xfs_alloc_btree.c | 6 +- fs/xfs/{ =3D> libxfs}/xfs_alloc_btree.h | 0 fs/xfs/{ =3D> libxfs}/xfs_attr.c | 92 ++--- fs/xfs/{ =3D> libxfs}/xfs_attr_leaf.c | 78 ++-- fs/xfs/{ =3D> libxfs}/xfs_attr_leaf.h | 0 fs/xfs/{ =3D> libxfs}/xfs_attr_remote.c | 22 +- fs/xfs/{ =3D> libxfs}/xfs_attr_remote.h | 0 fs/xfs/{ =3D> libxfs}/xfs_attr_sf.h | 0 fs/xfs/{ =3D> libxfs}/xfs_bit.h | 0 fs/xfs/{ =3D> libxfs}/xfs_bmap.c | 67 ++-- fs/xfs/{ =3D> libxfs}/xfs_bmap.h | 4 +- fs/xfs/{ =3D> libxfs}/xfs_bmap_btree.c | 99 +---- fs/xfs/{ =3D> libxfs}/xfs_bmap_btree.h | 0 fs/xfs/{ =3D> libxfs}/xfs_btree.c | 128 +++++-- fs/xfs/{ =3D> libxfs}/xfs_btree.h | 2 +- fs/xfs/{ =3D> libxfs}/xfs_cksum.h | 0 fs/xfs/{ =3D> libxfs}/xfs_da_btree.c | 112 +++--- fs/xfs/{ =3D> libxfs}/xfs_da_btree.h | 0 fs/xfs/{ =3D> libxfs}/xfs_da_format.c | 0 fs/xfs/{ =3D> libxfs}/xfs_da_format.h | 0 fs/xfs/{ =3D> libxfs}/xfs_dinode.h | 0 fs/xfs/{ =3D> libxfs}/xfs_dir2.c | 24 +- fs/xfs/{ =3D> libxfs}/xfs_dir2.h | 0 fs/xfs/{ =3D> libxfs}/xfs_dir2_block.c | 18 +- fs/xfs/{ =3D> libxfs}/xfs_dir2_data.c | 10 +- fs/xfs/{ =3D> libxfs}/xfs_dir2_leaf.c | 24 +- fs/xfs/{ =3D> libxfs}/xfs_dir2_node.c | 40 +-- fs/xfs/{ =3D> libxfs}/xfs_dir2_priv.h | 0 fs/xfs/{ =3D> libxfs}/xfs_dir2_sf.c | 75 ++-- fs/xfs/{ =3D> libxfs}/xfs_dquot_buf.c | 6 +- fs/xfs/{ =3D> libxfs}/xfs_format.h | 14 +- fs/xfs/{ =3D> libxfs}/xfs_ialloc.c | 34 +- fs/xfs/{ =3D> libxfs}/xfs_ialloc.h | 0 fs/xfs/{ =3D> libxfs}/xfs_ialloc_btree.c | 6 +- fs/xfs/{ =3D> libxfs}/xfs_ialloc_btree.h | 0 fs/xfs/{ =3D> libxfs}/xfs_inode_buf.c | 10 +- fs/xfs/{ =3D> libxfs}/xfs_inode_buf.h | 0 fs/xfs/{ =3D> libxfs}/xfs_inode_fork.c | 36 +- fs/xfs/{ =3D> libxfs}/xfs_inode_fork.h | 0 fs/xfs/{ =3D> libxfs}/xfs_inum.h | 4 - fs/xfs/{ =3D> libxfs}/xfs_log_format.h | 4 +- fs/xfs/{ =3D> libxfs}/xfs_log_recover.h | 0 fs/xfs/{ =3D> libxfs}/xfs_log_rlimit.c | 0 fs/xfs/{ =3D> libxfs}/xfs_quota_defs.h | 2 - fs/xfs/{ =3D> libxfs}/xfs_rtbitmap.c | 0 fs/xfs/{ =3D> libxfs}/xfs_sb.c | 81 +++-- fs/xfs/{ =3D> libxfs}/xfs_sb.h | 8 +- fs/xfs/{ =3D> libxfs}/xfs_shared.h | 0 fs/xfs/{ =3D> libxfs}/xfs_symlink_remote.c | 6 +- fs/xfs/{ =3D> libxfs}/xfs_trans_resv.c | 0 fs/xfs/{ =3D> libxfs}/xfs_trans_resv.h | 0 fs/xfs/{ =3D> libxfs}/xfs_trans_space.h | 0 fs/xfs/xfs_acl.c | 8 +- fs/xfs/xfs_aops.c | 18 +- fs/xfs/xfs_attr_inactive.c | 22 +- fs/xfs/xfs_attr_list.c | 38 +- fs/xfs/xfs_bmap_util.c | 227 +++++------- fs/xfs/xfs_bmap_util.h | 4 - fs/xfs/xfs_buf.c | 40 ++- fs/xfs/xfs_buf.h | 2 +- fs/xfs/xfs_buf_item.c | 4 +- fs/xfs/xfs_dir2_readdir.c | 4 +- fs/xfs/xfs_discard.c | 18 +- fs/xfs/xfs_dquot.c | 41 +-- fs/xfs/xfs_dquot.h | 15 + fs/xfs/xfs_error.c | 25 +- fs/xfs/xfs_error.h | 13 +- fs/xfs/xfs_export.c | 10 +- fs/xfs/xfs_extfree_item.c | 2 +- fs/xfs/xfs_file.c | 75 ++-- fs/xfs/xfs_filestream.c | 4 +- fs/xfs/xfs_fs.h | 7 +- fs/xfs/xfs_fsops.c | 42 +-- fs/xfs/xfs_icache.c | 148 ++++++-- fs/xfs/xfs_icache.h | 13 +- fs/xfs/xfs_inode.c | 68 ++-- fs/xfs/xfs_inode.h | 10 + fs/xfs/xfs_inode_item.c | 2 +- fs/xfs/xfs_ioctl.c | 266 +++++++------- fs/xfs/xfs_ioctl32.c | 111 +++--- fs/xfs/xfs_iomap.c | 57 +-- fs/xfs/xfs_iops.c | 72 ++-- fs/xfs/xfs_itable.c | 579 ++++++++++++++------------= ---- fs/xfs/xfs_itable.h | 23 +- fs/xfs/xfs_linux.h | 27 +- fs/xfs/xfs_log.c | 69 ++-- fs/xfs/xfs_log_cil.c | 8 +- fs/xfs/xfs_log_priv.h | 2 + fs/xfs/xfs_log_recover.c | 284 ++++++++------- fs/xfs/xfs_mount.c | 97 ++--- fs/xfs/xfs_mount.h | 1 + fs/xfs/xfs_mru_cache.c | 14 +- fs/xfs/xfs_qm.c | 229 ++++++------ fs/xfs/xfs_qm.h | 1 - fs/xfs/xfs_qm_bhv.c | 2 +- fs/xfs/xfs_qm_syscalls.c | 46 +-- fs/xfs/xfs_quotaops.c | 20 +- fs/xfs/xfs_rtalloc.c | 24 +- fs/xfs/xfs_rtalloc.h | 2 +- fs/xfs/xfs_super.c | 132 +++---- fs/xfs/xfs_super.h | 15 +- fs/xfs/xfs_symlink.c | 30 +- fs/xfs/xfs_sysfs.c | 165 +++++++++ fs/xfs/xfs_sysfs.h | 59 +++ fs/xfs/xfs_trans.c | 10 +- fs/xfs/xfs_trans_ail.c | 4 +- fs/xfs/xfs_trans_buf.c | 37 +- fs/xfs/xfs_trans_dquot.c | 4 +- fs/xfs/xfs_types.h | 29 +- fs/xfs/xfs_vnode.h | 46 --- fs/xfs/xfs_xattr.c | 6 +- 117 files changed, 2358 insertions(+), 2116 deletions(-) create mode 100644 Documentation/ABI/testing/sysfs-fs-xfs rename fs/xfs/{ =3D> libxfs}/xfs_ag.h (100%) rename fs/xfs/{ =3D> libxfs}/xfs_alloc.c (99%) rename fs/xfs/{ =3D> libxfs}/xfs_alloc.h (100%) rename fs/xfs/{ =3D> libxfs}/xfs_alloc_btree.c (99%) rename fs/xfs/{ =3D> libxfs}/xfs_alloc_btree.h (100%) rename fs/xfs/{ =3D> libxfs}/xfs_attr.c (97%) rename fs/xfs/{ =3D> libxfs}/xfs_attr_leaf.c (98%) rename fs/xfs/{ =3D> libxfs}/xfs_attr_leaf.h (100%) rename fs/xfs/{ =3D> libxfs}/xfs_attr_remote.c (98%) rename fs/xfs/{ =3D> libxfs}/xfs_attr_remote.h (100%) rename fs/xfs/{ =3D> libxfs}/xfs_attr_sf.h (100%) rename fs/xfs/{ =3D> libxfs}/xfs_bit.h (100%) rename fs/xfs/{ =3D> libxfs}/xfs_bmap.c (99%) rename fs/xfs/{ =3D> libxfs}/xfs_bmap.h (98%) rename fs/xfs/{ =3D> libxfs}/xfs_bmap_btree.c (88%) rename fs/xfs/{ =3D> libxfs}/xfs_bmap_btree.h (100%) rename fs/xfs/{ =3D> libxfs}/xfs_btree.c (97%) rename fs/xfs/{ =3D> libxfs}/xfs_btree.h (99%) rename fs/xfs/{ =3D> libxfs}/xfs_cksum.h (100%) rename fs/xfs/{ =3D> libxfs}/xfs_da_btree.c (97%) rename fs/xfs/{ =3D> libxfs}/xfs_da_btree.h (100%) rename fs/xfs/{ =3D> libxfs}/xfs_da_format.c (100%) rename fs/xfs/{ =3D> libxfs}/xfs_da_format.h (100%) rename fs/xfs/{ =3D> libxfs}/xfs_dinode.h (100%) rename fs/xfs/{ =3D> libxfs}/xfs_dir2.c (98%) rename fs/xfs/{ =3D> libxfs}/xfs_dir2.h (100%) rename fs/xfs/{ =3D> libxfs}/xfs_dir2_block.c (99%) rename fs/xfs/{ =3D> libxfs}/xfs_dir2_data.c (99%) rename fs/xfs/{ =3D> libxfs}/xfs_dir2_leaf.c (99%) rename fs/xfs/{ =3D> libxfs}/xfs_dir2_node.c (98%) rename fs/xfs/{ =3D> libxfs}/xfs_dir2_priv.h (100%) rename fs/xfs/{ =3D> libxfs}/xfs_dir2_sf.c (97%) rename fs/xfs/{ =3D> libxfs}/xfs_dquot_buf.c (98%) rename fs/xfs/{ =3D> libxfs}/xfs_format.h (97%) rename fs/xfs/{ =3D> libxfs}/xfs_ialloc.c (99%) rename fs/xfs/{ =3D> libxfs}/xfs_ialloc.h (100%) rename fs/xfs/{ =3D> libxfs}/xfs_ialloc_btree.c (98%) rename fs/xfs/{ =3D> libxfs}/xfs_ialloc_btree.h (100%) rename fs/xfs/{ =3D> libxfs}/xfs_inode_buf.c (98%) rename fs/xfs/{ =3D> libxfs}/xfs_inode_buf.h (100%) rename fs/xfs/{ =3D> libxfs}/xfs_inode_fork.c (98%) rename fs/xfs/{ =3D> libxfs}/xfs_inode_fork.h (100%) rename fs/xfs/{ =3D> libxfs}/xfs_inum.h (96%) rename fs/xfs/{ =3D> libxfs}/xfs_log_format.h (99%) rename fs/xfs/{ =3D> libxfs}/xfs_log_recover.h (100%) rename fs/xfs/{ =3D> libxfs}/xfs_log_rlimit.c (100%) rename fs/xfs/{ =3D> libxfs}/xfs_quota_defs.h (98%) rename fs/xfs/{ =3D> libxfs}/xfs_rtbitmap.c (100%) rename fs/xfs/{ =3D> libxfs}/xfs_sb.c (93%) rename fs/xfs/{ =3D> libxfs}/xfs_sb.h (98%) rename fs/xfs/{ =3D> libxfs}/xfs_shared.h (100%) rename fs/xfs/{ =3D> libxfs}/xfs_symlink_remote.c (97%) rename fs/xfs/{ =3D> libxfs}/xfs_trans_resv.c (100%) rename fs/xfs/{ =3D> libxfs}/xfs_trans_resv.h (100%) rename fs/xfs/{ =3D> libxfs}/xfs_trans_space.h (100%) create mode 100644 fs/xfs/xfs_sysfs.c create mode 100644 fs/xfs/xfs_sysfs.h delete mode 100644 fs/xfs/xfs_vnode.h --=20 Dave Chinner david@fromorbit.com --tMbDGjvJuJijemkf Content-Type: application/pgp-signature; name="signature.asc" Content-Description: Digital signature -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.12 (GNU/Linux) iQIcBAEBAgAGBQJT6g44AAoJEK3oKUf0dfodS40P/irj9NHfLmSTXmOXKAp+rhUs fDN9bqI/EjQaeqTf2pRP1jFsCO14Pr9j/QVOF/bBminJ6NKqnGuzfYQzRWsQ+IDH Kx2RFnkOMnj/QEOPGO9fsfzCNqW/rIt2HHFqR+QGfB0dJCcMiTlLGPjMGyNYo7GJ jkCB3x6hSZY0S33mhyQTKlsGMY+0q77KbVeZQZK90nhIZER7RSALB2N+i9SSokxV mty9TkLCOFOY9wv38GWokx7N+MZk5IUypPj08z8xD+HMBJ8mrmYpV40ezuYOHVhq IwAjA7q147BIi9v4BtdObx77//sLQ05uIUriBcZRGTZ7ZJpIEw1aRE7uRGTJvhLo JATD9y/SAWeinNVRtMzSEGs+KuCHYMDGcqHsFdTRNV++DmnuMJgt+GNrgaLEOLoF mHokbHGL0saR9uo0Kc4Ztv4P0pSDiywi9M5gYBeKCtWuJluym58XN4neWe02gk5N ZDNKyIykbn57afT3YoXqvh7XXyeJuYjNjJc2bECK4dlHHlvOGQJ5iofEJ5WyiOBt jRCHE1QS7c8Xsq4fe/ObvPCBQHfWEk2wdFfa6IYTPUzbn+2KfLKQgl9Ww3AmUCu0 MDei1prTapMu3j6/Y63fol9yknmOe/y0KOpnORqoeCN3vDWCv0HAnXDzVPNMRSFp YiVOBNxP/zw+YSkKpvnI =oLm5 -----END PGP SIGNATURE----- --tMbDGjvJuJijemkf-- From sfr@canb.auug.org.au Tue Aug 12 08:56: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 E7B5C7F3F for ; Tue, 12 Aug 2014 08:56:28 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id B2CB78F8037 for ; Tue, 12 Aug 2014 06:56:25 -0700 (PDT) X-ASG-Debug-ID: 1407851781-04cb6c4c94b3cb0001-NocioJ Received: from ozlabs.org (ozlabs.org [103.22.144.67]) by cuda.sgi.com with ESMTP id padfAzpmnJ68EVJZ (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 12 Aug 2014 06:56:23 -0700 (PDT) X-Barracuda-Envelope-From: sfr@canb.auug.org.au X-Barracuda-Apparent-Source-IP: 103.22.144.67 Received: from authenticated.ozlabs.org (localhost [127.0.0.1]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPSA id 55CB1140087; Tue, 12 Aug 2014 23:56:20 +1000 (EST) Date: Tue, 12 Aug 2014 23:56:12 +1000 From: Stephen Rothwell To: Dave Chinner Cc: torvalds@linux-foundation.org, akpm@linux-foundation.org, linux-kernel@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [GIT PULL] xfs: updates for 3.17-rc1 Message-ID: <20140812235612.684a9af7@canb.auug.org.au> X-ASG-Orig-Subj: Re: [GIT PULL] xfs: updates for 3.17-rc1 In-Reply-To: <20140812125313.GX20518@dastard> References: <20140812125313.GX20518@dastard> X-Mailer: Claws Mail 3.10.1 (GTK+ 2.24.24; i486-pc-linux-gnu) MIME-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha256; boundary="Sig_/FbP4CYOTAJSl_7QI41nE3ce"; protocol="application/pgp-signature" X-Barracuda-Connect: ozlabs.org[103.22.144.67] X-Barracuda-Start-Time: 1407851782 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.8362 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- --Sig_/FbP4CYOTAJSl_7QI41nE3ce Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: quoted-printable Hi Dave, On Tue, 12 Aug 2014 22:53:13 +1000 Dave Chinner wrote: > > FYI, this will be the last pull request I will send you from a tree > on oss.sgi.com. I'm moving everything XFS related over to kernel.org > so future pull requests should come from there. Please let me know when you have the new tree set up so I can change where I fetch from. --=20 Cheers, Stephen Rothwell sfr@canb.auug.org.au --Sig_/FbP4CYOTAJSl_7QI41nE3ce Content-Type: application/pgp-signature; name=signature.asc Content-Disposition: attachment; filename=signature.asc -----BEGIN PGP SIGNATURE----- Version: GnuPG v2 iQIcBAEBCAAGBQJT6h0DAAoJEMDTa8Ir7ZwVa0wP/j0ONjUshXWfwHbGiWLU/K45 8AqHE2OHvFL1GIcnOE+heXmYMn0HVzkfFPzp0HFR98JubgXI4kFPxTBjb7bSh1KQ t0NstYhroALRf4XLS82EuIgfauy0B7BxTfEkD1j9Ai9qQI2jQ0e4BkWX0MayVQwD CRnkmzjMFWGu/3ARGckAX7QPWeQ63vQAgdNNRh9ryBLQutHVeTBjr8ls+WcOZwCJ +hCI4lZE4sw04ThZWOHxs4p84+OFLJfYXxLiLMJoGfHlvVlNBDoBXDr7pGkayvUF ky5FIj1akiuOOXhuYfRSJk1iuOUtGAgn0nIqMqZvb/ixhWJEy2cXF7GP3pC9cb/9 qNeT0sxqGzR3mFfnPrRApFIjiU+yeFV50OXj3UMD6yChWDmGLgaIf0dIMt3uJfkR WvBF2gGs8DypYUxHZSdUAUfwy3HvgEYtGjJcOxgZKaxtAtvPTkUZ0CLiUvAW/jmU eHqlKURZOmuJyDdYpQNulvJZv0DhHBkF/Bw/8eLV/K81kPpiuq3lrScxsUKk72pv T9Rzgwent2s3P8jcYHIxTpiK0QxONYnEX+wTHFUffXXI5u+V53Mt8ckSsAbH46zx Trfpbppj5+/pUiE8p6zuRuLmoObEVbHlIV6OTkz8Ezb9Qe24EJS2osfYcVkkPIiq ogUHFE95BdGRNNo1XC6O =Rp08 -----END PGP SIGNATURE----- --Sig_/FbP4CYOTAJSl_7QI41nE3ce-- From tdm@sgi.com Tue Aug 12 09:47: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=HTML_MESSAGE,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 91B2D7F3F for ; Tue, 12 Aug 2014 09:47:40 -0500 (CDT) Received: from estes.americas.sgi.com (estes.americas.sgi.com [128.162.236.10]) by relay2.corp.sgi.com (Postfix) with ESMTP id 372CA30404E; Tue, 12 Aug 2014 07:47:40 -0700 (PDT) Received: from [128.162.232.11] (porter.americas.sgi.com [128.162.232.11]) by estes.americas.sgi.com (Postfix) with ESMTP id DB4567001834; Tue, 12 Aug 2014 09:47:39 -0500 (CDT) Message-ID: <53EA290B.6000009@sgi.com> Date: Tue, 12 Aug 2014 09:47:39 -0500 From: Troy McCorkell User-Agent: Mozilla/5.0 (X11; U; Linux i686 (x86_64); en-US; rv:1.9.1.5) Gecko/20091204 Thunderbird/3.0 MIME-Version: 1.0 To: Dave Chinner Cc: xfs@oss.sgi.com, fstests@vger.kernel.org Subject: Re: [DISCUSS] Moving from oss.sgi.com to kernel.org References: <20140807000922.GA26465@dastard> In-Reply-To: <20140807000922.GA26465@dastard> Content-Type: multipart/alternative; boundary="------------000902030909030903060406" This is a multi-part message in MIME format. --------------000902030909030903060406 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 08/06/2014 07:09 PM, Dave Chinner wrote: > Hi folks, > > A few recent incidents, discoveries and comments have me concerned > about the viability of using oss.sgi.com to host XFS deveopment and > community support. > > We are very grateful for the time, effort and money that SGI has put > into providing oss.sgi.com for us over many, many years, but these > recent issues have brought the state of oss.sgi.com and hence it's > viability as a host for XFS development to my immediate attention. > > Ultimately, as the XFS maintainer, I'm responsible for the contents > of the pull requests sent to Linus and the code we distribute to > users, distros and developers. That means I need to be able to trust > that the hosting infrastructure is secure and well maintained. > > The short story is that I can't trust oss.sgi.com to be maintained > and secure anymore. The recent DOS issues with oss.sgi.com made it > clear that it is essentially unmaintained and the SGI admins don't > have time to address issues that arise. This little snippet of the > conversion about blocking the rogue spider causing the recent > ftp and gitweb DOS problems is instructive: > > [19/07/14 09:07] trev, it's you guys' box :) > [19/07/14 09:07] you get to make it work > [19/07/14 09:07] I am not eh administrator, and if I'm forced to do this sort of thing I'll just take the content elsewhere.... > [19/07/14 09:08] dchinner__, please do so. I don't have much time for oss anymore > > It should be no surprise that since this conversation I've been > looking at what is involved in moving everything XFS off oss.sgi.com > to kernel.org. Right now I have the main XFS repositories up to > date on kernel.org. For userspace I've simply pushed the current > trees and tags to the pre-existing repositories here: > > git://git.kernel.org/pub/scm/fs/xfs/xfsprogs-dev.git > git://git.kernel.org/pub/scm/fs/xfs/xfsdump-dev.git > git://git.kernel.org/pub/scm/fs/xfs/xfstests-dev.git > > These trees currently have the same content as the trees on > oss.sgi.com. I may rename these as a result of discussions here > (e.g. some people don't like the -dev suffix on the trees) so it's > best for people to continue to use the trees on oss.sgi.com until > this disucssion comes to a conclusion. > > My new kernel dev tree can be found here: > > git://git.kernel.org/pub/scm/linux/kernel/git/dgc/linux-xfs.git > > This is my immediate concern: this tree, regardless of anything > else, the tree I am going to be asking Linus to pull from - it is > now *my* master tree and the tree on oss.sgi.com will simply mirror > that tree. > > For the short term, I will set up a cron job to keep the oss trees > up to date with the trees on kernel.org. By "short-term" I mean till > the end of the year at most. This will allow people time to change > their workflows, update their repos, bookmarks, etc in their own > time so hopefully not take anyone by surprise when the trees on > oss.sgi.com stop updating. "short-term" is a rubbery concept - if > anyone things it should be longer or shorter or whether a completely > different approach is warranted, please speak up. > > Over the next few days I will move the remaining xfs trees to > kernel.org - the historical kernel archive and documentation trees - > and then I'll maintain them as the primary trees with the same > short term mirroring backup. > > In moving these trees, we will need to update some documentation > (e.g. the "where to get" documentation on the xfs.org wiki) and > links, as well as place a "readme" in the gitweb main page on > oss.sgi.com to indicate that the up-to-date XFS trees are now on > kernel.org and documenting the drop-dead date to when the trees on > oss will no longer be kept up to date. > > The only remaining issue is what to do about tarball releases for > xfsprogs/xfsdump/fstests. We currently have a bunch of historic > releases in the ftp release area on oss.sgi.com. I will organise a > release directory on kernel.org for future releases (location yet to > be confirmed), but I'm not sure what to do with the older releases. > I'm open to suggestions here, but the limit of what I will try to > move to kernel.org is signed tarballs that I have verified. > > For xfstests, I think this would be a good time to rename the > project officially as well (i.e. to "fstests"). I'll need to talk to > the kernel.org admins on where to locate it (pub/scm/fs/fstests is > the best candidate, I think), but in the mean time I'll just mirror > to oss.sgi.com as per the above so nobody needs to change anything > until we sort out the final location/name of the tree. If anyone has > any other ideas on this, please let me know, otherwise I'll just > proceed with this plan. > > In conjunction with this source tree move, I'd also like to start the > move the mailing list. We have ongoing spam, performance and user > access issues with oss.sgi.com, so IMO if we are moving source trees > off this host we should also move the mailing list to kernel.org > infrastructure. > > To that end, there is a linux-xfs@vger.kernel.org > list already - it was created at the same time that the above > kernel.org repositories were created, but we've never used it. It > is archived here: > > http://www.spinics.net/lists/linux-xfs/ > > Moving the mailing list is going to be something that affects more > than just the developers - we've got lots of documentation that > points at this list and there are lots of users that are subscribed, > read it though nntp gateways, have aliases for it, etc so we need > a good transition plan here. > > I'm not sure what the best approach - perhaps just > forwarding all email from xfs@oss.sgi.com to > linux-xfs@vger.kernel.org will solve most transitional problems > for users that aren't aware of the change or are following old > documentation or "please report bug" messages from xfs_repair. > But it means that everyone needs to subscribe to the new list > and probably unsubscribe from the old list. I dont see how we can > avoid that in the long term, but I'd like to minimise the pain > as much as possible for everyone. > > Again, I'm open to suggestions on how to approach this and maintain > the oss list aliases for long enough that people and search engines > learn about the new list. > > I would like to make this as painless as possible for everyone. This > isn't the only solution to the problems we have with oss.sgi.com, > but it's the path of least effort/greatest gain for me. If anyone > has any ideas on alternative solutions, reservations about moving to > kernel.org infrastructure and/or suggestions to make it less painful > for everyone, please speak up now. > > Cheers, > > Dave. > > > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs > We'll make the necessary updates to oss.sgi.com to make the transition to vger.kernel.org as seamless as possible. Thanks, Troy --------------000902030909030903060406 Content-Type: text/html; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit On 08/06/2014 07:09 PM, Dave Chinner wrote:
Hi folks,

A few recent incidents, discoveries and comments have me concerned
about the viability of using oss.sgi.com to host XFS deveopment and
community support.

We are very grateful for the time, effort and money that SGI has put
into providing oss.sgi.com for us over many, many years, but these
recent issues have brought the state of oss.sgi.com and hence it's
viability as a host for XFS development to my immediate attention.

Ultimately, as the XFS maintainer, I'm responsible for the contents
of the pull requests sent to Linus and the code we distribute to
users, distros and developers. That means I need to be able to trust
that the hosting infrastructure is secure and well maintained.

The short story is that I can't trust oss.sgi.com to be maintained
and secure anymore. The recent DOS issues with oss.sgi.com made it
clear that it is essentially unmaintained and the SGI admins don't
have time to address issues that arise. This little snippet of the
conversion about blocking the rogue spider causing the recent
ftp and gitweb DOS problems is instructive:

[19/07/14 09:07] <sandeen> trev, it's you guys' box :)
[19/07/14 09:07] <sandeen> you get to make it work 
[19/07/14 09:07] <dchinner__> I am not eh administrator, and if I'm forced to do this sort of thing I'll just take the content elsewhere....
[19/07/14 09:08] <trev> dchinner__, please do so. I don't have much time for oss anymore

It should be no surprise that since this conversation I've been
looking at what is involved in moving everything XFS off oss.sgi.com
to kernel.org.  Right now I have the main XFS repositories up to
date on kernel.org.  For userspace I've simply pushed the current
trees and tags to the pre-existing repositories here:

	git://git.kernel.org/pub/scm/fs/xfs/xfsprogs-dev.git
	git://git.kernel.org/pub/scm/fs/xfs/xfsdump-dev.git
	git://git.kernel.org/pub/scm/fs/xfs/xfstests-dev.git

These trees currently have the same content as the trees on
oss.sgi.com.  I may rename these as a result of discussions here
(e.g. some people don't like the -dev suffix on the trees) so it's
best for people to continue to use the trees on oss.sgi.com until
this disucssion comes to a conclusion.

My new kernel dev tree can be found here:

	git://git.kernel.org/pub/scm/linux/kernel/git/dgc/linux-xfs.git

This is my immediate concern: this tree, regardless of anything
else, the tree I am going to be asking Linus to pull from - it is
now *my* master tree and the tree on oss.sgi.com will simply mirror
that tree.

For the short term, I will set up a cron job to keep the oss trees
up to date with the trees on kernel.org. By "short-term" I mean till
the end of the year at most. This will allow people time to change
their workflows, update their repos, bookmarks, etc in their own
time so hopefully not take anyone by surprise when the trees on
oss.sgi.com stop updating. "short-term" is a rubbery concept - if
anyone things it should be longer or shorter or whether a completely
different approach is warranted, please speak up.

Over the next few days I will move the remaining xfs trees to
kernel.org - the historical kernel archive and documentation trees -
and then I'll maintain them as the primary trees with the same
short term mirroring backup.

In moving these trees, we will need to update some documentation
(e.g. the "where to get" documentation on the xfs.org wiki) and
links, as well as place a "readme" in the gitweb main page on
oss.sgi.com to indicate that the up-to-date XFS trees are now on
kernel.org and documenting the drop-dead date to when the trees on
oss will no longer be kept up to date.

The only remaining issue is what to do about tarball releases for
xfsprogs/xfsdump/fstests. We currently have a bunch of historic
releases in the ftp release area on oss.sgi.com. I will organise a
release directory on kernel.org for future releases (location yet to
be confirmed), but I'm not sure what to do with the older releases.
I'm open to suggestions here, but the limit of what I will try to
move to kernel.org is signed tarballs that I have verified.

For xfstests, I think this would be a good time to rename the
project officially as well (i.e. to "fstests"). I'll need to talk to
the kernel.org admins on where to locate it (pub/scm/fs/fstests is
the best candidate, I think), but in the mean time I'll just mirror
to oss.sgi.com as per the above so nobody needs to change anything
until we sort out the final location/name of the tree. If anyone has
any other ideas on this, please let me know, otherwise I'll just
proceed with this plan.

In conjunction with this source tree move, I'd also like to start the
move the mailing list. We have ongoing spam, performance and user
access issues with oss.sgi.com, so IMO if we are moving source trees
off this host we should also move the mailing list to kernel.org
infrastructure.

To that end, there is a linux-xfs@vger.kernel.org
list already - it was created at the same time that the above
kernel.org repositories were created, but we've never used it. It
is archived here:

	http://www.spinics.net/lists/linux-xfs/

Moving the mailing list is going to be something that affects more
than just the developers - we've got lots of documentation that
points at this list and there are lots of users that are subscribed,
read it though nntp gateways, have aliases for it, etc so we need
a good transition plan here.

I'm not sure what the best approach - perhaps just
forwarding all email from xfs@oss.sgi.com to
linux-xfs@vger.kernel.org will solve most transitional problems
for users that aren't aware of the change or are following old
documentation or "please report bug" messages from xfs_repair.
But it means that everyone needs to subscribe to the new list
and probably unsubscribe from the old list. I dont see how we can
avoid that in the long term, but I'd like to minimise the pain
as much as possible for everyone.

Again, I'm open to suggestions on how to approach this and maintain
the oss list aliases for long enough that people and search engines
learn about the new list.

I would like to make this as painless as possible for everyone. This
isn't the only solution to the problems we have with oss.sgi.com,
but it's the path of least effort/greatest gain for me. If anyone
has any ideas on alternative solutions, reservations about moving to
kernel.org infrastructure and/or suggestions to make it less painful
for everyone, please speak up now.

Cheers,

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

We'll make the necessary updates to oss.sgi.com to make the transition to vger.kernel.org
as seamless as possible.

Thanks,
Troy

--------------000902030909030903060406-- From sandeen@sandeen.net Tue Aug 12 11:42: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 (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 4169A7F3F for ; Tue, 12 Aug 2014 11:42:24 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id A008CAC008 for ; Tue, 12 Aug 2014 09:42:20 -0700 (PDT) X-ASG-Debug-ID: 1407861737-04cbb0508cd9a10001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id XVjNpOWU1WJFTqm4 for ; Tue, 12 Aug 2014 09:42:18 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from Liberator-2.local (24-113-182-223.wavecable.com [24.113.182.223]) (using TLSv1 with cipher DHE-RSA-AES128-SHA (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 1CB5863C6058; Tue, 12 Aug 2014 11:42:16 -0500 (CDT) Message-ID: <53EA43E6.5010100@sandeen.net> Date: Tue, 12 Aug 2014 09:42:14 -0700 From: Eric Sandeen MIME-Version: 1.0 To: Felipe Monteiro de Carvalho , xfs@oss.sgi.com Subject: Re: Location of backup superblocks References: X-ASG-Orig-Subj: Re: Location of backup superblocks In-Reply-To: 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: 1407861738 X-Barracuda-URL: http://192.48.176.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.8366 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 8/12/14, 3:49 AM, Felipe Monteiro de Carvalho wrote: > Hello, > > I am trying to recover a XFS partition (or series of partitions) where > the main superblock was corrupted, and I see that there are multiple > superblock copies. I'd like to guess the partition start and size > also. so I guess you mean that the partition table was corrupted as well? > I see that the partition size can be calculated with sb_blocksize* sb_dblocks > > But what about the partition start? I think I can guess it based in > the position of the found superblocks. > > Any ideas where is the code that writes to disk those backup > superblocks? So far to me it looks like that their position is > calculated as disk_size / 4 rounded (nearest rounding?) to a multiple > of sb_blocksize, but having the exact code part would be better of > course =) Or even better, a list of backup superblock positions... How hard have you tried looking? ;) In xfsprogs, you can find this if you search for "backup": " set allocation group superblock\n" "\n" " Example:\n" "\n" " 'sb 7' - set location to 7th allocation group superblock, set type to 'sb'\n" "\n" " Located in the first sector of each allocation group, the superblock\n" " contains the base information for the filesystem.\n" " The superblock in allocation group 0 is the primary. The copies in the\n" " remaining allocation groups only serve as backup for filesystem recovery.\n" " The icount/ifree/fdblocks/frextents are only updated in superblock 0.\n" The on-disk structure document describes the same thing: http://xfs.org/docs/xfsdocs-xml-dev/XFS_Filesystem_Structure//tmp/en-US/html/Allocation_Groups.html#Superblocks IOWs: there are superblocks in each allocation group. They are located in the first sector of each AG, therefore the primary is in sector 0 of the filesystem, and the secondaries are evenly spaced, at the first sector of of AGs 1, 2, 3, 4, etc. If you read the mkfs manpage, you'll see that ag size can be specified at mkfs time, so there is no universal answer. However, the default is to split the filesystem into 4 AGs, unless the filesystem is > 1T, in which case it will create 1T allocation groups. If you want to look at the actual code that makes these geometry calculations, you can find it by tracing through mkfs, paying attention to the variables which get set by the agcount and/or agsize options. -Eric From bfoster@redhat.com Tue Aug 12 11:51: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 E2D307F3F for ; Tue, 12 Aug 2014 11:51:57 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 91AC6304043 for ; Tue, 12 Aug 2014 09:51:54 -0700 (PDT) X-ASG-Debug-ID: 1407862309-04bdf06ef8d9c00001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 0g0aJX7M2Gle8T4D (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 12 Aug 2014 09:51: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 s7CGpjs7011655 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Tue, 12 Aug 2014 12:51:46 -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 s7CGpj5G007666; Tue, 12 Aug 2014 12:51:45 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 2FE7812577C; Tue, 12 Aug 2014 12:51:43 -0400 (EDT) Date: Tue, 12 Aug 2014 12:51:43 -0400 From: Brian Foster To: "Carlos E. R." Cc: XFS mailing list Subject: Re: Subject : Happened again, 20140811 -- Got "Internal error XFS_WANT_CORRUPTED_GOTO". Filesystem needs reformatting to correct issue. Message-ID: <20140812165143.GB46654@bfoster.bfoster> X-ASG-Orig-Subj: Re: Subject : Happened again, 20140811 -- Got "Internal error XFS_WANT_CORRUPTED_GOTO". Filesystem needs reformatting to correct issue. References: <53E8D9F6.7080704@sgi.com> <53E93530.4070902@sgi.com> <53E93C29.1020103@sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: User-Agent: Mutt/1.5.23 (2014-03-12) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.27 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1407862310 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Tue, Aug 12, 2014 at 02:17:00AM +0200, Carlos E. R. wrote: > -----BEGIN PGP SIGNED MESSAGE----- > Hash: SHA256 > > Content-ID: > > > El 2014-08-12 a las 00:36 +0200, Carlos E. R. escribió: > >El 2014-08-11 a las 16:56 -0500, Mark Tinguely escribió: > > >but all of them are about 401M before compression. The upload will take > >long, my ADSL upload is 0.3M/s at most. > > > I have shared (view) on google drive a folder with the three files. Both > Brian Foster and Mark Tinguely should have got a link on the mail from me. > If somebody else wants access, just tell me. > I see the same thing from repair that was in your repair output: block (1,12608397-12608397) multiply claimed by cnt space tree, state - 2 If I take a look at the btrees as is, I see "235:[12608397,10]" included in the bnobt (fsb 0x200aa55) and "270:[12608397,10]" in the cntbt (fsb 0x2000781). If I skip the mount, zero the log and repair, everything seems Ok. I can allocate the remainder of available space and rm -rf everything in the fs without an error. Once I replay the log, I see "272:[12608397,10] 273:[12608397,10]" in the cntbt, which is clearly a duplicate entry. This is what repair detects and cleans up and seems to lead to the shutdown. E.g., if I mount and use the fs, I can hit an assert or failure just by attempting to allocate the rest of the space in the fs. If that is the state of the fs on disk, it's only a matter of time we explode due to allocating and freeing that range of space or possibly attempting to allocate that space twice. Mark mentioned that he didn't see the superblock item in the log with regard to the freeze. I don't see that either... which perhaps suggests that this all happens during the wake-from-hibernate sequence..? My understanding is that we should freeze on hibernate, thus force everything out to the log, write an unmount record and then dirty the log with a superblock transaction. Therefore, that should be the only item in the log post-freeze. Here, we have various items in the log including several logged buffers that correspond to the cntbt block that ends up corrupted (daddr 0xf427c08). Given the failure occurs on freeing an extent via the xfs_eofblocks scanner, perhaps this extent was initially allocated as speculative preallocation and the eofblocks scanner is where we happen to first identify the corrupted cntbt. What is strange is that, as mentioned previously, the space appears to be free if I zero the log, so that means it was probably free before the freeze. It seems highly unlikely for a file to gain preallocation, be written out and then get trimmed by the scanner all on wake-from-hibernate. Carlos, How long after hibernate does the shutdown/crash typically occur? Do you basically wake-up and within a few seconds the filesystem crashes, or is it some time (minutes) later? If the former, I wonder if it's possible that the scanner returns to life pointing to a stale or freed incore inode and does something bogus based on that. Brian > - -- Cheers > Carlos E. R. > > (from 13.1 x86_64 "Bottle" (Minas Tirith)) > -----BEGIN PGP SIGNATURE----- > Version: GnuPG v2.0.22 (GNU/Linux) > > iF4EAREIAAYFAlPpXQYACgkQja8UbcUWM1wQ9gEAl1WI24UDArdlWHh3J2ih3AV3 > nMTwDRqTrT0Rk2BJOB8A/1BOzzn3/IX16sPCsYoqGEyXNHcNXWBHENShlyWzJGUr > =W+BG > -----END PGP SIGNATURE----- > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From sandeen@sandeen.net Tue Aug 12 11:52: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 9747F7F3F for ; Tue, 12 Aug 2014 11:52:14 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 50B45304043 for ; Tue, 12 Aug 2014 09:52:14 -0700 (PDT) X-ASG-Debug-ID: 1407862331-04bdf06ef8d9c40001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id USHyzNvX96J6nuGK for ; Tue, 12 Aug 2014 09:52:12 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from Liberator-2.local (24-113-182-223.wavecable.com [24.113.182.223]) (using TLSv1 with cipher DHE-RSA-AES128-SHA (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 5DF0663C6058; Tue, 12 Aug 2014 11:52:11 -0500 (CDT) Message-ID: <53EA463A.5090203@sandeen.net> Date: Tue, 12 Aug 2014 09:52:10 -0700 From: Eric Sandeen MIME-Version: 1.0 To: Felipe Monteiro de Carvalho , xfs@oss.sgi.com Subject: Re: Location of backup superblocks References: <53EA43E6.5010100@sandeen.net> X-ASG-Orig-Subj: Re: Location of backup superblocks In-Reply-To: <53EA43E6.5010100@sandeen.net> 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: 1407862332 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.8366 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 8/12/14, 9:42 AM, Eric Sandeen wrote: > On 8/12/14, 3:49 AM, Felipe Monteiro de Carvalho wrote: >> Hello, >> >> I am trying to recover a XFS partition (or series of partitions) where >> the main superblock was corrupted, and I see that there are multiple >> superblock copies. I'd like to guess the partition start and size >> also. > > so I guess you mean that the partition table was corrupted as well? > >> I see that the partition size can be calculated with sb_blocksize* sb_dblocks >> >> But what about the partition start? I think I can guess it based in >> the position of the found superblocks. >> >> Any ideas where is the code that writes to disk those backup >> superblocks? So far to me it looks like that their position is >> calculated as disk_size / 4 rounded (nearest rounding?) to a multiple >> of sb_blocksize, but having the exact code part would be better of >> course =) Or even better, a list of backup superblock positions... > > How hard have you tried looking? ;) > > In xfsprogs, you can find this if you search for "backup": > > " set allocation group superblock\n" > "\n" > " Example:\n" > "\n" > " 'sb 7' - set location to 7th allocation group superblock, set type to 'sb'\n" > "\n" > " Located in the first sector of each allocation group, the superblock\n" > " contains the base information for the filesystem.\n" > " The superblock in allocation group 0 is the primary. The copies in the\n" > " remaining allocation groups only serve as backup for filesystem recovery.\n" > " The icount/ifree/fdblocks/frextents are only updated in superblock 0.\n" > > The on-disk structure document describes the same thing: > > http://xfs.org/docs/xfsdocs-xml-dev/XFS_Filesystem_Structure//tmp/en-US/html/Allocation_Groups.html#Superblocks or the xfs(5) manpage :) -eric From bfoster@redhat.com Tue Aug 12 14:31: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 27C887F3F for ; Tue, 12 Aug 2014 14:31:19 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 066258F8081 for ; Tue, 12 Aug 2014 12:31:15 -0700 (PDT) X-ASG-Debug-ID: 1407871874-04cb6c4c93c3990001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id A1sOEFink76fsXLW (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 12 Aug 2014 12:31:14 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s7CJV7so024978 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Tue, 12 Aug 2014 15:31:07 -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 s7CJV6uO030561; Tue, 12 Aug 2014 15:31:06 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id C50BC12577C; Tue, 12 Aug 2014 15:31:04 -0400 (EDT) Date: Tue, 12 Aug 2014 15:31:04 -0400 From: Brian Foster To: Alex Lyakas Cc: Dave Chinner , xfs@oss.sgi.com Subject: Re: use-after-free on log replay failure Message-ID: <20140812193104.GC46654@bfoster.bfoster> X-ASG-Orig-Subj: Re: use-after-free on log replay failure References: <4B2A412C75324EE9880358513C069476@alyakaslap> <9D3CBECB663B4A77B7EF74B67973310A@alyakaslap> <20140804230721.GA20518@dastard> <20140806152042.GB39990@bfoster.bfoster> <20140811132057.GA1186@bfoster.bfoster> <20140811215207.GS20518@dastard> <20140812120341.GA46654@bfoster.bfoster> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.23 (2014-03-12) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1407871874 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Tue, Aug 12, 2014 at 03:39:02PM +0300, Alex Lyakas wrote: > Hello Dave, Brian, > I will describe a generic reproduction that you ask for. > > It was performed on pristine XFS code from 3.8.13, taken from here: > git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git > This seems generic enough to me. Could you try on a more recent kernel? Dave had mentioned there were fixes in this area of log recovery, so a bisect might be all that is necessary to track down the patch you need. Otherwise, we can pick up debugging from something more recent. Brian > top commit being: > commit dbf932a9b316d5b29b3e220e5a30e7a165ad2992 > Author: Greg Kroah-Hartman > Date: Sat May 11 13:57:46 2013 -0700 > > Linux 3.8.13 > > > I made a single (I swear!) code change in XFS: > > diff --git a/fs/xfs/xfs_log_recover.c b/fs/xfs/xfs_log_recover.c > index 96fcbb8..d756bf6 100644 > --- a/fs/xfs/xfs_log_recover.c > +++ b/fs/xfs/xfs_log_recover.c > @@ -3736,6 +3736,9 @@ xlog_recover( > if ((error = xlog_find_tail(log, &head_blk, &tail_blk))) > return error; > > + xfs_notice(log->l_mp, "Sleep 10s before xlog_do_recover"); > + msleep(10000); > + > if (tail_blk != head_blk) { > /* There used to be a comment here: > * > > Fresh XFS was formatted on a 20 GB block device within a VM, using: > mkfs.xfs -f -K /dev/vde -p /etc/zadara/xfs.protofile > and: > root@vc-00-00-1383-dev:~# cat /etc/zadara/xfs.protofile > dummy : bootfilename, not used, backward compatibility > 0 0 : numbers of blocks and inodes, not used, > backward compatibility > d--777 0 0 : set 777 perms for the root dir > $ > $ > > I mounted XFS with the following options: > rw,sync,noatime,wsync,attr2,inode64,noquota 0 0 > > I started a couple of processes writing files sequentially onto this mount > point, and after few seconds crashed the VM. > When the VM came up, I took the metadump file and placed it in: > https://drive.google.com/file/d/0ByBy89zr3kJNa0ZpdmZFS242RVU/edit?usp=sharing > > Then I set up the following Device Mapper target onto /dev/vde: > dmsetup create VDE --table "0 41943040 linear-custom /dev/vde 0" > I am attaching the code (and Makefile) of dm-linear-custom target. It is > exact copy of dm-linear, except that it has a module parameter. With the > parameter set to 0, this is an identity mapping onto /dev/vde. If the > parameter is set to non-0, all WRITE bios are failed with ENOSPC. There is a > workqueue to fail them in a different context (not sure if really needed, > but that's what our "real" custom > block device does). > > Now I did: > mount -o noatime,sync /dev/mapper/VDE /mnt/xfs > > The log recovery flow went into the sleep that I added, and then I did: > echo 1 > /sys/module/dm_linear_custom/parameters/fail_writes > > Problem reproduced: > Aug 12 14:23:04 vc-00-00-1383-dev kernel: [ 175.000657] XFS (dm-0): > Mounting Filesystem > Aug 12 14:23:04 vc-00-00-1383-dev kernel: [ 175.026991] XFS (dm-0): Sleep > 10s before xlog_do_recover > Aug 12 14:23:14 vc-00-00-1383-dev kernel: [ 185.028113] XFS (dm-0): > Starting recovery (logdev: internal) > Aug 12 14:23:18 vc-00-00-1383-dev kernel: [ 188.556622] XFS (dm-0): > metadata I/O error: block 0x2 ("xlog_recover_iodone") error 28 numblks 1 > Aug 12 14:23:18 vc-00-00-1383-dev kernel: [ 188.556675] XFS (dm-0): > metadata I/O error: block 0x40 ("xlog_recover_iodone") error 28 numblks 16 > Aug 12 14:23:18 vc-00-00-1383-dev kernel: [ 188.556680] XFS (dm-0): > xfs_do_force_shutdown(0x1) called from line 377 of file > /mnt/work/alex/linux-stable/source/fs/xfs/xfs_log_recover.c. Return address > = 0xffffffffa0349f68 > Aug 12 14:23:18 vc-00-00-1383-dev kernel: [ 188.556683] XFS (dm-0): I/O > Error Detected. Shutting down filesystem > Aug 12 14:23:18 vc-00-00-1383-dev kernel: [ 188.556684] XFS (dm-0): Please > umount the filesystem and rectify the problem(s) > Aug 12 14:23:18 vc-00-00-1383-dev kernel: [ 188.556766] XFS (dm-0): > metadata I/O error: block 0xa00002 ("xlog_recover_iodone") error 5 numblks 1 > Aug 12 14:23:18 vc-00-00-1383-dev kernel: [ 188.556769] XFS (dm-0): > xfs_do_force_shutdown(0x1) called from line 377 of file > /mnt/work/alex/linux-stable/source/fs/xfs/xfs_log_recover.c. Return address > = 0xffffffffa0349f68 > Aug 12 14:23:18 vc-00-00-1383-dev kernel: [ 188.556771] XFS (dm-0): > metadata I/O error: block 0xa00008 ("xlog_recover_iodone") error 5 numblks 8 > Aug 12 14:23:18 vc-00-00-1383-dev kernel: [ 188.556774] XFS (dm-0): > xfs_do_force_shutdown(0x1) called from line 377 of file > /mnt/work/alex/linux-stable/source/fs/xfs/xfs_log_recover.c. Return address > = 0xffffffffa0349f68 > Aug 12 14:23:18 vc-00-00-1383-dev kernel: [ 188.556776] XFS (dm-0): > metadata I/O error: block 0xa00010 ("xlog_recover_iodone") error 5 numblks 8 > Aug 12 14:23:18 vc-00-00-1383-dev kernel: [ 188.556779] XFS (dm-0): > xfs_do_force_shutdown(0x1) called from line 377 of file > /mnt/work/alex/linux-stable/source/fs/xfs/xfs_log_recover.c. Return address > = 0xffffffffa0349f68 > Aug 12 14:23:18 vc-00-00-1383-dev kernel: [ 188.556781] XFS (dm-0): > metadata I/O error: block 0xa00018 ("xlog_recover_iodone") error 5 numblks 8 > Aug 12 14:23:18 vc-00-00-1383-dev kernel: [ 188.556783] XFS (dm-0): > xfs_do_force_shutdown(0x1) called from line 377 of file > /mnt/work/alex/linux-stable/source/fs/xfs/xfs_log_recover.c. Return address > = 0xffffffffa0349f68 > Aug 12 14:23:18 vc-00-00-1383-dev kernel: [ 188.556785] XFS (dm-0): > metadata I/O error: block 0xa00040 ("xlog_recover_iodone") error 5 numblks > 16 > Aug 12 14:23:18 vc-00-00-1383-dev kernel: [ 188.556788] XFS (dm-0): > xfs_do_force_shutdown(0x1) called from line 377 of file > /mnt/work/alex/linux-stable/source/fs/xfs/xfs_log_recover.c. Return address > = 0xffffffffa0349f68 > Aug 12 14:23:18 vc-00-00-1383-dev kernel: [ 188.556790] XFS (dm-0): > metadata I/O error: block 0xa00050 ("xlog_recover_iodone") error 5 numblks > 16 > Aug 12 14:23:18 vc-00-00-1383-dev kernel: [ 188.556793] XFS (dm-0): > xfs_do_force_shutdown(0x1) called from line 377 of file > /mnt/work/alex/linux-stable/source/fs/xfs/xfs_log_recover.c. Return address > = 0xffffffffa0349f68 > Aug 12 14:23:18 vc-00-00-1383-dev kernel: [ 188.556880] XFS (dm-0): > metadata I/O error: block 0xa00001 ("xlog_recover_iodone") error 28 numblks > 1 > Aug 12 14:23:18 vc-00-00-1383-dev kernel: [ 188.556884] XFS (dm-0): > xfs_do_force_shutdown(0x1) called from line 377 of file > /mnt/work/alex/linux-stable/source/fs/xfs/xfs_log_recover.c. Return address > = 0xffffffffa0349f68 > Aug 12 14:23:18 vc-00-00-1383-dev kernel: [ 188.556977] XFS (dm-0): log > mount/recovery failed: error 28 > Aug 12 14:23:18 vc-00-00-1383-dev kernel: [ 188.557215] XFS (dm-0): log > mount failed > Aug 12 14:23:18 vc-00-00-1383-dev kernel: [ 188.573194] XFS (): > xfs_do_force_shutdown(0x1) called from line 377 of file > /mnt/work/alex/linux-stable/source/fs/xfs/xfs_log_recover.c. Return address > = 0xffffffffa0349f68 > Aug 12 14:23:18 vc-00-00-1383-dev kernel: [ 188.573214] XFS (): metadata > I/O error: block 0x18 ("xlog_recover_iodone") error 28 numblks 8 > Aug 12 14:23:18 vc-00-00-1383-dev kernel: [ 188.574685] XFS (): > xfs_do_force_shutdown(0x1) called from line 377 of file > /mnt/work/alex/linux-stable/source/fs/xfs/xfs_log_recover.c. Return address > = 0xffffffffa0349f68 > > As you see, after mount completes, IO callbacks are still arriving and > printing junk (empty string in this case). Immediately after that kernel > dies. > > Is this description generic enough? > > Thanks, > Alex. > > > > > -----Original Message----- From: Brian Foster > Sent: 12 August, 2014 3:03 PM > To: Dave Chinner > Cc: Alex Lyakas ; xfs@oss.sgi.com > Subject: Re: use-after-free on log replay failure > > On Tue, Aug 12, 2014 at 07:52:07AM +1000, Dave Chinner wrote: > >On Mon, Aug 11, 2014 at 09:20:57AM -0400, Brian Foster wrote: > >> On Sun, Aug 10, 2014 at 03:20:50PM +0300, Alex Lyakas wrote: > >> > On Wed, Aug 6, 2014 at 6:20 PM, Brian Foster > > > >wrote: > >> > > On Wed, Aug 06, 2014 at 03:52:03PM +0300, Alex Lyakas wrote: > >..... > >> > >> But I believe, my analysis shows that during the mount sequence XFS > >> > >> does not > >> > >> wait properly for all the bios to complete, before failing the > > > >>> mount > >> > >> sequence back to the caller. > >> > >> > >> > > > >> > > As an experiment, what about the following? Compile tested only and > >> > > not > >> > > safe for general use. > >... > >> > > diff --git a/fs/xfs/xfs_buf.c b/fs/xfs/xfs_buf.c > >> > > index cd7b8ca..fbcf524 100644 > >> > > --- a/fs/xfs/xfs_buf.c > >> > > +++ b/fs/xfs/xfs_buf.c > >> > > @@ -1409,19 +1409,27 @@ xfs_buf_iorequest( > >> > > * case nothing will ever complete. It returns the I/O error code, > >> > > if any, or > >> > > * 0 if there was no error. > >> > > */ > >> > > -int > >> > > -xfs_buf_iowait( > >> > > - xfs_buf_t *bp) > >> > > +static int > >> > > +__xfs_buf_iowait( > >> > > + struct xfs_buf *bp, > >> > > + bool skip_error) > >> > > { > >> > > trace_xfs_buf_iowait(bp, _RET_IP_); > >> > > > >> > > - if (!bp->b_error) > >> > > + if (skip_error || !bp->b_error) > >> > > wait_for_completion(&bp->b_iowait); > >> > > > >> > > trace_xfs_buf_iowait_done(bp, _RET_IP_); > >> > > return bp->b_error; > >> > > } > >> > > > >> > > +int > >> > > +xfs_buf_iowait( > >> > > + struct xfs_buf *bp) > >> > > +{ > >> > > + return __xfs_buf_iowait(bp, false); > >> > > +} > >> > > + > >> > > xfs_caddr_t > >> > > xfs_buf_offset( > >> > > xfs_buf_t *bp, > >> > > @@ -1866,7 +1874,7 @@ xfs_buf_delwri_submit( > >> > > bp = list_first_entry(&io_list, struct xfs_buf, > > > >> b_list); > >> > > > >> > > list_del_init(&bp->b_list); > >> > > - error2 = xfs_buf_iowait(bp); > >> > > + error2 = __xfs_buf_iowait(bp, true); > >> > > xfs_buf_relse(bp); > >> > > if (!error) > >> > > error = error2; > > > >Not waiting here on buffer error should not matter. Any buffer that > >is under IO and requires completion should be referenced, and that > >means it should be caught and waited on by xfs_wait_buftarg() in the > >mount failure path after log recovery fails. > > > > I think that assumes the I/O is successful. Looking through > xlog_recover_buffer_pass2() as an example, we read the buffer which > should return with b_hold == 1. The delwri queue increments the hold and > we xfs_buf_relse() in the return path (i.e., buffer is now held by the > delwri queue awaiting submission). > > Sometime later we delwri_submit()... xfs_buf_iorequest() does an > xfs_buf_hold() and xfs_buf_rele() within that single function. The > delwri_submit() releases its hold after xfs_buf_iowait(), which I guess > at that point bp should go onto the lru (b_hold back to 1 in > xfs_buf_rele(). Indeed, the caller has lost scope of the buffer at this > point. > > So unless I miss something or got the lifecycle wrong here, which is > easily possible ;), this all hinges on xfs_buf_iowait(). That's where > the last hold forcing the buffer to stay around goes away. > xfs_buftarg_wait_rele() will dispose the buffer if b_hold == 1. If > xfs_buf_iowait() is racy in the event of I/O errors via the bio > callback, I think this path is susceptible just the same. > > >> > > --- > >> > I think that this patch fixes the problem. I tried reproducing it like > >> > 30 times, and it doesn't happen with this patch. Dropping this patch > >> > reproduces the problem within 1 or 2 tries. Thanks! > >> > What are next steps? How to make it "safe for general use"? > >> > > >> > >> Ok, thanks for testing. I think that implicates the caller bypassing the > >> expected blocking with the right sequence of log recovery I/Os and > >> device failure. TBH, I'd still like to see the specifics, if possible. > >> Could you come up with a generic reproducer for this? I think a metadump > >> of the fs with the dirty log plus whatever device failure simulation > >> hack you're using would suffice. > > > >The real issue is we don't know exactly what code is being tested > >(it's 3.8 + random bug fix backports + custom code). Even if we have > >a reproducer there's no guarantee it will reproduce on a current > >kernel. IOWs, we are stumbling around in the dark bashing our heads > >against everything in the room, and that just wastes everyone's > >time. > > > >We need a reproducer that triggers on a current, unmodified > >kernel release. You can use dm-faulty to error out all writes just > >like you are doing with your custom code. See > >xfstests::tests/generic/321 and common/dmflakey for to do this. > >Ideally the reproducer is in a form that xfstests can use.... > > > >If you can't reproduce it on an upstream kernel, then git bisect is > >your friend. It will find the commit that fixed the problem you are > >seeing.... > > > > Ugh, yeah. The fact that this was customized as such apparently went > over my head. I agree completely. This needs to be genericized to a > pristine, preferably current kernel. The experiment patch could be > papering over something completely different. > > >> The ideal fix is not yet clear to me. > > > >We are not even that far along - the root cause of the bug is not at > >all clear to me. :/ > > > > Yeah.. the above was just the theory that motivated the experiment in > the previously posted patch. It of course remains a theory until we can > see the race in action. I was referring to the potential fix for the > raciness of xfs_buf_iowait() with regard to bio errors and the wq iodone > handling, while still asking for a reproducer to confirm the actual > problem. FWIW, I'm not too high on changes in the buf management code, > even a smallish behavior change, without a real trace of some sort that > documents the problem and justifies the change. > > Brian > > >Cheers, > > > >Dave. > >-- > >Dave Chinner > >david@fromorbit.com > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From robin.listas@gmail.com Tue Aug 12 16:17: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=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 CB9AE7F3F for ; Tue, 12 Aug 2014 16:17:59 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id A8D4030406A for ; Tue, 12 Aug 2014 14:17:56 -0700 (PDT) X-ASG-Debug-ID: 1407878273-04cb6c4c96c84b0001-NocioJ Received: from mail-wi0-f182.google.com (mail-wi0-f182.google.com [209.85.212.182]) by cuda.sgi.com with ESMTP id B4vtzg74FshPMzV9 (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Tue, 12 Aug 2014 14:17:54 -0700 (PDT) X-Barracuda-Envelope-From: robin.listas@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.212.182 X-Barracuda-IPDD: Level1 [gmail.com/209.85.212.182] Received: by mail-wi0-f182.google.com with SMTP id d1so6425638wiv.3 for ; Tue, 12 Aug 2014 14:17:53 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.212.182] X-Barracuda-IPDD: Level1 [gmail.com/209.85.212.182] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=sender:date:from:to:subject:in-reply-to:message-id:references :user-agent:mime-version:content-type; bh=prugJHtRLy0L2DJcFJbia6pVB0lzU37ud4TLPsjyMQQ=; b=XSznVoZAJz7nECcSS4TRC60RKgJcgb8lCSw3Qnp9y5wnfq1YfTU99j7h7ZmDpqH4wQ NKhbThw1aia6eM4zrTguXZM2g37asCFDXGyFZ5DcItbS2QaMKz7gApHsC8pbUP6O8rKH w+L8t6FMV+wDHMN5HJCIIYwlxHno12QLfd+Ubfb4czuZqnHnlF/VKsjsaT586csQIWrW X5nreg+AB1H7HGEdC0yTmnPbsTy67qJpg8Arlvg5IsNYHPL04WZcc8NZp4xDObX1uSOq yCqzivfTTGFTj3GA3ngd04FFjYlizQLNatjAeW+dY64LjuORfBZi/Hg92LIQJDe6VpNF TyuQ== X-Received: by 10.180.86.202 with SMTP id r10mr31217599wiz.6.1407878273405; Tue, 12 Aug 2014 14:17:53 -0700 (PDT) Received: from Telcontar.valinor (177.Red-79-159-63.staticIP.rima-tde.net. [79.159.63.177]) by mx.google.com with ESMTPSA id i8sm797868wib.6.2014.08.12.14.17.50 for (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 12 Aug 2014 14:17:51 -0700 (PDT) Sender: Carlos Robinson Received: from localhost (localhost [127.0.0.1]) by Telcontar.valinor (Postfix) with ESMTP id 83C6960682 for ; Tue, 12 Aug 2014 23:17:48 +0200 (CEST) X-Virus-Scanned: amavisd-new at valinor Received: from Telcontar.valinor ([127.0.0.1]) by localhost (Telcontar.valinor [127.0.0.1]) (amavisd-new, port 10024) with LMTP id NO5JKXJ2m_cJ for ; Tue, 12 Aug 2014 23:17:48 +0200 (CEST) Received: from localhost (localhost [127.0.0.1]) by Telcontar.valinor (Postfix) with ESMTP id 5D65B605B8 for ; Tue, 12 Aug 2014 23:17:48 +0200 (CEST) Date: Tue, 12 Aug 2014 23:17:36 +0200 (CEST) From: "Carlos E. R." X-X-Sender: cer@Telcontar.valinor To: XFS mailing list Subject: Re: Subject : Happened again, 20140811 -- Got "Internal error XFS_WANT_CORRUPTED_GOTO". Filesystem needs reformatting to correct issue. In-Reply-To: <20140812165143.GB46654@bfoster.bfoster> X-ASG-Orig-Subj: Re: Subject : Happened again, 20140811 -- Got "Internal error XFS_WANT_CORRUPTED_GOTO". Filesystem needs reformatting to correct issue. Message-ID: References: <53E8D9F6.7080704@sgi.com> <53E93530.4070902@sgi.com> <53E93C29.1020103@sgi.com> <20140812165143.GB46654@bfoster.bfoster> User-Agent: Alpine 2.11 (LSU 23 2013-08-11) MIME-Version: 1.0 Content-Type: MULTIPART/MIXED; BOUNDARY="-1463808511-1570526093-1407878268=:14631" X-Barracuda-Connect: mail-wi0-f182.google.com[209.85.212.182] X-Barracuda-Start-Time: 1407878274 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.8375 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 This message is in MIME format. The first part should be readable text, while the remaining parts are likely unreadable without MIME-aware tools. ---1463808511-1570526093-1407878268=:14631 Content-Type: TEXT/PLAIN; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8BIT -----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 On Tuesday, 2014-08-12 at 12:51 -0400, Brian Foster wrote: > On Tue, Aug 12, 2014 at 02:17:00AM +0200, Carlos E. R. wrote: > I see the same thing from repair that was in your repair output: > > block (1,12608397-12608397) multiply claimed by cnt space tree, state - 2 Is it possible to find out what file uses that block? I have a non-obfuscated copy of the metadata. Knowing the file, we can know what application is involved - and that might help, or perhaps not. > If I take a look at the btrees as is, I see "235:[12608397,10]" included > in the bnobt (fsb 0x200aa55) and "270:[12608397,10]" in the cntbt (fsb > 0x2000781). If I skip the mount, zero the log and repair, everything > seems Ok. I can allocate the remainder of available space and rm -rf > everything in the fs without an error. > > Once I replay the log, I see "272:[12608397,10] 273:[12608397,10]" in > the cntbt, which is clearly a duplicate entry. This is what repair > detects and cleans up and seems to lead to the shutdown. E.g., if I > mount and use the fs, I can hit an assert or failure just by attempting > to allocate the rest of the space in the fs. If that is the state of the > fs on disk, it's only a matter of time we explode due to allocating and > freeing that range of space or possibly attempting to allocate that > space twice. I'm not sure if I follow you. The sequence of events here is: a) hibernate b) thaw c) immediately, in memory corruption found and kernel error message. Filesystem is switched to read only. System is unstable, has to be halted or rebooted. Umount is impossible. d) (¬) Reboot e) Mount (¬), manual umount, xfs_repair (¬), mount (photos of metadata taken at the appropriate points (marked with ¬)) This the point I'm at now. Are you saying that the filesystem can explode at any time now? I have not written any files, beyond what the desktop does automatically. What I have not done (on your request), this time, is: f) backup, format, restore. > Mark mentioned that he didn't see the superblock item in the log with > regard to the freeze. I don't see that either... which perhaps suggests > that this all happens during the wake-from-hibernate sequence..? My > understanding is that we should freeze on hibernate, thus force > everything out to the log, write an unmount record and then dirty the > log with a superblock transaction. Therefore, that should be the only > item in the log post-freeze. Here, we have various items in the log > including several logged buffers that correspond to the cntbt block that > ends up corrupted (daddr 0xf427c08). > > Given the failure occurs on freeing an extent via the xfs_eofblocks > scanner, perhaps this extent was initially allocated as speculative > preallocation and the eofblocks scanner is where we happen to first > identify the corrupted cntbt. What is strange is that, as mentioned > previously, the space appears to be free if I zero the log, so that > means it was probably free before the freeze. It seems highly unlikely > for a file to gain preallocation, be written out and then get trimmed by > the scanner all on wake-from-hibernate. Well, I understand little of that, but if you do, and can do whatever modifications need to be done to the code, that's fine with me :-) > Carlos, > > How long after hibernate does the shutdown/crash typically occur? Do you > basically wake-up and within a few seconds the filesystem crashes, or is > it some time (minutes) later? Instantly during the wake-up (thaw), according to the log. I'm typically not present when it happens: my routine is switch on the computer, then go make coffee/tea, and then return and start using the machine. It takes a minute or two to wake up from hibernation, and then the machine is sluggish for a minute or two more while processes start doing things and claiming chunks from swap, mail is fetched, etc. And instead of starting work, I find the machine in a bad state. Look, an excerpt from the last event (the full log is in another post yesterday), but taken from another log file with finer grained timestaps: <30>1 2014-08-11T05:22:25.861413+02:00 Telcontar ntp 5867 - - Shutting down network time protocol daemon (NTPD)..done <30>1 2014-08-11T05:22:25.917520+02:00 Telcontar systemd 1 - - Stopped LSB: Network time protocol daemon (ntpd). <28>1 2014-08-11T05:22:25.977431+02:00 Telcontar pm-utils - - - Hibernating (95)... <7>1 2014-08-11T05:22:30.605714+02:00 Telcontar kernel - - - [73220.857511] PM: Marking nosave pages: [mem 0x0009f000-0x000fffff] <7>1 2014-08-11T05:22:30.605728+02:00 Telcontar kernel - - - [73220.857516] PM: Marking nosave pages: [mem 0xbff90000-0xffffffff] <7>1 2014-08-11T05:22:30.605729+02:00 Telcontar kernel - - - [73220.858132] PM: Basic memory bitmaps created <4>1 2014-08-11T15:17:18.911655+02:00 Telcontar kernel - - - [73221.946553] Syncing filesystems ... done. <4>1 2014-08-11T15:17:18.911744+02:00 Telcontar kernel - - - [73222.682396] Freezing user space processes ... (elapsed 0.002 seconds) done. <6>1 2014-08-11T15:17:18.911746+02:00 Telcontar kernel - - - [73222.685031] PM: Preallocating image memory... done (allocated 1140745 pages) The "Hibernating (95)" is written by a script of mine in "/etc/pm/sleep.d/95cosas" which main purpose is to write to the log that line. Then the machine wakes up, hours later - despite the timestamp not saying so (the time jump is written instead lines above): <6>1 2014-08-11T15:17:18.911768+02:00 Telcontar kernel - - - [73228.307358] CPU3 is up <6>1 2014-08-11T15:17:18.911769+02:00 Telcontar kernel - - - [73228.335219] PM: noirq restore of devices complete after 22.779 msecs <6>1 2014-08-11T15:17:18.911770+02:00 Telcontar kernel - - - [73228.335354] PM: early restore of devices complete after 0.110 msecs <7>1 2014-08-11T15:17:18.911771+02:00 Telcontar kernel - - - [73228.508789] uhci_hcd 0000:00:1a.0: setting latency timer to 64 <4>1 2014-08-11T15:17:18.911771+02:00 Telcontar kernel - - - [73228.508809] usb usb3: root hub lost power or was reset ... <6>1 2014-08-11T15:17:18.911838+02:00 Telcontar kernel - - - [73230.798419] r8169 0000:06:00.0 eth0: link up <6>1 2014-08-11T15:17:18.911839+02:00 Telcontar kernel - - - [73231.245103] PM: restore of devices complete after 2736.365 msecs <4>1 2014-08-11T15:17:18.911839+02:00 Telcontar kernel - - - [73231.514298] Restarting kernel threads ... done. <4>1 2014-08-11T15:17:18.911842+02:00 Telcontar kernel - - - [73231.518736] Restarting tasks ... done. <7>1 2014-08-11T15:17:18.911843+02:00 Telcontar kernel - - - [73231.562307] PM: Basic memory bitmaps freed <28>1 2014-08-11T15:17:19.946945+02:00 Telcontar rtkit-daemon 4535 - - The canary thread is apparently starving. Taking action. <30>1 2014-08-11T15:17:19.947259+02:00 Telcontar rtkit-daemon 4535 - - Demoting known real-time threads. <29>1 2014-08-11T15:17:19.951276+02:00 Telcontar rtkit-daemon 4535 - - Successfully demoted thread 4541 of process 4534 (/usr/bin/pulseaudio). <29>1 2014-08-11T15:17:19.951546+02:00 Telcontar rtkit-daemon 4535 - - Successfully demoted thread 4540 of process 4534 (/usr/bin/pulseaudio). <29>1 2014-08-11T15:17:19.951799+02:00 Telcontar rtkit-daemon 4535 - - Successfully demoted thread 4534 of process 4534 (/usr/bin/pulseaudio). <29>1 2014-08-11T15:17:19.952033+02:00 Telcontar rtkit-daemon 4535 - - Demoted 3 threads. <20>1 2014-08-11T15:17:20.808125+02:00 Telcontar dovecot - - - imap: Warning: Time jumped forwards 33996 seconds <20>1 2014-08-11T15:17:20.840771+02:00 Telcontar dovecot - - - imap: Warning: Time jumped forwards 35660 seconds <22>1 2014-08-11T15:17:20.841006+02:00 Telcontar dovecot - - - imap(cer): Disconnected for inactivity in=237010 out=9273919 <1>1 2014-08-11T15:17:22.173611+02:00 Telcontar kernel - - - [73235.439809] XFS: Internal error XFS_WANT_CORRUPTED_GOTO at line 1602 of file /home/abuild/rpmbuild/BUILD/kernel-desktop-3.11.10/linux-3.11/fs/xfs/xfs_alloc.c. Caller 0xffffffffa0c39fe9 <1>1 2014-08-11T15:17:22.173625+02:00 Telcontar kernel - - - [73235.439809] ... <5>1 2014-08-11T15:17:22.174493+02:00 Telcontar kernel - - - [73235.440751] XFS (sdd5): xfs_do_force_shutdown(0x8) called from line 916 of file /home/abuild/rpmbuild/BUILD/kernel-desktop-3.11.10/linux-3.11/fs/xfs/xfs_bmap.c. Return address = 0xffffffffa0c4c3d8 <1>1 2014-08-11T15:17:22.232589+02:00 Telcontar kernel - - - [73235.498979] XFS (sdd5): Corruption of in-memory data detected. Shutting down filesystem <1>1 2014-08-11T15:17:22.232594+02:00 Telcontar kernel - - - [73235.499136] XFS (sdd5): Please umount the filesystem and rectify the problem(s) <30>1 2014-08-11T15:17:22.716184+02:00 Telcontar systemd 1 - - Time has been changed <30>1 2014-08-11T15:17:27.171188+02:00 Telcontar acpid - - - 1 client rule loaded <28>1 2014-08-11T15:17:29.413944+02:00 Telcontar pm-utils - - - Thawing (95)... <29>1 2014-08-11T15:17:30.048264+02:00 Telcontar dbus 1020 - - [system] Activating service name='org.freedesktop.PackageKit' (using servicehelper) <30>1 2014-08-11T15:17:30.833496+02:00 Telcontar systemd 1 - - Starting LSB: Network time protocol daemon (ntpd)... <4>1 2014-08-11T15:17:30.990470+02:00 Telcontar kernel - - - [73244.256012] XFS (sdd5): xfs_log_force: error 5 returned. <29>1 2014-08-11T15:17:31.324585+02:00 Telcontar dbus 1020 - - [system] Activated service 'org.freedesktop.PackageKit' failed: Cannot launch daemon, file not found or permissions invalid As you see, the corruption is detected instantly after waking up, before pm-utils scripts have a chance to run. > If the former, I wonder if it's possible that the scanner returns to > life pointing to a stale or freed incore inode and does something bogus > based on that. Well, as I said, that's above my understanding ;-) - -- Cheers, Carlos E. R. (from 13.1 x86_64 "Bottle" at Telcontar) -----BEGIN PGP SIGNATURE----- Version: GnuPG v2.0.22 (GNU/Linux) iEYEARECAAYFAlPqhHwACgkQtTMYHG2NR9WmrwCglBRRHEMgU9mCEHkU9iHqYehX +1AAn2oUn8/M3Rfb7mLWapLqYxDfvHNv =9Yft -----END PGP SIGNATURE----- ---1463808511-1570526093-1407878268=:14631-- From sandeen@sandeen.net Tue Aug 12 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 DAD707F3F for ; Tue, 12 Aug 2014 16:28:07 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id A91738F8087 for ; Tue, 12 Aug 2014 14:28:04 -0700 (PDT) X-ASG-Debug-ID: 1407878880-04cbb0508ae6b20001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id whWuC1qNMpfasdJ2 for ; Tue, 12 Aug 2014 14:28:00 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from Liberator-2.local (24-113-182-223.wavecable.com [24.113.182.223]) (using TLSv1 with cipher DHE-RSA-AES128-SHA (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 9934263C6058; Tue, 12 Aug 2014 16:27:59 -0500 (CDT) Message-ID: <53EA86DE.5060508@sandeen.net> Date: Tue, 12 Aug 2014 14:27:58 -0700 From: Eric Sandeen MIME-Version: 1.0 To: Brian Foster , "Carlos E. R." CC: XFS mailing list Subject: Re: Subject : Happened again, 20140811 -- Got "Internal error XFS_WANT_CORRUPTED_GOTO". Filesystem needs reformatting to correct issue. References: <53E8D9F6.7080704@sgi.com> <53E93530.4070902@sgi.com> <53E93C29.1020103@sgi.com> <20140812165143.GB46654@bfoster.bfoster> X-ASG-Orig-Subj: Re: Subject : Happened again, 20140811 -- Got "Internal error XFS_WANT_CORRUPTED_GOTO". Filesystem needs reformatting to correct issue. In-Reply-To: <20140812165143.GB46654@bfoster.bfoster> X-Enigmail-Version: 1.6 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 8bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1407878880 X-Barracuda-URL: http://192.48.176.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.8375 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 8/12/14, 9:51 AM, Brian Foster wrote: > On Tue, Aug 12, 2014 at 02:17:00AM +0200, Carlos E. R. wrote: > Content-ID: > > > El 2014-08-12 a las 00:36 +0200, Carlos E. R. escribió: >>>> El 2014-08-11 a las 16:56 -0500, Mark Tinguely escribió: > >>>> but all of them are about 401M before compression. The upload will take >>>> long, my ADSL upload is 0.3M/s at most. > > > I have shared (view) on google drive a folder with the three files. Both > Brian Foster and Mark Tinguely should have got a link on the mail from me. > If somebody else wants access, just tell me. > > >> I see the same thing from repair that was in your repair output: > >> block (1,12608397-12608397) multiply claimed by cnt space tree, state - 2 > >> If I take a look at the btrees as is, I see "235:[12608397,10]" included >> in the bnobt (fsb 0x200aa55) and "270:[12608397,10]" in the cntbt (fsb >> 0x2000781). If I skip the mount, zero the log and repair, everything >> seems Ok. I can allocate the remainder of available space and rm -rf >> everything in the fs without an error. > >> Once I replay the log, I see "272:[12608397,10] 273:[12608397,10]" in >> the cntbt, which is clearly a duplicate entry. This is what repair >> detects and cleans up and seems to lead to the shutdown. E.g., if I >> mount and use the fs, I can hit an assert or failure just by attempting >> to allocate the rest of the space in the fs. If that is the state of the >> fs on disk, it's only a matter of time we explode due to allocating and >> freeing that range of space or possibly attempting to allocate that >> space twice. > >> Mark mentioned that he didn't see the superblock item in the log with >> regard to the freeze. I don't see that either... which perhaps suggests >> that this all happens during the wake-from-hibernate sequence..? My >> understanding is that we should freeze on hibernate, thus force >> everything out to the log, write an unmount record and then dirty the >> log with a superblock transaction. Therefore, that should be the only >> item in the log post-freeze. Here, we have various items in the log >> including several logged buffers that correspond to the cntbt block that >> ends up corrupted (daddr 0xf427c08). What freeze? look at hibernate(), nothing but a sync: /** * hibernate - Carry out system hibernation, including saving the image. */ int hibernate(void) { ... printk(KERN_INFO "PM: Syncing filesystems ... "); sys_sync(); printk("done.\n"); error = freeze_processes(); if (error) goto Exit; AFAIK there is no freeze call involved. -Eric From david@fromorbit.com Tue Aug 12 16:54: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 36F9F7F3F for ; Tue, 12 Aug 2014 16:54:01 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id F1DB38F8087 for ; Tue, 12 Aug 2014 14:54:00 -0700 (PDT) X-ASG-Debug-ID: 1407880438-04cbb0508ae7cf0001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id KsvJUfBiz8zKhWnh for ; Tue, 12 Aug 2014 14:53: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: AiwKAFSM6lN5LDJ8/2dsb2JhbABagw1SV65JAQEBAQEBBp5WgWWFawGBFhd3hAQBBTocIxAIAw4KCSUPBSUDIROIQcU4FxiFZIlQB4RMAQSVQ4Z1gViTJ4NuKy8 Received: from ppp121-44-50-124.lns20.syd6.internode.on.net (HELO dastard) ([121.44.50.124]) by ipmail07.adl2.internode.on.net with ESMTP; 13 Aug 2014 07:23:57 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1XHK0m-0002To-7X; Wed, 13 Aug 2014 07:53:44 +1000 Date: Wed, 13 Aug 2014 07:53:44 +1000 From: Dave Chinner To: Stephen Rothwell Cc: torvalds@linux-foundation.org, akpm@linux-foundation.org, linux-kernel@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [GIT PULL] xfs: updates for 3.17-rc1 Message-ID: <20140812215344.GY20518@dastard> X-ASG-Orig-Subj: Re: [GIT PULL] xfs: updates for 3.17-rc1 References: <20140812125313.GX20518@dastard> <20140812235612.684a9af7@canb.auug.org.au> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140812235612.684a9af7@canb.auug.org.au> 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: 1407880438 X-Barracuda-URL: http://192.48.176.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.8376 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Tue, Aug 12, 2014 at 11:56:12PM +1000, Stephen Rothwell wrote: > Hi Dave, > > On Tue, 12 Aug 2014 22:53:13 +1000 Dave Chinner wrote: > > > > FYI, this will be the last pull request I will send you from a tree > > on oss.sgi.com. I'm moving everything XFS related over to kernel.org > > so future pull requests should come from there. > > Please let me know when you have the new tree set up so I can change > where I fetch from. git://git.kernel.org/pub/scm/linux/kernel/git/dgc/linux-xfs.git for-next It should be identical to the xfs tree you are pulling from oss.sgi.com. Cheers, Dave. -- Dave Chinner david@fromorbit.com From bfoster@redhat.com Tue Aug 12 16:59: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 599F17F3F for ; Tue, 12 Aug 2014 16:59:53 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 097EC304032 for ; Tue, 12 Aug 2014 14:59:52 -0700 (PDT) X-ASG-Debug-ID: 1407880788-04bdf06ef8e7870001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id OShizzuljimRlDMY (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 12 Aug 2014 14:59: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 s7CLxkGm016380 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Tue, 12 Aug 2014 17:59:46 -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 s7CLxjYc008654; Tue, 12 Aug 2014 17:59:45 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id E0AE412577C; Tue, 12 Aug 2014 17:59:43 -0400 (EDT) Date: Tue, 12 Aug 2014 17:59:43 -0400 From: Brian Foster To: Eric Sandeen Cc: "Carlos E. R." , XFS mailing list Subject: Re: Subject : Happened again, 20140811 -- Got "Internal error XFS_WANT_CORRUPTED_GOTO". Filesystem needs reformatting to correct issue. Message-ID: <20140812215943.GA39704@bfoster.bfoster> X-ASG-Orig-Subj: Re: Subject : Happened again, 20140811 -- Got "Internal error XFS_WANT_CORRUPTED_GOTO". Filesystem needs reformatting to correct issue. References: <53E8D9F6.7080704@sgi.com> <53E93530.4070902@sgi.com> <53E93C29.1020103@sgi.com> <20140812165143.GB46654@bfoster.bfoster> <53EA86DE.5060508@sandeen.net> MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <53EA86DE.5060508@sandeen.net> User-Agent: Mutt/1.5.23 (2014-03-12) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1407880789 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Tue, Aug 12, 2014 at 02:27:58PM -0700, Eric Sandeen wrote: > On 8/12/14, 9:51 AM, Brian Foster wrote: > > On Tue, Aug 12, 2014 at 02:17:00AM +0200, Carlos E. R. wrote: > > Content-ID: > > > > > > El 2014-08-12 a las 00:36 +0200, Carlos E. R. escribió: > >>>> El 2014-08-11 a las 16:56 -0500, Mark Tinguely escribió: > > > >>>> but all of them are about 401M before compression. The upload will take > >>>> long, my ADSL upload is 0.3M/s at most. > > > > > > I have shared (view) on google drive a folder with the three files. Both > > Brian Foster and Mark Tinguely should have got a link on the mail from me. > > If somebody else wants access, just tell me. > > > > > >> I see the same thing from repair that was in your repair output: > > > >> block (1,12608397-12608397) multiply claimed by cnt space tree, state - 2 > > > >> If I take a look at the btrees as is, I see "235:[12608397,10]" included > >> in the bnobt (fsb 0x200aa55) and "270:[12608397,10]" in the cntbt (fsb > >> 0x2000781). If I skip the mount, zero the log and repair, everything > >> seems Ok. I can allocate the remainder of available space and rm -rf > >> everything in the fs without an error. > > > >> Once I replay the log, I see "272:[12608397,10] 273:[12608397,10]" in > >> the cntbt, which is clearly a duplicate entry. This is what repair > >> detects and cleans up and seems to lead to the shutdown. E.g., if I > >> mount and use the fs, I can hit an assert or failure just by attempting > >> to allocate the rest of the space in the fs. If that is the state of the > >> fs on disk, it's only a matter of time we explode due to allocating and > >> freeing that range of space or possibly attempting to allocate that > >> space twice. > > > >> Mark mentioned that he didn't see the superblock item in the log with > >> regard to the freeze. I don't see that either... which perhaps suggests > >> that this all happens during the wake-from-hibernate sequence..? My > >> understanding is that we should freeze on hibernate, thus force > >> everything out to the log, write an unmount record and then dirty the > >> log with a superblock transaction. Therefore, that should be the only > >> item in the log post-freeze. Here, we have various items in the log > >> including several logged buffers that correspond to the cntbt block that > >> ends up corrupted (daddr 0xf427c08). > > What freeze? look at hibernate(), nothing but a sync: > > /** > * hibernate - Carry out system hibernation, including saving the image. > */ > int hibernate(void) > { > ... > printk(KERN_INFO "PM: Syncing filesystems ... "); > sys_sync(); > printk("done.\n"); > > error = freeze_processes(); > if (error) > goto Exit; > > > AFAIK there is no freeze call involved. > Eep, not sure why I was thinking there was a freeze there. It appears not. I guess that explains why the log contains what it does. Thanks for pointing that out... Brian > -Eric > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From david@fromorbit.com Tue Aug 12 17:02: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 (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 6FA4F7F3F for ; Tue, 12 Aug 2014 17:02:38 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id D5011AC002 for ; Tue, 12 Aug 2014 15:02:34 -0700 (PDT) X-ASG-Debug-ID: 1407880951-04cb6c4c95c9fe0001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id LqqtgZ0kZr769WrR for ; Tue, 12 Aug 2014 15:02:32 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.131 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AqQJAHqN6lN5LDJ8/2dsb2JhbABagw2BKa5JAQEBAQEHoDuFawGBFBd3hAQBBTIBIyMQCAMYCRoLDwUlAyETiEHFOhcYhWSGIYJeAQFPB4RMBYUDApczjAaIeYIWgVgrL4EP Received: from ppp121-44-50-124.lns20.syd6.internode.on.net (HELO dastard) ([121.44.50.124]) by ipmail07.adl2.internode.on.net with ESMTP; 13 Aug 2014 07:27:17 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1XHK41-0002Ue-1k; Wed, 13 Aug 2014 07:57:05 +1000 Date: Wed, 13 Aug 2014 07:57:05 +1000 From: Dave Chinner To: Eric Sandeen Cc: Brian Foster , "Carlos E. R." , XFS mailing list Subject: Re: Subject : Happened again, 20140811 -- Got "Internal error XFS_WANT_CORRUPTED_GOTO". Filesystem needs reformatting to correct issue. Message-ID: <20140812215704.GZ20518@dastard> X-ASG-Orig-Subj: Re: Subject : Happened again, 20140811 -- Got "Internal error XFS_WANT_CORRUPTED_GOTO". Filesystem needs reformatting to correct issue. References: <53E8D9F6.7080704@sgi.com> <53E93530.4070902@sgi.com> <53E93C29.1020103@sgi.com> <20140812165143.GB46654@bfoster.bfoster> <53EA86DE.5060508@sandeen.net> MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <53EA86DE.5060508@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: 1407880951 X-Barracuda-URL: http://192.48.176.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.8376 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Tue, Aug 12, 2014 at 02:27:58PM -0700, Eric Sandeen wrote: > On 8/12/14, 9:51 AM, Brian Foster wrote: > > On Tue, Aug 12, 2014 at 02:17:00AM +0200, Carlos E. R. wrote: > > Content-ID: > > > > > > El 2014-08-12 a las 00:36 +0200, Carlos E. R. escribió: > >>>> El 2014-08-11 a las 16:56 -0500, Mark Tinguely escribió: > > > >>>> but all of them are about 401M before compression. The upload will take > >>>> long, my ADSL upload is 0.3M/s at most. > > > > > > I have shared (view) on google drive a folder with the three files. Both > > Brian Foster and Mark Tinguely should have got a link on the mail from me. > > If somebody else wants access, just tell me. > > > > > >> I see the same thing from repair that was in your repair output: > > > >> block (1,12608397-12608397) multiply claimed by cnt space tree, state - 2 > > > >> If I take a look at the btrees as is, I see "235:[12608397,10]" included > >> in the bnobt (fsb 0x200aa55) and "270:[12608397,10]" in the cntbt (fsb > >> 0x2000781). If I skip the mount, zero the log and repair, everything > >> seems Ok. I can allocate the remainder of available space and rm -rf > >> everything in the fs without an error. > > > >> Once I replay the log, I see "272:[12608397,10] 273:[12608397,10]" in > >> the cntbt, which is clearly a duplicate entry. This is what repair > >> detects and cleans up and seems to lead to the shutdown. E.g., if I > >> mount and use the fs, I can hit an assert or failure just by attempting > >> to allocate the rest of the space in the fs. If that is the state of the > >> fs on disk, it's only a matter of time we explode due to allocating and > >> freeing that range of space or possibly attempting to allocate that > >> space twice. > > > >> Mark mentioned that he didn't see the superblock item in the log with > >> regard to the freeze. I don't see that either... which perhaps suggests > >> that this all happens during the wake-from-hibernate sequence..? My > >> understanding is that we should freeze on hibernate, thus force > >> everything out to the log, write an unmount record and then dirty the > >> log with a superblock transaction. Therefore, that should be the only > >> item in the log post-freeze. Here, we have various items in the log > >> including several logged buffers that correspond to the cntbt block that > >> ends up corrupted (daddr 0xf427c08). > > What freeze? look at hibernate(), nothing but a sync: > > /** > * hibernate - Carry out system hibernation, including saving the image. > */ > int hibernate(void) > { > ... > printk(KERN_INFO "PM: Syncing filesystems ... "); > sys_sync(); > printk("done.\n"); > > error = freeze_processes(); > if (error) > goto Exit; > > > AFAIK there is no freeze call involved. Yes, that's a problem I've been pointing out for years. TuxOnIce freezes the filesystems, but the kernel hibernation maintainers have steadfastly refuses to even acknowledge that it is necessary. As it is, I'm pretty sure this is being caused by the XFS workqueues not being frozen appropriately i.e. WQ_FREEZEABLE needs to be added to various workqueue definitions so that work gets halted when kernel threads get halted. Cheers, Dave. -- Dave Chinner david@fromorbit.com From sandeen@sandeen.net Tue Aug 12 17:22: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 5953B7F3F for ; Tue, 12 Aug 2014 17: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 EE32C8F8066 for ; Tue, 12 Aug 2014 15:22:02 -0700 (PDT) X-ASG-Debug-ID: 1407882120-04bdf06ef6e8520001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id HUYdieITyHKAe1Yt for ; Tue, 12 Aug 2014 15:22:00 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from Liberator-2.local (24-113-182-223.wavecable.com [24.113.182.223]) (using TLSv1 with cipher DHE-RSA-AES128-SHA (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 921D563D71EC; Tue, 12 Aug 2014 17:21:59 -0500 (CDT) Message-ID: <53EA9386.2040207@sandeen.net> Date: Tue, 12 Aug 2014 15:21:58 -0700 From: Eric Sandeen MIME-Version: 1.0 To: Brian Foster CC: "Carlos E. R." , XFS mailing list Subject: Re: Subject : Happened again, 20140811 -- Got "Internal error XFS_WANT_CORRUPTED_GOTO". Filesystem needs reformatting to correct issue. References: <53E8D9F6.7080704@sgi.com> <53E93530.4070902@sgi.com> <53E93C29.1020103@sgi.com> <20140812165143.GB46654@bfoster.bfoster> <53EA86DE.5060508@sandeen.net> <20140812215943.GA39704@bfoster.bfoster> X-ASG-Orig-Subj: Re: Subject : Happened again, 20140811 -- Got "Internal error XFS_WANT_CORRUPTED_GOTO". Filesystem needs reformatting to correct issue. In-Reply-To: <20140812215943.GA39704@bfoster.bfoster> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 8bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1407882120 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.8377 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 8/12/14, 2:59 PM, Brian Foster wrote: > On Tue, Aug 12, 2014 at 02:27:58PM -0700, Eric Sandeen wrote: >> On 8/12/14, 9:51 AM, Brian Foster wrote: >>> On Tue, Aug 12, 2014 at 02:17:00AM +0200, Carlos E. R. wrote: >>> Content-ID: >>> >>> >>> El 2014-08-12 a las 00:36 +0200, Carlos E. R. escribió: >>>>>> El 2014-08-11 a las 16:56 -0500, Mark Tinguely escribió: >>> >>>>>> but all of them are about 401M before compression. The upload will take >>>>>> long, my ADSL upload is 0.3M/s at most. >>> >>> >>> I have shared (view) on google drive a folder with the three files. Both >>> Brian Foster and Mark Tinguely should have got a link on the mail from me. >>> If somebody else wants access, just tell me. >>> >>> >>>> I see the same thing from repair that was in your repair output: >>> >>>> block (1,12608397-12608397) multiply claimed by cnt space tree, state - 2 >>> >>>> If I take a look at the btrees as is, I see "235:[12608397,10]" included >>>> in the bnobt (fsb 0x200aa55) and "270:[12608397,10]" in the cntbt (fsb >>>> 0x2000781). If I skip the mount, zero the log and repair, everything >>>> seems Ok. I can allocate the remainder of available space and rm -rf >>>> everything in the fs without an error. >>> >>>> Once I replay the log, I see "272:[12608397,10] 273:[12608397,10]" in >>>> the cntbt, which is clearly a duplicate entry. This is what repair >>>> detects and cleans up and seems to lead to the shutdown. E.g., if I >>>> mount and use the fs, I can hit an assert or failure just by attempting >>>> to allocate the rest of the space in the fs. If that is the state of the >>>> fs on disk, it's only a matter of time we explode due to allocating and >>>> freeing that range of space or possibly attempting to allocate that >>>> space twice. >>> >>>> Mark mentioned that he didn't see the superblock item in the log with >>>> regard to the freeze. I don't see that either... which perhaps suggests >>>> that this all happens during the wake-from-hibernate sequence..? My >>>> understanding is that we should freeze on hibernate, thus force >>>> everything out to the log, write an unmount record and then dirty the >>>> log with a superblock transaction. Therefore, that should be the only >>>> item in the log post-freeze. Here, we have various items in the log >>>> including several logged buffers that correspond to the cntbt block that >>>> ends up corrupted (daddr 0xf427c08). >> >> What freeze? look at hibernate(), nothing but a sync: >> >> /** >> * hibernate - Carry out system hibernation, including saving the image. >> */ >> int hibernate(void) >> { >> ... >> printk(KERN_INFO "PM: Syncing filesystems ... "); >> sys_sync(); >> printk("done.\n"); >> >> error = freeze_processes(); >> if (error) >> goto Exit; >> >> >> AFAIK there is no freeze call involved. >> > > Eep, not sure why I was thinking there was a freeze there. because it seems so logical. :) > It appears > not. I guess that explains why the log contains what it does. Thanks for > pointing that out... but as I was saying on IRC, I think in theory it's not necessary; the fs state on disk + fs state in memory (saved to disk during hibernate) needs to be consistent, and it's conceivable that this could be done without freeze (or even sync for that matter). A freeze sure sounds nice though, to be sure the fs really is consistent on disk, in case resume fails. The thing I was wondering about is what makes sure disk caches are flushed before disks lose power when hibernate completes. (I'm just handwaving here, though...) Anyway, Dave's mention of making threads freezable makes the most sense. Documentation/power/freezing-of-tasks.txt makes it pretty clear that any thread which might change fs state needs to be freezable: > We therefore freeze tasks that might > cause the on-disk filesystems' data and metadata to be modified after the > hibernation image has been created and before the system is finally powered off. > The majority of these are user space processes, but if any of the kernel threads > may cause something like this to happen, they have to be freezable. jbd/jbd2 explicitly handle this freezing in the kjournald/kjournald2 threads. -Eric > Brian > >> -Eric >> >> _______________________________________________ >> xfs mailing list >> xfs@oss.sgi.com >> http://oss.sgi.com/mailman/listinfo/xfs > From sfr@canb.auug.org.au Tue Aug 12 17:59: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 0B6387F3F for ; Tue, 12 Aug 2014 17:59:22 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 93078AC002 for ; Tue, 12 Aug 2014 15:59:21 -0700 (PDT) X-ASG-Debug-ID: 1407884357-04bdf06ef9e9970001-NocioJ Received: from ozlabs.org (ozlabs.org [103.22.144.67]) by cuda.sgi.com with ESMTP id xJnDXBTjJX7ghEFN (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 12 Aug 2014 15:59:19 -0700 (PDT) X-Barracuda-Envelope-From: sfr@canb.auug.org.au X-Barracuda-Apparent-Source-IP: 103.22.144.67 Received: from authenticated.ozlabs.org (localhost [127.0.0.1]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPSA id AA8BF140097; Wed, 13 Aug 2014 08:59:16 +1000 (EST) Date: Wed, 13 Aug 2014 08:59:11 +1000 From: Stephen Rothwell To: Dave Chinner Cc: torvalds@linux-foundation.org, akpm@linux-foundation.org, linux-kernel@vger.kernel.org, xfs@oss.sgi.com Subject: Re: [GIT PULL] xfs: updates for 3.17-rc1 Message-ID: <20140813085911.53e5fbd5@canb.auug.org.au> X-ASG-Orig-Subj: Re: [GIT PULL] xfs: updates for 3.17-rc1 In-Reply-To: <20140812215344.GY20518@dastard> References: <20140812125313.GX20518@dastard> <20140812235612.684a9af7@canb.auug.org.au> <20140812215344.GY20518@dastard> X-Mailer: Claws Mail 3.10.1 (GTK+ 2.24.24; i486-pc-linux-gnu) MIME-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha256; boundary="Sig_/1YyK36QbUd5rdgnKeGq9nH6"; protocol="application/pgp-signature" X-Barracuda-Connect: ozlabs.org[103.22.144.67] X-Barracuda-Start-Time: 1407884358 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.8378 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- --Sig_/1YyK36QbUd5rdgnKeGq9nH6 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: quoted-printable Hi Dave, On Wed, 13 Aug 2014 07:53:44 +1000 Dave Chinner wrote: > > On Tue, Aug 12, 2014 at 11:56:12PM +1000, Stephen Rothwell wrote: > >=20 > > On Tue, 12 Aug 2014 22:53:13 +1000 Dave Chinner w= rote: > > > > > > FYI, this will be the last pull request I will send you from a tree > > > on oss.sgi.com. I'm moving everything XFS related over to kernel.org > > > so future pull requests should come from there. > >=20 > > Please let me know when you have the new tree set up so I can change > > where I fetch from. >=20 > git://git.kernel.org/pub/scm/linux/kernel/git/dgc/linux-xfs.git for-next OK, I have switched starting today. > It should be identical to the xfs tree you are pulling from > oss.sgi.com. Yep, it is. --=20 Cheers, Stephen Rothwell sfr@canb.auug.org.au --Sig_/1YyK36QbUd5rdgnKeGq9nH6 Content-Type: application/pgp-signature; name=signature.asc Content-Disposition: attachment; filename=signature.asc -----BEGIN PGP SIGNATURE----- Version: GnuPG v2 iQIcBAEBCAAGBQJT6pxEAAoJEMDTa8Ir7ZwVAgYQAIc2j31HcOScP1IyQxqPxGTc ZhM/fjZplQVmi6aWu1QTNhVSsaxp3pAXMfFp2NgY8YqRBV4TqGeeAmhpajScoBA/ eB39G8lBliESfghGuz3hHTFFVJ0qgZPTJi1l/zf+BCwTZ/P8klKzoRKWPJQC+Sag drx6s4/C/UinjLg9QkD3bPE+KRWhh+GFaoaIOl82xYQlDsHNCkBl5ofFp8UDJecg Hu8zyVKVrFqYpT7tvVCf3YB5cFxu2rCeH3FjF+cX/K1eu1pV8iqq+HHmZks2Jni5 4hTMCluWrO1TVL0kfwBJRveoSUHK0gt0ZIq+RVH/TtH9fzsl8VW9wY29sr8SdDga 8Hs2wcLL5WFnomeInxL0Ouzm7FnMkVZi088K0tVnQGpIaLG0jBoAo1j1j3NMuqro 1iP+ehG8WrT/kGYIJhLwD+9DH/gzIDlrS8Q6DKiPLQL2w0pWhxFyhv5TqN+0QmCG yfkTe9PnmPzo+CTDiuYYR8lM/WtUw4UeMf4rxooUs5ygPApl7epl5UeuHwt8Mnjd PDCEZSHWYYfGFfyXH941bZOw3inlHJpNTptpjfZpZz8gnwaJPDx0GLa7eFLGXtOM mHlkXZosCFlBvzC0ialekR5nQUh9xMN6ScFUrzhHAMyreKCEhfdbXYy+MmGtHS3c WO5McYkEr2aw9c3K04yB =uxmt -----END PGP SIGNATURE----- --Sig_/1YyK36QbUd5rdgnKeGq9nH6-- From david@fromorbit.com Tue Aug 12 18:16: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 (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 4608F7F3F for ; Tue, 12 Aug 2014 18:16:50 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 1211F8F8064 for ; Tue, 12 Aug 2014 16:16:46 -0700 (PDT) X-ASG-Debug-ID: 1407885403-04cbb0508deab80001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id qjJ8drq2FunUG3CI for ; Tue, 12 Aug 2014 16:16:44 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.131 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AqQJAA6f6lN5LDJ8/2dsb2JhbABagw2BKa5LAQEBAQEHoDuFawGBERd3hAMBAQQBMgEjIwULCAMYCRoLDwUlAyETiDoHxRgXGIVkhiGCXgEBAU4Hgy+BHQWFAwKXM4wGiHmCFoFYKy+BDw Received: from ppp121-44-50-124.lns20.syd6.internode.on.net (HELO dastard) ([121.44.50.124]) by ipmail07.adl2.internode.on.net with ESMTP; 13 Aug 2014 08:46:42 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1XHLIr-0002fF-HA; Wed, 13 Aug 2014 09:16:29 +1000 Date: Wed, 13 Aug 2014 09:16:29 +1000 From: Dave Chinner To: Eric Sandeen Cc: Brian Foster , "Carlos E. R." , XFS mailing list Subject: Re: Subject : Happened again, 20140811 -- Got "Internal error XFS_WANT_CORRUPTED_GOTO". Filesystem needs reformatting to correct issue. Message-ID: <20140812231629.GA20518@dastard> X-ASG-Orig-Subj: Re: Subject : Happened again, 20140811 -- Got "Internal error XFS_WANT_CORRUPTED_GOTO". Filesystem needs reformatting to correct issue. References: <53E93530.4070902@sgi.com> <53E93C29.1020103@sgi.com> <20140812165143.GB46654@bfoster.bfoster> <53EA86DE.5060508@sandeen.net> <20140812215943.GA39704@bfoster.bfoster> <53EA9386.2040207@sandeen.net> MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <53EA9386.2040207@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: 1407885403 X-Barracuda-URL: http://192.48.176.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.8378 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Tue, Aug 12, 2014 at 03:21:58PM -0700, Eric Sandeen wrote: > On 8/12/14, 2:59 PM, Brian Foster wrote: > > On Tue, Aug 12, 2014 at 02:27:58PM -0700, Eric Sandeen wrote: > >> On 8/12/14, 9:51 AM, Brian Foster wrote: > >>> On Tue, Aug 12, 2014 at 02:17:00AM +0200, Carlos E. R. wrote: > >>> Content-ID: > >>> > >>> > >>> El 2014-08-12 a las 00:36 +0200, Carlos E. R. escribió: > >>>>>> El 2014-08-11 a las 16:56 -0500, Mark Tinguely escribió: > >>> > >>>>>> but all of them are about 401M before compression. The upload will take > >>>>>> long, my ADSL upload is 0.3M/s at most. > >>> > >>> > >>> I have shared (view) on google drive a folder with the three files. Both > >>> Brian Foster and Mark Tinguely should have got a link on the mail from me. > >>> If somebody else wants access, just tell me. > >>> > >>> > >>>> I see the same thing from repair that was in your repair output: > >>> > >>>> block (1,12608397-12608397) multiply claimed by cnt space tree, state - 2 > >>> > >>>> If I take a look at the btrees as is, I see "235:[12608397,10]" included > >>>> in the bnobt (fsb 0x200aa55) and "270:[12608397,10]" in the cntbt (fsb > >>>> 0x2000781). If I skip the mount, zero the log and repair, everything > >>>> seems Ok. I can allocate the remainder of available space and rm -rf > >>>> everything in the fs without an error. > >>> > >>>> Once I replay the log, I see "272:[12608397,10] 273:[12608397,10]" in > >>>> the cntbt, which is clearly a duplicate entry. This is what repair > >>>> detects and cleans up and seems to lead to the shutdown. E.g., if I > >>>> mount and use the fs, I can hit an assert or failure just by attempting > >>>> to allocate the rest of the space in the fs. If that is the state of the > >>>> fs on disk, it's only a matter of time we explode due to allocating and > >>>> freeing that range of space or possibly attempting to allocate that > >>>> space twice. > >>> > >>>> Mark mentioned that he didn't see the superblock item in the log with > >>>> regard to the freeze. I don't see that either... which perhaps suggests > >>>> that this all happens during the wake-from-hibernate sequence..? My > >>>> understanding is that we should freeze on hibernate, thus force > >>>> everything out to the log, write an unmount record and then dirty the > >>>> log with a superblock transaction. Therefore, that should be the only > >>>> item in the log post-freeze. Here, we have various items in the log > >>>> including several logged buffers that correspond to the cntbt block that > >>>> ends up corrupted (daddr 0xf427c08). > >> > >> What freeze? look at hibernate(), nothing but a sync: > >> > >> /** > >> * hibernate - Carry out system hibernation, including saving the image. > >> */ > >> int hibernate(void) > >> { > >> ... > >> printk(KERN_INFO "PM: Syncing filesystems ... "); > >> sys_sync(); > >> printk("done.\n"); > >> > >> error = freeze_processes(); > >> if (error) > >> goto Exit; > >> > >> > >> AFAIK there is no freeze call involved. > >> > > > > Eep, not sure why I was thinking there was a freeze there. > > because it seems so logical. :) > > > It appears > > not. I guess that explains why the log contains what it does. Thanks for > > pointing that out... > > but as I was saying on IRC, I think in theory it's not necessary; the fs state > on disk + fs state in memory (saved to disk during hibernate) needs to be > consistent, and it's conceivable that this could be done without freeze > (or even sync for that matter). Well, the sync is necessary for hibernate - it needs to shrink the amount of memory that is saved to disk to as small as possible. If your memory is full of dirty page cache, why would you save that to the hibernate image, only to have to load it back off, then write it to the filesystem after resume? Why wouldn't you write it straight to disk before hibernation, then remove it from memory so you've then got free memory to allocate the hibernation image that gets written to disk? > A freeze sure sounds nice though, to be sure the fs really is consistent > on disk, in case resume fails. > > The thing I was wondering about is what makes sure disk caches are flushed > before disks lose power when hibernate completes. (I'm just handwaving > here, though...) That usually happens in the driver power-down sequence. > Anyway, Dave's mention of making threads freezable makes the most sense. > Documentation/power/freezing-of-tasks.txt > makes it pretty clear that any thread which might change fs state > needs to be freezable: > > > We therefore freeze tasks that might > > cause the on-disk filesystems' data and metadata to be modified after the > > hibernation image has been created and before the system is finally powered off. > > The majority of these are user space processes, but if any of the kernel threads > > may cause something like this to happen, they have to be freezable. > > jbd/jbd2 explicitly handle this freezing in the kjournald/kjournald2 threads. As we do for the xfsaild kernel thread. We used to use kernel threads for functionality that we now use workqueues for - the xfssyncd and the xfsbufd - and those kernel threads used to also freeze like the xfsaild does. We lost that when moving to workqueues. The stupid part about all this is we actually stop periodic workqueue processing for workqueues that can modify state when the filesystem freezes. i.e. if the hibernation code froze the filesystem we wouldn't need to mark workqueues as freezable because XFS already manages everything in the manner than hibernation requires.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Tue Aug 12 18:56: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 (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 009557F3F for ; Tue, 12 Aug 2014 18:56:39 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id E52BB304032 for ; Tue, 12 Aug 2014 16:56:35 -0700 (PDT) X-ASG-Debug-ID: 1407887789-04cbb0508aebed0001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id iVAm15EnsfmmIbfy for ; Tue, 12 Aug 2014 16:56: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: AlYKAH6o6lN5LDJ8/2dsb2JhbABRCYMNUleuTQEBAQEBAQaYFAeGRYFbhWsBgRAXd4QEAQUnExwjEAgDGAklDwUlAyETiEEOxQwXGIVkiHVbB4MvgR0FhQMCkD6GdZR/g24rL4EIJA Received: from ppp121-44-50-124.lns20.syd6.internode.on.net (HELO dastard) ([121.44.50.124]) by ipmail07.adl2.internode.on.net with ESMTP; 13 Aug 2014 09:26:29 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1XHLvL-0002jd-EW; Wed, 13 Aug 2014 09:56:15 +1000 Date: Wed, 13 Aug 2014 09:56:15 +1000 From: Dave Chinner To: Alex Lyakas Cc: Brian Foster , xfs@oss.sgi.com Subject: Re: use-after-free on log replay failure Message-ID: <20140812235615.GB20518@dastard> X-ASG-Orig-Subj: Re: use-after-free on log replay failure References: <4B2A412C75324EE9880358513C069476@alyakaslap> <9D3CBECB663B4A77B7EF74B67973310A@alyakaslap> <20140804230721.GA20518@dastard> <20140806152042.GB39990@bfoster.bfoster> <20140811132057.GA1186@bfoster.bfoster> <20140811215207.GS20518@dastard> <20140812120341.GA46654@bfoster.bfoster> 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: 1407887789 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=MARKETING_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.8381 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words On Tue, Aug 12, 2014 at 03:39:02PM +0300, Alex Lyakas wrote: > Hello Dave, Brian, > I will describe a generic reproduction that you ask for. > > It was performed on pristine XFS code from 3.8.13, taken from here: > git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git .... > I mounted XFS with the following options: > rw,sync,noatime,wsync,attr2,inode64,noquota 0 0 > > I started a couple of processes writing files sequentially onto this > mount point, and after few seconds crashed the VM. > When the VM came up, I took the metadump file and placed it in: > https://drive.google.com/file/d/0ByBy89zr3kJNa0ZpdmZFS242RVU/edit?usp=sharing > > Then I set up the following Device Mapper target onto /dev/vde: > dmsetup create VDE --table "0 41943040 linear-custom /dev/vde 0" > I am attaching the code (and Makefile) of dm-linear-custom target. > It is exact copy of dm-linear, except that it has a module > parameter. With the parameter set to 0, this is an identity mapping > onto /dev/vde. If the parameter is set to non-0, all WRITE bios are > failed with ENOSPC. There is a workqueue to fail them in a different > context (not sure if really needed, but that's what our "real" > custom > block device does). Well, they you go. That explains it - an asynchronous dispatch error happening fast enough to race with the synchronous XFS dispatch processing. dispatch thread device workqueue xfs_buf_hold(); atomic_set(b_io_remaining, 1) atomic_inc(b_io_remaining) submit_bio(bio) queue_work(bio) xfs_buf_ioend(bp, ....); atomic_dec(b_io_remaining) xfs_buf_rele() bio error set to ENOSPC bio->end_io() xfs_buf_bio_endio() bp->b_error = ENOSPC _xfs_buf_ioend(bp, 1); atomic_dec(b_io_remaining) xfs_buf_ioend(bp, 1); queue_work(bp) xfs_buf_iowait() if (bp->b_error) return error; if (error) xfs_buf_relse() xfs_buf_rele() xfs_buf_free() And now we have a freed buffer that is queued on the io completion queue. Basically, it requires the buffer error to be set asynchronously *between* the dispatch decrementing it's I/O count after dispatch, but before we wait on the IO. Not sure what the right fix is yet - removing the bp->b_error check from xfs_buf_iowait() doesn't solve the problem - it just prevents this code path from being tripped over by the race condition. But, just to validate this is the problem, you should be able to reproduce this on a 3.16 kernel. Can you try that, Alex? Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Tue Aug 12 19:03: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 C62A47F3F for ; Tue, 12 Aug 2014 19:03:45 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id A5390304032 for ; Tue, 12 Aug 2014 17:03:42 -0700 (PDT) X-ASG-Debug-ID: 1407888219-04bdf06ef8eb7c0001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id nVhjC05lrA2cfbxZ for ; Tue, 12 Aug 2014 17:03: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: AlMKANqq6lN5LDJ8/2dsb2JhbABRCYMNgSmuTQEBAQEBAQaYFAeIIIVrAYEQF3eEBAEFOhwjEAgDGAklDwUlAyETiEHFHxcYhWSIdVsHgy+BHQWcOJR/g24rLw Received: from ppp121-44-50-124.lns20.syd6.internode.on.net (HELO dastard) ([121.44.50.124]) by ipmail07.adl2.internode.on.net with ESMTP; 13 Aug 2014 09:33:25 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1XHM24-0002lO-CT; Wed, 13 Aug 2014 10:03:12 +1000 Date: Wed, 13 Aug 2014 10:03:12 +1000 From: Dave Chinner To: Alex Lyakas Cc: Brian Foster , xfs@oss.sgi.com Subject: Re: use-after-free on log replay failure Message-ID: <20140813000312.GC20518@dastard> X-ASG-Orig-Subj: Re: use-after-free on log replay failure References: <4B2A412C75324EE9880358513C069476@alyakaslap> <9D3CBECB663B4A77B7EF74B67973310A@alyakaslap> <20140804230721.GA20518@dastard> <20140806152042.GB39990@bfoster.bfoster> <20140811132057.GA1186@bfoster.bfoster> <20140811215207.GS20518@dastard> <20140812120341.GA46654@bfoster.bfoster> 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: 1407888219 X-Barracuda-URL: http://192.48.157.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.8381 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words On Tue, Aug 12, 2014 at 03:39:02PM +0300, Alex Lyakas wrote: > Then I set up the following Device Mapper target onto /dev/vde: > dmsetup create VDE --table "0 41943040 linear-custom /dev/vde 0" > I am attaching the code (and Makefile) of dm-linear-custom target. > It is exact copy of dm-linear, except that it has a module > parameter. With the parameter set to 0, this is an identity mapping > onto /dev/vde. If the parameter is set to non-0, all WRITE bios are > failed with ENOSPC. There is a workqueue to fail them in a different > context (not sure if really needed, but that's what our "real" > custom > block device does). FWIW, now I've looked at the dm module, this could easily be added to the dm-flakey driver by adding a "queue_write_error" option to it (i.e. similar to the current drop_writes and corrupt_bio_byte options). If we add the code there, then we could add a debug-only XFS sysfs variable to trigger the log recovery sleep, and then use dm-flakey to queue and error out writes. That gives us a reproducable xfstest for this condition. Brian, does that sound like a reasonable plan to you? Thanks for describing the method you've been using to reproduce the bug so clearly, Alex. Cheers, Dave. -- Dave Chinner david@fromorbit.com From robin.listas@gmail.com Tue Aug 12 19:08: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=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 CD3367F3F for ; Tue, 12 Aug 2014 19:08:05 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 4A08CAC007 for ; Tue, 12 Aug 2014 17:08:02 -0700 (PDT) X-ASG-Debug-ID: 1407888474-04cbb0508aec510001-NocioJ Received: from mail-wg0-f44.google.com (mail-wg0-f44.google.com [74.125.82.44]) by cuda.sgi.com with ESMTP id n3MDDVGAQyFZLuEa (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Tue, 12 Aug 2014 17:07:55 -0700 (PDT) X-Barracuda-Envelope-From: robin.listas@gmail.com X-Barracuda-Apparent-Source-IP: 74.125.82.44 Received: by mail-wg0-f44.google.com with SMTP id m15so10544151wgh.15 for ; Tue, 12 Aug 2014 17:07:54 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=sender:date:from:to:subject:in-reply-to:message-id:references :user-agent:mime-version:content-type; bh=5/B382C3+YRXXqvAPj8UJ1fs+Eg9stOaBVRvlcd0CJU=; b=ZM0pQTt7Fe2hIU/BuqpuQQ/yAD0JjDaGSX1RUbkbihkBppTlAzXzJIMLXxM7vnfzZR y20AYjDgaPw9CvlzUZbSuBwyDqLD9kSdrj+JmGbd3CNjSjo6/hBJbRLpNw1upLRtzYkI MpMqOg+TjRiljunVunWaTfihZoHyu607gT7ZzlXLaUwhmCXCffsRBO1c4iOBMYvevQBh DmzmkIuHotW1wsBn/wyRPUj6cd09ZkEH8KaSIVSOimf58qgy+LxRUSOfZ86P8uYTF3ot wkv35qrt48R2b5noumepj8x+/f8HGrITMdGohXYyBJPAiL4Sf4AMTNqehL2V1tCYhLqt Zofg== X-Received: by 10.194.23.135 with SMTP id m7mr1004130wjf.2.1407888474717; Tue, 12 Aug 2014 17:07:54 -0700 (PDT) Received: from Telcontar.valinor (177.Red-79-159-63.staticIP.rima-tde.net. [79.159.63.177]) by mx.google.com with ESMTPSA id x11sm547652wjr.15.2014.08.12.17.07.53 for (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 12 Aug 2014 17:07:53 -0700 (PDT) Sender: Carlos Robinson Received: from localhost (localhost [127.0.0.1]) by Telcontar.valinor (Postfix) with ESMTP id EC2E960682 for ; Wed, 13 Aug 2014 02:07:51 +0200 (CEST) X-Virus-Scanned: amavisd-new at valinor Received: from Telcontar.valinor ([127.0.0.1]) by localhost (Telcontar.valinor [127.0.0.1]) (amavisd-new, port 10024) with LMTP id lS4UXv62XUU9 for ; Wed, 13 Aug 2014 02:07:51 +0200 (CEST) Received: from localhost (localhost [127.0.0.1]) by Telcontar.valinor (Postfix) with ESMTP id C6CD1605B8 for ; Wed, 13 Aug 2014 02:07:51 +0200 (CEST) Date: Wed, 13 Aug 2014 02:07:42 +0200 (CEST) From: "Carlos E. R." X-X-Sender: cer@Telcontar.valinor To: XFS mailing list Subject: Re: Subject : Happened again, 20140811 -- Got "Internal error XFS_WANT_CORRUPTED_GOTO". Filesystem needs reformatting to correct issue. In-Reply-To: <20140812231629.GA20518@dastard> X-ASG-Orig-Subj: Re: Subject : Happened again, 20140811 -- Got "Internal error XFS_WANT_CORRUPTED_GOTO". Filesystem needs reformatting to correct issue. Message-ID: References: <53E93530.4070902@sgi.com> <53E93C29.1020103@sgi.com> <20140812165143.GB46654@bfoster.bfoster> <53EA86DE.5060508@sandeen.net> <20140812215943.GA39704@bfoster.bfoster> <53EA9386.2040207@sandeen.net> <20140812231629.GA20518@dastard> User-Agent: Alpine 2.11 (LSU 23 2013-08-11) MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII; format=flowed X-Barracuda-Connect: mail-wg0-f44.google.com[74.125.82.44] X-Barracuda-Start-Time: 1407888475 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.8381 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: SHA1 On Wednesday, 2014-08-13 at 09:16 +1000, Dave Chinner wrote: ... > Well, the sync is necessary for hibernate - it needs to shrink the > amount of memory that is saved to disk to as small as possible. If > your memory is full of dirty page cache, why would you save that to > the hibernate image, only to have to load it back off, then write it > to the filesystem after resume? Why wouldn't you write it straight > to disk before hibernation, then remove it from memory so you've > then got free memory to allocate the hibernation image that gets > written to disk? You can see that this happens by looking at the output of "free" before and after hibernation. Even issuing the command after getting the desktop back, I can see a big difference (the ammount of buffers and cache). - -- Cheers, Carlos E. R. (from 13.1 x86_64 "Bottle" at Telcontar) -----BEGIN PGP SIGNATURE----- Version: GnuPG v2.0.22 (GNU/Linux) iEYEARECAAYFAlPqrFcACgkQtTMYHG2NR9VfIgCgj3AXArngfCdoK/bGDsHNNWWU pgoAnRJK7GMHRbO9KCV2TKYnlSYWMolT =MtMr -----END PGP SIGNATURE----- From hawk@tbi.univie.ac.at Wed Aug 13 04:42: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 4F9177F3F for ; Wed, 13 Aug 2014 04:42:33 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 098AC8F8074 for ; Wed, 13 Aug 2014 02:42:29 -0700 (PDT) X-ASG-Debug-ID: 1407922946-04bdf06ef71002e0001-NocioJ Received: from mescalin.tbi.univie.ac.at (mescalin.tbi.univie.ac.at [131.130.44.61]) by cuda.sgi.com with ESMTP id Bv7fHOpIy5suhGax (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 13 Aug 2014 02:42:27 -0700 (PDT) X-Barracuda-Envelope-From: hawk@tbi.univie.ac.at X-Barracuda-Apparent-Source-IP: 131.130.44.61 Received: from denobula.tbi.univie.ac.at ([131.130.44.65]:42797) by mescalin.tbi.univie.ac.at with esmtpsa (TLS1.0:DHE_RSA_AES_128_CBC_SHA1:16) (Exim 4.76) (envelope-from ) id 1XHV4c-0004N8-A4 for xfs@oss.sgi.com; Wed, 13 Aug 2014 11:42:26 +0200 Message-ID: <53EB3302.1090000@tbi.univie.ac.at> Date: Wed, 13 Aug 2014 11:42:26 +0200 From: Richard Neuboeck User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Thunderbird/24.5.0 MIME-Version: 1.0 To: xfs@oss.sgi.com Subject: File System Corruption - Internal error xfs_dir3_data_reada_verify Content-Type: multipart/signed; micalg=pgp-sha1; protocol="application/pgp-signature"; boundary="OgiujWGRgACxmDpNj1g6pLCq7sCfhs5ti" X-ASG-Orig-Subj: File System Corruption - Internal error xfs_dir3_data_reada_verify X-Barracuda-Connect: mescalin.tbi.univie.ac.at[131.130.44.61] X-Barracuda-Start-Time: 1407922947 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.8393 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- This is an OpenPGP/MIME signed message (RFC 4880 and 3156) --OgiujWGRgACxmDpNj1g6pLCq7sCfhs5ti Content-Type: multipart/mixed; boundary="------------040508060702070407000707" This is a multi-part message in MIME format. --------------040508060702070407000707 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable Hi, for some time now our storage machine using XFS stops the file system due to some reason I don't seem to have found so far. In this process the file system gets corrupted and the attached trace log is shown. After xfs_repair is run it's running again for an always changing amount of time. In general it fails within a few hours or days. There are no relevant log messages before the entries shown below and no immediate actions that lead to this condition. So far my experiments (Ubuntu upgrade from 10.04 to 14.04, different kernel versions, changes to the hypervisor) didn't show any lasting effects (positive or negative). If any one could shed some light on what XFS is trying to tell me it would be highly appreciated. I've found the mention of 'xfs_dir3_data_reada_verify' in the mailing list but didn't find a solution that was applicable. Thanks in advance Richard Operating System: Ubuntu 14.04 x86_64 Kernel: 3.13.0-32-generic Machine: Virtual, gets an LVM device (/dev/vdb) The system hosting the virtual machine is Ubuntu lucid (10.04LTS) x86_64. There are no log messages related to this incident on this machine. --=20 /dev/null --------------040508060702070407000707 Content-Type: text/plain; charset=UTF-8; name="xfs_trace.log" Content-Transfer-Encoding: quoted-printable Content-Disposition: attachment; filename="xfs_trace.log" Aug 13 10:11:16 huddle kernel: [ 5247.325984] ffff880113855000: 20 73 63 = 6f 70 65 2e 52 65 73 65 74 48 69 73 74 scope.ResetHist Aug 13 10:11:16 huddle kernel: [ 5247.326066] ffff880113855010: 6f 72 79 = 28 29 3b 0a 20 20 20 20 20 20 20 20 20 ory();. =20 Aug 13 10:11:16 huddle kernel: [ 5247.326107] ffff880113855020: 20 20 20 = 20 20 20 20 68 61 6e 64 6c 65 2e 52 65 handle.Re Aug 13 10:11:16 huddle kernel: [ 5247.326147] ffff880113855030: 73 65 74 = 28 29 3b 0a 20 20 20 20 20 20 20 20 20 set();. =20 Aug 13 10:11:16 huddle kernel: [ 5247.326196] XFS (vdb): Internal error x= fs_dir3_data_reada_verify at line 258 of file /build/buildd/linux-3.13.0/= fs/xfs/xfs_dir2_data.c. Caller 0xffffffffa006b6c5 Aug 13 10:11:16 huddle kernel: [ 5247.326276] CPU: 0 PID: 341 Comm: kwork= er/0:1H Not tainted 3.13.0-32-generic #57-Ubuntu Aug 13 10:11:16 huddle kernel: [ 5247.326278] Hardware name: Bochs Bochs,= BIOS Bochs 01/01/2007 Aug 13 10:11:16 huddle kernel: [ 5247.326352] Workqueue: xfslogd xfs_buf_= iodone_work [xfs] Aug 13 10:11:16 huddle kernel: [ 5247.326357] 0000000000000001 ffff88021= 1f97d88 ffffffff8171bcb4 ffff8802125bd000 Aug 13 10:11:16 huddle kernel: [ 5247.326361] ffff880211f97da0 ffffffffa= 006e53b ffffffffa006b6c5 ffff880211f97dd8 Aug 13 10:11:16 huddle kernel: [ 5247.326363] ffffffffa006e595 000001021= 1f97dc8 ffff880101aa8000 ffff880101aa8000 Aug 13 10:11:16 huddle kernel: [ 5247.326365] Call Trace: Aug 13 10:11:16 huddle kernel: [ 5247.326373] [] dump_= stack+0x45/0x56 Aug 13 10:11:16 huddle kernel: [ 5247.326385] [] xfs_e= rror_report+0x3b/0x40 [xfs] Aug 13 10:11:16 huddle kernel: [ 5247.326395] [] ? xfs= _buf_iodone_work+0x85/0xf0 [xfs] Aug 13 10:11:16 huddle kernel: [ 5247.326406] [] xfs_c= orruption_error+0x55/0x80 [xfs] Aug 13 10:11:16 huddle kernel: [ 5247.326442] [] xfs_d= ir3_data_reada_verify+0x62/0xc0 [xfs] Aug 13 10:11:16 huddle kernel: [ 5247.326451] [] ? xfs= _buf_iodone_work+0x85/0xf0 [xfs] Aug 13 10:11:16 huddle kernel: [ 5247.326460] [] xfs_b= uf_iodone_work+0x85/0xf0 [xfs] Aug 13 10:11:16 huddle kernel: [ 5247.326465] [] proce= ss_one_work+0x182/0x450 Aug 13 10:11:16 huddle kernel: [ 5247.326478] [] worke= r_thread+0x121/0x410 Aug 13 10:11:16 huddle kernel: [ 5247.326481] [] ? res= cuer_thread+0x430/0x430 Aug 13 10:11:16 huddle kernel: [ 5247.326484] [] kthre= ad+0xd2/0xf0 Aug 13 10:11:16 huddle kernel: [ 5247.326486] [] ? kth= read_create_on_node+0x1d0/0x1d0 Aug 13 10:11:16 huddle kernel: [ 5247.326490] [] ret_f= rom_fork+0x7c/0xb0 Aug 13 10:11:16 huddle kernel: [ 5247.326492] [] ? kth= read_create_on_node+0x1d0/0x1d0 Aug 13 10:11:16 huddle kernel: [ 5247.326494] XFS (vdb): Corruption detec= ted. Unmount and run xfs_repair Aug 13 10:11:16 huddle kernel: [ 5247.326532] XFS (vdb): metadata I/O err= or: block 0x160003e488 ("xfs_trans_read_buf_map") error 117 numblks 8 Aug 13 10:11:16 huddle kernel: [ 5247.326789] ffff880113855000: 20 73 63 = 6f 70 65 2e 52 65 73 65 74 48 69 73 74 scope.ResetHist Aug 13 10:11:16 huddle kernel: [ 5247.326831] ffff880113855010: 6f 72 79 = 28 29 3b 0a 20 20 20 20 20 20 20 20 20 ory();. =20 Aug 13 10:11:16 huddle kernel: [ 5247.326870] ffff880113855020: 20 20 20 = 20 20 20 20 68 61 6e 64 6c 65 2e 52 65 handle.Re Aug 13 10:11:16 huddle kernel: [ 5247.326909] ffff880113855030: 73 65 74 = 28 29 3b 0a 20 20 20 20 20 20 20 20 20 set();. =20 Aug 13 10:11:16 huddle kernel: [ 5247.326949] XFS (vdb): Internal error x= fs_dir3_data_read_verify at line 274 of file /build/buildd/linux-3.13.0/f= s/xfs/xfs_dir2_data.c. Caller 0xffffffffa006b6c5 Aug 13 10:11:16 huddle kernel: [ 5247.327029] CPU: 0 PID: 341 Comm: kwork= er/0:1H Not tainted 3.13.0-32-generic #57-Ubuntu Aug 13 10:11:16 huddle kernel: [ 5247.327031] Hardware name: Bochs Bochs,= BIOS Bochs 01/01/2007 Aug 13 10:11:16 huddle kernel: [ 5247.327042] Workqueue: xfslogd xfs_buf_= iodone_work [xfs] Aug 13 10:11:16 huddle kernel: [ 5247.327044] 0000000000000001 ffff88021= 1f97d68 ffffffff8171bcb4 ffff8802125bd000 Aug 13 10:11:16 huddle kernel: [ 5247.327045] ffff880211f97d80 ffffffffa= 006e53b ffffffffa006b6c5 ffff880211f97db8 Aug 13 10:11:16 huddle kernel: [ 5247.327047] ffffffffa006e595 000001121= 1f97db0 ffff880036ab1300 ffff8802125bd000 Aug 13 10:11:16 huddle kernel: [ 5247.327049] Call Trace: Aug 13 10:11:16 huddle kernel: [ 5247.327052] [] dump_= stack+0x45/0x56 Aug 13 10:11:16 huddle kernel: [ 5247.327061] [] xfs_e= rror_report+0x3b/0x40 [xfs] Aug 13 10:11:16 huddle kernel: [ 5247.327070] [] ? xfs= _buf_iodone_work+0x85/0xf0 [xfs] Aug 13 10:11:16 huddle kernel: [ 5247.327079] [] xfs_c= orruption_error+0x55/0x80 [xfs] Aug 13 10:11:16 huddle kernel: [ 5247.327092] [] xfs_d= ir3_data_read_verify+0x6d/0xf0 [xfs] Aug 13 10:11:16 huddle kernel: [ 5247.327101] [] ? xfs= _buf_iodone_work+0x85/0xf0 [xfs] Aug 13 10:11:16 huddle kernel: [ 5247.327104] [] ? fin= ish_task_switch+0x128/0x170 Aug 13 10:11:16 huddle kernel: [ 5247.327113] [] xfs_b= uf_iodone_work+0x85/0xf0 [xfs] Aug 13 10:11:16 huddle kernel: [ 5247.327115] [] proce= ss_one_work+0x182/0x450 Aug 13 10:11:16 huddle kernel: [ 5247.327117] [] worke= r_thread+0x121/0x410 Aug 13 10:11:16 huddle kernel: [ 5247.327119] [] ? res= cuer_thread+0x430/0x430 Aug 13 10:11:16 huddle kernel: [ 5247.327121] [] kthre= ad+0xd2/0xf0 Aug 13 10:11:16 huddle kernel: [ 5247.327122] [] ? kth= read_create_on_node+0x1d0/0x1d0 Aug 13 10:11:16 huddle kernel: [ 5247.327124] [] ret_f= rom_fork+0x7c/0xb0 Aug 13 10:11:16 huddle kernel: [ 5247.327126] [] ? kth= read_create_on_node+0x1d0/0x1d0 Aug 13 10:11:16 huddle kernel: [ 5247.327127] XFS (vdb): Corruption detec= ted. Unmount and run xfs_repair Aug 13 10:11:16 huddle kernel: [ 5247.327164] XFS (vdb): metadata I/O err= or: block 0x160003e488 ("xfs_trans_read_buf_map") error 117 numblks 8 Aug 13 10:11:21 huddle kernel: [ 5252.482540] XFS: Internal error XFS_WAN= T_CORRUPTED_GOTO at line 1602 of file /build/buildd/linux-3.13.0/fs/xfs/x= fs_alloc.c. Caller 0xffffffffa0088485 Aug 13 10:11:21 huddle kernel: [ 5252.482644] CPU: 0 PID: 2167 Comm: rm N= ot tainted 3.13.0-32-generic #57-Ubuntu Aug 13 10:11:21 huddle kernel: [ 5252.482646] Hardware name: Bochs Bochs,= BIOS Bochs 01/01/2007 Aug 13 10:11:21 huddle kernel: [ 5252.482648] 0000000000fef248 ffff88010= d125b88 ffffffff8171bcb4 0000000000000004 Aug 13 10:11:21 huddle kernel: [ 5252.482651] ffff88010d125ba0 ffffffffa= 006e53b ffffffffa0088485 ffff88010d125c38 Aug 13 10:11:21 huddle kernel: [ 5252.482653] ffffffffa0086f19 ffff88021= 25bd000 ffff880033fff780 ffff880211f9b9c0 Aug 13 10:11:21 huddle kernel: [ 5252.482655] Call Trace: Aug 13 10:11:21 huddle kernel: [ 5252.482664] [] dump_= stack+0x45/0x56 Aug 13 10:11:21 huddle kernel: [ 5252.482694] [] xfs_e= rror_report+0x3b/0x40 [xfs] Aug 13 10:11:21 huddle kernel: [ 5252.482706] [] ? xfs= _free_extent+0xc5/0xf0 [xfs] Aug 13 10:11:21 huddle kernel: [ 5252.482718] [] xfs_f= ree_ag_extent+0x1e9/0x710 [xfs] Aug 13 10:11:21 huddle kernel: [ 5252.482730] [] xfs_f= ree_extent+0xc5/0xf0 [xfs] Aug 13 10:11:21 huddle kernel: [ 5252.482748] [] xfs_b= map_finish+0x13f/0x190 [xfs] Aug 13 10:11:21 huddle kernel: [ 5252.482766] [] xfs_i= truncate_extents+0x16d/0x2a0 [xfs] Aug 13 10:11:21 huddle kernel: [ 5252.482781] [] xfs_i= nactive_truncate+0x8d/0x120 [xfs] Aug 13 10:11:21 huddle kernel: [ 5252.482812] [] xfs_i= nactive+0x138/0x160 [xfs] Aug 13 10:11:21 huddle kernel: [ 5252.482844] [] xfs_f= s_evict_inode+0x80/0xc0 [xfs] Aug 13 10:11:21 huddle kernel: [ 5252.482848] [] evict= +0xb0/0x1b0 Aug 13 10:11:21 huddle kernel: [ 5252.482850] [] iput+= 0xf5/0x180 Aug 13 10:11:21 huddle kernel: [ 5252.482852] [] do_un= linkat+0x18e/0x2b0 Aug 13 10:11:21 huddle kernel: [ 5252.482857] [] ? sys= call_trace_enter+0x145/0x250 Aug 13 10:11:21 huddle kernel: [ 5252.482859] [] SyS_u= nlinkat+0x1b/0x40 Aug 13 10:11:21 huddle kernel: [ 5252.482863] [] trace= sys+0xe1/0xe6 Aug 13 10:11:21 huddle kernel: [ 5252.482872] XFS (vdb): xfs_do_force_shu= tdown(0x8) called from line 138 of file /build/buildd/linux-3.13.0/fs/xfs= /xfs_bmap_util.c. Return address =3D 0xffffffffa0068118 Aug 13 10:11:21 huddle kernel: [ 5252.483790] XFS (vdb): Corruption of in= -memory data detected. Shutting down filesystem Aug 13 10:11:21 huddle kernel: [ 5252.483830] XFS (vdb): Please umount th= e filesystem and rectify the problem(s) --------------040508060702070407000707-- --OgiujWGRgACxmDpNj1g6pLCq7sCfhs5ti Content-Type: application/pgp-signature; name="signature.asc" Content-Description: OpenPGP digital signature Content-Disposition: attachment; filename="signature.asc" -----BEGIN PGP SIGNATURE----- Version: GnuPG v2 iEYEARECAAYFAlPrMwIACgkQnGohgOrO9GG9eACfTUkJVdEERdE5uq8Ffc4bsYIZ imIAnA8AZu1dRRuEqNelIQ+7CoGAVyMc =NS9s -----END PGP SIGNATURE----- --OgiujWGRgACxmDpNj1g6pLCq7sCfhs5ti-- From webmaster@dev104.magizz.com Wed Aug 13 04: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=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 0D8E67F3F for ; Wed, 13 Aug 2014 04:54:12 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id D46428F8071 for ; Wed, 13 Aug 2014 02:54:11 -0700 (PDT) X-ASG-Debug-ID: 1407923649-04cb6c4c94e1430001-NocioJ Received: from vps.magizz.com (vps.magizz.com [162.251.83.157]) by cuda.sgi.com with ESMTP id us6XRJ473Z1uwG5g (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 13 Aug 2014 02:54:09 -0700 (PDT) X-Barracuda-Envelope-From: webmaster@dev104.magizz.com X-Barracuda-Apparent-Source-IP: 162.251.83.157 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=dev104.magizz.com; s=default; h=Content-Type:MIME-Version:List-Owner:List-Subscribe:List-Unsubscribe:List-Help:Message-ID:Reply-To:From:Date:Subject:To; bh=z92DInjIb25P0yXPZO9nAjaIFyyBExE9UVmk1qGh2P8=; b=v36+f5A/hXXxfXBCe7ojIaOLirV1CP+FyChwIYw+kRIqW9UCgwZkWfThYcUiMFyi1lB6VVmcysLmlptGIMOhaaaVLHJGwgODb7PYq3V6rdRI9/BeCwa1c4Vg/pajmYk2qIms+aucj2bLNpg+np1OnG5wL1K6vRCpdcqz4ZOWFzY=; Received: from dev104magizz by vps.magizz.com with local (Exim 4.82) (envelope-from ) id 1XHVFz-00067z-UU for xfs@oss.sgi.com; Wed, 13 Aug 2014 13:54:11 +0400 To: xfs@oss.sgi.com Subject: An Unbelievable Offer for You - Bag Your Luck Now X-PHP-Script: dev104.magizz.com/mailz/admin/index.php for 122.170.50.201 X-ASG-Orig-Subj: An Unbelievable Offer for You - Bag Your Luck Now Received: from abts-mum-dynamic-201.50.170.122.airtelbroadband.in [122.170.50.201] by dev104.magizz.com with HTTP; Wed, 13 Aug 2014 08:58:08 +0000 Date: Wed, 13 Aug 2014 09:54:11 +0000 From: Good Luck! Reply-To: Good Luck! Message-ID: <18bda152c075385963d851396b6855be@dev104.magizz.com> X-Priority: 3 X-Mailer: PHPMailer 5.2.5 (https://github.com/Synchro/PHPMailer/) X-phpList-version: 3.0.6 X-MessageID: 12 X-ListMember: xfs@oss.sgi.com Precedence: bulk Bounces-To: webmaster@dev104.magizz.com List-Help: List-Unsubscribe: List-Subscribe: List-Owner: MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="b1_18bda152c075385963d851396b6855be" X-AntiAbuse: This header was added to track abuse, please include it with any abuse report X-AntiAbuse: Primary Hostname - vps.magizz.com X-AntiAbuse: Original Domain - oss.sgi.com X-AntiAbuse: Originator/Caller UID/GID - [510 520] / [47 12] X-AntiAbuse: Sender Address Domain - dev104.magizz.com X-Get-Message-Sender-Via: vps.magizz.com: authenticated_id: dev104magizz/from_h X-Barracuda-Connect: vps.magizz.com[162.251.83.157] X-Barracuda-Start-Time: 1407923649 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.8394 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 --b1_18bda152c075385963d851396b6855be Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable Congrats User * * *It's Time to celebrate, we bring for you a Super Dhamaka Offer!* * * *You can win amazing Smart Phones through our grand offer* * * *It's indeed a rare deal & a dream come true for you* * * *Just click your mouse once and the brand new Apple iPhone 5 becomes yours* * * *Just click your mouse once and the brand new Samsung Galaxy Grand 2 becomes yours* * * *Just click your mouse once and the brand new Samsung Galaxy S5 becomes yours* * * *It's a Now or never chance for you because the offer ends soon. So, make it fast to steal the golden chance and turn all heads with your luxurious smart phone!* * * -- This message was sent to xfs@oss.sgi.com by swati@dev104.magizz.com To forward this message, please do not use the forward button of your email application, because this message was made specifically for you only. Instead use the forward page=0A in our newsletter system. To change your details and to choose which lists to be subscribed to, visit your personal preferences page=0A Or you can UNSUBSCRIBE this panel.=0A from all future mailings. =20 amj --b1_18bda152c075385963d851396b6855be Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: quoted-printable =0A =0A

 Congrats User


It’s Time to c= elebrate, we bring for you a Super Dhamaka Offer!


You can win amazing = Smart Phones through our grand offer


It’s indeed a = rare deal & a dream come true for you

 =

Just click your mouse once a= nd the brand new 

Just click your mouse once a= nd the brand new 

Just click your mouse once a= nd the brand new  =

It’s a Now or = never chance for you because the offer ends soon. So, make it fast to steal= the golden chance and turn all heads with your luxurious smart phone!


 

-- =20
=0Aamj --b1_18bda152c075385963d851396b6855be-- From david@fromorbit.com Wed Aug 13 05:43: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 6BA967F3F for ; Wed, 13 Aug 2014 05:43:02 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 3163B304043 for ; Wed, 13 Aug 2014 03:43:02 -0700 (PDT) X-ASG-Debug-ID: 1407926577-04bdf06ef7101dd0001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id 0U13QX5PIkJaRezC for ; Wed, 13 Aug 2014 03:42:58 -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: Aj8KAFRA61N5LDJ8PGdsb2JhbABAGg6Cf1JXgiqLJKByAQEBAQEBBp5UDIdGAYESFwUBAQEBODaEAwEBAQMBAQEBNxwYCwULCAMOCgklDwUTEgMHGhMbiB8HDjbFQRiFZIdAgUdEBQeETAWPCoY5hnWMBowTVCsvAYEG Received: from ppp121-44-50-124.lns20.syd6.internode.on.net (HELO dastard) ([121.44.50.124]) by ipmail06.adl6.internode.on.net with ESMTP; 13 Aug 2014 20:12:56 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1XHW19-0004G5-Do; Wed, 13 Aug 2014 20:42:55 +1000 Date: Wed, 13 Aug 2014 20:42:55 +1000 From: Dave Chinner To: Richard Neuboeck Cc: xfs@oss.sgi.com Subject: Re: File System Corruption - Internal error xfs_dir3_data_reada_verify Message-ID: <20140813104255.GO26465@dastard> X-ASG-Orig-Subj: Re: File System Corruption - Internal error xfs_dir3_data_reada_verify References: <53EB3302.1090000@tbi.univie.ac.at> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <53EB3302.1090000@tbi.univie.ac.at> 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: 1407926578 X-Barracuda-URL: http://192.48.157.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.8395 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 BSF_SC0_SA085 Custom Rule SA085 On Wed, Aug 13, 2014 at 11:42:26AM +0200, Richard Neuboeck wrote: > Hi, > > for some time now our storage machine using XFS stops the file > system due to some reason I don't seem to have found so far. In this > process the file system gets corrupted and the attached trace log is > shown. What's the workload the VM runs? > After xfs_repair is run it's running again for an always > changing amount of time. What errors does xfs_repair correct? Can you post the output of a repair run that corrects the issue. > In general it fails within a few hours or > days. There are no relevant log messages before the entries shown > below and no immediate actions that lead to this condition. So far > my experiments (Ubuntu upgrade from 10.04 to 14.04, different kernel > versions, changes to the hypervisor) didn't show any lasting effects > (positive or negative). If any one could shed some light on what XFS > is trying to tell me it would be highly appreciated. The directory is trying to read a block of data that does not contain directory data. i.e. the directory has somehow been corrupted. The block contains file data, but that's about all I can tell you right now. > I've found the mention of 'xfs_dir3_data_reada_verify' in the > mailing list but didn't find a solution that was applicable. It's just checking the block read from disk. However, that's not the only error that is occurring: > [ 5247.327164] XFS (vdb): metadata I/O error: block 0x160003e488 ("xfs_trans_read_buf_map") error 117 numblks 8 > [ 5252.482540] XFS: Internal error XFS_WANT_CORRUPTED_GOTO at line 1602 of file /build/buildd/linux-3.13.0/fs/xfs/xfs_alloc.c. Caller 0xffffffffa0088485 There are corrupted free space btrees. In this case, the by-bno tree has been found to be inconsistent. So there's something corrupting more than just the directory. SO, more information needed. Lets start with: http://xfs.org/index.php/XFS_FAQ#Q:_What_information_should_I_include_when_reporting_a_problem.3F and the output of xfs_repair. Also, a metadump image of the filesystem before you run repair would be helpful. And finally, the configuration of the block devices the VM is using (i.e. virtio, cache=?, etc). Describing the physical storage the VM is using might also be helpful - it could be host based corruption, not guest based corruption that is occurring... Cheers, Dave. > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs -- Dave Chinner david@fromorbit.com From bfoster@redhat.com Wed Aug 13 07:05: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 9F3157F3F for ; Wed, 13 Aug 2014 07: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 830E3304043 for ; Wed, 13 Aug 2014 05:04:57 -0700 (PDT) X-ASG-Debug-ID: 1407931495-04cbb0508d1031f0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id OPd6fsXIzV9ON1xb (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 13 Aug 2014 05:04:56 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-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 s7DC4qx3012371 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 13 Aug 2014 08:04:52 -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 s7DC4qqn014216; Wed, 13 Aug 2014 08:04:52 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 4B1EE12577C; Wed, 13 Aug 2014 08:04:51 -0400 (EDT) Date: Wed, 13 Aug 2014 08:04:51 -0400 From: Brian Foster To: "Carlos E. R." Cc: XFS mailing list Subject: Re: Subject : Happened again, 20140811 -- Got "Internal error XFS_WANT_CORRUPTED_GOTO". Filesystem needs reformatting to correct issue. Message-ID: <20140813120450.GA3569@bfoster.bfoster> X-ASG-Orig-Subj: Re: Subject : Happened again, 20140811 -- Got "Internal error XFS_WANT_CORRUPTED_GOTO". Filesystem needs reformatting to correct issue. References: <53E8D9F6.7080704@sgi.com> <53E93530.4070902@sgi.com> <53E93C29.1020103@sgi.com> <20140812165143.GB46654@bfoster.bfoster> MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: User-Agent: Mutt/1.5.23 (2014-03-12) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.27 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1407931496 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Tue, Aug 12, 2014 at 11:17:36PM +0200, Carlos E. R. wrote: > -----BEGIN PGP SIGNED MESSAGE----- > Hash: SHA1 > > > > On Tuesday, 2014-08-12 at 12:51 -0400, Brian Foster wrote: > >On Tue, Aug 12, 2014 at 02:17:00AM +0200, Carlos E. R. wrote: > > >I see the same thing from repair that was in your repair output: > > > >block (1,12608397-12608397) multiply claimed by cnt space tree, state - 2 > > Is it possible to find out what file uses that block? > I have a non-obfuscated copy of the metadata. Knowing the file, we can know > what application is involved - and that might help, or perhaps not. > I don't see how given the current situation. The space appears to be free initially, so zeroing the log contents on repair puts the fs in a state where the space is not allocated to any particular file. Perhaps there is some incremental state created by the log that can provide this information (e.g., space is free, space is preallocated, extent is converted, eofblocks are trimmed all in a single checkpoint), but that could be difficult to trace back since iirc the btree had grown as well. > > >If I take a look at the btrees as is, I see "235:[12608397,10]" included > >in the bnobt (fsb 0x200aa55) and "270:[12608397,10]" in the cntbt (fsb > >0x2000781). If I skip the mount, zero the log and repair, everything > >seems Ok. I can allocate the remainder of available space and rm -rf > >everything in the fs without an error. > > > >Once I replay the log, I see "272:[12608397,10] 273:[12608397,10]" in > >the cntbt, which is clearly a duplicate entry. This is what repair > >detects and cleans up and seems to lead to the shutdown. E.g., if I > >mount and use the fs, I can hit an assert or failure just by attempting > >to allocate the rest of the space in the fs. If that is the state of the > >fs on disk, it's only a matter of time we explode due to allocating and > >freeing that range of space or possibly attempting to allocate that > >space twice. > > I'm not sure if I follow you. > > The sequence of events here is: > > a) hibernate > b) thaw > c) immediately, in memory corruption found and kernel error message. > Filesystem is switched to read only. > System is unstable, has to be halted or rebooted. > Umount is impossible. > Ok, so the crash is fairly immediate after the wake (also according to the log output below). > d) (¬) Reboot > e) Mount (¬), manual umount, xfs_repair (¬), mount > (photos of metadata taken at the appropriate points (marked with ¬)) > > > This the point I'm at now. Are you saying that the filesystem can explode at > any time now? I have not written any files, beyond what the desktop does > automatically. > No, the filesystem has been fixed by repair. I'm just saying that somehow the fs creates a duplicate free space record in one of the free space trees. That particular condition means it's only a matter of time before some block allocation operation trips up on that inconsistent state and shuts down the fs. You happen to hit it immediately due to that space being involved with speculative preallocation. The current theory is that this is probably due to XFS workqueues not being freezable, and therefore can make changes on disk after the dump image is created. This seems logical to me, but I'd still like to see some kind of verification of the potential fix if possible. I can repeat some vm hibernate testing with that in mind. Alternatively, would you have the ability to test a patch? Have you been able to reproduce this again since the most recent instance? Brian > > > What I have not done (on your request), this time, is: > > f) backup, format, restore. > > > > > >Mark mentioned that he didn't see the superblock item in the log with > >regard to the freeze. I don't see that either... which perhaps suggests > >that this all happens during the wake-from-hibernate sequence..? My > >understanding is that we should freeze on hibernate, thus force > >everything out to the log, write an unmount record and then dirty the > >log with a superblock transaction. Therefore, that should be the only > >item in the log post-freeze. Here, we have various items in the log > >including several logged buffers that correspond to the cntbt block that > >ends up corrupted (daddr 0xf427c08). > > > >Given the failure occurs on freeing an extent via the xfs_eofblocks > >scanner, perhaps this extent was initially allocated as speculative > >preallocation and the eofblocks scanner is where we happen to first > >identify the corrupted cntbt. What is strange is that, as mentioned > >previously, the space appears to be free if I zero the log, so that > >means it was probably free before the freeze. It seems highly unlikely > >for a file to gain preallocation, be written out and then get trimmed by > >the scanner all on wake-from-hibernate. > > > Well, I understand little of that, but if you do, and can do whatever > modifications need to be done to the code, that's fine with me :-) > > > > >Carlos, > > > >How long after hibernate does the shutdown/crash typically occur? Do you > >basically wake-up and within a few seconds the filesystem crashes, or is > >it some time (minutes) later? > > Instantly during the wake-up (thaw), according to the log. > > I'm typically not present when it happens: my routine is switch on the > computer, then go make coffee/tea, and then return and start using the > machine. It takes a minute or two to wake up from hibernation, and then the > machine is sluggish for a minute or two more while processes start doing > things and claiming chunks from swap, mail is fetched, etc. > > And instead of starting work, I find the machine in a bad state. > > > Look, an excerpt from the last event (the full log is in another post > yesterday), but taken from another log file with finer grained timestaps: > > > <30>1 2014-08-11T05:22:25.861413+02:00 Telcontar ntp 5867 - - Shutting down network time protocol daemon (NTPD)..done > <30>1 2014-08-11T05:22:25.917520+02:00 Telcontar systemd 1 - - Stopped LSB: Network time protocol daemon (ntpd). > <28>1 2014-08-11T05:22:25.977431+02:00 Telcontar pm-utils - - - Hibernating (95)... > <7>1 2014-08-11T05:22:30.605714+02:00 Telcontar kernel - - - [73220.857511] PM: Marking nosave pages: [mem 0x0009f000-0x000fffff] > <7>1 2014-08-11T05:22:30.605728+02:00 Telcontar kernel - - - [73220.857516] PM: Marking nosave pages: [mem 0xbff90000-0xffffffff] > <7>1 2014-08-11T05:22:30.605729+02:00 Telcontar kernel - - - [73220.858132] PM: Basic memory bitmaps created > <4>1 2014-08-11T15:17:18.911655+02:00 Telcontar kernel - - - [73221.946553] Syncing filesystems ... done. > <4>1 2014-08-11T15:17:18.911744+02:00 Telcontar kernel - - - [73222.682396] Freezing user space processes ... (elapsed 0.002 seconds) done. > <6>1 2014-08-11T15:17:18.911746+02:00 Telcontar kernel - - - [73222.685031] PM: Preallocating image memory... done (allocated 1140745 pages) > > > The "Hibernating (95)" is written by a script of mine in > "/etc/pm/sleep.d/95cosas" which main purpose is to write to the log that > line. > > Then the machine wakes up, hours later - despite the timestamp not saying so > (the time jump is written instead lines above): > > > <6>1 2014-08-11T15:17:18.911768+02:00 Telcontar kernel - - - [73228.307358] CPU3 is up > <6>1 2014-08-11T15:17:18.911769+02:00 Telcontar kernel - - - [73228.335219] PM: noirq restore of devices complete after 22.779 msecs > <6>1 2014-08-11T15:17:18.911770+02:00 Telcontar kernel - - - [73228.335354] PM: early restore of devices complete after 0.110 msecs > <7>1 2014-08-11T15:17:18.911771+02:00 Telcontar kernel - - - [73228.508789] uhci_hcd 0000:00:1a.0: setting latency timer to 64 > <4>1 2014-08-11T15:17:18.911771+02:00 Telcontar kernel - - - [73228.508809] usb usb3: root hub lost power or was reset > > ... > > > <6>1 2014-08-11T15:17:18.911838+02:00 Telcontar kernel - - - [73230.798419] r8169 0000:06:00.0 eth0: link up > <6>1 2014-08-11T15:17:18.911839+02:00 Telcontar kernel - - - [73231.245103] PM: restore of devices complete after 2736.365 msecs > <4>1 2014-08-11T15:17:18.911839+02:00 Telcontar kernel - - - [73231.514298] Restarting kernel threads ... done. > <4>1 2014-08-11T15:17:18.911842+02:00 Telcontar kernel - - - [73231.518736] Restarting tasks ... done. > <7>1 2014-08-11T15:17:18.911843+02:00 Telcontar kernel - - - [73231.562307] PM: Basic memory bitmaps freed > <28>1 2014-08-11T15:17:19.946945+02:00 Telcontar rtkit-daemon 4535 - - The canary thread is apparently starving. Taking action. > <30>1 2014-08-11T15:17:19.947259+02:00 Telcontar rtkit-daemon 4535 - - Demoting known real-time threads. > <29>1 2014-08-11T15:17:19.951276+02:00 Telcontar rtkit-daemon 4535 - - Successfully demoted thread 4541 of process 4534 (/usr/bin/pulseaudio). > <29>1 2014-08-11T15:17:19.951546+02:00 Telcontar rtkit-daemon 4535 - - Successfully demoted thread 4540 of process 4534 (/usr/bin/pulseaudio). > <29>1 2014-08-11T15:17:19.951799+02:00 Telcontar rtkit-daemon 4535 - - Successfully demoted thread 4534 of process 4534 (/usr/bin/pulseaudio). > <29>1 2014-08-11T15:17:19.952033+02:00 Telcontar rtkit-daemon 4535 - - Demoted 3 threads. > <20>1 2014-08-11T15:17:20.808125+02:00 Telcontar dovecot - - - imap: Warning: Time jumped forwards 33996 seconds > <20>1 2014-08-11T15:17:20.840771+02:00 Telcontar dovecot - - - imap: Warning: Time jumped forwards 35660 seconds > <22>1 2014-08-11T15:17:20.841006+02:00 Telcontar dovecot - - - imap(cer): Disconnected for inactivity in=237010 out=9273919 > <1>1 2014-08-11T15:17:22.173611+02:00 Telcontar kernel - - - [73235.439809] XFS: Internal error XFS_WANT_CORRUPTED_GOTO at line 1602 of file /home/abuild/rpmbuild/BUILD/kernel-desktop-3.11.10/linux-3.11/fs/xfs/xfs_alloc.c. Caller 0xffffffffa0c39fe9 > <1>1 2014-08-11T15:17:22.173625+02:00 Telcontar kernel - - - [73235.439809] > > > ... > > > <5>1 2014-08-11T15:17:22.174493+02:00 Telcontar kernel - - - [73235.440751] XFS (sdd5): xfs_do_force_shutdown(0x8) called from line 916 of file /home/abuild/rpmbuild/BUILD/kernel-desktop-3.11.10/linux-3.11/fs/xfs/xfs_bmap.c. Return address = 0xffffffffa0c4c3d8 > <1>1 2014-08-11T15:17:22.232589+02:00 Telcontar kernel - - - [73235.498979] XFS (sdd5): Corruption of in-memory data detected. Shutting down filesystem > <1>1 2014-08-11T15:17:22.232594+02:00 Telcontar kernel - - - [73235.499136] XFS (sdd5): Please umount the filesystem and rectify the problem(s) > <30>1 2014-08-11T15:17:22.716184+02:00 Telcontar systemd 1 - - Time has been changed > <30>1 2014-08-11T15:17:27.171188+02:00 Telcontar acpid - - - 1 client rule loaded > <28>1 2014-08-11T15:17:29.413944+02:00 Telcontar pm-utils - - - Thawing (95)... > <29>1 2014-08-11T15:17:30.048264+02:00 Telcontar dbus 1020 - - [system] Activating service name='org.freedesktop.PackageKit' (using servicehelper) > <30>1 2014-08-11T15:17:30.833496+02:00 Telcontar systemd 1 - - Starting LSB: Network time protocol daemon (ntpd)... > <4>1 2014-08-11T15:17:30.990470+02:00 Telcontar kernel - - - [73244.256012] XFS (sdd5): xfs_log_force: error 5 returned. > <29>1 2014-08-11T15:17:31.324585+02:00 Telcontar dbus 1020 - - [system] Activated service 'org.freedesktop.PackageKit' failed: Cannot launch daemon, file not found or permissions invalid > > > As you see, the corruption is detected instantly after waking up, before > pm-utils scripts have a chance to run. > > > > > >If the former, I wonder if it's possible that the scanner returns to > >life pointing to a stale or freed incore inode and does something bogus > >based on that. > > > Well, as I said, that's above my understanding ;-) > > > > - -- Cheers, > Carlos E. R. > (from 13.1 x86_64 "Bottle" at Telcontar) > -----BEGIN PGP SIGNATURE----- > Version: GnuPG v2.0.22 (GNU/Linux) > > iEYEARECAAYFAlPqhHwACgkQtTMYHG2NR9WmrwCglBRRHEMgU9mCEHkU9iHqYehX > +1AAn2oUn8/M3Rfb7mLWapLqYxDfvHNv > =9Yft > -----END PGP SIGNATURE----- > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From bfoster@redhat.com Wed Aug 13 07:59: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 (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 4EA4F7F3F for ; Wed, 13 Aug 2014 07:59:38 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id C6309AC002 for ; Wed, 13 Aug 2014 05:59:37 -0700 (PDT) X-ASG-Debug-ID: 1407934775-04cbb0508a106100001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id JwG1jfDcZmL7kmIX (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 13 Aug 2014 05:59: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 s7DCxYGZ024926 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 13 Aug 2014 08:59:34 -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 s7DCxXU2015903; Wed, 13 Aug 2014 08:59:33 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id A73C112577C; Wed, 13 Aug 2014 08:59:32 -0400 (EDT) Date: Wed, 13 Aug 2014 08:59:32 -0400 From: Brian Foster To: Dave Chinner Cc: Alex Lyakas , xfs@oss.sgi.com Subject: Re: use-after-free on log replay failure Message-ID: <20140813125932.GA4605@bfoster.bfoster> X-ASG-Orig-Subj: Re: use-after-free on log replay failure References: <9D3CBECB663B4A77B7EF74B67973310A@alyakaslap> <20140804230721.GA20518@dastard> <20140806152042.GB39990@bfoster.bfoster> <20140811132057.GA1186@bfoster.bfoster> <20140811215207.GS20518@dastard> <20140812120341.GA46654@bfoster.bfoster> <20140812235615.GB20518@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140812235615.GB20518@dastard> User-Agent: Mutt/1.5.23 (2014-03-12) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1407934776 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Wed, Aug 13, 2014 at 09:56:15AM +1000, Dave Chinner wrote: > On Tue, Aug 12, 2014 at 03:39:02PM +0300, Alex Lyakas wrote: > > Hello Dave, Brian, > > I will describe a generic reproduction that you ask for. > > > > It was performed on pristine XFS code from 3.8.13, taken from here: > > git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git > .... > > I mounted XFS with the following options: > > rw,sync,noatime,wsync,attr2,inode64,noquota 0 0 > > > > I started a couple of processes writing files sequentially onto this > > mount point, and after few seconds crashed the VM. > > When the VM came up, I took the metadump file and placed it in: > > https://drive.google.com/file/d/0ByBy89zr3kJNa0ZpdmZFS242RVU/edit?usp=sharing > > > > Then I set up the following Device Mapper target onto /dev/vde: > > dmsetup create VDE --table "0 41943040 linear-custom /dev/vde 0" > > I am attaching the code (and Makefile) of dm-linear-custom target. > > It is exact copy of dm-linear, except that it has a module > > parameter. With the parameter set to 0, this is an identity mapping > > onto /dev/vde. If the parameter is set to non-0, all WRITE bios are > > failed with ENOSPC. There is a workqueue to fail them in a different > > context (not sure if really needed, but that's what our "real" > > custom > > block device does). > > Well, they you go. That explains it - an asynchronous dispatch error > happening fast enough to race with the synchronous XFS dispatch > processing. > > dispatch thread device workqueue > xfs_buf_hold(); > atomic_set(b_io_remaining, 1) > atomic_inc(b_io_remaining) > submit_bio(bio) > queue_work(bio) > xfs_buf_ioend(bp, ....); > atomic_dec(b_io_remaining) > xfs_buf_rele() > bio error set to ENOSPC > bio->end_io() > xfs_buf_bio_endio() > bp->b_error = ENOSPC > _xfs_buf_ioend(bp, 1); > atomic_dec(b_io_remaining) > xfs_buf_ioend(bp, 1); > queue_work(bp) > xfs_buf_iowait() > if (bp->b_error) return error; > if (error) > xfs_buf_relse() > xfs_buf_rele() > xfs_buf_free() > > And now we have a freed buffer that is queued on the io completion > queue. Basically, it requires the buffer error to be set > asynchronously *between* the dispatch decrementing it's I/O count > after dispatch, but before we wait on the IO. > That's basically the theory I wanted to test with the experimental patch. E.g., the error check races with the iodone workqueue item. > Not sure what the right fix is yet - removing the bp->b_error check > from xfs_buf_iowait() doesn't solve the problem - it just prevents > this code path from being tripped over by the race condition. > Perhaps I'm missing some context... I don't follow how removing the error check doesn't solve the problem. It clearly closes the race and perhaps there are other means of doing the same thing, but what part of the problem does that leave unresolved? E.g., we provide a synchronization mechanism for an async submission path and an object (xfs_buf) that is involved with potentially multiple such async (I/O) operations. The async callback side manages the counts of outstanding bios etc. to set the state of the buf object correctly and fires a completion when everything is done. The calling side simply waits on the completion before it can analyze state of the object. Referring to anything inside that object that happens to be managed by the buffer I/O mechanism before the buffer is considered complete just seems generally racy. It looks like submit_bio() manages this by providing the error through the callback (always). It also doesn't look like submission path is guaranteed to be synchronous either (consider md, which appears to use workqueues and kernel threads)), so I'm not sure that '...; xfs_buf_iorequest(bp); if (bp->b_error)' is really safe anywhere unless you're explicitly looking for a write verifier error or something and do nothing further on the buf contingent on completion (e.g., freeing it or something it depends on). Brian > But, just to validate this is the problem, you should be able to > reproduce this on a 3.16 kernel. Can you try that, Alex? > > Cheers, > > Dave. > -- > Dave Chinner > david@fromorbit.com From bfoster@redhat.com Wed Aug 13 08:11: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 (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 283FC7F47 for ; Wed, 13 Aug 2014 08:11:50 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id F1F25304043 for ; Wed, 13 Aug 2014 06:11:46 -0700 (PDT) X-ASG-Debug-ID: 1407935505-04bdf06ef8107c10001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id H3vxisK7GGzaWWIo (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 13 Aug 2014 06:11: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-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 s7DDBhqk031274 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 13 Aug 2014 09:11:43 -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 s7DDBhZJ024650; Wed, 13 Aug 2014 09:11:43 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 7176F12577C; Wed, 13 Aug 2014 09:11:42 -0400 (EDT) Date: Wed, 13 Aug 2014 09:11:42 -0400 From: Brian Foster To: Dave Chinner Cc: Alex Lyakas , xfs@oss.sgi.com Subject: Re: use-after-free on log replay failure Message-ID: <20140813131142.GB4605@bfoster.bfoster> X-ASG-Orig-Subj: Re: use-after-free on log replay failure References: <9D3CBECB663B4A77B7EF74B67973310A@alyakaslap> <20140804230721.GA20518@dastard> <20140806152042.GB39990@bfoster.bfoster> <20140811132057.GA1186@bfoster.bfoster> <20140811215207.GS20518@dastard> <20140812120341.GA46654@bfoster.bfoster> <20140813000312.GC20518@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140813000312.GC20518@dastard> User-Agent: Mutt/1.5.23 (2014-03-12) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1407935505 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Wed, Aug 13, 2014 at 10:03:12AM +1000, Dave Chinner wrote: > On Tue, Aug 12, 2014 at 03:39:02PM +0300, Alex Lyakas wrote: > > Then I set up the following Device Mapper target onto /dev/vde: > > dmsetup create VDE --table "0 41943040 linear-custom /dev/vde 0" > > I am attaching the code (and Makefile) of dm-linear-custom target. > > It is exact copy of dm-linear, except that it has a module > > parameter. With the parameter set to 0, this is an identity mapping > > onto /dev/vde. If the parameter is set to non-0, all WRITE bios are > > failed with ENOSPC. There is a workqueue to fail them in a different > > context (not sure if really needed, but that's what our "real" > > custom > > block device does). > > FWIW, now I've looked at the dm module, this could easily be added > to the dm-flakey driver by adding a "queue_write_error" option > to it (i.e. similar to the current drop_writes and corrupt_bio_byte > options). > > If we add the code there, then we could add a debug-only XFS sysfs > variable to trigger the log recovery sleep, and then use dm-flakey > to queue and error out writes. That gives us a reproducable xfstest > for this condition. Brian, does that sound like a reasonable plan to > you? > It would be nice if we could avoid this kind of timing hack, but I'll have to look at the related code and see what we have for options. I'm also assuming the oops/crash is a consistent behavior when we hit the race, since that probably defines the failure mode of the test. But yeah, seems like a reasonable plan in general. Added to the todo list for once we have this sorted out... Brian > Thanks for describing the method you've been using to reproduce the > bug so clearly, Alex. > > Cheers, > > Dave. > -- > Dave Chinner > david@fromorbit.com From tinguely@sgi.com Wed Aug 13 08:29: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=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 0176C7F3F for ; Wed, 13 Aug 2014 08:29:43 -0500 (CDT) Received: from dhcp-128-162-232-117.americas.sgi.com (dhcp-128-162-232-117.americas.sgi.com [128.162.232.117]) by relay2.corp.sgi.com (Postfix) with ESMTP id 8FDE3304032; Wed, 13 Aug 2014 06:29:41 -0700 (PDT) Message-ID: <53EB6845.70804@sgi.com> Date: Wed, 13 Aug 2014 08:29:41 -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: "Carlos E. R." , XFS mailing list Subject: Re: Subject : Happened again, 20140811 -- Got "Internal error XFS_WANT_CORRUPTED_GOTO". Filesystem needs reformatting to correct issue. References: <53E8D9F6.7080704@sgi.com> <53E93530.4070902@sgi.com> <53E93C29.1020103@sgi.com> <20140812165143.GB46654@bfoster.bfoster> <20140813120450.GA3569@bfoster.bfoster> In-Reply-To: <20140813120450.GA3569@bfoster.bfoster> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 8bit On 08/13/14 07:04, Brian Foster wrote: > On Tue, Aug 12, 2014 at 11:17:36PM +0200, Carlos E. R. wrote: >> -----BEGIN PGP SIGNED MESSAGE----- >> Hash: SHA1 >> >> >> >> On Tuesday, 2014-08-12 at 12:51 -0400, Brian Foster wrote: >>> On Tue, Aug 12, 2014 at 02:17:00AM +0200, Carlos E. R. wrote: >> >>> I see the same thing from repair that was in your repair output: >>> >>> block (1,12608397-12608397) multiply claimed by cnt space tree, state - 2 >> >> Is it possible to find out what file uses that block? >> I have a non-obfuscated copy of the metadata. Knowing the file, we can know >> what application is involved - and that might help, or perhaps not. >> > > I don't see how given the current situation. The space appears to be > free initially, so zeroing the log contents on repair puts the fs in a > state where the space is not allocated to any particular file. Perhaps > there is some incremental state created by the log that can provide this > information (e.g., space is free, space is preallocated, extent is > converted, eofblocks are trimmed all in a single checkpoint), but that > could be difficult to trace back since iirc the btree had grown as well. > >> >>> If I take a look at the btrees as is, I see "235:[12608397,10]" included >>> in the bnobt (fsb 0x200aa55) and "270:[12608397,10]" in the cntbt (fsb >>> 0x2000781). If I skip the mount, zero the log and repair, everything >>> seems Ok. I can allocate the remainder of available space and rm -rf >>> everything in the fs without an error. >>> >>> Once I replay the log, I see "272:[12608397,10] 273:[12608397,10]" in >>> the cntbt, which is clearly a duplicate entry. This is what repair >>> detects and cleans up and seems to lead to the shutdown. E.g., if I >>> mount and use the fs, I can hit an assert or failure just by attempting >>> to allocate the rest of the space in the fs. If that is the state of the >>> fs on disk, it's only a matter of time we explode due to allocating and >>> freeing that range of space or possibly attempting to allocate that >>> space twice. >> >> I'm not sure if I follow you. >> >> The sequence of events here is: >> >> a) hibernate >> b) thaw >> c) immediately, in memory corruption found and kernel error message. >> Filesystem is switched to read only. >> System is unstable, has to be halted or rebooted. >> Umount is impossible. >> > > Ok, so the crash is fairly immediate after the wake (also according to > the log output below). > >> d) (¬) Reboot >> e) Mount (¬), manual umount, xfs_repair (¬), mount >> (photos of metadata taken at the appropriate points (marked with ¬)) >> >> >> This the point I'm at now. Are you saying that the filesystem can explode at >> any time now? I have not written any files, beyond what the desktop does >> automatically. >> > > No, the filesystem has been fixed by repair. I'm just saying that > somehow the fs creates a duplicate free space record in one of the free > space trees. That particular condition means it's only a matter of time > before some block allocation operation trips up on that inconsistent > state and shuts down the fs. You happen to hit it immediately due to > that space being involved with speculative preallocation. > > The current theory is that this is probably due to XFS workqueues not > being freezable, and therefore can make changes on disk after the dump > image is created. This seems logical to me, but I'd still like to see > some kind of verification of the potential fix if possible. I can repeat > some vm hibernate testing with that in mind. Alternatively, would you > have the ability to test a patch? Have you been able to reproduce this > again since the most recent instance? > > Brian I am still digging through the xfs log: I do not see anything in that extent range 46162829-46162839 being freed in the log. (or anything close to it). Late in the log, there is a write (op 27 of tid e9f15120) of a big portion of the interested AG1 cnt btree. So we know that it is good at that point. The the next two writes (op 66 of tid 6ed362ea and op 25 of tid 6281c8b) that write entry "8d63c000 a000000" to that block are the beginning of the 16 byte log write. Depending on the offset, it is possible that one of these writes could insert a duplicate entry. I will chase it further and see where and why this duplicate happens from a log perspective. --Mark. >> >> >> What I have not done (on your request), this time, is: >> >> f) backup, format, restore. >> >> >> >> >>> Mark mentioned that he didn't see the superblock item in the log with >>> regard to the freeze. I don't see that either... which perhaps suggests >>> that this all happens during the wake-from-hibernate sequence..? My >>> understanding is that we should freeze on hibernate, thus force >>> everything out to the log, write an unmount record and then dirty the >>> log with a superblock transaction. Therefore, that should be the only >>> item in the log post-freeze. Here, we have various items in the log >>> including several logged buffers that correspond to the cntbt block that >>> ends up corrupted (daddr 0xf427c08). >>> >>> Given the failure occurs on freeing an extent via the xfs_eofblocks >>> scanner, perhaps this extent was initially allocated as speculative >>> preallocation and the eofblocks scanner is where we happen to first >>> identify the corrupted cntbt. What is strange is that, as mentioned >>> previously, the space appears to be free if I zero the log, so that >>> means it was probably free before the freeze. It seems highly unlikely >>> for a file to gain preallocation, be written out and then get trimmed by >>> the scanner all on wake-from-hibernate. >> >> >> Well, I understand little of that, but if you do, and can do whatever >> modifications need to be done to the code, that's fine with me :-) >> >> >> >>> Carlos, >>> >>> How long after hibernate does the shutdown/crash typically occur? Do you >>> basically wake-up and within a few seconds the filesystem crashes, or is >>> it some time (minutes) later? >> >> Instantly during the wake-up (thaw), according to the log. >> >> I'm typically not present when it happens: my routine is switch on the >> computer, then go make coffee/tea, and then return and start using the >> machine. It takes a minute or two to wake up from hibernation, and then the >> machine is sluggish for a minute or two more while processes start doing >> things and claiming chunks from swap, mail is fetched, etc. >> >> And instead of starting work, I find the machine in a bad state. >> >> >> Look, an excerpt from the last event (the full log is in another post >> yesterday), but taken from another log file with finer grained timestaps: >> >> >> <30>1 2014-08-11T05:22:25.861413+02:00 Telcontar ntp 5867 - - Shutting down network time protocol daemon (NTPD)..done >> <30>1 2014-08-11T05:22:25.917520+02:00 Telcontar systemd 1 - - Stopped LSB: Network time protocol daemon (ntpd). >> <28>1 2014-08-11T05:22:25.977431+02:00 Telcontar pm-utils - - - Hibernating (95)... >> <7>1 2014-08-11T05:22:30.605714+02:00 Telcontar kernel - - - [73220.857511] PM: Marking nosave pages: [mem 0x0009f000-0x000fffff] >> <7>1 2014-08-11T05:22:30.605728+02:00 Telcontar kernel - - - [73220.857516] PM: Marking nosave pages: [mem 0xbff90000-0xffffffff] >> <7>1 2014-08-11T05:22:30.605729+02:00 Telcontar kernel - - - [73220.858132] PM: Basic memory bitmaps created >> <4>1 2014-08-11T15:17:18.911655+02:00 Telcontar kernel - - - [73221.946553] Syncing filesystems ... done. >> <4>1 2014-08-11T15:17:18.911744+02:00 Telcontar kernel - - - [73222.682396] Freezing user space processes ... (elapsed 0.002 seconds) done. >> <6>1 2014-08-11T15:17:18.911746+02:00 Telcontar kernel - - - [73222.685031] PM: Preallocating image memory... done (allocated 1140745 pages) >> >> >> The "Hibernating (95)" is written by a script of mine in >> "/etc/pm/sleep.d/95cosas" which main purpose is to write to the log that >> line. >> >> Then the machine wakes up, hours later - despite the timestamp not saying so >> (the time jump is written instead lines above): >> >> >> <6>1 2014-08-11T15:17:18.911768+02:00 Telcontar kernel - - - [73228.307358] CPU3 is up >> <6>1 2014-08-11T15:17:18.911769+02:00 Telcontar kernel - - - [73228.335219] PM: noirq restore of devices complete after 22.779 msecs >> <6>1 2014-08-11T15:17:18.911770+02:00 Telcontar kernel - - - [73228.335354] PM: early restore of devices complete after 0.110 msecs >> <7>1 2014-08-11T15:17:18.911771+02:00 Telcontar kernel - - - [73228.508789] uhci_hcd 0000:00:1a.0: setting latency timer to 64 >> <4>1 2014-08-11T15:17:18.911771+02:00 Telcontar kernel - - - [73228.508809] usb usb3: root hub lost power or was reset >> >> ... >> >> >> <6>1 2014-08-11T15:17:18.911838+02:00 Telcontar kernel - - - [73230.798419] r8169 0000:06:00.0 eth0: link up >> <6>1 2014-08-11T15:17:18.911839+02:00 Telcontar kernel - - - [73231.245103] PM: restore of devices complete after 2736.365 msecs >> <4>1 2014-08-11T15:17:18.911839+02:00 Telcontar kernel - - - [73231.514298] Restarting kernel threads ... done. >> <4>1 2014-08-11T15:17:18.911842+02:00 Telcontar kernel - - - [73231.518736] Restarting tasks ... done. >> <7>1 2014-08-11T15:17:18.911843+02:00 Telcontar kernel - - - [73231.562307] PM: Basic memory bitmaps freed >> <28>1 2014-08-11T15:17:19.946945+02:00 Telcontar rtkit-daemon 4535 - - The canary thread is apparently starving. Taking action. >> <30>1 2014-08-11T15:17:19.947259+02:00 Telcontar rtkit-daemon 4535 - - Demoting known real-time threads. >> <29>1 2014-08-11T15:17:19.951276+02:00 Telcontar rtkit-daemon 4535 - - Successfully demoted thread 4541 of process 4534 (/usr/bin/pulseaudio). >> <29>1 2014-08-11T15:17:19.951546+02:00 Telcontar rtkit-daemon 4535 - - Successfully demoted thread 4540 of process 4534 (/usr/bin/pulseaudio). >> <29>1 2014-08-11T15:17:19.951799+02:00 Telcontar rtkit-daemon 4535 - - Successfully demoted thread 4534 of process 4534 (/usr/bin/pulseaudio). >> <29>1 2014-08-11T15:17:19.952033+02:00 Telcontar rtkit-daemon 4535 - - Demoted 3 threads. >> <20>1 2014-08-11T15:17:20.808125+02:00 Telcontar dovecot - - - imap: Warning: Time jumped forwards 33996 seconds >> <20>1 2014-08-11T15:17:20.840771+02:00 Telcontar dovecot - - - imap: Warning: Time jumped forwards 35660 seconds >> <22>1 2014-08-11T15:17:20.841006+02:00 Telcontar dovecot - - - imap(cer): Disconnected for inactivity in=237010 out=9273919 >> <1>1 2014-08-11T15:17:22.173611+02:00 Telcontar kernel - - - [73235.439809] XFS: Internal error XFS_WANT_CORRUPTED_GOTO at line 1602 of file /home/abuild/rpmbuild/BUILD/kernel-desktop-3.11.10/linux-3.11/fs/xfs/xfs_alloc.c. Caller 0xffffffffa0c39fe9 >> <1>1 2014-08-11T15:17:22.173625+02:00 Telcontar kernel - - - [73235.439809] >> >> >> ... >> >> >> <5>1 2014-08-11T15:17:22.174493+02:00 Telcontar kernel - - - [73235.440751] XFS (sdd5): xfs_do_force_shutdown(0x8) called from line 916 of file /home/abuild/rpmbuild/BUILD/kernel-desktop-3.11.10/linux-3.11/fs/xfs/xfs_bmap.c. Return address = 0xffffffffa0c4c3d8 >> <1>1 2014-08-11T15:17:22.232589+02:00 Telcontar kernel - - - [73235.498979] XFS (sdd5): Corruption of in-memory data detected. Shutting down filesystem >> <1>1 2014-08-11T15:17:22.232594+02:00 Telcontar kernel - - - [73235.499136] XFS (sdd5): Please umount the filesystem and rectify the problem(s) >> <30>1 2014-08-11T15:17:22.716184+02:00 Telcontar systemd 1 - - Time has been changed >> <30>1 2014-08-11T15:17:27.171188+02:00 Telcontar acpid - - - 1 client rule loaded >> <28>1 2014-08-11T15:17:29.413944+02:00 Telcontar pm-utils - - - Thawing (95)... >> <29>1 2014-08-11T15:17:30.048264+02:00 Telcontar dbus 1020 - - [system] Activating service name='org.freedesktop.PackageKit' (using servicehelper) >> <30>1 2014-08-11T15:17:30.833496+02:00 Telcontar systemd 1 - - Starting LSB: Network time protocol daemon (ntpd)... >> <4>1 2014-08-11T15:17:30.990470+02:00 Telcontar kernel - - - [73244.256012] XFS (sdd5): xfs_log_force: error 5 returned. >> <29>1 2014-08-11T15:17:31.324585+02:00 Telcontar dbus 1020 - - [system] Activated service 'org.freedesktop.PackageKit' failed: Cannot launch daemon, file not found or permissions invalid >> >> >> As you see, the corruption is detected instantly after waking up, before >> pm-utils scripts have a chance to run. >> >> >> >> >>> If the former, I wonder if it's possible that the scanner returns to >>> life pointing to a stale or freed incore inode and does something bogus >>> based on that. >> >> >> Well, as I said, that's above my understanding ;-) >> >> >> >> - -- Cheers, >> Carlos E. R. >> (from 13.1 x86_64 "Bottle" at Telcontar) >> -----BEGIN PGP SIGNATURE----- >> Version: GnuPG v2.0.22 (GNU/Linux) >> >> iEYEARECAAYFAlPqhHwACgkQtTMYHG2NR9WmrwCglBRRHEMgU9mCEHkU9iHqYehX >> +1AAn2oUn8/M3Rfb7mLWapLqYxDfvHNv >> =9Yft >> -----END PGP SIGNATURE----- > >> _______________________________________________ >> xfs mailing list >> xfs@oss.sgi.com >> http://oss.sgi.com/mailman/listinfo/xfs > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From bfoster@redhat.com Wed Aug 13 10:42: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 (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id EB5B27F3F for ; Wed, 13 Aug 2014 10:42:40 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 63042AC002 for ; Wed, 13 Aug 2014 08:42:36 -0700 (PDT) X-ASG-Debug-ID: 1407944552-04cb6c4c96ef970001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id fVSuM75zJIBihFat (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 13 Aug 2014 08:42: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-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 s7DFgWbu006640 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK) for ; Wed, 13 Aug 2014 11:42:32 -0400 Received: from laptop.bfoster (vpn-55-52.rdu2.redhat.com [10.10.55.52]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s7DFgULb001792 (version=TLSv1/SSLv3 cipher=AES128-GCM-SHA256 bits=128 verify=NO) for ; Wed, 13 Aug 2014 11:42:31 -0400 Date: Wed, 13 Aug 2014 11:42:29 -0400 From: Brian Foster To: xfs@oss.sgi.com Subject: Re: [PATCH 2/2] xfs: hole the inode lock across a full file collapse Message-ID: <20140813154229.GB4426@laptop.bfoster> X-ASG-Orig-Subj: Re: [PATCH 2/2] xfs: hole the inode lock across a full file collapse References: <1407523766-62233-1-git-send-email-bfoster@redhat.com> <1407523766-62233-3-git-send-email-bfoster@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1407523766-62233-3-git-send-email-bfoster@redhat.com> User-Agent: Mutt/1.5.23 (2014-03-12) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1407944552 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Fri, Aug 08, 2014 at 02:49:26PM -0400, Brian Foster wrote: > A file collapse stress test workload reproduces collapse failures > mid-operation due to changes in the inode fork extent count across > extent shift cycles. xfs_collapse_file_space() currently calls > xfs_bmap_shift_extents() to shift one extent at a time per transaction. > The extent index is used to track the next extent to shift after each > iteration. > > A concurrent fsx and fsstress workload reproduces a scenario where the > extent count changes during this sequence, causing the 'current_ext' > index to become inaccurate and possibly skip shifting an extent. The > likely result of this behavior is the subsequent shift attempt will not > find a hole in the area of the skipped extent and fail, leaving the file > in a partially collapsed state. > > This occurs because the ilock is released and acquired across each > transaction and each individual extent shift. Tracepoint output shows > that once the ilock is released after an extent shift, a pending > blocking writeback (e.g., sync) can acquire the lock and proceed before > the next extent is shifted down. If the writeback converts part of a > delayed allocation earlier in the file, for example, it can insert a new > extent into the map. Tracing confirms a call to > xfs_bmap_add_extent_delay_real() in this particular instance. > > To prevent this scenario, hold the ilock across the entire extent shift > loop in xfs_collapse_file_space(). > > Signed-off-by: Brian Foster > --- > fs/xfs/xfs_bmap_util.c | 5 +++-- > 1 file changed, 3 insertions(+), 2 deletions(-) > > diff --git a/fs/xfs/xfs_bmap_util.c b/fs/xfs/xfs_bmap_util.c > index 2f1e30d..96eb97b 100644 > --- a/fs/xfs/xfs_bmap_util.c > +++ b/fs/xfs/xfs_bmap_util.c > @@ -1474,6 +1474,8 @@ xfs_collapse_file_space( > if (error) > return error; > > + xfs_ilock(ip, XFS_ILOCK_EXCL); > + I realized this moves the lock outside of the xfs_trans_reserve(), thus opening a potential deadlock scenario with regard to the log. I suppose this might be harder to hit in real life than a sync() causing the operation to fall over mid-sequence, so I'm still Ok with keeping this unless anybody objects. That said, we might still have to do something else here longer term... perhaps sync the whole file and revert to the original locking, or retain this locking scheme and use a rolling transaction. Anyways, food for thought.. Brian > while (!error && !done) { > tp = xfs_trans_alloc(mp, XFS_TRANS_DIOSTRAT); > /* > @@ -1489,7 +1491,6 @@ xfs_collapse_file_space( > 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, > @@ -1517,9 +1518,9 @@ xfs_collapse_file_space( > goto out; > > error = xfs_trans_commit(tp, XFS_TRANS_RELEASE_LOG_RES); > - xfs_iunlock(ip, XFS_ILOCK_EXCL); > } > > + xfs_iunlock(ip, XFS_ILOCK_EXCL); > return error; > > out: > -- > 1.8.3.1 > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From alex@zadarastorage.com Wed Aug 13 12:08: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=1.9 required=5.0 tests=STOX_REPLY_TYPE 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 7CDAE7F3F for ; Wed, 13 Aug 2014 12:08:05 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 104C5AC002 for ; Wed, 13 Aug 2014 10:08:01 -0700 (PDT) X-ASG-Debug-ID: 1407949677-04bdf06ef7116590001-NocioJ Received: from mail-wi0-f180.google.com (mail-wi0-f180.google.com [209.85.212.180]) by cuda.sgi.com with ESMTP id fKyPC9QyekedLuS2 (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Wed, 13 Aug 2014 10:07:58 -0700 (PDT) X-Barracuda-Envelope-From: alex@zadarastorage.com X-Barracuda-Apparent-Source-IP: 209.85.212.180 Received: by mail-wi0-f180.google.com with SMTP id n3so1119862wiv.7 for ; Wed, 13 Aug 2014 10:07:57 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:message-id:from:to:cc:references:in-reply-to :subject:date:mime-version:content-type:content-transfer-encoding :importance; bh=VVFNJHuPXmM7+I3M/rXACARtepevRsLh4HyjX5v30P4=; b=e9r1IK1S9904kp4uLldJ50Vjjpnmjp1Nkj7OdHr7z5kI/8TXE9kQaFU0sZVLkzZB+7 jEuUoqyrVjCJW1O+nHypVNE5XcwNsqN6DRQ3QbFzDbmY5CisrgFb6uX/ISz+pkdMfJDz PoSyLLiKr/BoOEkXbsXC6uuWQ+PNU9MGvEkOR7wfYijkd2bN5PV/U9QVXYq82awrb6no HJWUOiBEVoFujyRTFk5C21DKHbiTF+yALilP7+E7W2B6yWQRsZofcYwq3WRxjtRaKH02 OUau9eluO7YPTvYiqm1AWNpTdBaQo9sgFtJ/xfwU5DPa880E1vrUmMwiONXsWW04xyVf Y7tA== X-Gm-Message-State: ALoCoQkjtGh0eYlWvYwpPElcVsSc+QRlDfodFKZJPm3iVRgWeUce2Ui1xMY/47RYp7dZ3nLPqu4t X-Received: by 10.194.87.102 with SMTP id w6mr5630728wjz.24.1407949677155; Wed, 13 Aug 2014 10:07:57 -0700 (PDT) Received: from alyakaslap (bzq-169-168-31-234.red.bezeqint.net. [31.168.169.234]) by mx.google.com with ESMTPSA id k6sm5636842wjq.5.2014.08.13.10.07.55 for (version=TLSv1 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Wed, 13 Aug 2014 10:07:55 -0700 (PDT) Message-ID: From: "Alex Lyakas" To: "Dave Chinner" Cc: "Brian Foster" , References: <4B2A412C75324EE9880358513C069476@alyakaslap> <9D3CBECB663B4A77B7EF74B67973310A@alyakaslap> <20140804230721.GA20518@dastard> <20140806152042.GB39990@bfoster.bfoster> <20140811132057.GA1186@bfoster.bfoster> <20140811215207.GS20518@dastard> <20140812120341.GA46654@bfoster.bfoster> <20140812235615.GB20518@dastard> In-Reply-To: <20140812235615.GB20518@dastard> Subject: Re: use-after-free on log replay failure Date: Wed, 13 Aug 2014 20:07:58 +0300 X-ASG-Orig-Subj: Re: use-after-free on log replay failure MIME-Version: 1.0 Content-Type: text/plain; format=flowed; charset="iso-8859-1"; reply-type=original Content-Transfer-Encoding: 7bit X-Priority: 3 X-MSMail-Priority: Normal Importance: Normal X-Mailer: Microsoft Windows Live Mail 15.4.3555.308 X-MimeOLE: Produced By Microsoft MimeOLE V15.4.3555.308 X-Barracuda-Connect: mail-wi0-f180.google.com[209.85.212.180] X-Barracuda-Start-Time: 1407949678 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, MARKETING_SUBJECT, STOX_REPLY_TYPE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.8404 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 STOX_REPLY_TYPE STOX_REPLY_TYPE 0.60 MARKETING_SUBJECT Subject contains popular marketing words 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header Hi Dave, I compiled kernel 3.16 today, top commit being: commit 19583ca584d6f574384e17fe7613dfaeadcdc4a6 Author: Linus Torvalds Date: Sun Aug 3 15:25:02 2014 -0700 Linux 3.16 (also had to use the updated copy of dm-linear from 3.16). I would say that the problem reproduces, but it looks a little differently. Typical flow is: Aug 13 19:45:48 vc-00-00-1383-dev kernel: [ 143.521383] XFS (dm-0): Mounting V4 Filesystem Aug 13 19:45:48 vc-00-00-1383-dev kernel: [ 143.558558] XFS (dm-0): Sleep 10s before log recovery Aug 13 19:45:58 vc-00-00-1383-dev kernel: [ 153.560139] XFS (dm-0): Starting recovery (logdev: internal) Aug 13 19:45:59 vc-00-00-1383-dev kernel: [ 154.085826] XFS (dm-0): metadata I/O error: block 0x1 ("xlog_recover_iodone") error 28 numblks 1 Aug 13 19:45:59 vc-00-00-1383-dev kernel: [ 154.087336] XFS (dm-0): xfs_do_force_shutdown(0x1) called from line 383 of file /mnt/share/src/linux-mainline/fs/xfs/xfs_log_recover.c. Return address = 0xffffffffa030d5f8 Aug 13 19:45:59 vc-00-00-1383-dev kernel: [ 154.087341] XFS (dm-0): I/O Error Detected. Shutting down filesystem Aug 13 19:45:59 vc-00-00-1383-dev kernel: [ 154.088455] XFS (dm-0): Please umount the filesystem and rectify the problem(s) Aug 13 19:45:59 vc-00-00-1383-dev kernel: [ 154.088601] XFS (dm-0): metadata I/O error: block 0x8 ("xlog_recover_iodone") error 28 numblks 8 Aug 13 19:45:59 vc-00-00-1383-dev kernel: [ 154.088605] XFS (dm-0): xfs_do_force_shutdown(0x1) called from line 383 of file /mnt/share/src/linux-mainline/fs/xfs/xfs_log_recover.c. Return address = 0xffffffffa030d5f8 Aug 13 19:45:59 vc-00-00-1383-dev kernel: [ 154.088658] XFS (dm-0): metadata I/O error: block 0x10 ("xlog_recover_iodone") error 28 numblks 8 Aug 13 19:45:59 vc-00-00-1383-dev kernel: [ 154.088663] XFS (dm-0): xfs_do_force_shutdown(0x1) called from line 383 of file /mnt/share/src/linux-mainline/fs/xfs/xfs_log_recover.c. Return address = 0xffffffffa030d5f8 Aug 13 19:45:59 vc-00-00-1383-dev kernel: [ 154.088702] XFS (dm-0): metadata I/O error: block 0x40 ("xlog_recover_iodone") error 28 numblks 16 Aug 13 19:45:59 vc-00-00-1383-dev kernel: [ 154.088714] XFS (dm-0): xfs_do_force_shutdown(0x1) called from line 383 of file /mnt/share/src/linux-mainline/fs/xfs/xfs_log_recover.c. Return address = 0xffffffffa030d5f8 Aug 13 19:45:59 vc-00-00-1383-dev kernel: [ 154.088719] XFS (dm-0): metadata I/O error: block 0xa00060 ("xlog_recover_iodone") error 28 numblks 16 Aug 13 19:45:59 vc-00-00-1383-dev kernel: [ 154.088731] XFS (dm-0): xfs_do_force_shutdown(0x1) called from line 383 of file /mnt/share/src/linux-mainline/fs/xfs/xfs_log_recover.c. Return address = 0xffffffffa030d5f8 Aug 13 19:45:59 vc-00-00-1383-dev kernel: [ 154.096288] XFS (dm-0): log mount/recovery failed: error 28 Aug 13 19:45:59 vc-00-00-1383-dev kernel: [ 154.096482] XFS (dm-0): log mount failed So there is no clearly-looking problem like with my development kernel (which also had KMEMLEAK enabled, which changes timings significantly). However, after several seconds, kernel panics sporadically with stacks like [1], [2], and sometimes KVM dies on me with messages like[3], [4]. So definitely this test corrupts some internal kernel structures, and with KMEMLEAK enabled this corruption is more clear. I put the metadump from this experiment here: https://drive.google.com/file/d/0ByBy89zr3kJNSGxoc3U4X1lOZ2s/edit?usp=sharing Thanks, Alex. [1] Aug 13 19:46:01 vc-00-00-1383-dev kernel: [ 156.223389] BUG: unable to handle kernel paging request at 00007f9e50678000 Aug 13 19:46:01 vc-00-00-1383-dev kernel: [ 156.224019] IP: [] kmem_cache_alloc+0x68/0x160 Aug 13 19:46:01 vc-00-00-1383-dev kernel: [ 156.224019] PGD 362b8067 PUD 7a9d9067 PMD 7849f067 PTE 0 Aug 13 19:46:01 vc-00-00-1383-dev kernel: [ 156.224019] Oops: 0000 [#1] SMP Aug 13 19:46:01 vc-00-00-1383-dev kernel: [ 156.224019] Modules linked in: xfs(O) libcrc32c dm_linear_custom(O) deflate ctr twofish_generic twofish_x86_64_3way glue_helper lrw xts gf128mul twofish_x86_64 twofish_common camellia_generic serpent_generic blowfish_generic blowfish_x86_64 blowfish_common cast5_generic cast_common des_generic cmac xcbc rmd160 sha512_generic crypto_null af_key xfrm_algo dm_round_robin nfsd nfs_acl ppdev dm_multipath psmouse parport_pc serio_raw i2c_piix4 mac_hid lp rpcsec_gss_krb5 parport auth_rpcgss oid_registry nfsv4 nfs fscache lockd sunrpc floppy Aug 13 19:46:01 vc-00-00-1383-dev kernel: [ 156.224019] CPU: 1 PID: 3302 Comm: cron Tainted: G O 3.16.0-999-generic #201408131143 Aug 13 19:46:01 vc-00-00-1383-dev kernel: [ 156.224019] Hardware name: Bochs Bochs, BIOS Bochs 01/01/2007 Aug 13 19:46:01 vc-00-00-1383-dev kernel: [ 156.224019] task: ffff88007a9d48c0 ti: ffff88007aeb0000 task.ti: ffff88007aeb0000 Aug 13 19:46:01 vc-00-00-1383-dev kernel: [ 156.224019] RIP: 0010:[] [] kmem_cache_alloc+0x68/0x160 Aug 13 19:46:01 vc-00-00-1383-dev kernel: [ 156.224019] RSP: 0018:ffff88007aeb3cc0 EFLAGS: 00010286 Aug 13 19:46:01 vc-00-00-1383-dev kernel: [ 156.224019] RAX: 0000000000000000 RBX: ffff88007a137048 RCX: 000000000001ff04 Aug 13 19:46:01 vc-00-00-1383-dev kernel: [ 156.224019] RDX: 000000000001ff03 RSI: 00000000000000d0 RDI: 0000000000015d20 Aug 13 19:46:01 vc-00-00-1383-dev kernel: [ 156.224019] RBP: ffff88007aeb3d10 R08: ffff88007fc95d20 R09: 0000000000000003 Aug 13 19:46:01 vc-00-00-1383-dev kernel: [ 156.224019] R10: 0000000000000003 R11: ffff8800362b83d0 R12: ffff88007d001b00 Aug 13 19:46:01 vc-00-00-1383-dev kernel: [ 156.224019] R13: 00007f9e50678000 R14: ffffffff811767fd R15: 00000000000000d0 Aug 13 19:46:01 vc-00-00-1383-dev kernel: [ 156.224019] FS: 00007f9e5066b7c0(0000) GS:ffff88007fc80000(0000) knlGS:0000000000000000 Aug 13 19:46:01 vc-00-00-1383-dev kernel: [ 156.224019] CS: 0010 DS: 0000 ES: 0000 CR0: 000000008005003b Aug 13 19:46:01 vc-00-00-1383-dev kernel: [ 156.224019] CR2: 00007f9e50678000 CR3: 0000000036743000 CR4: 00000000000006e0 Aug 13 19:46:01 vc-00-00-1383-dev kernel: [ 156.224019] Stack: Aug 13 19:46:01 vc-00-00-1383-dev kernel: [ 156.224019] 00007f9e4e9d4fff ffffffff811767d6 0000000000000040 0000000000000048 Aug 13 19:46:01 vc-00-00-1383-dev kernel: [ 156.224019] ffff88007aeb3d40 ffff88007a137048 ffff88007af7cb80 ffff880079814da8 Aug 13 19:46:01 vc-00-00-1383-dev kernel: [ 156.224019] ffff88007af7cc38 ffff88007af7cc48 ffff88007aeb3d40 ffffffff811767fd Aug 13 19:46:01 vc-00-00-1383-dev kernel: [ 156.224019] Call Trace: Aug 13 19:46:01 vc-00-00-1383-dev kernel: [ 156.224019] [] ? anon_vma_fork+0x56/0x130 Aug 13 19:46:01 vc-00-00-1383-dev kernel: [ 156.224019] [] anon_vma_fork+0x7d/0x130 Aug 13 19:46:01 vc-00-00-1383-dev kernel: [ 156.224019] [] dup_mmap+0x1c5/0x380 Aug 13 19:46:01 vc-00-00-1383-dev kernel: [ 156.224019] [] dup_mm+0xbe/0x155 Aug 13 19:46:01 vc-00-00-1383-dev kernel: [ 156.224019] [] copy_mm+0xc6/0xe9 Aug 13 19:46:01 vc-00-00-1383-dev kernel: [ 156.224019] [] copy_process.part.35+0x694/0xe90 Aug 13 19:46:01 vc-00-00-1383-dev kernel: [ 156.224019] [] copy_process+0x80/0x90 Aug 13 19:46:01 vc-00-00-1383-dev kernel: [ 156.224019] [] do_fork+0x62/0x280 Aug 13 19:46:01 vc-00-00-1383-dev kernel: [ 156.224019] [] ? cap_task_setnice+0xe/0x10 Aug 13 19:46:01 vc-00-00-1383-dev kernel: [ 156.224019] [] ? security_task_setnice+0x16/0x20 Aug 13 19:46:01 vc-00-00-1383-dev kernel: [ 156.224019] [] ? set_one_prio+0x88/0xd0 Aug 13 19:46:01 vc-00-00-1383-dev kernel: [ 156.224019] [] SyS_clone+0x16/0x20 Aug 13 19:46:01 vc-00-00-1383-dev kernel: [ 156.224019] [] stub_clone+0x69/0x90 Aug 13 19:46:01 vc-00-00-1383-dev kernel: [ 156.224019] [] ? system_call_fastpath+0x16/0x1b Aug 13 19:46:01 vc-00-00-1383-dev kernel: [ 156.224019] Code: 00 49 8b 50 08 4d 8b 28 49 8b 40 10 4d 85 ed 0f 84 e6 00 00 00 48 85 c0 0f 84 dd 00 00 00 49 63 44 24 20 49 8b 3c 24 48 8d 4a 01 <49> 8b 5c 05 00 4c 89 e8 65 48 0f c7 0f 0f 94 c0 84 c0 74 b5 49 Aug 13 19:46:01 vc-00-00-1383-dev kernel: [ 156.224019] RIP [] kmem_cache_alloc+0x68/0x160 Aug 13 19:46:01 vc-00-00-1383-dev kernel: [ 156.224019] RSP Aug 13 19:46:01 vc-00-00-1383-dev kernel: [ 156.224019] CR2: 00007f9e50678000 Aug 13 19:46:01 vc-00-00-1383-dev kernel: [ 156.276967] ---[ end trace 56118c807adeb6de ]--- Aug 13 19:46:12 vc-00-00-1383-dev kernel: [ 167.136602] BUG: unable to handle kernel paging request at 00007f9e50678000 Aug 13 19:46:12 vc-00-00-1383-dev kernel: [ 167.137877] IP: [] kmem_cache_alloc_trace+0x6c/0x160 Aug 13 19:46:12 vc-00-00-1383-dev kernel: [ 167.139042] PGD 79732067 PUD 0 Aug 13 19:46:12 vc-00-00-1383-dev kernel: [ 167.139645] Oops: 0000 [#2] SMP Aug 13 19:46:12 vc-00-00-1383-dev kernel: [ 167.140050] Modules linked in: xfs(O) libcrc32c dm_linear_custom(O) deflate ctr twofish_generic twofish_x86_64_3way glue_helper lrw xts gf128mul twofish_x86_64 twofish_common camellia_generic serpent_generic blowfish_generic blowfish_x86_64 blowfish_common cast5_generic cast_common des_generic cmac xcbc rmd160 sha512_generic crypto_null af_key xfrm_algo dm_round_robin nfsd nfs_acl ppdev dm_multipath psmouse parport_pc serio_raw i2c_piix4 mac_hid lp rpcsec_gss_krb5 parport auth_rpcgss oid_registry nfsv4 nfs fscache lockd sunrpc floppy Aug 13 19:46:12 vc-00-00-1383-dev kernel: [ 167.140050] CPU: 1 PID: 1688 Comm: whoopsie Tainted: G D O 3.16.0-999-generic #201408131143 Aug 13 19:46:12 vc-00-00-1383-dev kernel: [ 167.140050] Hardware name: Bochs Bochs, BIOS Bochs 01/01/2007 Aug 13 19:46:12 vc-00-00-1383-dev kernel: [ 167.140050] task: ffff88007c261840 ti: ffff8800799a8000 task.ti: ffff8800799a8000 Aug 13 19:46:12 vc-00-00-1383-dev kernel: [ 167.140050] RIP: 0010:[] [] kmem_cache_alloc_trace+0x6c/0x160 Aug 13 19:46:12 vc-00-00-1383-dev kernel: [ 167.140050] RSP: 0018:ffff8800799abdd8 EFLAGS: 00010286 Aug 13 19:46:12 vc-00-00-1383-dev kernel: [ 167.140050] RAX: 0000000000000000 RBX: ffff88007bd0e080 RCX: 000000000001ff04 Aug 13 19:46:12 vc-00-00-1383-dev kernel: [ 167.140050] RDX: 000000000001ff03 RSI: 00000000000000d0 RDI: 0000000000015d20 Aug 13 19:46:12 vc-00-00-1383-dev kernel: [ 167.140050] RBP: ffff8800799abe28 R08: ffff88007fc95d20 R09: 0000000000000000 Aug 13 19:46:12 vc-00-00-1383-dev kernel: [ 167.140050] R10: 0000000000000000 R11: 0000000000000246 R12: ffff88007d001b00 Aug 13 19:46:12 vc-00-00-1383-dev kernel: [ 167.140050] R13: 00007f9e50678000 R14: ffffffff815bbbdb R15: 00000000000000d0 Aug 13 19:46:12 vc-00-00-1383-dev kernel: [ 167.140050] FS: 00007fa0248e37c0(0000) GS:ffff88007fc80000(0000) knlGS:0000000000000000 Aug 13 19:46:12 vc-00-00-1383-dev kernel: [ 167.140050] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 Aug 13 19:46:12 vc-00-00-1383-dev kernel: [ 167.140050] CR2: 00007f9e50678000 CR3: 00000000367c0000 CR4: 00000000000006e0 Aug 13 19:46:12 vc-00-00-1383-dev kernel: [ 167.140050] Stack: Aug 13 19:46:12 vc-00-00-1383-dev kernel: [ 167.140050] ffff88007c7ee780 ffffffff815bbbbd 0000000000000040 0000000000000280 Aug 13 19:46:12 vc-00-00-1383-dev kernel: [ 167.140050] ffff8800799abe08 ffff88007bd0e080 0000000000000000 0000000000000000 Aug 13 19:46:12 vc-00-00-1383-dev kernel: [ 167.140050] 0000000000000000 0000000000000000 ffff8800799abe58 ffffffff815bbbdb Aug 13 19:46:12 vc-00-00-1383-dev kernel: [ 167.140050] Call Trace: Aug 13 19:46:12 vc-00-00-1383-dev kernel: [ 167.140050] [] ? sock_alloc_inode+0x2d/0xd0 Aug 13 19:46:12 vc-00-00-1383-dev kernel: [ 167.140050] [] sock_alloc_inode+0x4b/0xd0 Aug 13 19:46:12 vc-00-00-1383-dev kernel: [ 167.140050] [] alloc_inode+0x26/0xa0 Aug 13 19:46:12 vc-00-00-1383-dev kernel: [ 167.140050] [] new_inode_pseudo+0x13/0x60 Aug 13 19:46:12 vc-00-00-1383-dev kernel: [ 167.140050] [] sock_alloc+0x1e/0x80 Aug 13 19:46:12 vc-00-00-1383-dev kernel: [ 167.140050] [] __sock_create+0x95/0x200 Aug 13 19:46:12 vc-00-00-1383-dev kernel: [ 167.140050] [] sock_create+0x30/0x40 Aug 13 19:46:12 vc-00-00-1383-dev kernel: [ 167.140050] [] SyS_socket+0x36/0xb0 Aug 13 19:46:12 vc-00-00-1383-dev kernel: [ 167.140050] [] system_call_fastpath+0x16/0x1b Aug 13 19:46:12 vc-00-00-1383-dev kernel: [ 167.140050] Code: 00 49 8b 50 08 4d 8b 28 49 8b 40 10 4d 85 ed 0f 84 e2 00 00 00 48 85 c0 0f 84 d9 00 00 00 49 63 44 24 20 49 8b 3c 24 48 8d 4a 01 <49> 8b 5c 05 00 4c 89 e8 65 48 0f c7 0f 0f 94 c0 84 c0 74 b5 49 Aug 13 19:46:12 vc-00-00-1383-dev kernel: [ 167.140050] RIP [] kmem_cache_alloc_trace+0x6c/0x160 Aug 13 19:46:12 vc-00-00-1383-dev kernel: [ 167.140050] RSP Aug 13 19:46:12 vc-00-00-1383-dev kernel: [ 167.140050] CR2: 00007f9e50678000 Aug 13 19:46:12 vc-00-00-1383-dev kernel: [ 167.185653] ---[ end trace 56118c807adeb6df ]--- [2] Aug 13 19:49:06 vc-00-00-1383-dev kernel: [ 118.566506] BUG: unable to handle kernel paging request at 00007f41d65a100c Aug 13 19:49:06 vc-00-00-1383-dev kernel: [ 118.567769] IP: [] vring_add_indirect+0x87/0x210 Aug 13 19:49:06 vc-00-00-1383-dev kernel: [ 118.568859] PGD 7b4a7067 PUD 7b4a8067 PMD 7b4aa067 PTE 8000000076f5b065 Aug 13 19:49:06 vc-00-00-1383-dev kernel: [ 118.570055] Oops: 0003 [#1] SMP Aug 13 19:49:06 vc-00-00-1383-dev kernel: [ 118.570399] Modules linked in: xfs(O) libcrc32c dm_linear_custom(O) deflate ctr twofish_generic twofish_x86_64_3way glue_helper lrw xts gf128mul twofish_x86_64 twofish_common camellia_generic serpent_generic blowfish_generic blowfish_x86_64 blowfish_common cast5_generic cast_common des_generic cmac xcbc rmd160 sha512_generic crypto_null af_key xfrm_algo nfsd nfs_acl dm_round_robin ppdev parport_pc mac_hid dm_multipath i2c_piix4 psmouse serio_raw rpcsec_gss_krb5 auth_rpcgss oid_registry lp nfsv4 parport nfs fscache lockd sunrpc floppy Aug 13 19:49:06 vc-00-00-1383-dev kernel: [ 118.570399] CPU: 3 PID: 3329 Comm: mount Tainted: G O 3.16.0-999-generic #201408131143 Aug 13 19:49:06 vc-00-00-1383-dev kernel: [ 118.570399] Hardware name: Bochs Bochs, BIOS Bochs 01/01/2007 Aug 13 19:49:06 vc-00-00-1383-dev kernel: [ 118.570399] task: ffff88007b2ac8c0 ti: ffff88007a900000 task.ti: ffff88007a900000 Aug 13 19:49:06 vc-00-00-1383-dev kernel: [ 118.570399] RIP: 0010:[] [] vring_add_indirect+0x87/0x210 Aug 13 19:49:06 vc-00-00-1383-dev kernel: [ 118.570399] RSP: 0018:ffff88007a903688 EFLAGS: 00010006 Aug 13 19:49:06 vc-00-00-1383-dev kernel: [ 118.570399] RAX: ffff88007a9037b8 RBX: ffff88007a903788 RCX: 00007f41d65a1000 Aug 13 19:49:06 vc-00-00-1383-dev kernel: [ 118.570399] RDX: 000000000001da11 RSI: 0000160000000000 RDI: ffff88007a9037b8 Aug 13 19:49:06 vc-00-00-1383-dev kernel: [ 118.570399] RBP: ffff88007a9036d8 R08: ffff88007fd95d20 R09: ffffffff814069f6 Aug 13 19:49:06 vc-00-00-1383-dev kernel: [ 118.570399] R10: 0000000000000003 R11: ffff88007a903860 R12: ffffffff81406cb0 Aug 13 19:49:06 vc-00-00-1383-dev kernel: [ 118.570399] R13: ffff88007c9ae000 R14: 0000000000000000 R15: 00007f41d65a1000 Aug 13 19:49:06 vc-00-00-1383-dev kernel: [ 118.570399] FS: 00007f41d67b5800(0000) GS:ffff88007fd80000(0000) knlGS:0000000000000000 Aug 13 19:49:06 vc-00-00-1383-dev kernel: [ 118.570399] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 Aug 13 19:49:06 vc-00-00-1383-dev kernel: [ 118.570399] CR2: 00007f41d65a100c CR3: 000000007a943000 CR4: 00000000000006e0 Aug 13 19:49:06 vc-00-00-1383-dev kernel: [ 118.570399] Stack: Aug 13 19:49:06 vc-00-00-1383-dev kernel: [ 118.570399] ffff88007fff8700 0000000300000202 000000007a9037b8 0000000100000002 Aug 13 19:49:06 vc-00-00-1383-dev kernel: [ 118.570399] ffff88007a903768 ffff88007c9ae000 ffff88007c9ae000 ffff88007a903788 Aug 13 19:49:06 vc-00-00-1383-dev kernel: [ 118.570399] 0000000000000001 0000000000000003 ffff88007a903768 ffffffff814072a2 Aug 13 19:49:06 vc-00-00-1383-dev kernel: [ 118.570399] Call Trace: Aug 13 19:49:06 vc-00-00-1383-dev kernel: [ 118.570399] [] virtqueue_add_sgs+0x2f2/0x340 Aug 13 19:49:06 vc-00-00-1383-dev kernel: [ 118.570399] [] __virtblk_add_req+0xda/0x1b0 Aug 13 19:49:06 vc-00-00-1383-dev kernel: [ 118.570399] [] ? __bt_get+0xc7/0x1e0 Aug 13 19:49:06 vc-00-00-1383-dev kernel: [ 118.570399] [] ? bt_get+0x5a/0x180 Aug 13 19:49:06 vc-00-00-1383-dev kernel: [ 118.570399] [] ? blk_rq_map_sg+0x3c/0x170 Aug 13 19:49:06 vc-00-00-1383-dev kernel: [ 118.570399] [] virtio_queue_rq+0xfa/0x250 Aug 13 19:49:06 vc-00-00-1383-dev kernel: [ 118.570399] [] __blk_mq_run_hw_queue+0xff/0x260 Aug 13 19:49:06 vc-00-00-1383-dev kernel: [ 118.570399] [] blk_mq_run_hw_queue+0x7d/0xb0 Aug 13 19:49:06 vc-00-00-1383-dev kernel: [ 118.570399] [] blk_sq_make_request+0x171/0x2f0 Aug 13 19:49:06 vc-00-00-1383-dev kernel: [ 118.570399] [] generic_make_request.part.75+0x75/0xb0 Aug 13 19:49:06 vc-00-00-1383-dev kernel: [ 118.570399] [] generic_make_request+0x68/0x70 Aug 13 19:49:06 vc-00-00-1383-dev kernel: [ 118.570399] [] submit_bio+0x75/0x140 Aug 13 19:49:06 vc-00-00-1383-dev kernel: [ 118.570399] [] _submit_bh+0x113/0x160 Aug 13 19:49:06 vc-00-00-1383-dev kernel: [ 118.570399] [] submit_bh+0x10/0x20 Aug 13 19:49:06 vc-00-00-1383-dev kernel: [ 118.570399] [] block_read_full_page+0x1f5/0x340 Aug 13 19:49:06 vc-00-00-1383-dev kernel: [ 118.570399] [] ? I_BDEV+0x10/0x10 Aug 13 19:49:06 vc-00-00-1383-dev kernel: [ 118.570399] [] ? __inc_zone_page_state+0x35/0x40 Aug 13 19:49:06 vc-00-00-1383-dev kernel: [ 118.570399] [] ? __add_to_page_cache_locked+0xa4/0x130 Aug 13 19:49:06 vc-00-00-1383-dev kernel: [ 118.570399] [] blkdev_readpage+0x18/0x20 Aug 13 19:49:06 vc-00-00-1383-dev kernel: [ 118.570399] [] read_pages+0xe8/0x100 Aug 13 19:49:06 vc-00-00-1383-dev kernel: [ 118.570399] [] __do_page_cache_readahead+0x163/0x170 Aug 13 19:49:06 vc-00-00-1383-dev kernel: [ 118.570399] [] force_page_cache_readahead+0x75/0xb0 Aug 13 19:49:06 vc-00-00-1383-dev kernel: [ 118.570399] [] page_cache_sync_readahead+0x43/0x50 Aug 13 19:49:06 vc-00-00-1383-dev kernel: [ 118.570399] [] do_generic_file_read+0x30e/0x490 Aug 13 19:49:06 vc-00-00-1383-dev kernel: [ 118.570399] [] generic_file_read_iter+0xf4/0x150 Aug 13 19:49:06 vc-00-00-1383-dev kernel: [ 118.570399] [] ? handle_mm_fault+0x48/0x80 Aug 13 19:49:06 vc-00-00-1383-dev kernel: [ 118.570399] [] ? find_vma+0x20/0x80 Aug 13 19:49:06 vc-00-00-1383-dev kernel: [ 118.570399] [] blkdev_read_iter+0x37/0x40 Aug 13 19:49:06 vc-00-00-1383-dev kernel: [ 118.570399] [] new_sync_read+0x78/0xb0 Aug 13 19:49:06 vc-00-00-1383-dev kernel: [ 118.570399] [] vfs_read+0xab/0x180 Aug 13 19:49:06 vc-00-00-1383-dev kernel: [ 118.570399] [] SyS_read+0x4f/0xb0 Aug 13 19:49:06 vc-00-00-1383-dev kernel: [ 118.570399] [] system_call_fastpath+0x16/0x1b Aug 13 19:49:06 vc-00-00-1383-dev kernel: [ 118.570399] Code: 00 00 00 00 48 63 45 c4 48 8b 04 c3 48 85 c0 74 59 0f 1f 00 49 63 ce 48 be 00 00 00 00 00 16 00 00 48 89 c7 48 c1 e1 04 4c 01 f9 <66> c7 41 0c 01 00 48 8b 10 48 83 e2 fc 48 01 f2 8b 70 08 48 c1 Aug 13 19:49:06 vc-00-00-1383-dev kernel: [ 118.570399] RIP [] vring_add_indirect+0x87/0x210 Aug 13 19:49:06 vc-00-00-1383-dev kernel: [ 118.570399] RSP Aug 13 19:49:06 vc-00-00-1383-dev kernel: [ 118.570399] CR2: 00007f41d65a100c Aug 13 19:49:06 vc-00-00-1383-dev kernel: [ 118.570399] ---[ end trace cc83f9989ae9e2af ]--- Aug 13 19:49:06 vc-00-00-1383-dev kernel: [ 118.570399] BUG: unable to handle kernel paging request at 0000000079a0b008 Aug 13 19:49:06 vc-00-00-1383-dev kernel: [ 118.570399] IP: [] acct_collect+0x60/0x1b0 Aug 13 19:49:06 vc-00-00-1383-dev kernel: [ 118.570399] PGD 7b4ac067 PUD 7b58c067 PMD 7b4a3067 PTE 0 Aug 13 19:49:06 vc-00-00-1383-dev kernel: [ 118.570399] Oops: 0000 [#2] SMP Aug 13 19:49:06 vc-00-00-1383-dev kernel: [ 118.570399] Modules linked in: xfs(O) libcrc32c dm_linear_custom(O) deflate ctr twofish_generic twofish_x86_64_3way glue_helper lrw xts gf128mul twofish_x86_64 twofish_common camellia_generic serpent_generic blowfish_generic blowfish_x86_64 blowfish_common cast5_generic cast_common des_generic cmac xcbc rmd160 sha512_generic crypto_null af_key xfrm_algo nfsd nfs_acl dm_round_robin ppdev parport_pc mac_hid dm_multipath i2c_piix4 psmouse serio_raw rpcsec_gss_krb5 auth_rpcgss oid_registry lp nfsv4 parport nfs fscache lockd sunrpc floppy Aug 13 19:49:06 vc-00-00-1383-dev kernel: [ 118.570399] CPU: 3 PID: 3329 Comm: mount Tainted: G D O 3.16.0-999-generic #201408131143 Aug 13 19:49:06 vc-00-00-1383-dev kernel: [ 118.570399] Hardware name: Bochs Bochs, BIOS Bochs 01/01/2007 Aug 13 19:49:06 vc-00-00-1383-dev kernel: [ 118.570399] task: ffff88007b2ac8c0 ti: ffff88007a900000 task.ti: ffff88007a900000 Aug 13 19:49:06 vc-00-00-1383-dev kernel: [ 118.570399] RIP: 0010:[] [] acct_collect+0x60/0x1b0 Aug 13 19:49:06 vc-00-00-1383-dev kernel: [ 118.570399] RSP: 0018:ffff88007a903328 EFLAGS: 00010006 Aug 13 19:49:06 vc-00-00-1383-dev kernel: [ 118.570399] RAX: 0000000079a0b000 RBX: 0000000000000009 RCX: 0000000000000245 Aug 13 19:49:06 vc-00-00-1383-dev kernel: [ 118.570399] RDX: 0000000000000275 RSI: 0000000000000001 RDI: ffff8800362fb860 Aug 13 19:49:06 vc-00-00-1383-dev kernel: [ 118.570399] RBP: ffff88007a903348 R08: 00007ffffffff000 R09: 0000000000000d01 Aug 13 19:49:06 vc-00-00-1383-dev kernel: [ 118.570399] R10: 0000000000000000 R11: 0000000000000000 R12: ffff88007afa4800 Aug 13 19:49:06 vc-00-00-1383-dev kernel: [ 118.570399] R13: ffff88007b2ac8c0 R14: 0001000101133010 R15: 0000000000000046 Aug 13 19:49:06 vc-00-00-1383-dev kernel: [ 118.570399] FS: 00007f41d67b5800(0000) GS:ffff88007fd80000(0000) knlGS:0000000000000000 Aug 13 19:49:06 vc-00-00-1383-dev kernel: [ 118.570399] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 Aug 13 19:49:06 vc-00-00-1383-dev kernel: [ 118.570399] CR2: 0000000079a0b008 CR3: 000000007a943000 CR4: 00000000000006e0 Aug 13 19:49:06 vc-00-00-1383-dev kernel: [ 118.570399] Stack: Aug 13 19:49:06 vc-00-00-1383-dev kernel: [ 118.570399] ffff88007b2ac8c0 0000000000000009 ffff88007a9035d8 0000000000000001 Aug 13 19:49:06 vc-00-00-1383-dev kernel: [ 118.570399] ffff88007a903398 ffffffff810582f7 0000000000000007 0000000000000006 Aug 13 19:49:06 vc-00-00-1383-dev kernel: [ 118.570399] 000000000000000a 0000000000000046 0000000000000009 ffff88007a9035d8 Aug 13 19:49:06 vc-00-00-1383-dev kernel: [ 118.570399] Call Trace: Aug 13 19:49:06 vc-00-00-1383-dev kernel: [ 118.570399] [] do_exit+0x367/0x470 Aug 13 19:49:06 vc-00-00-1383-dev kernel: [ 118.570399] [] oops_end+0xa5/0xf0 Aug 13 19:49:06 vc-00-00-1383-dev kernel: [ 118.570399] [] no_context+0x1be/0x1cd Aug 13 19:49:06 vc-00-00-1383-dev kernel: [ 118.570399] [] __bad_area_nosemaphore+0x1d2/0x1f1 Aug 13 19:49:06 vc-00-00-1383-dev kernel: [ 118.570399] [] bad_area_access_error+0x45/0x4e Aug 13 19:49:06 vc-00-00-1383-dev kernel: [ 118.570399] [] __do_page_fault+0x2fe/0x550 Aug 13 19:49:06 vc-00-00-1383-dev kernel: [ 118.570399] [] ? kernfs_path+0x55/0x70 Aug 13 19:49:06 vc-00-00-1383-dev kernel: [ 118.570399] [] ? cfq_find_alloc_queue+0x293/0x430 Aug 13 19:49:06 vc-00-00-1383-dev kernel: [ 118.570399] [] ? mempool_alloc_slab+0x15/0x20 Aug 13 19:49:06 vc-00-00-1383-dev kernel: [ 118.570399] [] ? mempool_alloc_slab+0x15/0x20 Aug 13 19:49:06 vc-00-00-1383-dev kernel: [ 118.570399] [] ? virtqueue_get_buf+0xe0/0xe0 Aug 13 19:49:06 vc-00-00-1383-dev kernel: [ 118.570399] [] do_page_fault+0xc/0x10 Aug 13 19:49:06 vc-00-00-1383-dev kernel: [ 118.570399] [] page_fault+0x22/0x30 Aug 13 19:49:06 vc-00-00-1383-dev kernel: [ 118.570399] [] ? virtqueue_get_buf+0xe0/0xe0 Aug 13 19:49:06 vc-00-00-1383-dev kernel: [ 118.570399] [] ? vring_add_indirect+0x36/0x210 Aug 13 19:49:06 vc-00-00-1383-dev kernel: [ 118.570399] [] ? vring_add_indirect+0x87/0x210 Aug 13 19:49:06 vc-00-00-1383-dev kernel: [ 118.570399] [] ? vring_add_indirect+0x36/0x210 Aug 13 19:49:06 vc-00-00-1383-dev kernel: [ 118.570399] [] virtqueue_add_sgs+0x2f2/0x340 Aug 13 19:49:06 vc-00-00-1383-dev kernel: [ 118.570399] [] __virtblk_add_req+0xda/0x1b0 Aug 13 19:49:06 vc-00-00-1383-dev kernel: [ 118.570399] [] ? __bt_get+0xc7/0x1e0 Aug 13 19:49:06 vc-00-00-1383-dev kernel: [ 118.570399] [] ? bt_get+0x5a/0x180 Aug 13 19:49:06 vc-00-00-1383-dev kernel: [ 118.570399] [] ? blk_rq_map_sg+0x3c/0x170 Aug 13 19:49:06 vc-00-00-1383-dev kernel: [ 118.570399] [] virtio_queue_rq+0xfa/0x250 Aug 13 19:49:06 vc-00-00-1383-dev kernel: [ 118.570399] [] __blk_mq_run_hw_queue+0xff/0x260 Aug 13 19:49:06 vc-00-00-1383-dev kernel: [ 118.570399] [] blk_mq_run_hw_queue+0x7d/0xb0 Aug 13 19:49:06 vc-00-00-1383-dev kernel: [ 118.570399] [] blk_sq_make_request+0x171/0x2f0 Aug 13 19:49:06 vc-00-00-1383-dev kernel: [ 118.570399] [] generic_make_request.part.75+0x75/0xb0 Aug 13 19:49:06 vc-00-00-1383-dev kernel: [ 118.570399] [] generic_make_request+0x68/0x70 Aug 13 19:49:06 vc-00-00-1383-dev kernel: [ 118.570399] [] submit_bio+0x75/0x140 Aug 13 19:49:06 vc-00-00-1383-dev kernel: [ 118.570399] [] _submit_bh+0x113/0x160 Aug 13 19:49:06 vc-00-00-1383-dev kernel: [ 118.570399] [] submit_bh+0x10/0x20 Aug 13 19:49:06 vc-00-00-1383-dev kernel: [ 118.570399] [] block_read_full_page+0x1f5/0x340 Aug 13 19:49:06 vc-00-00-1383-dev kernel: [ 118.570399] [] ? I_BDEV+0x10/0x10 Aug 13 19:49:06 vc-00-00-1383-dev kernel: [ 118.570399] [] ? __inc_zone_page_state+0x35/0x40 Aug 13 19:49:06 vc-00-00-1383-dev kernel: [ 118.570399] [] ? __add_to_page_cache_locked+0xa4/0x130 Aug 13 19:49:06 vc-00-00-1383-dev kernel: [ 118.570399] [] blkdev_readpage+0x18/0x20 Aug 13 19:49:06 vc-00-00-1383-dev kernel: [ 118.570399] [] read_pages+0xe8/0x100 Aug 13 19:49:06 vc-00-00-1383-dev kernel: [ 118.570399] [] __do_page_cache_readahead+0x163/0x170 Aug 13 19:49:06 vc-00-00-1383-dev kernel: [ 118.570399] [] force_page_cache_readahead+0x75/0xb0 Aug 13 19:49:06 vc-00-00-1383-dev kernel: [ 118.570399] [] page_cache_sync_readahead+0x43/0x50 Aug 13 19:49:06 vc-00-00-1383-dev kernel: [ 118.570399] [] do_generic_file_read+0x30e/0x490 Aug 13 19:49:06 vc-00-00-1383-dev kernel: [ 118.570399] [] generic_file_read_iter+0xf4/0x150 Aug 13 19:49:06 vc-00-00-1383-dev kernel: [ 118.570399] [] ? handle_mm_fault+0x48/0x80 Aug 13 19:49:06 vc-00-00-1383-dev kernel: [ 118.570399] [] ? find_vma+0x20/0x80 Aug 13 19:49:06 vc-00-00-1383-dev kernel: [ 118.570399] [] blkdev_read_iter+0x37/0x40 Aug 13 19:49:06 vc-00-00-1383-dev kernel: [ 118.570399] [] new_sync_read+0x78/0xb0 Aug 13 19:49:06 vc-00-00-1383-dev kernel: [ 118.570399] [] vfs_read+0xab/0x180 Aug 13 19:49:06 vc-00-00-1383-dev kernel: [ 118.570399] [] SyS_read+0x4f/0xb0 Aug 13 19:49:06 vc-00-00-1383-dev kernel: [ 118.570399] [] system_call_fastpath+0x16/0x1b Aug 13 19:49:06 vc-00-00-1383-dev kernel: [ 118.570399] Code: 00 74 55 49 8b bd a0 03 00 00 48 83 c7 60 e8 a8 65 61 00 49 8b 85 a0 03 00 00 48 8b 00 48 85 c0 74 1d 66 0f 1f 84 00 00 00 00 00 <4c> 03 70 08 4c 2b 30 48 8b 40 10 48 85 c0 75 f0 49 c1 ee 0a 65 Aug 13 19:49:06 vc-00-00-1383-dev kernel: [ 118.570399] RIP [] acct_collect+0x60/0x1b0 Aug 13 19:49:06 vc-00-00-1383-dev kernel: [ 118.570399] RSP Aug 13 19:49:06 vc-00-00-1383-dev kernel: [ 118.570399] CR2: 0000000079a0b008 Aug 13 19:49:06 vc-00-00-1383-dev kernel: [ 118.570399] ---[ end trace cc83f9989ae9e2b0 ]--- Aug 13 19:49:06 vc-00-00-1383-dev kernel: [ 118.570399] Fixing recursive fault but reboot is needed! [3] (qemu) KVM internal error. Suberror: 1 emulation failure RAX=0000000000000000 RBX=0000000000000000 RCX=0000000000000000 RDX=0000000000000623 RSI=0000000000000000 RDI=0000000000000000 RBP=0000000000000000 RSP=0000000000000000 R8 =0000000000000000 R9 =0000000000000000 R10=0000000000000000 R11=0000000000000000 R12=0000000000000000 R13=0000000000000000 R14=0000000000000000 R15=0000000000000000 RIP=000000000000fff0 RFL=00010002 [-------] CPL=3 II=0 A20=1 SMM=0 HLT=0 ES =0000 0000000000000000 ffffffff 00000000 CS =0033 0000000000000000 ffffffff 00a0fb00 DPL=3 CS64 [-RA] SS =002b 0000000000000000 ffffffff 00c0f300 DPL=3 DS [-WA] DS =0000 0000000000000000 ffffffff 00000000 FS =0000 00007f0514f7c700 ffffffff 00000000 GS =0000 0000000000000000 ffffffff 00000000 LDT=0000 0000000000000000 ffffffff 00000000 TR =0040 ffff88007fc90380 00002087 00008b00 DPL=0 TSS64-busy GDT= ffff88007fc84000 0000007f IDT= ffffffffff57c000 00000fff CR0=80050033 CR2=000000000061cd64 CR3=000000007ae6b000 CR4=000006e0 DR0=0000000000000000 DR1=0000000000000000 DR2=0000000000000000 DR3=0000000000000000 DR6=00000000ffff0ff0 DR7=0000000000000400 EFER=0000000000000d01 [4] (qemu) qemu-system-x86_64: virtio: trying to map MMIO memory -----Original Message----- From: Dave Chinner Sent: 13 August, 2014 2:56 AM To: Alex Lyakas Cc: Brian Foster ; xfs@oss.sgi.com Subject: Re: use-after-free on log replay failure On Tue, Aug 12, 2014 at 03:39:02PM +0300, Alex Lyakas wrote: > Hello Dave, Brian, > I will describe a generic reproduction that you ask for. > > It was performed on pristine XFS code from 3.8.13, taken from here: > git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git .... > I mounted XFS with the following options: > rw,sync,noatime,wsync,attr2,inode64,noquota 0 0 > > I started a couple of processes writing files sequentially onto this > mount point, and after few seconds crashed the VM. > When the VM came up, I took the metadump file and placed it in: > https://drive.google.com/file/d/0ByBy89zr3kJNa0ZpdmZFS242RVU/edit?usp=sharing > > Then I set up the following Device Mapper target onto /dev/vde: > dmsetup create VDE --table "0 41943040 linear-custom /dev/vde 0" > I am attaching the code (and Makefile) of dm-linear-custom target. > It is exact copy of dm-linear, except that it has a module > parameter. With the parameter set to 0, this is an identity mapping > onto /dev/vde. If the parameter is set to non-0, all WRITE bios are > failed with ENOSPC. There is a workqueue to fail them in a different > context (not sure if really needed, but that's what our "real" > custom > block device does). Well, they you go. That explains it - an asynchronous dispatch error happening fast enough to race with the synchronous XFS dispatch processing. dispatch thread device workqueue xfs_buf_hold(); atomic_set(b_io_remaining, 1) atomic_inc(b_io_remaining) submit_bio(bio) queue_work(bio) xfs_buf_ioend(bp, ....); atomic_dec(b_io_remaining) xfs_buf_rele() bio error set to ENOSPC bio->end_io() xfs_buf_bio_endio() bp->b_error = ENOSPC _xfs_buf_ioend(bp, 1); atomic_dec(b_io_remaining) xfs_buf_ioend(bp, 1); queue_work(bp) xfs_buf_iowait() if (bp->b_error) return error; if (error) xfs_buf_relse() xfs_buf_rele() xfs_buf_free() And now we have a freed buffer that is queued on the io completion queue. Basically, it requires the buffer error to be set asynchronously *between* the dispatch decrementing it's I/O count after dispatch, but before we wait on the IO. Not sure what the right fix is yet - removing the bp->b_error check from xfs_buf_iowait() doesn't solve the problem - it just prevents this code path from being tripped over by the race condition. But, just to validate this is the problem, you should be able to reproduce this on a 3.16 kernel. Can you try that, Alex? Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Wed Aug 13 15:59: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 (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id BFB237F3F for ; Wed, 13 Aug 2014 15:59:41 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 79DD5304043 for ; Wed, 13 Aug 2014 13:59:38 -0700 (PDT) X-ASG-Debug-ID: 1407963571-04bdf06ef6123500001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id O9OHAdJwAL5GM9eC for ; Wed, 13 Aug 2014 13:59:32 -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: AjgLADLR61N5LDJ8PGdsb2JhbABRCYMNUleCKqwQDAEBAQEBAQaYEweGRIFbhWsBgRUXBQEBAQE4NoQDAQEEAScTHCMFCwgDDgoJJQ8FJQMHGhOIOgcOxwUXGIVkiHVbB4MvgR0FhQMCkD6GdZhtKy8 Received: from ppp121-44-50-124.lns20.syd6.internode.on.net (HELO dastard) ([121.44.50.124]) by ipmail06.adl2.internode.on.net with ESMTP; 14 Aug 2014 06:29:30 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1XHfdp-0005iB-4o; Thu, 14 Aug 2014 06:59:29 +1000 Date: Thu, 14 Aug 2014 06:59:29 +1000 From: Dave Chinner To: Brian Foster Cc: Alex Lyakas , xfs@oss.sgi.com Subject: Re: use-after-free on log replay failure Message-ID: <20140813205929.GE20518@dastard> X-ASG-Orig-Subj: Re: use-after-free on log replay failure References: <20140804230721.GA20518@dastard> <20140806152042.GB39990@bfoster.bfoster> <20140811132057.GA1186@bfoster.bfoster> <20140811215207.GS20518@dastard> <20140812120341.GA46654@bfoster.bfoster> <20140812235615.GB20518@dastard> <20140813125932.GA4605@bfoster.bfoster> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140813125932.GA4605@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: 1407963571 X-Barracuda-URL: http://192.48.157.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.8411 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words On Wed, Aug 13, 2014 at 08:59:32AM -0400, Brian Foster wrote: > On Wed, Aug 13, 2014 at 09:56:15AM +1000, Dave Chinner wrote: > > On Tue, Aug 12, 2014 at 03:39:02PM +0300, Alex Lyakas wrote: > > > Hello Dave, Brian, > > > I will describe a generic reproduction that you ask for. > > > > > > It was performed on pristine XFS code from 3.8.13, taken from here: > > > git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git > > .... > > > I mounted XFS with the following options: > > > rw,sync,noatime,wsync,attr2,inode64,noquota 0 0 > > > > > > I started a couple of processes writing files sequentially onto this > > > mount point, and after few seconds crashed the VM. > > > When the VM came up, I took the metadump file and placed it in: > > > https://drive.google.com/file/d/0ByBy89zr3kJNa0ZpdmZFS242RVU/edit?usp=sharing > > > > > > Then I set up the following Device Mapper target onto /dev/vde: > > > dmsetup create VDE --table "0 41943040 linear-custom /dev/vde 0" > > > I am attaching the code (and Makefile) of dm-linear-custom target. > > > It is exact copy of dm-linear, except that it has a module > > > parameter. With the parameter set to 0, this is an identity mapping > > > onto /dev/vde. If the parameter is set to non-0, all WRITE bios are > > > failed with ENOSPC. There is a workqueue to fail them in a different > > > context (not sure if really needed, but that's what our "real" > > > custom > > > block device does). > > > > Well, they you go. That explains it - an asynchronous dispatch error > > happening fast enough to race with the synchronous XFS dispatch > > processing. > > > > dispatch thread device workqueue > > xfs_buf_hold(); > > atomic_set(b_io_remaining, 1) > > atomic_inc(b_io_remaining) > > submit_bio(bio) > > queue_work(bio) > > xfs_buf_ioend(bp, ....); > > atomic_dec(b_io_remaining) > > xfs_buf_rele() > > bio error set to ENOSPC > > bio->end_io() > > xfs_buf_bio_endio() > > bp->b_error = ENOSPC > > _xfs_buf_ioend(bp, 1); > > atomic_dec(b_io_remaining) > > xfs_buf_ioend(bp, 1); > > queue_work(bp) > > xfs_buf_iowait() > > if (bp->b_error) return error; > > if (error) > > xfs_buf_relse() > > xfs_buf_rele() > > xfs_buf_free() > > > > And now we have a freed buffer that is queued on the io completion > > queue. Basically, it requires the buffer error to be set > > asynchronously *between* the dispatch decrementing it's I/O count > > after dispatch, but before we wait on the IO. > > > > That's basically the theory I wanted to test with the experimental > patch. E.g., the error check races with the iodone workqueue item. > > > Not sure what the right fix is yet - removing the bp->b_error check > > from xfs_buf_iowait() doesn't solve the problem - it just prevents > > this code path from being tripped over by the race condition. > > > > Perhaps I'm missing some context... I don't follow how removing the > error check doesn't solve the problem. It clearly closes the race and > perhaps there are other means of doing the same thing, but what part of > the problem does that leave unresolved? Anything that does: xfs_buf_iorequest(bp); if (bp->b_error) xfs_buf_relse(bp); is susceptible to the same race condition. based on bp->b_error being set asynchronously and before the buffer IO completion processing is complete. > E.g., we provide a > synchronization mechanism for an async submission path and an object > (xfs_buf) that is involved with potentially multiple such async (I/O) > operations. The async callback side manages the counts of outstanding > bios etc. to set the state of the buf object correctly and fires a > completion when everything is done. The calling side simply waits on the > completion before it can analyze state of the object. Referring to > anything inside that object that happens to be managed by the buffer I/O > mechanism before the buffer is considered complete just seems generally > racy. The point is that the IO submitter holds the buffer lock and so has "exclusive" access to the buffer, even after it is submitted. It is allowed to check the internal state of the buffer at any time, and it is expected to be sane, including while IO completion processing is running. The real issue is that workqueue based IO completion processing is not protected by a reference count of any kind for synchronous IO. It is done with only the reference count of lock holder held, and so if the lock holder unlocks and frees the buffer, then that buffer will be freed. This issue doesn't exist with B_ASYNC IO submission, because the B_ASYNC IO owns the reference and the the buffer lock and drops them from the workqueue when the IO comlpetion processing actuall completes... > It looks like submit_bio() manages this by providing the error through > the callback (always). It also doesn't look like submission path is > guaranteed to be synchronous either (consider md, which appears to use > workqueues and kernel threads)), so I'm not sure that '...; > xfs_buf_iorequest(bp); if (bp->b_error)' is really safe anywhere unless > you're explicitly looking for a write verifier error or something and > do nothing further on the buf contingent on completion (e.g., freeing it > or something it depends on). My point remains that it *should be safe*, and the intent is that the caller should be able to check for submission errors without being exposed to a use after free situation. That's the bug we need to fix, not say "you can't check for submission errors on synchronous IO" to avoid the race condition..... Cheers, Dave -- Dave Chinner david@fromorbit.com From david@fromorbit.com Wed Aug 13 16:04: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 D66D87F4E for ; Wed, 13 Aug 2014 16: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 5C705AC006 for ; Wed, 13 Aug 2014 14:04:49 -0700 (PDT) X-ASG-Debug-ID: 1407963884-04cbb0508a122fe0001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id W5tPLqMq5kbCYokO for ; Wed, 13 Aug 2014 14:04:45 -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: AlgUAFTS61N5LDJ8PGdsb2JhbABagw2BKYIqhQenFQEBAQEBB6A5hWsBgRUXBQEBAQE4NoQEAQU6HCMQCAMOCgkaCw8FJQMHGhOIQccUFxiFZIYhgy8Hgy+BHQWcOIwGiw+BWCsv Received: from ppp121-44-50-124.lns20.syd6.internode.on.net (HELO dastard) ([121.44.50.124]) by ipmail06.adl2.internode.on.net with ESMTP; 14 Aug 2014 06:34:12 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1XHfiL-0005jV-4y; Thu, 14 Aug 2014 07:04:09 +1000 Date: Thu, 14 Aug 2014 07:04:09 +1000 From: Dave Chinner To: Brian Foster Cc: "Carlos E. R." , XFS mailing list Subject: Re: Subject : Happened again, 20140811 -- Got "Internal error XFS_WANT_CORRUPTED_GOTO". Filesystem needs reformatting to correct issue. Message-ID: <20140813210409.GF20518@dastard> X-ASG-Orig-Subj: Re: Subject : Happened again, 20140811 -- Got "Internal error XFS_WANT_CORRUPTED_GOTO". Filesystem needs reformatting to correct issue. References: <53E8D9F6.7080704@sgi.com> <53E93530.4070902@sgi.com> <53E93C29.1020103@sgi.com> <20140812165143.GB46654@bfoster.bfoster> <20140813120450.GA3569@bfoster.bfoster> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140813120450.GA3569@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: 1407963884 X-Barracuda-URL: http://192.48.176.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.8411 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Wed, Aug 13, 2014 at 08:04:51AM -0400, Brian Foster wrote: > On Tue, Aug 12, 2014 at 11:17:36PM +0200, Carlos E. R. wrote: > > This the point I'm at now. Are you saying that the filesystem can explode at > > any time now? I have not written any files, beyond what the desktop does > > automatically. > > > > No, the filesystem has been fixed by repair. I'm just saying that > somehow the fs creates a duplicate free space record in one of the free > space trees. Simple answer: the block is being freed twice. i.e. from a workqueue during the hibernate process after the relevant memory has been snapshotted (i.e. because the workqueue was not frozen), and again after thaw when the memory image is restored to RAM and the workqueue is started up again and the workqueue runs the same work a second time. Cheers, Dave. -- Dave Chinner david@fromorbit.com From zhangxiufeng@crosston.com Wed Aug 13 17:44: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=3.2 required=5.0 tests=DEAR_SOMETHING, FREEMAIL_FORGED_REPLYTO autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 79B3E7F51 for ; Wed, 13 Aug 2014 17:44:01 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 50631304043 for ; Wed, 13 Aug 2014 15:43:57 -0700 (PDT) X-ASG-Debug-ID: 1407969832-04cbb0508d125a30001-NocioJ Received: from smtp5x01.east.net (smtp5x01.east.net [211.100.47.38]) by cuda.sgi.com with ESMTP id IXBkV7Zii9srwCiP for ; Wed, 13 Aug 2014 15:43:53 -0700 (PDT) X-Barracuda-Envelope-From: zhangxiufeng@crosston.com X-Barracuda-Apparent-Source-IP: 211.100.47.38 Received: from [173.208.175.184] (unknown [173.208.175.184]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by smtp5x01.east.net (Postfix) with ESMTPSA id 599847FE8; Thu, 14 Aug 2014 06:43:46 +0800 (CST) Content-Type: text/plain; charset="iso-8859-1" MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Description: Mail message body Subject: Direct provider To: Recipient X-ASG-Orig-Subj: Direct provider From: "financial links" Date: Wed, 13 Aug 2014 15:43:25 -0700 Reply-To: financial.links@aol.com X-Barracuda-Connect: smtp5x01.east.net[211.100.47.38] X-Barracuda-Start-Time: 1407969832 X-Barracuda-URL: http://192.48.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.84 X-Barracuda-Spam-Status: No, SCORE=1.84 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_SA609_MID, BSF_SC0_SA_TO_FROM_ADDR_MATCH, MISSING_MID X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.8414 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.14 MISSING_MID Missing Message-Id: header 0.50 BSF_SC0_SA_TO_FROM_ADDR_MATCH Sender Address Matches Recipient Address 1.20 BSF_SC0_SA609_MID Custom Rule SA609_MID Message-Id: <20140813224357.D9D34106C883@cuda.sgi.com> Dear Sir/Mdm, = We are direct provider for wire transfer instruments. Issuance banks are AA= A rated banks in Europe, America, Middle East and Asia. Our MT103 and BG/SB= LC Financing can help you get your project funded by cash backed wire trans= fer. We work directly with banks and owners of funds, our cash Instruments = can be monetized for 100% funding of your projects. Intermediaries/Consultants/Brokers are welcome to bring their clients and a= re 100% protected. In complete confidence, we will work together in transpa= rent way for the benefits/doubts and protection of all parties involved. = For further details do make contact with me. Kind regard, Jose. From bfoster@redhat.com Wed Aug 13 18: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 9ED867F3F for ; Wed, 13 Aug 2014 18:21:51 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 83ADD8F8059 for ; Wed, 13 Aug 2014 16:21:51 -0700 (PDT) X-ASG-Debug-ID: 1407972106-04cb6c4c93104450001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 7TOj6su2b9MvALH3 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 13 Aug 2014 16:21:47 -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 s7DNLcGQ007189 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 13 Aug 2014 19:21:38 -0400 Received: from laptop.bfoster (vpn-55-52.rdu2.redhat.com [10.10.55.52]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s7DNLZaL027668 (version=TLSv1/SSLv3 cipher=AES128-GCM-SHA256 bits=128 verify=NO); Wed, 13 Aug 2014 19:21:37 -0400 Date: Wed, 13 Aug 2014 19:21:35 -0400 From: Brian Foster To: Dave Chinner Cc: Alex Lyakas , xfs@oss.sgi.com Subject: Re: use-after-free on log replay failure Message-ID: <20140813232135.GB8456@laptop.bfoster> X-ASG-Orig-Subj: Re: use-after-free on log replay failure References: <20140806152042.GB39990@bfoster.bfoster> <20140811132057.GA1186@bfoster.bfoster> <20140811215207.GS20518@dastard> <20140812120341.GA46654@bfoster.bfoster> <20140812235615.GB20518@dastard> <20140813125932.GA4605@bfoster.bfoster> <20140813205929.GE20518@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140813205929.GE20518@dastard> User-Agent: Mutt/1.5.23 (2014-03-12) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1407972107 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Thu, Aug 14, 2014 at 06:59:29AM +1000, Dave Chinner wrote: > On Wed, Aug 13, 2014 at 08:59:32AM -0400, Brian Foster wrote: > > On Wed, Aug 13, 2014 at 09:56:15AM +1000, Dave Chinner wrote: > > > On Tue, Aug 12, 2014 at 03:39:02PM +0300, Alex Lyakas wrote: > > > > Hello Dave, Brian, > > > > I will describe a generic reproduction that you ask for. > > > > > > > > It was performed on pristine XFS code from 3.8.13, taken from here: > > > > git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git > > > .... > > > > I mounted XFS with the following options: > > > > rw,sync,noatime,wsync,attr2,inode64,noquota 0 0 > > > > > > > > I started a couple of processes writing files sequentially onto this > > > > mount point, and after few seconds crashed the VM. > > > > When the VM came up, I took the metadump file and placed it in: > > > > https://drive.google.com/file/d/0ByBy89zr3kJNa0ZpdmZFS242RVU/edit?usp=sharing > > > > > > > > Then I set up the following Device Mapper target onto /dev/vde: > > > > dmsetup create VDE --table "0 41943040 linear-custom /dev/vde 0" > > > > I am attaching the code (and Makefile) of dm-linear-custom target. > > > > It is exact copy of dm-linear, except that it has a module > > > > parameter. With the parameter set to 0, this is an identity mapping > > > > onto /dev/vde. If the parameter is set to non-0, all WRITE bios are > > > > failed with ENOSPC. There is a workqueue to fail them in a different > > > > context (not sure if really needed, but that's what our "real" > > > > custom > > > > block device does). > > > > > > Well, they you go. That explains it - an asynchronous dispatch error > > > happening fast enough to race with the synchronous XFS dispatch > > > processing. > > > > > > dispatch thread device workqueue > > > xfs_buf_hold(); > > > atomic_set(b_io_remaining, 1) > > > atomic_inc(b_io_remaining) > > > submit_bio(bio) > > > queue_work(bio) > > > xfs_buf_ioend(bp, ....); > > > atomic_dec(b_io_remaining) > > > xfs_buf_rele() > > > bio error set to ENOSPC > > > bio->end_io() > > > xfs_buf_bio_endio() > > > bp->b_error = ENOSPC > > > _xfs_buf_ioend(bp, 1); > > > atomic_dec(b_io_remaining) > > > xfs_buf_ioend(bp, 1); > > > queue_work(bp) > > > xfs_buf_iowait() > > > if (bp->b_error) return error; > > > if (error) > > > xfs_buf_relse() > > > xfs_buf_rele() > > > xfs_buf_free() > > > > > > And now we have a freed buffer that is queued on the io completion > > > queue. Basically, it requires the buffer error to be set > > > asynchronously *between* the dispatch decrementing it's I/O count > > > after dispatch, but before we wait on the IO. > > > > > > > That's basically the theory I wanted to test with the experimental > > patch. E.g., the error check races with the iodone workqueue item. > > > > > Not sure what the right fix is yet - removing the bp->b_error check > > > from xfs_buf_iowait() doesn't solve the problem - it just prevents > > > this code path from being tripped over by the race condition. > > > > > > > Perhaps I'm missing some context... I don't follow how removing the > > error check doesn't solve the problem. It clearly closes the race and > > perhaps there are other means of doing the same thing, but what part of > > the problem does that leave unresolved? > > Anything that does: > > xfs_buf_iorequest(bp); > if (bp->b_error) > xfs_buf_relse(bp); > > is susceptible to the same race condition. based on bp->b_error > being set asynchronously and before the buffer IO completion > processing is complete. > Understood, by why would anything do that (as opposed to xfs_buf_iowait())? I don't see that we do that anywhere today (the check buried within xfs_buf_iowait() notwithstanding of course). >From what I can see, all it really guarantees is that the submission has either passed/failed the write verifier, yes? > > > E.g., we provide a > > synchronization mechanism for an async submission path and an object > > (xfs_buf) that is involved with potentially multiple such async (I/O) > > operations. The async callback side manages the counts of outstanding > > bios etc. to set the state of the buf object correctly and fires a > > completion when everything is done. The calling side simply waits on the > > completion before it can analyze state of the object. Referring to > > anything inside that object that happens to be managed by the buffer I/O > > mechanism before the buffer is considered complete just seems generally > > racy. > > The point is that the IO submitter holds the buffer lock and so has > "exclusive" access to the buffer, even after it is submitted. It is > allowed to check the internal state of the buffer at any time, and > it is expected to be sane, including while IO completion processing > is running. > Fair enough, but if the mechanism is async the submitter clearly knows that's not failsafe (i.e., passing the check above doesn't mean the I/O will not fail). > The real issue is that workqueue based IO completion processing is > not protected by a reference count of any kind for synchronous IO. > It is done with only the reference count of lock holder held, and so > if the lock holder unlocks and frees the buffer, then that buffer > will be freed. > I see, the notion of the work item having a hold/refcount on the buffer makes sense. But with a submission/wait mechanism that waits on actual "completion" of the I/O (e.g., complete(bp->b_iowait)), that only offers protection for the case where a sync I/O submitter doesn't wait. I suppose that's possible, but also seems like a misuse of sync I/O. E.g., why wouldn't that caller do async I/O? > This issue doesn't exist with B_ASYNC IO submission, because the > B_ASYNC IO owns the reference and the the buffer lock and drops them > from the workqueue when the IO comlpetion processing actuall > completes... > Indeed. I wasn't clear on the reference ownership nuance between the sync/async variants of I/O. Thanks for the context. That said, we also don't have submitters that check for errors on async I/O either. > > It looks like submit_bio() manages this by providing the error through > > the callback (always). It also doesn't look like submission path is > > guaranteed to be synchronous either (consider md, which appears to use > > workqueues and kernel threads)), so I'm not sure that '...; > > xfs_buf_iorequest(bp); if (bp->b_error)' is really safe anywhere unless > > you're explicitly looking for a write verifier error or something and > > do nothing further on the buf contingent on completion (e.g., freeing it > > or something it depends on). > > My point remains that it *should be safe*, and the intent is that > the caller should be able to check for submission errors without > being exposed to a use after free situation. That's the bug we need > to fix, not say "you can't check for submission errors on > synchronous IO" to avoid the race condition..... > Well, technically you can check for submission errors on sync I/O, just use the code you posted above. :) What we can't currently do is find out when the I/O subsystem is done with the buffer. Perhaps the point here is around the semantics of xfs_buf_iowait(). With a mechanism that is fundamentally async, the sync variant obviously becomes the async mechanism + some kind of synchronization. I'd expect that synchronization to not necessarily just tell me whether an error occurred, but also tell me when the I/O subsystem is done with the object I've passed (e.g., so I'm free to chuck it, scribble over it, put it back where I got it, whatever). My impression is that's the purpose of the b_iowait mechanism. Otherwise, what's the point of the whole bio_end_io->buf_ioend->b_iodone->buf_ioend round trip dance? Brian > Cheers, > > Dave > -- > Dave Chinner > david@fromorbit.com From test@reunionesecretariales.info Wed Aug 13 21:13: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=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 0E4D57F3F for ; Wed, 13 Aug 2014 21:13:16 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id CD465304032 for ; Wed, 13 Aug 2014 19:13:15 -0700 (PDT) X-ASG-Debug-ID: 1407982390-04cbb0508b12c750001-NocioJ Received: from mail.reunionesecretariales.info (mail.reunionesecretariales.info [66.148.68.24]) by cuda.sgi.com with ESMTP id FXJ70Si6u0LsBB7p for ; Wed, 13 Aug 2014 19:13:10 -0700 (PDT) X-Barracuda-Envelope-From: test@reunionesecretariales.info X-Barracuda-Apparent-Source-IP: 66.148.68.24 Received: from SUPERB-TLBSC4RS (66.148.68.24) by mail.reunionesecretariales.info id htgdhm0our0b for ; Wed, 13 Aug 2014 21:12:39 -0500 (envelope-from ) poppop: fd25f39a-7480-48bc-843f-89413644a548 Message-ID: <1a00ebf9f99d1eed6150a80a001c83f2@reunionesecretariales.info> From: "Funciones Medulares" To: Subject: Recursos Humanos, Que Medir y Por Que Date: Wed, 13 Aug 2014 21:12:39 -0500 X-ASG-Orig-Subj: Recursos Humanos, Que Medir y Por Que MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="----=SPLITOR00A_001_43270671D" X-Barracuda-Connect: mail.reunionesecretariales.info[66.148.68.24] X-Barracuda-Start-Time: 1407982390 X-Barracuda-URL: http://192.48.176.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.8421 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. ------=SPLITOR00A_001_43270671D Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable =20 Recursos Humanos, Qu=C3=A9 Medir y Por Qu=C3=A9 M=C3=A9xico, D.F. 04 de septiembre 2014 Aprender=C3=A1, a aprovechar las VENTAJAS COMPETITIVAS de tener un = =C3=A1rea de Recursos Humanos s=C3=B3lido y manejado de manera = estrat=C3=A9gica para generar valor y fomentar la confianza, lealtad y = compromiso de los integrantes de la empresa=2E Usted dejar=C3=A1 de ser un administrador de recursos humanos tradicional = y pasivo, para convertirse en un Directivo de RRHH con visi=C3=B3n = estrat=C3=A9gica, energ=C3=ADa, liderazgo y capacidad para generar valor y = entusiasmo en su organizaci=C3=B3n.=20 Inscr=C3=ADbase y aprenda: - Cu=C3=A1les son los nuevos retos a los que se enfrenta un departamento = de Recursos Humanos=2E - Cu=C3=A1l es el rol actual de la Direcci=C3=B3n de Recursos Humanos=2E Para obtener el contenido completo de este programa responda este correo = con la palabra Informes + Nombre + Tel=C3=A9fono y se lo enviaremos a la = brevedad=2E Mayores informes e inscripci=C3=B3n, - Solic=C3=ADtala ya L=C3=ADnea directa: 01 800 212 0660=2E Att: Mildreth Lara Demasiados boletines xfs@oss.sgi.com para ya no recibirlos simplemente = env=C3=ADe un correo con asunto (Exit3) ------=SPLITOR00A_001_43270671D Content-Type: text/html; charset="utf-8" Content-Transfer-Encoding: quoted-printable

 

Recursos Humanos, Qu=C3=A9 Medir y Por=20 Qu=C3=A9

M=C3=A9xico, D.F. = 04 de=20 septiembre=20 2014


Aprender=C3=A1,=20 a aprovechar las VENTAJAS COMPETITIVAS de tener un = =C3=A1rea de=20 Recursos Humanos s=C3=B3lido y manejado de manera = estrat=C3=A9gica para=20 generar valor y fomentar la confianza, lealtad y = compromiso de=20 los integrantes de la=20 empresa.
Usted=20 dejar=C3=A1 de ser un administrador de recursos humanos = tradicional=20 y pasivo, para convertirse en un Directivo de RRHH con = visi=C3=B3n=20 estrat=C3=A9gica, energ=C3=ADa, liderazgo y capacidad = para generar valor=20 y entusiasmo en su organizaci=C3=B3n. =

Inscr=C3=ADbase y = aprenda:
-=20 Cu=C3=A1les son los nuevos retos a los que se enfrenta = un=20 departamento de Recursos Humanos.
- Cu=C3=A1l es el = rol actual=20 de la Direcci=C3=B3n de Recursos Humanos.

Para=20 obtener el=20 contenido completo de este programa = responda=20 este correo con la palabra Informes + Nombre + = Tel=C3=A9fono y se lo = enviaremos=20 a la brevedad.

Mayores informes e inscripci=C3=B3n, - = Solic=C3=ADtala=20 ya
L=C3=ADnea=20 directa: 01 800=20 212 0660.
Att: Mildreth=20 Lara

Demasiados = boletines =20 xfs@oss.sgi.com  para ya no recibirlos  = simplemente env=C3=ADe=20 un correo con asunto=20 (Exit3)

------=SPLITOR00A_001_43270671D-- From david@fromorbit.com Wed Aug 13 22:13: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 D7B717F3F for ; Wed, 13 Aug 2014 22:13:32 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id B608930404E for ; Wed, 13 Aug 2014 20:13:29 -0700 (PDT) X-ASG-Debug-ID: 1407986006-04cbb0508a12d9f0001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id 5TYQddMIzlI8CXZo for ; Wed, 13 Aug 2014 20:13:27 -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: Ap4UAGoo7FN5LDJ8PGdsb2JhbABagw2BKYIqhQenJwEBAQEBAQagOYVrAYEQFwUBAQEBODaEAwEBBAE6HCMQCAMOCgklDwUlAwcaExmIIQfHGxcYhWSJUAeETAWcOJhtKy8 Received: from ppp121-44-50-124.lns20.syd6.internode.on.net (HELO dastard) ([121.44.50.124]) by ipmail05.adl6.internode.on.net with ESMTP; 14 Aug 2014 12:41:37 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1XHlRw-0006by-4j; Thu, 14 Aug 2014 13:11:36 +1000 Date: Thu, 14 Aug 2014 13:11:36 +1000 From: Dave Chinner To: Brian Foster Cc: xfs@oss.sgi.com Subject: Re: [PATCH 2/2] xfs: hole the inode lock across a full file collapse Message-ID: <20140814031136.GG20518@dastard> X-ASG-Orig-Subj: Re: [PATCH 2/2] xfs: hole the inode lock across a full file collapse References: <1407523766-62233-1-git-send-email-bfoster@redhat.com> <1407523766-62233-3-git-send-email-bfoster@redhat.com> <20140813154229.GB4426@laptop.bfoster> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140813154229.GB4426@laptop.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: 1407986007 X-Barracuda-URL: http://192.48.176.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.8423 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Wed, Aug 13, 2014 at 11:42:29AM -0400, Brian Foster wrote: > On Fri, Aug 08, 2014 at 02:49:26PM -0400, Brian Foster wrote: > > A file collapse stress test workload reproduces collapse failures > > mid-operation due to changes in the inode fork extent count across > > extent shift cycles. xfs_collapse_file_space() currently calls > > xfs_bmap_shift_extents() to shift one extent at a time per transaction. > > The extent index is used to track the next extent to shift after each > > iteration. Right, it does so after writing back all the dirty pages and invalidating the cache. This is done under the IOLOCK_EXCL, so we should end up with nothing being able to newly dirty the inode while the collapse range operation is in progress. > > > > A concurrent fsx and fsstress workload reproduces a scenario where the > > extent count changes during this sequence, causing the 'current_ext' > > index to become inaccurate and possibly skip shifting an extent. The > > likely result of this behavior is the subsequent shift attempt will not > > find a hole in the area of the skipped extent and fail, leaving the file > > in a partially collapsed state. > > > > This occurs because the ilock is released and acquired across each > > transaction and each individual extent shift. Tracepoint output shows > > that once the ilock is released after an extent shift, a pending > > blocking writeback (e.g., sync) can acquire the lock and proceed before > > the next extent is shifted down. If the writeback converts part of a > > delayed allocation earlier in the file, for example, it can insert a new > > extent into the map. Tracing confirms a call to > > xfs_bmap_add_extent_delay_real() in this particular instance. Are we getting a dirty extent in the range being collapsed, or does it exist outside the range being shifted? If outside, then shouldn't we just sync the entire file first? i.e. treat it the same way as we do xfs_swap_extents()? Realistically, cur_extent is not valid once we drop the ILOCK. Perhaps we should keep the offset of the extent we are up to in the shift, and then look up the offset to get current extent map index once we pick the ILOCK back up. That way we avoid issues with other parts of the extent map changing between ILOCK hold contexts. > > To prevent this scenario, hold the ilock across the entire extent shift > > loop in xfs_collapse_file_space(). > > > > Signed-off-by: Brian Foster > > --- > > fs/xfs/xfs_bmap_util.c | 5 +++-- > > 1 file changed, 3 insertions(+), 2 deletions(-) > > > > diff --git a/fs/xfs/xfs_bmap_util.c b/fs/xfs/xfs_bmap_util.c > > index 2f1e30d..96eb97b 100644 > > --- a/fs/xfs/xfs_bmap_util.c > > +++ b/fs/xfs/xfs_bmap_util.c > > @@ -1474,6 +1474,8 @@ xfs_collapse_file_space( > > if (error) > > return error; > > > > + xfs_ilock(ip, XFS_ILOCK_EXCL); > > + > > I realized this moves the lock outside of the xfs_trans_reserve(), thus > opening a potential deadlock scenario with regard to the log. I suppose > this might be harder to hit in real life than a sync() causing the > operation to fall over mid-sequence, so I'm still Ok with keeping this > unless anybody objects. We can't do that. Inode locking rules explicitly forbid it - we've avoided needing to do break this rule for 20 years, so let's not start making exceptions now just because it's a "simple fix". Cheers, Dave. -- Dave Chinner david@fromorbit.com From administra@empresanacionalmx.info Thu Aug 14 00:47: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=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 3BC817F3F for ; Thu, 14 Aug 2014 00:47:31 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 25FDC8F8050 for ; Wed, 13 Aug 2014 22:47:28 -0700 (PDT) X-ASG-Debug-ID: 1407995245-04cb6c4c9610ea10001-NocioJ Received: from mail4.empresanacionalmx.info (mail4.empresanacionalmx.info [66.36.250.4]) by cuda.sgi.com with ESMTP id LVT63MPcjjLnpJE5 for ; Wed, 13 Aug 2014 22:47:25 -0700 (PDT) X-Barracuda-Envelope-From: administra@empresanacionalmx.info X-Barracuda-Apparent-Source-IP: 66.36.250.4 Received: from SUPERB-B8WCSALV (66.36.250.99) by mail4.empresanacionalmx.info id hth6lc0our0v for ; Thu, 14 Aug 2014 00:47:02 -0500 (envelope-from ) pop: fd25f39a-7480-48bc-843f-89413644a548 Message-ID: <833458d7c71b12a38dd0aa06001d929f@empresanacionalmx.info> From: "Administracion Publica" To: Subject: Organizacion y Conservacion de Archivos Date: Thu, 14 Aug 2014 00:47:00 -0500 X-ASG-Orig-Subj: Organizacion y Conservacion de Archivos MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="----=SPLITOR00A_001_390063282D" X-Barracuda-Connect: mail4.empresanacionalmx.info[66.36.250.4] X-Barracuda-Start-Time: 1407995245 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.54 X-Barracuda-Spam-Status: No, SCORE=0.54 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=HTML_FONT_LOW_CONTRAST, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.8427 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.54 HTML_FONT_LOW_CONTRAST BODY: HTML font color similar to background 0.00 HTML_MESSAGE BODY: HTML included in message This is a multi-part message in MIME format. ------=SPLITOR00A_001_390063282D Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable =20 Organizaci=C3=B3n y Conservaci=C3=B3n de Archivos y Documentos de la = Administraci=C3=B3n P=C3=BAblica / 18 de septiembre, M=C3=A9xico, D.F=2E =20 Durante este periodo las dependencias, entidades y organismos del sector = p=C3=BAblico deben actualizar sus instrumentos de descripci=C3=B3n = archiv=C3=ADstica y adecuarlos, en su caso, a los modelos establecidos por = el Archivo General de la Naci=C3=B3n. Por otra parte, la normatividad en = materia de acceso a la informaci=C3=B3n p=C3=BAblica requiere mantener una = congruencia con la estructura funcional de las dependencias y las acciones = propuestas en sus planes de desarrollo y programas institucionales, mismos = que ser=C3=A1n materia de revisi=C3=B3n por parte de las instancias = fiscalizadoras y los =C3=B3rganos de control=2E Este oportuno programa le ofrece la informaci=C3=B3n que usted necesita = para coordinar e implementar un sistema funcional y unificado de los = archivos de su dependencia, incluyendo: C=C3=B3mo poner en marcha el proceso de modernizaci=C3=B3n de archivos y = documentos p=C3=BAblicos en su instituci=C3=B3n.=20 Lineamientos para la clasificaci=C3=B3n de la informaci=C3=B3n y manejo de = los archivos de tr=C3=A1mite, concentraci=C3=B3n e hist=C3=B3rico.=20 Los archivos y documentos en el contexto de la Ley de Transparencia y = Acceso a la Informaci=C3=B3n P=C3=BAblica=2E Adquiera informaci=C3=B3n completa (temario, precios, rese=C3=B1a del = instructor), s=C3=B3lo responda con la palabra "Doc" + Nombre + = Tel=C3=A9fono=2E Mayores Informes e inscripci=C3=B3n, llame..=2E l=C3=ADnea directa: 01 800 212 0660=2E Atte: Abraham Rementer=C3=ADa Demasiados boletines xfs@oss.sgi.com para ya no recibirlos simplemente = env=C3=ADe un correo con asunto (END3) ------=SPLITOR00A_001_390063282D Content-Type: text/html; charset="utf-8" Content-Transfer-Encoding: quoted-printable

 

Organizaci=C3=B3n y Conservaci=C3=B3n de = Archivos y Documentos de=20 la Administraci=C3=B3n P=C3=BAblica / 18 de=20 septiembre, M=C3=A9xico, = D.F. 

Durante este periodo las dependencias, entidades y=20 organismos del sector p=C3=BAblico deben actualizar sus=20 instrumentos de descripci=C3=B3n archiv=C3=ADstica y = adecuarlos, en su=20 caso, a los modelos establecidos por el Archivo General = de la=20 Naci=C3=B3n. Por otra parte, la normatividad en materia = de acceso a=20 la informaci=C3=B3n p=C3=BAblica requiere mantener una = congruencia con=20 la estructura funcional de las dependencias y las = acciones=20 propuestas en sus planes de desarrollo y programas=20 institucionales, mismos que ser=C3=A1n materia de = revisi=C3=B3n por=20 parte de las instancias fiscalizadoras y los = =C3=B3rganos de=20 control.1474412

Este oportuno programa le ofrece la informaci=C3=B3n = que usted=20 necesita para coordinar e implementar un sistema = funcional y=20 unificado de los archivos de su dependencia, = incluyendo:

  • C=C3=B3mo poner en marcha el proceso de = modernizaci=C3=B3n de=20 archivos y documentos p=C3=BAblicos en su = instituci=C3=B3n.=20
  • Lineamientos para la clasificaci=C3=B3n de la = informaci=C3=B3n y=20 manejo de los archivos de tr=C3=A1mite, = concentraci=C3=B3n e=20 hist=C3=B3rico.=20
  • Los archivos y documentos en el contexto de la Ley = de=20 Transparencia y Acceso a la Informaci=C3=B3n=20 P=C3=BAblica.

Adquiera=20 informaci=C3=B3n completa (temario, = precios, rese=C3=B1a=20 del instructor), s=C3=B3lo responda con la palabra "Doc" = +=20 Nombre + Tel=C3=A9fono.

Mayores = Informes e=20 inscripci=C3=B3n, llame...
l=C3=ADnea=20 directa:
01 800 212=20 = 0660.

Atte: Abraham=20 Rementer=C3=ADa=20

Demasiados boletines  xfs@oss.sgi.com = para ya no=20 recibirlos  simplemente env=C3=ADe un correo con = asunto=20 (END3)=20

 

------=SPLITOR00A_001_390063282D-- From david@fromorbit.com Thu Aug 14 01:14: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 DB5C97F3F for ; Thu, 14 Aug 2014 01:14:56 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id C596A304032 for ; Wed, 13 Aug 2014 23:14:53 -0700 (PDT) X-ASG-Debug-ID: 1407996887-04cbb0508d134f00001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id EL7O8W6p3wFyEuTu for ; Wed, 13 Aug 2014 23:14:48 -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: As4UAMRS7FN5LDJ8PGdsb2JhbABagw2BKYIqhQenQwEBAQMGoDmFawGBERcFAQEBATg2hAMBAQQBJxMcERIFCwgDDgoJJQ8FJQMHGgoJiDoHxyQXGIVkiVAHhEwFnDiYbSsv Received: from ppp121-44-50-124.lns20.syd6.internode.on.net (HELO dastard) ([121.44.50.124]) by ipmail06.adl6.internode.on.net with ESMTP; 14 Aug 2014 15:44:46 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1XHoJA-0006yo-Um; Thu, 14 Aug 2014 16:14:44 +1000 Date: Thu, 14 Aug 2014 16:14:44 +1000 From: Dave Chinner To: Brian Foster Cc: Alex Lyakas , xfs@oss.sgi.com Subject: Re: use-after-free on log replay failure Message-ID: <20140814061444.GH20518@dastard> X-ASG-Orig-Subj: Re: use-after-free on log replay failure References: <20140806152042.GB39990@bfoster.bfoster> <20140811132057.GA1186@bfoster.bfoster> <20140811215207.GS20518@dastard> <20140812120341.GA46654@bfoster.bfoster> <20140812235615.GB20518@dastard> <20140813125932.GA4605@bfoster.bfoster> <20140813205929.GE20518@dastard> <20140813232135.GB8456@laptop.bfoster> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140813232135.GB8456@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: 1407996887 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=MARKETING_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.8427 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words On Wed, Aug 13, 2014 at 07:21:35PM -0400, Brian Foster wrote: > On Thu, Aug 14, 2014 at 06:59:29AM +1000, Dave Chinner wrote: > > On Wed, Aug 13, 2014 at 08:59:32AM -0400, Brian Foster wrote: > > > Perhaps I'm missing some context... I don't follow how removing the > > > error check doesn't solve the problem. It clearly closes the race and > > > perhaps there are other means of doing the same thing, but what part of > > > the problem does that leave unresolved? > > > > Anything that does: > > > > xfs_buf_iorequest(bp); > > if (bp->b_error) > > xfs_buf_relse(bp); > > > > is susceptible to the same race condition. based on bp->b_error > > being set asynchronously and before the buffer IO completion > > processing is complete. > > > > Understood, by why would anything do that (as opposed to > xfs_buf_iowait())? I don't see that we do that anywhere today > (the check buried within xfs_buf_iowait() notwithstanding of course). "Why" is not important - the fact is the caller *owns* the buffer and so the above fragment of code is valid behaviour. If there is an error on the buffer after xfs_buf_iorequest() request returns on a synchronous IO, then it's a bug if there is still IO in progress on that buffer. We can't run IO completion synchronously from xfs_buf_bio_end_io in this async dispatch error case - we cannot detect it as any different from IO completion in interrupt context - and so we need to have some kind of reference protecting the buffer from being freed from under the completion. i.e. the bug is that a synchronous buffer has no active reference while it is sitting on the completion workqueue - it's references are owned by other contexts that can drop them without regard to the completion status of the buffer. For async IO we transfer a reference and the lock to the IO context, which gets dropped in xfs_buf_iodone_work when all the IO is complete. Synchronous IO needs this protection, too. As a proof of concept, adding this to the start of xfs_buf_iorequest(): + /* + * synchronous IO needs it's own reference count. async IO + * inherits the submitter's reference count. + */ + if (!(bp->b_flags & XBF_ASYNC)) + xfs_buf_hold(bp); And this to the synchronous IO completion case for xfs_buf_iodone_work(): else { ASSERT(read && bp->b_ops); complete(&bp->b_iowait); + xfs_buf_rele(bp); } Should ensure that all IO carries a reference count and the buffer cannot be freed until all IO processing has been completed. This means it does not matter what the buffer owner does after xfs_buf_iorequest() - even unconditionally calling xfs_buf_relse() will not result in use-after-free as the b_hold count will not go to zero until the IO completion processing has been finalised. Fixing the rest of the mess (i.e. determining how to deal with submission/completion races) is going to require more effort and thought. For the moment, though, correctly reference counting buffers will solve the use-after-free without changing any other behaviour. > From what I can see, all it really guarantees is that the submission has > either passed/failed the write verifier, yes? No. It can also mean it wasn't rejected by the lower layersi as they process the bio passed by submit_bio(). e.g. ENODEV, because the underlying device has been hot-unplugged, EIO because the buffer is beyond the end of the device, etc. > > > It looks like submit_bio() manages this by providing the error through > > > the callback (always). It also doesn't look like submission path is > > > guaranteed to be synchronous either (consider md, which appears to use > > > workqueues and kernel threads)), so I'm not sure that '...; > > > xfs_buf_iorequest(bp); if (bp->b_error)' is really safe anywhere unless > > > you're explicitly looking for a write verifier error or something and > > > do nothing further on the buf contingent on completion (e.g., freeing it > > > or something it depends on). > > > > My point remains that it *should be safe*, and the intent is that > > the caller should be able to check for submission errors without > > being exposed to a use after free situation. That's the bug we need > > to fix, not say "you can't check for submission errors on > > synchronous IO" to avoid the race condition..... > > > > Well, technically you can check for submission errors on sync I/O, just > use the code you posted above. :) What we can't currently do is find out > when the I/O subsystem is done with the buffer. By definition, a buffer marked with an error after submission processing is complete. It should not need to be waited on, and there-in lies the bug. > Perhaps the point here is around the semantics of xfs_buf_iowait(). With > a mechanism that is fundamentally async, the sync variant obviously > becomes the async mechanism + some kind of synchronization. I'd expect > that synchronization to not necessarily just tell me whether an error > occurred, but also tell me when the I/O subsystem is done with the > object I've passed (e.g., so I'm free to chuck it, scribble over it, put > it back where I got it, whatever). > > My impression is that's the purpose of the b_iowait mechanism. > Otherwise, what's the point of the whole > bio_end_io->buf_ioend->b_iodone->buf_ioend round trip dance? Yes, that's exactly what xfs_buf_iorequest/xfs_buf_iowait() provides and the b_error indication is an integral part of that synchronisation mechanism. Unfortunately, that is also the part of the mechanism that is racy and causing problems. Cheers, Dave. -- Dave Chinner david@fromorbit.com From rahul@fly102.magizz.com Thu Aug 14 01:36: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=4.4 required=5.0 tests=HTML_IMAGE_ONLY_32, HTML_IMAGE_RATIO_02,HTML_MESSAGE,T_DKIM_INVALID autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id CB2E97F3F for ; Thu, 14 Aug 2014 01:36:11 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 8E9CB8F8037 for ; Wed, 13 Aug 2014 23:36:11 -0700 (PDT) X-ASG-Debug-ID: 1407998168-04cb6c4c9510f720001-NocioJ Received: from vps.magizz.com (vps.magizz.com [162.251.83.157]) by cuda.sgi.com with ESMTP id ZL9bmOyEKfG7po0T (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 13 Aug 2014 23:36:09 -0700 (PDT) X-Barracuda-Envelope-From: rahul@fly102.magizz.com X-Barracuda-Apparent-Source-IP: 162.251.83.157 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=fly102.magizz.com; s=default; h=Content-Transfer-Encoding:Content-Type:List-Unsubscribe:MIME-Version:Reply-To:From:Date:Message-ID:Subject:To; bh=k8mOCbKQdaYlJqqfhLxqS8Fs5PrsTAeuWhpe1bszLYw=; b=eXxHEqYq2ifEOXqcAqD+zKaw50Z+weHqkD+RHuPzTGeonRPaHBOfHpGAH/j0Bs6EGfVBI1epucZ5H4BSKV3yBOhKOJqU0/RSmqnwLyXwICc5ACFnah4zBMCl7XFbDZp5aDK31oOW/QvExE3ORtCe0EsSWJa/Er7RaBCPA5qjtqI=; Received: from fly102magizz by vps.magizz.com with local (Exim 4.82) (envelope-from ) id 1XHodv-0006Rr-Fa for xfs@oss.sgi.com; Thu, 14 Aug 2014 10:36:11 +0400 To: xfs@oss.sgi.com Subject: Get your friends on LINE and win a trip to Bangkok Message-ID: X-ASG-Orig-Subj: Get your friends on LINE and win a trip to Bangkok Date: Thu, 14 Aug 2014 06:00:10 +0000 From: "LINE Friend Converter" Reply-To: rahul@fly102.magizz.com MIME-Version: 1.0 X-Mailer-LID: 12 List-Unsubscribe: X-Mailer-RecptId: 109415 X-Mailer-SID: 24 X-Mailer-Sent-By: 2 Content-Type: multipart/alternative; charset="UTF-8"; boundary="b1_fc181f13a79afd4e6f7839f4d6a6bd75" Content-Transfer-Encoding: 8bit X-AntiAbuse: This header was added to track abuse, please include it with any abuse report X-AntiAbuse: Primary Hostname - vps.magizz.com X-AntiAbuse: Original Domain - oss.sgi.com X-AntiAbuse: Originator/Caller UID/GID - [508 518] / [47 12] X-AntiAbuse: Sender Address Domain - fly102.magizz.com X-Get-Message-Sender-Via: vps.magizz.com: authenticated_id: fly102magizz/from_h X-Barracuda-Connect: vps.magizz.com[162.251.83.157] X-Barracuda-Start-Time: 1407998169 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 1.35 X-Barracuda-Spam-Status: No, SCORE=1.35 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_SA424, DKIM_SIGNED, DKIM_VERIFIED, HTML_IMAGE_ONLY_32, HTML_IMAGE_RATIO_02, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.8427 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 0.00 HTML_IMAGE_ONLY_32 BODY: HTML: images with 2800-3200 bytes of words 0.55 HTML_IMAGE_RATIO_02 BODY: HTML has a low ratio of text to image area 0.00 HTML_MESSAGE BODY: HTML included in message 0.80 BSF_SC0_SA424 Custom Rule SA424 --b1_fc181f13a79afd4e6f7839f4d6a6bd75 Content-Type: text/plain; format=flowed; charset="UTF-8" Content-Transfer-Encoding: 8bit Your email client cannot read this email. To view it online, please go here: http://fly102.magizz.com/display.php?M=109415&C=3d4767d53b319ed1062537ecbf4054dd&S=24&L=12&N=3 To stop receiving these emails:http://fly102.magizz.com/unsubscribe.php?M=109415&C=3d4767d53b319ed1062537ecbf4054dd&L=12&N=24 --b1_fc181f13a79afd4e6f7839f4d6a6bd75 Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: 8bit Line Friend Converter
Unable to view the mailer
www.friendconverter.com
Convert your friends to Line Users & Win a tablet, an iPhone and
even a trip to Bangkok
Line : Friend Converter
Start Converting! Register Now

Click here to unsubscribe --b1_fc181f13a79afd4e6f7839f4d6a6bd75-- From bfoster@redhat.com Thu Aug 14 14:05: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 DC23A7F3F for ; Thu, 14 Aug 2014 14:05:30 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id C542C304032 for ; Thu, 14 Aug 2014 12:05:27 -0700 (PDT) X-ASG-Debug-ID: 1408043126-04cbb054860a870001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id kN11EPzZBM7X0ctl (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 14 Aug 2014 12:05:26 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s7EJ5OqE021202 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 14 Aug 2014 15:05: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 s7EJ5NqN011984; Thu, 14 Aug 2014 15:05:23 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 186F112577C; Thu, 14 Aug 2014 15:05:22 -0400 (EDT) Date: Thu, 14 Aug 2014 15:05:22 -0400 From: Brian Foster To: Dave Chinner Cc: Alex Lyakas , xfs@oss.sgi.com Subject: Re: use-after-free on log replay failure Message-ID: <20140814190521.GA51682@bfoster.bfoster> X-ASG-Orig-Subj: Re: use-after-free on log replay failure References: <20140811132057.GA1186@bfoster.bfoster> <20140811215207.GS20518@dastard> <20140812120341.GA46654@bfoster.bfoster> <20140812235615.GB20518@dastard> <20140813125932.GA4605@bfoster.bfoster> <20140813205929.GE20518@dastard> <20140813232135.GB8456@laptop.bfoster> <20140814061444.GH20518@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140814061444.GH20518@dastard> User-Agent: Mutt/1.5.23 (2014-03-12) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.24 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1408043126 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Thu, Aug 14, 2014 at 04:14:44PM +1000, Dave Chinner wrote: > On Wed, Aug 13, 2014 at 07:21:35PM -0400, Brian Foster wrote: > > On Thu, Aug 14, 2014 at 06:59:29AM +1000, Dave Chinner wrote: > > > On Wed, Aug 13, 2014 at 08:59:32AM -0400, Brian Foster wrote: > > > > Perhaps I'm missing some context... I don't follow how removing the > > > > error check doesn't solve the problem. It clearly closes the race and > > > > perhaps there are other means of doing the same thing, but what part of > > > > the problem does that leave unresolved? > > > > > > Anything that does: > > > > > > xfs_buf_iorequest(bp); > > > if (bp->b_error) > > > xfs_buf_relse(bp); > > > > > > is susceptible to the same race condition. based on bp->b_error > > > being set asynchronously and before the buffer IO completion > > > processing is complete. > > > > > > > Understood, by why would anything do that (as opposed to > > xfs_buf_iowait())? I don't see that we do that anywhere today > > (the check buried within xfs_buf_iowait() notwithstanding of course). > > "Why" is not important - the fact is the caller *owns* the buffer > and so the above fragment of code is valid behaviour. If there is > an error on the buffer after xfs_buf_iorequest() request returns on > a synchronous IO, then it's a bug if there is still IO in progress > on that buffer. > A buffer can consist of multiple I/Os, yes? If so, then it seems quite possible for one I/O to fail and set an error on the buffer while another might still be in progress. I don't see how that can be considered a bug in general. Even if not, I'd expect to see a comment explaining why any code fragment such as the above is not broken because that's not deterministic at all, even with a single I/O. E.g., the error could very well have been set by the callback where we clearly continue I/O processing so-to-speak (though we could consider where we currently set the error in the callback sequence a bug as well). > We can't run IO completion synchronously from xfs_buf_bio_end_io in > this async dispatch error case - we cannot detect it as any > different from IO completion in interrupt context - and so we need > to have some kind of reference protecting the buffer from being > freed from under the completion. > Indeed. > i.e. the bug is that a synchronous buffer has no active reference > while it is sitting on the completion workqueue - it's references > are owned by other contexts that can drop them without regard to > the completion status of the buffer. > > For async IO we transfer a reference and the lock to the IO context, > which gets dropped in xfs_buf_iodone_work when all the IO is > complete. Synchronous IO needs this protection, too. > > As a proof of concept, adding this to the start of > xfs_buf_iorequest(): > > + /* > + * synchronous IO needs it's own reference count. async IO > + * inherits the submitter's reference count. > + */ > + if (!(bp->b_flags & XBF_ASYNC)) > + xfs_buf_hold(bp); > > And this to the synchronous IO completion case for > xfs_buf_iodone_work(): > > else { > ASSERT(read && bp->b_ops); > complete(&bp->b_iowait); > + xfs_buf_rele(bp); > } > > Should ensure that all IO carries a reference count and the buffer > cannot be freed until all IO processing has been completed. > > This means it does not matter what the buffer owner does after > xfs_buf_iorequest() - even unconditionally calling xfs_buf_relse() > will not result in use-after-free as the b_hold count will not go to > zero until the IO completion processing has been finalised. > Makes sense, assuming we handle the possible error cases and whatnot therein. Thinking some more, suppose we take this ref, submit one I/O successfully and a subsequent fails. Then who is responsible for releasing the reference? > Fixing the rest of the mess (i.e. determining how to deal with > submission/completion races) is going to require more effort and > thought. For the moment, though, correctly reference counting > buffers will solve the use-after-free without changing any > other behaviour. > > > From what I can see, all it really guarantees is that the submission has > > either passed/failed the write verifier, yes? > > No. It can also mean it wasn't rejected by the lower layersi as > they process the bio passed by submit_bio(). e.g. ENODEV, because > the underlying device has been hot-unplugged, EIO because the > buffer is beyond the end of the device, etc. > Those are the errors that happen to be synchronously processed today. That's an implementation detail. submit_bio() is an asynchronous interface so I don't see any guarantee that will always be the case. E.g., that's easily broken should somebody decide to defer early end_io processing to a workqueue. We do a similar thing ourselves for the reasons you've stated above. I don't see anything in or around submit_bio() or generic_make_request() that suggest the interface is anything but async. From generic_make_request(): /** ... * generic_make_request() does not return any status. The * success/failure status of the request, along with notification of * completion, is delivered asynchronously through the bio->bi_end_io * function described (one day) else where. * ... */ > > > > It looks like submit_bio() manages this by providing the error through > > > > the callback (always). It also doesn't look like submission path is > > > > guaranteed to be synchronous either (consider md, which appears to use > > > > workqueues and kernel threads)), so I'm not sure that '...; > > > > xfs_buf_iorequest(bp); if (bp->b_error)' is really safe anywhere unless > > > > you're explicitly looking for a write verifier error or something and > > > > do nothing further on the buf contingent on completion (e.g., freeing it > > > > or something it depends on). > > > > > > My point remains that it *should be safe*, and the intent is that > > > the caller should be able to check for submission errors without > > > being exposed to a use after free situation. That's the bug we need > > > to fix, not say "you can't check for submission errors on > > > synchronous IO" to avoid the race condition..... > > > > > > > Well, technically you can check for submission errors on sync I/O, just > > use the code you posted above. :) What we can't currently do is find out > > when the I/O subsystem is done with the buffer. > > By definition, a buffer marked with an error after submission > processing is complete. It should not need to be waited on, and > there-in lies the bug. > I suppose that implicates the error processing on the callback side. We set the error and continue processing on the buffer. Another option could be to shuffle that around on the callback side, but to me _that_ is an approach that narrowly avoids the race rather than closing it via use of synchronization. > > Perhaps the point here is around the semantics of xfs_buf_iowait(). With > > a mechanism that is fundamentally async, the sync variant obviously > > becomes the async mechanism + some kind of synchronization. I'd expect > > that synchronization to not necessarily just tell me whether an error > > occurred, but also tell me when the I/O subsystem is done with the > > object I've passed (e.g., so I'm free to chuck it, scribble over it, put > > it back where I got it, whatever). > > > > My impression is that's the purpose of the b_iowait mechanism. > > Otherwise, what's the point of the whole > > bio_end_io->buf_ioend->b_iodone->buf_ioend round trip dance? > > Yes, that's exactly what xfs_buf_iorequest/xfs_buf_iowait() provides > and the b_error indication is an integral part of that > synchronisation mechanism. Unfortunately, that is also the part of > the mechanism that is racy and causing problems. > I don't see how b_iowait itself is racy. It completes when the I/O completes. The problem is that we've overloaded these mechanisms to where we attempt to use them for multiple things. b_error can be a submission error or a deeper I/O error. Adding the b_error check to xfs_buf_iowait() converts it to the same "has a submission error occurred? or has any error occurred yet? or wait until all buffer I/O is complete" non-deterministic semantics. I agree that the reference count protection for sync I/O sounds useful and closes a gap (need to think about that some more), but to check for an error as part of the synchronization mechanism means that the mechanism simply isn't synchronous. I don't see any paths outside of I/O submission itself that care significantly about one general form of error (submission) vs. another (async I/O error) as opposed to simply whether an error has occurred or not. The fact that an error _can_ occur at any time until all of the outstanding bios are completed overrides the fact that some might occur by the time submission completes, meaning we have to handle the former for any callers that care about errors in general. Waiting on b_iowait before checking b_error is an always-safe way to do that. Brian > Cheers, > > Dave. > -- > Dave Chinner > david@fromorbit.com From bfoster@redhat.com Thu Aug 14 14:09: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 (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 06F2C7F47 for ; Thu, 14 Aug 2014 14:09:25 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id B4717304032 for ; Thu, 14 Aug 2014 12:09:24 -0700 (PDT) X-ASG-Debug-ID: 1408043363-04bdf018540c070001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id QTzRLESBNkAEdGM5 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 14 Aug 2014 12:09: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 s7EJ9Kgm005999 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 14 Aug 2014 15:09:21 -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 s7EJ9KFK017741; Thu, 14 Aug 2014 15:09:20 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id E067512577C; Thu, 14 Aug 2014 15:09:18 -0400 (EDT) Date: Thu, 14 Aug 2014 15:09:18 -0400 From: Brian Foster To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 2/2] xfs: hole the inode lock across a full file collapse Message-ID: <20140814190918.GB51682@bfoster.bfoster> X-ASG-Orig-Subj: Re: [PATCH 2/2] xfs: hole the inode lock across a full file collapse References: <1407523766-62233-1-git-send-email-bfoster@redhat.com> <1407523766-62233-3-git-send-email-bfoster@redhat.com> <20140813154229.GB4426@laptop.bfoster> <20140814031136.GG20518@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140814031136.GG20518@dastard> User-Agent: Mutt/1.5.23 (2014-03-12) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1408043363 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Thu, Aug 14, 2014 at 01:11:36PM +1000, Dave Chinner wrote: > On Wed, Aug 13, 2014 at 11:42:29AM -0400, Brian Foster wrote: > > On Fri, Aug 08, 2014 at 02:49:26PM -0400, Brian Foster wrote: > > > A file collapse stress test workload reproduces collapse failures > > > mid-operation due to changes in the inode fork extent count across > > > extent shift cycles. xfs_collapse_file_space() currently calls > > > xfs_bmap_shift_extents() to shift one extent at a time per transaction. > > > The extent index is used to track the next extent to shift after each > > > iteration. > > Right, it does so after writing back all the dirty pages and > invalidating the cache. This is done under the IOLOCK_EXCL, so we > should end up with nothing being able to newly dirty the inode while > the collapse range operation is in progress. > > > > > > A concurrent fsx and fsstress workload reproduces a scenario where the > > > extent count changes during this sequence, causing the 'current_ext' > > > index to become inaccurate and possibly skip shifting an extent. The > > > likely result of this behavior is the subsequent shift attempt will not > > > find a hole in the area of the skipped extent and fail, leaving the file > > > in a partially collapsed state. > > > > > > This occurs because the ilock is released and acquired across each > > > transaction and each individual extent shift. Tracepoint output shows > > > that once the ilock is released after an extent shift, a pending > > > blocking writeback (e.g., sync) can acquire the lock and proceed before > > > the next extent is shifted down. If the writeback converts part of a > > > delayed allocation earlier in the file, for example, it can insert a new > > > extent into the map. Tracing confirms a call to > > > xfs_bmap_add_extent_delay_real() in this particular instance. > > Are we getting a dirty extent in the range being collapsed, or does > it exist outside the range being shifted? If outside, then shouldn't > we just sync the entire file first? i.e. treat it the same way as we > do xfs_swap_extents()? > The dirty extent is prior to the range being collapsed, presumably already dirty by the time we acquire the iolock. The free space portion of the collapse currently only syncs from the start of the range to EOF. Syncing the entire file is something I was planning to experiment with, particularly since it seems like the remaining failure I mentioned in the series intro appears to be related to hitting a delalloc extent during the collapse. I don't yet know how that occurs, but my last test dumped enough trace data to show a startblock value that includes the mask used for delalloc extents. The collapse attempts to look up an extent in the bmap btree with these values and falls over when it's not found. > Realistically, cur_extent is not valid once we drop the ILOCK. > Perhaps we should keep the offset of the extent we are up to in the > shift, and then look up the offset to get current extent map index > once we pick the ILOCK back up. That way we avoid issues with other > parts of the extent map changing between ILOCK hold contexts. > I noticed that one or more of the other bmap functions do something like this. Unless there's some other reason that we don't want to drop ilock here, that sounds like a safer approach. Thanks. > > > To prevent this scenario, hold the ilock across the entire extent shift > > > loop in xfs_collapse_file_space(). > > > > > > Signed-off-by: Brian Foster > > > --- > > > fs/xfs/xfs_bmap_util.c | 5 +++-- > > > 1 file changed, 3 insertions(+), 2 deletions(-) > > > > > > diff --git a/fs/xfs/xfs_bmap_util.c b/fs/xfs/xfs_bmap_util.c > > > index 2f1e30d..96eb97b 100644 > > > --- a/fs/xfs/xfs_bmap_util.c > > > +++ b/fs/xfs/xfs_bmap_util.c > > > @@ -1474,6 +1474,8 @@ xfs_collapse_file_space( > > > if (error) > > > return error; > > > > > > + xfs_ilock(ip, XFS_ILOCK_EXCL); > > > + > > > > I realized this moves the lock outside of the xfs_trans_reserve(), thus > > opening a potential deadlock scenario with regard to the log. I suppose > > this might be harder to hit in real life than a sync() causing the > > operation to fall over mid-sequence, so I'm still Ok with keeping this > > unless anybody objects. > > We can't do that. Inode locking rules explicitly forbid it - we've > avoided needing to do break this rule for 20 years, so let's not > start making exceptions now just because it's a "simple fix". > Sounds good, let's drop this one then and I'll revisit it. Are we still Ok with the first patch? I think that one is still warranted since it limits the current flaws of collapse to the collapse operation itself. Brian > Cheers, > > Dave. > -- > Dave Chinner > david@fromorbit.com From david@fromorbit.com Thu Aug 14 17:28: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 4DAFC7F3F for ; Thu, 14 Aug 2014 17:28:21 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id DB239AC001 for ; Thu, 14 Aug 2014 15:28:17 -0700 (PDT) X-ASG-Debug-ID: 1408055291-04bdf0185515210001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id W4YXFJDFPeYHKsCI for ; Thu, 14 Aug 2014 15:28: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: AtMGAGE37VN5LDJ8/2dsb2JhbABagw2BKq8QAQEBAQEBBqYlAYEXF3eEAwEBBAEnExwjBQsIAw4KCSUPBSUDIROIOgfFLhcYhWSJUAeETAEEnDiUf4NuKy+CTwEBAQ Received: from ppp121-44-50-124.lns20.syd6.internode.on.net (HELO dastard) ([121.44.50.124]) by ipmail07.adl2.internode.on.net with ESMTP; 15 Aug 2014 07:58:09 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1XI3Uy-0000fF-Q0; Fri, 15 Aug 2014 08:27:56 +1000 Date: Fri, 15 Aug 2014 08:27:56 +1000 From: Dave Chinner To: Brian Foster Cc: Alex Lyakas , xfs@oss.sgi.com Subject: Re: use-after-free on log replay failure Message-ID: <20140814222756.GR26465@dastard> X-ASG-Orig-Subj: Re: use-after-free on log replay failure References: <20140811132057.GA1186@bfoster.bfoster> <20140811215207.GS20518@dastard> <20140812120341.GA46654@bfoster.bfoster> <20140812235615.GB20518@dastard> <20140813125932.GA4605@bfoster.bfoster> <20140813205929.GE20518@dastard> <20140813232135.GB8456@laptop.bfoster> <20140814061444.GH20518@dastard> <20140814190521.GA51682@bfoster.bfoster> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140814190521.GA51682@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: 1408055291 X-Barracuda-URL: http://192.48.157.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.8450 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words On Thu, Aug 14, 2014 at 03:05:22PM -0400, Brian Foster wrote: > On Thu, Aug 14, 2014 at 04:14:44PM +1000, Dave Chinner wrote: > > On Wed, Aug 13, 2014 at 07:21:35PM -0400, Brian Foster wrote: > > > On Thu, Aug 14, 2014 at 06:59:29AM +1000, Dave Chinner wrote: > > > > On Wed, Aug 13, 2014 at 08:59:32AM -0400, Brian Foster wrote: > > > > > Perhaps I'm missing some context... I don't follow how removing the > > > > > error check doesn't solve the problem. It clearly closes the race and > > > > > perhaps there are other means of doing the same thing, but what part of > > > > > the problem does that leave unresolved? > > > > > > > > Anything that does: > > > > > > > > xfs_buf_iorequest(bp); > > > > if (bp->b_error) > > > > xfs_buf_relse(bp); > > > > > > > > is susceptible to the same race condition. based on bp->b_error > > > > being set asynchronously and before the buffer IO completion > > > > processing is complete. > > > > > > > > > > Understood, by why would anything do that (as opposed to > > > xfs_buf_iowait())? I don't see that we do that anywhere today > > > (the check buried within xfs_buf_iowait() notwithstanding of course). > > > > "Why" is not important - the fact is the caller *owns* the buffer > > and so the above fragment of code is valid behaviour. If there is > > an error on the buffer after xfs_buf_iorequest() request returns on > > a synchronous IO, then it's a bug if there is still IO in progress > > on that buffer. > > > > A buffer can consist of multiple I/Os, yes? If so, then it seems quite > possible for one I/O to fail and set an error on the buffer while > another might still be in progress. I don't see how that can be > considered a bug in general. You miss my point. We have to mark the buffer with an error, but it should not be visible to the submitter until all IO on the buffer is done. i.e. setting bp->b_error from the completion path needs to be deferred until xfs_buf_iodone_work() is run after all submitted IOs on the buffer have completed. > Even if not, I'd expect to see a comment explaining why any code > fragment such as the above is not broken because that's not > deterministic at all, even with a single I/O. E.g., the error could very > well have been set by the callback where we clearly continue I/O > processing so-to-speak (though we could consider where we currently set > the error in the callback sequence a bug as well). Chicken, meet Egg. There's no comment saying the above code is OK or not because we assume that if we hold the buffer lock it is safe to look at any state on the buffer at any time. What this thread points out is that synchronous IO changes the state of the buffer in a context that does not hold the buffer lock, and so violates that assumption. > > This means it does not matter what the buffer owner does after > > xfs_buf_iorequest() - even unconditionally calling xfs_buf_relse() > > will not result in use-after-free as the b_hold count will not go to > > zero until the IO completion processing has been finalised. > > > > Makes sense, assuming we handle the possible error cases and whatnot > therein. Thinking some more, suppose we take this ref, submit one I/O > successfully and a subsequent fails. Then who is responsible for > releasing the reference? xfs_buf_iodone_work() doesn't run until b_io_remaining goes to zero. That's the context that releases the ref. It doesn't matter how many are submitted, complete successfully or fail. > > Fixing the rest of the mess (i.e. determining how to deal with > > submission/completion races) is going to require more effort and > > thought. For the moment, though, correctly reference counting > > buffers will solve the use-after-free without changing any > > other behaviour. > > > > > From what I can see, all it really guarantees is that the submission has > > > either passed/failed the write verifier, yes? > > > > No. It can also mean it wasn't rejected by the lower layersi as > > they process the bio passed by submit_bio(). e.g. ENODEV, because > > the underlying device has been hot-unplugged, EIO because the > > buffer is beyond the end of the device, etc. > > > > Those are the errors that happen to be synchronously processed today. > That's an implementation detail. submit_bio() is an asynchronous > interface so I don't see any guarantee that will always be the case. > E.g., that's easily broken should somebody decide to defer early end_io > processing to a workqueue. We do a similar thing ourselves for the > reasons you've stated above. > > I don't see anything in or around submit_bio() or generic_make_request() > that suggest the interface is anything but async. From > generic_make_request(): > > /** > ... > * generic_make_request() does not return any status. The > * success/failure status of the request, along with notification of > * completion, is delivered asynchronously through the bio->bi_end_io > * function described (one day) else where. > * > ... > */ Delivery of the error is through bio->bi_end_io, but that is not necessarily from an asynchronous context. e.g. the first thing that generic_make_request() does is run generic_make_request_checks(), where a failure runs bio_endio() and therefore bio->bi_end_io() in the submitter's context. i.e. *synchronously*. This is exactly what the b_io_remaining reference owned by xfs_buf_iorequest() is being taken for - to prevent the *XFS endio processing* from being run asynchronously. > > > > > It looks like submit_bio() manages this by providing the error through > > > > > the callback (always). It also doesn't look like submission path is > > > > > guaranteed to be synchronous either (consider md, which appears to use > > > > > workqueues and kernel threads)), so I'm not sure that '...; > > > > > xfs_buf_iorequest(bp); if (bp->b_error)' is really safe anywhere unless > > > > > you're explicitly looking for a write verifier error or something and > > > > > do nothing further on the buf contingent on completion (e.g., freeing it > > > > > or something it depends on). > > > > > > > > My point remains that it *should be safe*, and the intent is that > > > > the caller should be able to check for submission errors without > > > > being exposed to a use after free situation. That's the bug we need > > > > to fix, not say "you can't check for submission errors on > > > > synchronous IO" to avoid the race condition..... > > > > > > > > > > Well, technically you can check for submission errors on sync I/O, just > > > use the code you posted above. :) What we can't currently do is find out > > > when the I/O subsystem is done with the buffer. > > > > By definition, a buffer marked with an error after submission > > processing is complete. It should not need to be waited on, and > > there-in lies the bug. > > I suppose that implicates the error processing on the callback side. We > set the error and continue processing on the buffer. Another option > could be to shuffle that around on the callback side, but to me _that_ > is an approach that narrowly avoids the race rather than closing it via > use of synchronization. We need to store the error from the callback somewhere, until b_io_remaining falls to zero. Right now we are putting it in b_error, which makes it immediately visible to the submitter without any synchronisation. Basically, we can't put state into anything that the submitter is expected to check. We have internal state fields that are not to be used externally: spinlock_t b_lock; /* internal state lock */ unsigned int b_state; /* internal state flags */ So what we probably need to do is add an internal: int b_io_error; /* internal error state */ serialised by b_lock, where we stuff errors from xfs_buf_bio_end_io and then propagate them to b_error in xfs_buf_iodone_work() when all the IO is complete.... And with the extra reference count on the buffer, it doesn't matter if the submitter detects a submission error and releases it's reference to the buffer while there is still other IO in progress. Hence we solve all the issues without changing the current submit/wait semantics, or needing to remove the submission error check from xfs_buf_iowait. > I don't see any paths outside of I/O submission itself that care > significantly about one general form of error (submission) vs. another > (async I/O error) as opposed to simply whether an error has occurred or > not. The fact that an error _can_ occur at any time until all of the > outstanding bios are completed overrides the fact that some might occur > by the time submission completes, meaning we have to handle the former > for any callers that care about errors in general. Waiting on b_iowait > before checking b_error is an always-safe way to do that. Assuming there are no other bugs, it's "always safe". And that's the key thing - the fact that we actually have a check for an error before waiting indicates that it hasn't always been safe to wait on a buffer marked with a submission error. This code is full of cruft and mess. It's fully of history, band-aids upon band-aids, partially completed cleanups, left over complexity from times gone past and new complexity layered over the top of structures not originally designed to support those uses. Let's fix the use after free bug right away, and then clean up the cruft and fix the underlying problems so we can guarantee that "always-safe" behaviour an not have it blow up in our faces in future.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Thu Aug 14 17:30: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 (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 69D6E7F53 for ; Thu, 14 Aug 2014 17:30:26 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 5370B304032 for ; Thu, 14 Aug 2014 15:30:23 -0700 (PDT) X-ASG-Debug-ID: 1408055421-04cb6c55000f8b0001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id AoawsALVG74wVSLq for ; Thu, 14 Aug 2014 15:30: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: AtMGAGE37VN5LDJ8/2dsb2JhbABagw2BKq8QAQEBAQEBBqYlAYEXF3eEBAEFOhwjEAgDDgoJJQ8FJQMhE4hBxS4XGIVkiVAHhEwBBI8KjS6Uf4NuKy+CTwEBAQ Received: from ppp121-44-50-124.lns20.syd6.internode.on.net (HELO dastard) ([121.44.50.124]) by ipmail07.adl2.internode.on.net with ESMTP; 15 Aug 2014 08:00:20 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1XI3X6-0000fS-1n; Fri, 15 Aug 2014 08:30:08 +1000 Date: Fri, 15 Aug 2014 08:30:08 +1000 From: Dave Chinner To: Brian Foster Cc: xfs@oss.sgi.com Subject: Re: [PATCH 2/2] xfs: hole the inode lock across a full file collapse Message-ID: <20140814223007.GS26465@dastard> X-ASG-Orig-Subj: Re: [PATCH 2/2] xfs: hole the inode lock across a full file collapse References: <1407523766-62233-1-git-send-email-bfoster@redhat.com> <1407523766-62233-3-git-send-email-bfoster@redhat.com> <20140813154229.GB4426@laptop.bfoster> <20140814031136.GG20518@dastard> <20140814190918.GB51682@bfoster.bfoster> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140814190918.GB51682@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: 1408055421 X-Barracuda-URL: http://192.48.176.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.8450 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Thu, Aug 14, 2014 at 03:09:18PM -0400, Brian Foster wrote: > Sounds good, let's drop this one then and I'll revisit it. Are we still > Ok with the first patch? I think that one is still warranted since it > limits the current flaws of collapse to the collapse operation itself. The first patch looks fine. Cheers, Dave. -- Dave Chinner david@fromorbit.com From ekgeikc@fujitaec.or.jp Thu Aug 14 19:52: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 831ED7F50 for ; Thu, 14 Aug 2014 19:52:14 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 5D9D2304032 for ; Thu, 14 Aug 2014 17:52:10 -0700 (PDT) X-ASG-Debug-ID: 1408063926-04cbb0548817540001-NocioJ Received: from mail.fujitaec.or.jp (fujitaec.or.jp [203.138.223.183]) by cuda.sgi.com with ESMTP id FXDTNhok60ntjG9V for ; Thu, 14 Aug 2014 17:52:07 -0700 (PDT) X-Barracuda-Envelope-From: ekgeikc@fujitaec.or.jp X-Barracuda-Apparent-Source-IP: 203.138.223.183 Received: from ezulcox (unknown [175.0.133.195]) by mail.fujitaec.or.jp (Postfix) with ESMTP id 423891001B55 for ; Fri, 15 Aug 2014 09:52:04 +0900 (JST) From: "=?GB2312?B?t73KwNHM?=" To: "xfs" Subject: =?GB2312?B?sO/W+r/Nu6e9qMGi0ru49sXFy/zQ1LXEssm5urHq17xmb3Jm?= Message-ID: <201408150852077900188@fujitaec.or.jp> X-ASG-Orig-Subj: =?GB2312?B?sO/W+r/Nu6e9qMGi0ru49sXFy/zQ1LXEssm5urHq17xmb3Jm?= Date: Fri, 15 Aug 2014 08:52:07 +0800 X-Mailer: Foxmail 6, 10, 201, 20 [cn] MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="----=ryulh576_5130_214774475.712531" X-Priority: 3 X-Barracuda-Connect: fujitaec.or.jp[203.138.223.183] X-Barracuda-Start-Time: 1408063926 X-Barracuda-URL: http://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: d94fab7a8c2b28f41febffded1442839-12202-txt X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.8454 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- This is a multi-part message in MIME format. ------=ryulh576_5130_214774475.712531 Content-Type: text/plain; charset="GB2312" Content-Transfer-Encoding: base64 SEQweDc5aw0KDQrOqsqyw7TP+srbyMvUsbGoz/q1xLfR08PUvcC01L2436OstavStbyoyLTUvcC0 1L2yu8Dtz+ujvw0KDQo4MDcxNDQ0ODY2NDI5Njc0ODEuMTg3LjIxNy4yMDc= ------=ryulh576_5130_214774475.712531 Content-Type: text/plain; name="bajouvov.txt" Content-Transfer-Encoding: quoted-printable Content-Disposition: attachment; filename="bajouvov.txt" =09 =09 <<=CF=FA=CA=DB=BE=AB=D3=A22=CC=EC=C7=BF=BB= =AF=D1=B5=C1=B7>> =09 =09 2014=C4=EA07=D4=C226-27=C8=D5 =C9=EE=DB=DA=A1=A208=D4=C202-03=C8= =D5 =C9=CF=BA=A3=A1=A208=D4=C216-17=C8=D5 =B1=B1=BE=A9=A1=A208=D4=C230= -31=C8=D5 =C9=EE=DB=DA =09 2014=C4=EA09=D4=C213-14=C8=D5 =C9=CF=BA=A3=A1=A209=D4=C227-28=C8= =D5 =B1=B1=BE=A9=A1=A210=D4=C218-19=C8=D5 =C9=EE=DB=DA=A1=A210=D4=C225= -26=C8=D5 =C9=CF=BA=A3 =09 2014=C4=EA11=D4=C201-02=C8=D5 =B1=B1=BE=A9=A1=A211=D4=C215-16=C8= =D5 =C9=EE=DB=DA=A1=A211=D4=C229-30=C8=D5 =C9=CF=BA=A3=A1=A212=D4=C213= -14=C8=D5 =B1=B1=BE=A9 =09 2014=C4=EA12=D4=C220-21=C8=D5 =C9=CF=BA=A3=A1=A212=D4=C227-28=C8= =D5 =C9=EE=DB=DA =09 =09 =09 =A1=BE=D6=F7=B0=EC=B5=A5=CE=BB=A1=BF=A3=BA=D0=C2 =CB=BC =CE=AC =C6=F3 = =D2=B5 =C5=E0 =D1=B5 =CD=F8 www.hpxcn.com =09 =A1=BE=D1=A7=D4=B1=B6=D4=CF=F3=A1=BF=A3=BA=D7=DC=BE=AD=C0=ED=A1=A2=CF= =FA=CA=DB=D7=DC=BC=E0=A1=A2=C7=F8=D3=F2=BE=AD=C0=ED=A1=A2=CF=FA=CA=DB= =BE=AD=C0=ED=A1=A2=D2=B5=CE=F1=B4=FA=B1=ED=A1=A2=CF=FA=CA=DB=C5=E0=D1= =B5=D7=A8=D4=B1=B5=C8=A1=A3 =09 =A1=BE=C5=E0=D1=B5=B7=D1=D3=C3=A1=BF=A3=BA4600=D4=AA/=C1=BD=C8=CB,=B2= =BB=D4=D9=B4=F2=D5=DB(=D0=E8=D4=DA=CD=AC=D2=BB=B8=F6=D4=C2=B5=C4=CD=AC= =D2=BB=BF=CE=B3=CC=B2=C5=CF=ED=D3=D0=B4=CB=D3=C5=BB=DD)=B5=A5=B6=C0=D2= =BB=C8=CB=CA=D5=B7=D12800=D4=AA =09 =A1=A3=A3=A82=CC=EC=D6=D0=B2=CD, =CB=B0=B7=D1,=D7=A8=BC=D2=D1=DD=BD=B2= =B7=D1,=BD=CC=B2=C4=B7=D1,=B2=E8=B5=E3=B5=C8)=A3=BB=D7=A1=CB=DE=CD=B3= =D2=BB=B0=B2=C5=C5=A3=AC=B7=D1=D3=C3=D7=D4=C0=ED=A3=BB =09 =09 =A1=BE=CE=C2=DC=B0=CC=E1=CA=BE=A1=BF=A3=BA=B1=BE=BF=CE=B3=CC=BF=C9=CE= =AA=C6=F3=D2=B5=CC=E1=B9=A9=C9=CF=C3=C5=C4=DA=D1=B5=B7=FE=CE=F1=A3=AC= =BB=B6=D3=AD=C0=B4=B5=E7=D7=C9=D1=AF=A3=A1 =09 =09 =A1=BE=B1=A8|=C3=FB=A1=A2=D7=C9|=D1=AF=A1=BF=A3=BA =09 =09 =C9=EE|=DB=DA=A3=BA=A3=A8=A3=B0=A3=B7=A3=B5=A3=B5=A3=A9-=A3=B8=A3=B1= =A3=B9=A3=B3 =A3=B9=A3=B4=A3=B7=A3=B8 =A1=A2=A3=A8=A3=B0=A3=B7=A3=B5= =A3=B5=A3=A9-=A3=B8=A3=B1=A3=B9=A3=B3 =A3=B1=A3=B8=A3=B7=A3=B2 = =09 =C9=CF|=BA=A3=A3=BA=A3=A8=A3=B0=A3=B2=A3=B1=A3=A9---=A3=B5=A3=B1=A3=B6= =A3=B1 =A3=B9=A3=B5=A3=B3=A3=B2 =A1=A2=A3=A8=A3=B0=A3=B2=A3=B1=A3=A9--= -=A3=B5=A3=B1=A3=B0=A3=B7 =A3=B8=A3=B1=A3=B3=A3=B0 =09 =B9=E3|=D6=DD=A3=BA=A3=A8=A3=B0=A3=B2=A3=B0=A3=A9---=A3=B6=A3=B1=A3=B1= =A3=B3 =A3=B6=A3=B2=A3=B4=A3=B5 =09 =09 =C1=AA=CF=B5=C8=CB=A3=BA=CD=F5=CF=C8=C9=FA=A1=A2=C1=F5=D0=A1=BD=E3=A1= =A2=BA=CE=D0=A1=BD=E3 =09 =09 =09 =A1=BE=C5=E0=3D=D1=B5=B1=B3=BE=B0=A1=BF=A3=BA =09 =09 Judge=A3=A8=C6=C0=BC=DB=A3=A9=D2=BB=B8=F6=C8=CB=A3=AC=D2=BB=B8=F6=B9= =AB=CB=BE=CA=C7=B2=BB=CA=C7=D3=C5=D0=E3,=B2=BB=D2=AA=BF=B4=CB=FB=CA=C7= =B2=BB=CA=C7Harvard=A3=A8=B9=FE=B7=F0=B4=F3=D1=A7=A3=A9,=CA=C7=B2=BB= =CA=C7Stanford =09 =A3=A8=CB=B9=CC=B9=B8=A3=B4=F3=D1=A7=A3=A9.=B2=BB=D2=AAjudge=A3=A8=C6= =C0=BC=DB=A3=A9=C0=EF=C3=E6=D3=D0=B6=E0=C9=D9=C3=FB=C5=C6=B4=F3=D1=A7= =B1=CF=D2=B5=C9=FA,=B6=F8=D2=AAjudge=A3=A8=C6=C0=BC=DB=A3=A9=D5=E2=B0= =EF=C8=CB=B8=C9=BB=EE=CA=C7=B2=BB =09 =CA=C7=B7=A2=B7=E8=D2=BB=D1=F9=B8=C9=A3=AC=BF=B4=CB=FB=C3=BF=CC=EC=CF= =C2=B0=E0=CA=C7=B2=BB=CA=C7=D0=A6=C3=D0=C3=D0=BB=D8=BC=D2=A3=A1 = =09 =A8D=A8D =B0=A2=C0=EF=B0=CD=B0= =CD=B9=AB=CB=BE=C2=ED=D4=C6 =09 =09 1=A1=A2=D0=C2=D4=B1=B9=A4=D3=D0=BC=A4=C7=E9=A3=AC=C3=BB=D3=D0=D2=B5=BC= =A8=A3=AC=D4=F5=C3=B4=B0=EC=A3=BF =09 2=A1=A2=CE=AA=CA=B2=C3=B4=B2=C5=D7=F6=C1=CB2=C4=EA=A3=AC=C0=CF=D4=B1= =B9=A4=BE=CD=B3=F6=CF=D6=C1=CB=D6=B0=D2=B5=BE=EB=B5=A1=A3=AC=B2=BB=D6= =AA=C9=CF=BD=F8=D4=F5=C3=B4=B0=EC=A3=BF =09 3=A1=A2=D3=D0=D0=A9=CF=FA=CA=DB=C8=CB=D4=B1=D3=F6=B5=BD=D2=BB=B5=E3=B4= =EC=D5=DB=BE=CD=BB=D2=D0=C4=C9=CB=C9=A5=C6=F8=D4=F5=C3=B4=B0=EC=A3=BF = =09 4=A1=A2=BF=CD=BB=A7=CC=E1=B3=F6=D2=EC=D2=E9=A3=AC=D3=D0=D0=A9=CF=FA=CA= =DB=C8=CB=D4=B1=BE=CD=B2=BB=D6=AA=CB=F9=B4=EB=A3=AC=D4=F5=C3=B4=B0=EC= =A3=BF =09 5=A1=A2=B5=A5=D7=D3=CB=C0=B5=F4=A3=AC=CF=FA=CA=DB=C8=CB=D4=B1=B6=BC=BB= =B9=B2=BB=D6=AA=B5=C0=D4=F5=C3=B4=BB=D8=CA=C2=A3=BB =09 6=A1=A2=BC=FB=B5=BD=BF=CD=BB=A7=BA=DC=C8=DD=D2=D7=C0=E4=B3=A1=A3=AC=D5= =D2=B2=BB=B5=BD=BB=B0=CB=B5=D4=F5=C3=B4=B0=EC=A3=BF =09 7=A1=A2=CE=AA=CA=B2=C3=B4=CF=FA=CA=DB=C8=CB=D4=B1=C7=E1=D2=D7=B8=F8=BF= =CD=BB=A7=C1=C1=B3=F6=D7=D4=BC=BA=B5=C4=A1=B0=B5=D7=C5=C6=A1=B1=A3=BF = =09 8=A1=A2=CE=AA=CA=B2=C3=B4=B2=BB=CD=AC=B5=C4=BF=CD=BB=A7=A3=AC=CF=FA=CA= =DB=C8=CB=D4=B1=CB=B5=B4=CA=C7=A7=C6=AA=D2=BB=C2=C9=A3=BF =09 9=A1=A2=CE=AA=CA=B2=C3=B4=B5=DA=D2=BB=B4=CE=C9=CF=C3=C5=BA=F3=A3=AC=B5= =DA=D2=BB=B4=CE=B4=F2=CD=EA=B5=E7=BB=B0=BA=F3=D2=B5=CE=F1=D4=B1=BE=CD= =B2=BB=D6=AA=B5=C0=D4=F5=C3=B4=B8=FA=BD=F8=A3=BF =09 =2E..... =09 =09 =A1=BE=C5=E0+=D1=B5=CC=D8=B5=E3=A1=BF=A3=BA =09 =09 1.=B7=D6=D7=E9=CC=D6=C2=DB=A3=AC=D1=B5=C1=B7=CE=AA=D6=F7=A3=AC=BB=A5= =B6=AF=CA=BD=BD=CC=D1=A7=A3=BB2=B4=CE=CF=D6=B3=A1=BF=BC=CA=D4; =09 2.=D5=E6=CA=B5=B0=B8=C0=FD=B7=D6=CE=F6=A3=AC=B4=F3=C1=BF=BF=CE=BA=F3= =D7=F7=D2=B5=CC=E2=A3=AC=BC=C8=D3=D0=C7=C0=B4=F0=A3=AC=D3=D6=D3=D0=B1= =E7=C2=DB=A3=AC=BB=B9=D3=D0=CF=D6=B3=A1=D1=DD=C1=B7=A3=AC=C8=C8=C1=D2= =B5=C4=BF=CE=CC=C3=B7=D5=CE=A7=A3=BB =09 3.=BD=AB=CF=FA=CA=DB=B9=DC=C0=ED=C8=DA=C8=EB=C5=E0=D1=B5=CF=D6=B3=A1= =A3=BA =09 3.1 =B2=BB=BD=F6=B9=D8=D7=A2=B8=F6=C8=CB=D1=A7=CF=B0=B1=ED=CF=D6=A3=AC= =B6=F8=C7=D2=D6=D8=CA=D3=CD=C5=B6=D3=BA=CF=D7=F7=A3=BB =09 3.2 =B2=BB=BD=F6=B9=D8=D7=A22=CC=EC=D2=D4=C4=DA=B5=C4=D1=A7=CF=B0=A3= =AC=B6=F8=C7=D2=D3=AA=D4=EC2=CC=EC=D2=D4=BA=F3=B5=C4=C5=E0=D1=B5=D1=A7= =CF=B0=B7=D5=CE=A7=A3=BB =09 3.3 =B2=BB=BD=F6=BF=BC=BA=CB=B8=F6=C8=CB=B5=C3=B7=D6=A3=AC=B6=F8=C7=D2= =BF=BC=BA=CB=CD=C5=B6=D3=B5=C3=B7=D6=A3=BB=B2=BB=BD=F6=BF=BC=BA=CB=D1= =A7=D4=B1=B5=C4=D1=A7=CF=B0=B3=C9=BC=A8=A3=AC=B6=F8=C7=D2=BF=BC=BA=CB= =D1=A7=D4=B1=D1=A7=CF=B0=B5=C4=B2=CE=D3=EB=B6=C8. =09 =09 =A1=BE=BF=CE=B3=CC=B4=F3=B8=D9=A1=BF=A3=BA =09 =09 =B5=DA=D2=BB=D5=C2 =BF=CD=BB=A7=D0=E8=C7=F3=B7=D6=CE=F6 =09 =B5=DA=D2=BB=BD=DA =CE=AA=CA=B2=C3=B4=D2=AA=B6=D4=BF=CD=BB=A7=D0=E8=C7= =F3=BD=F8=D0=D0=B7=D6=CE=F6=A3=BF =09 1=A1=A2=C1=CB=BD=E2=BF=CD=BB=A7=B5=C4=B1=B3=BE=B0,=B9=BA=C2=F2=B5=C4= =B1=EA=D7=BC=A3=AC=D7=F6=B5=BD=D6=AA=D2=D1=D6=AA=B1=CB,=BD=BB=C1=F7=B8= =FC=D3=D0=D5=EB=B6=D4=D0=D4=A3=BB =09 2=A1=A2=B4=D3=B7=D6=CE=F6=B2=FA=C6=B7=B5=C4=A1=B0=C2=F4=B5=E3=A1=B1=D7= =AA=B1=E4=B5=BD=D1=D0=BE=BF=BF=CD=BB=A7=B5=C4=A1=B0=C2=F2=B5=E3=A1=B1,= =C1=CB=BD=E2=CA=B2=C3=B4=D1=F9=B5=C4=BF=CD=BB=A7=D0=E8=D2=AA=B1=C8=C1= =CB=BD=E2=BF=CD=BB=A7=D0=E8=D2=AA=CA=B2=C3=B4 =09 =B8=FC=D6=D8=D2=AA=A3=BB =09 3=A1=A2=D2=FD=B5=BC=BF=CD=BB=A7=A3=AC=BF=D8=D6=C6=CC=B8=BB=B0=B5=C4=B7= =BD=CF=F2=A1=A2=BD=DA=D7=E0=A1=A2=C4=DA=C8=DD=A3=AC=B6=F8=B2=BB=CA=C7= =C2=FE=CE=DE=B1=DF=BC=CA; =09 4=A1=A2=D3=D0=C4=BF=B5=C4=B5=D8=D7=F6=BA=C3=B0=DD=B7=C3=BC=C6=BB=AE,= =C3=BF=B4=CE=B9=B5=CD=A8=B6=BC=D3=D0=D0=C2=B5=C4=BB=B0=CC=E2=BA=CD=CA= =D5=BB=F1; =09 5=A1=A2=D6=F7=B6=AF=B3=F6=BB=F7=A3=AC=B2=BB=D2=AA=D2=BB=CE=B6=B5=D8=B7= =C0=CA=D8,=B1=BB=B6=AF=B5=D8=B5=C8=B4=FD=D7=C5=C6=E6=BC=A3=B5=C4=B7=A2= =C9=FA,=CC=B8=B6=F8=D3=D0=A1=B0=C5=D0=A1=B1 =A3=BB =09 6=A1=A2=BF=CD=B9=DB=C0=ED=D0=D4=B7=D6=CE=F6,=D3=D0=B9=FB=B1=D8=D3=D0= =D2=F2=D4=DA=C7=B0=A3=AC=D3=D0=D2=F2=B1=D8=D3=D0=B9=FB=D4=DA=BA=F3,=D2= =BB=D2=F2=B6=E0=B9=FB,=D2=BB=B9=FB=B6=E0=D2=F2=A3=BB =09 7=A1=A2=B2=BB=D2=AA=B0=FC=B0=EC=B4=FA=CC=E6,=D3=C3=D7=D4=BC=BA=B5=C4= =CD=B7=C4=D4=C8=A5=CC=E6=BF=CD=BB=A7=CB=BC=BF=BC,=D3=C3=D7=D4=BC=BA=B5= =C4=BC=DB=D6=B5=D1=A1=D4=F1=C8=A5=B4=FA=CC=E6=BF=CD=BB=A7=B5=C4=BC=DB= =D6=B5=D1=A1=D4=F1. =09 8=A1=A2=CF=FA=CA=DB=C8=CB=D4=B1=D2=AA=BE=DF=B1=B8=B6=C0=C1=A2=C5=D0=B6= =CF=B5=C4=C4=DC=C1=A6=A3=BA =09 8.1 =BF=CD=BB=A7=C0=ED=CF=EB=CB=F9=D0=E8=D3=EB=CF=D6=CA=B5=CB=F9=D0=E8= =B2=BB=D2=BB=D6=C2; =09 8.2 =BF=CD=BB=A7=CB=B5=B5=C3=D3=EB=D7=F6=B5=C4=B2=BB=D2=BB=D6=C2; = =09 8.3 =BF=CD=BB=A7=C7=B0=BA=F3=D1=D4=D3=EF=B2=BB=D2=BB=D6=C2; =09 8.4 =B2=BB=CD=AC=B5=C4=C8=CB=D2=AA=C7=F3=B2=BB=D2=BB=D6=C2=A3=BB = =09 8.5 =BF=CD=BB=A7=C0=ED=BD=E2=D3=EB=CF=FA=CA=DB=C0=ED=BD=E2=B2=BB=D2=BB= =D6=C2. =09 =09 =B0=B8=C0=FD=A3=BA=CE=AA=CA=B2=C3=B4=BC=FB=B5=BD=BF=CD=BB=A7=D5=D2=B2= =BB=B5=BD=BB=B0=CB=B5=A3=BF =09 =B0=B8=C0=FD=A3=BA=C8=E7=BA=CE=BD=F8=D0=D0=B6=FE=B4=CE=A1=A2=C8=FD=B4= =CE=B5=C8=BA=F3=D0=F8=B5=C4=B8=FA=BD=F8=A3=BF =09 =B0=B8=C0=FD=A3=BA=BF=CD=BB=A7=C3=F7=C3=F7=D2=D1=B3=D0=C8=CF=CE=D2=C3= =C7=B2=FA=C6=B7=B7=C7=B3=A3=CA=CA=BA=CF=CB=FB=A3=AC=CE=AA=CA=B2=C3=B4= =BB=B9=D0=E8=D2=AA=B1=C8=BD=CF=D2=BB=CF=C2=A3=BF =09 =B0=B8=C0=FD=A3=BA=CE=D2=B7=C7=B3=A3=D7=D4=D0=C5=B5=D8=B8=E6=CB=DF=B8= =F8=BF=CD=BB=A7=D1=A1=D4=F1=CE=D2=C3=C7=CA=C7=D5=FD=C8=B7=B5=C4=A3=AC= =CE=AA=CA=B2=C3=B4=CB=FB=C3=C7=B2=BB=D0=C5=A3=BF =09 =B0=B8=C0=FD=A3=BA=C5=D0=B6=CF=CB=AD=CA=C7=B9=D8=BC=FC=C8=CB=B5=C48=B8= =F6=D2=F2=CB=D8 =09 =B0=B8=C0=FD=A3=BA=C8=E7=BA=CE=C5=D0=B6=CF=BF=CD=BB=A7=B5=C4=D0=C5=D3= =FE=B6=C8=A1=A2=D6=D2=B3=CF=B6=C8=A3=BF=CF=C8=BB=F5=BA=F3=BF=EE=B5=C4= =D2=C0=BE=DD=CA=C7=CA=B2=C3=B4=A3=BF =09 =09 =B5=DA=B6=FE=BD=DA =BF=CD=BB=A7=D0=E8=C7=F3=B7=D6=CE=F6=B2=BD=D6=E8 = =09 1=A1=A2=C1=CB=BD=E2=BF=CD=BB=A7=B2=C9=B9=BA=B5=C4=BE=AD=C0=FA=A3=BB = =09 2=A1=A2=C5=D0=B6=CF=BF=CD=BB=A7=B5=B1=C7=B0=BC=DB=D6=B5=D3=EB=CE=B4=C0= =B4=BC=DB=D6=B5=A3=BB =09 3=A1=A2=C5=D0=B6=CF=BF=CD=BB=A7=B5=C4=BD=D3=CA=DC=C4=DC=C1=A6=A3=AC=C4= =DA=D0=D0=BB=B9=CA=C7=CD=E2=D0=D0=A3=BB =09 4=A1=A2=C1=CB=BD=E2=BF=CD=BB=A7=B9=BA=C2=F2=B5=C4=B1=EA=D7=BC=A3=BB = =09 5=A1=A2=B6=D4=BF=CD=BB=A7=B9=BA=C2=F2=B5=C4=D0=E8=C7=F3=BD=F8=D0=D0=C8= =B7=C8=CF=A3=BB =09 6=A1=A2=D3=EB=BF=CD=BB=A7=B9=B2=CD=AC=C8=B7=B6=A8=B2=C9=B9=BA=B5=C4=B1= =EA=D7=BC =09 =D7=F7=D2=B5=A3=BA=C8=E7=BA=CE=C9=E8=BC=C6=BF=CD=BB=A7=D0=E8=C7=F3=B7= =D6=CE=F6=CA=D6=B2=E1=A3=BF =09 =09 =B5=DA=B6=FE=D5=C2 =C8=E7=BA=CE=D5=FD=C8=B7=CD=C6=BC=F6=B2=FA=C6=B7 = =09 =B0=B8=C0=FD=A3=BA=CE=AA=CA=B2=C3=B4=CE=D2=C2=FA=D7=E3=BF=CD=BB=A7=CB= =F9=CC=E1=B3=F6=B5=C4=D2=AA=C7=F3=A3=AC=BF=CD=BB=A7=C8=B4=BB=B9=D0=E8= =D2=AA=BF=BC=C2=C7=D2=BB=CF=C2=A3=BF =09 =B0=B8=C0=FD=A3=BA=CE=AA=CA=B2=C3=B4=BF=CD=BB=A7=B2=BB=CF=E0=D0=C5=CE= =D2=D6=CA=C1=BF=D3=EB=B7=FE=CE=F1=B5=C4=B3=D0=C5=B5=A3=BF =09 =B5=DA=D2=BB=BD=DA =CE=AA=CA=B2=C3=B4=D0=E8=D2=AA=CE=D2=C3=C7=D5=FD=C8= =B7=B5=D8=CD=C6=BC=F6=B2=FA=C6=B7=A3=BF =09 =D2=BB=A1=A2=BF=CD=BB=A7=CD=F9=CD=F9=B6=D4=D7=D4=BC=BA=C9=EE=B2=E3=B4= =CE=B5=C4=CE=CA=CC=E2=B2=A2=B2=BB=C7=E5=B3=FE=A3=BB =09 =B6=FE=A1=A2=BF=CD=BB=A7=B5=C4=CC=E1=B3=F6=B5=C4=D2=AA=C7=F3=BF=C9=C4= =DC=CA=C7=C4=A3=BA=FD=BB=F2=B3=E9=CF=F3,=D3=D0=B5=C4=BD=F6=BD=F6=CC=E1= =B3=F6=B7=BD=CF=F2=A3=AC=B2=BB=D2=AA=BE=D6=CF=DE=D3=DA=BF=CD=BB=A7=C3= =F7=CF=D4=B5=C4=CE=CA=CC=E2,=CD=B7=CD=B4=D2=BD=CD=B7 =09 ,=BD=C5=CD=B4=D2=BD=BD=C5=A3=BB =09 =C8=FD=A1=A2=BF=CD=BB=A7=CD=F9=CD=F9=BB=E1=D2=D4=CE=D2=C3=C7=BE=BA=C6= =B7=B8=F8=CB=FB=B5=C4=CC=F5=BC=FE=D2=AA=C7=F3=CE=D2=C3=C7=A3=AC=CF=EB= =D2=AA=B5=C4=B2=BB=D2=BB=B6=A8=BE=CD=CA=C7=CB=FB=D0=E8=D2=AA=B5=C4 = =09 =CB=C4=A1=A2=C2=FA=D7=E3=BF=CD=BB=A7=CC=E1=B3=F6=B5=C4=D2=AA=C7=F3=A3= =AC=CA=C7=D2=FD=B5=BC=BF=CD=BB=A7=D4=DA=B2=BB=CD=AC=B9=AB=CB=BE=D6=AE= =BC=E4=D7=F6=B1=C8=BD=CF=A3=AC=B6=F8=B2=BB=D4=DA=CE=D2=B9=AB=CB=BE=D7= =F6=B3=F6=BE=F6=B2=DF=A3=BB =09 =CE=E5=A1=A2=BA=C3=B2=FA=C6=B7=A3=AC=B2=BB=D2=BB=B6=A8=CA=C7=D7=EE=CA= =CA=BA=CF=B5=C4=A3=AC=D7=EE=CA=CA=BA=CF=B5=C4=B2=FA=C6=B7=B2=C5=CA=C7= =D7=EE=BA=C3=B5=C4=A3=BA =09 1=A1=A2=CA=CA=B5=B1=B5=C4=CA=FD=C1=BF 2=A1=A2=CA=CA=B5=B1=B5=C4= =BC=DB=B8=F1 =09 3=A1=A2=CA=CA=BA=CF=B5=C4=CA=B1=BC=E4 4=A1=A2=CA=CA=B5=B1=B5=C4= =B5=D8=D6=B7 =09 5=A1=A2=CA=CA=B5=B1=B5=C4=D6=CA=C1=BF =09 =B0=B8=C0=FD=A3=BA=BF=CD=BB=A7=B9=D8=D0=C4=B5=C4=CA=C7=C4=E3=C8=E7=BA= =CE=B1=A3=D6=A4=C4=E3=B5=C4=D6=CA=C1=BF=BA=CD=C4=E3=B5=C4=B7=FE=CE=F1= =CB=AE=C6=BD =09 =09 =B5=DA=B6=FE=BD=DA =C8=E7=BA=CE=B0=EF=D6=FA=BF=CD=BB=A7=BD=A8=C1=A2=A1= =B0=C5=C5=CB=FB=D0=D4=A1=B1=B5=C4=B2=C9=B9=BA=B1=EA=D7=BC=A3=BF = =09 =CD=C6=BC=F6=B2=FA=C6=B7=D6=D0=B3=A3=D3=C3=B5=C434=CF=EE=C4=DA=C8=DD= =A3=BA=C6=B7=C5=C6=A1=A2=B3=C9=B1=BE=A1=A2=D6=CA=C1=BF=A1=A2=B9=A9=BB= =F5=C4=DC=C1=A6=A1=A2=B5=D8=C0=ED=CE=BB=D6=C3=A1=A2=CA=D0=B3=A1=B5=D8= =CE=BB=A1=A2=B3=C9=B9=A6=B0=B8=C0=FD=A1=A2=C9=FA=B2=FA =09 =BC=BC=CA=F5=D3=EB=C9=E8=B1=B8=A1=A2=BF=C9=BF=BF=D0=D4=A1=A2=D1=F9=C6= =B7=A1=A2=BC=BC=CA=F5=B7=FE=CE=F1=A1=A2=BD=BB=BB=F5=A1=AD =09 =09 =B5=DA=C8=FD=D5=C2 =C8=E7=BA=CE=D3=D0=D0=A7=B4=A6=C0=ED=D2=EC=D2=E9 = =09 =D2=BB=A1=A2=B6=D4=CA=C2=B2=BB=B6=D4=C8=CB=A3=AC=C4=E3=C8=E7=BA=CE=BF= =B4=B1=F0=C8=CB=A3=AC=B1=F0=C8=CB=BE=CD=BB=E1=C8=E7=BA=CE=BF=B4=C4=E3 = =09 =B0=B8=C0=FD=A3=BA=D3=F6=B5=BD=D0=A1=C6=F8=A1=A2=B9=CC=D6=B4=A1=A2=B4= =D6=C2=B3=A1=A2=86=AA=E0=C2=A1=A2=BF=CC=B1=A1=A1=A2=B4=B5=C3=AB=C7=F3= =B4=C3=A1=A2=D3=C5=C8=E1=B9=D1=B6=CF=B5=C4=BF=CD=BB=A7=D3=A6=B6=D4=A3= =BF =09 =B0=B8=C0=FD=A3=BA=BF=CD=BB=A7=D6=B1=BD=D3=B9=D2=B5=E7=BB=B0=A3=AC=D4= =F5=C3=B4=B0=EC=A3=BF =09 =B0=B8=C0=FD=A3=BA=B8=D5=BC=FB=C3=E6=A3=AC=BF=CD=BB=A7=BE=CD=B6=D4=CE= =D2=B7=A2=BB=F0=A3=AC=D4=F5=C3=B4=B0=EC=A3=BF =09 =09 =B6=FE=A1=A2=BF=CD=BB=A7=D2=EC=D2=E9=B4=A6=C0=ED=D2=AA=D3=D06=B8=F6=C7= =F8=B7=D6: =09 1=A1=A2=D2=AA=C7=F8=B7=D6=A1=B0=B5=DA=D2=BB=A1=B1 =BB=B9=CA=C7=A1=B0= =CE=A8=D2=BB=A1=B1 =09 2=A1=A2=B6=D4=BF=CD=BB=A7=D2=AA=C7=F3=B5=C4=D5=E6=CE=B1=BD=F8=D0=D0=BC= =F8=B1=F0; =09 3=A1=A2=D2=AA=C7=F8=B7=D6=A1=B0=C7=E9=D0=F7=A1=B1=BB=B9=CA=C7=A1=B0=D0= =D0=CE=AA=A1=B1 =09 4=A1=A2=C7=F8=B7=D6=A1=B0=BC=D9=CF=EB=A1=B1=BB=B9=CA=C7=A1=B0=CA=C2=CA= =B5=A1=B1 =09 5=A1=A2=C7=F8=B1=F0=CE=CA=CC=E2=B5=C4=C7=E1=D6=D8,=BB=BA=BC=B1; = =09 6=A1=A2=D0=C4=C0=EF=CF=EB=B5=C4=BA=CD=CA=B5=BC=CA=D7=F6. =09 =09 =C8=FD=A1=A2=C0=ED=BD=E2=BF=CD=BB=A7=B2=C9=B9=BA=B5=C4=D0=C4=CC=AC=A3= =BB =09 1=A1=A2=BF=CD=BB=A7=CC=B8=C5=D0=CA=B1=B3=A3=D3=C37=D6=D6=CA=D4=CC=BD= =BC=BC=C7=C9=B7=D6=CE=F6=A3=BB =09 2=A1=A2=CE=AA=CA=B2=C3=B4=D3=D0=D0=A9=BF=CD=BB=A7=B6=D4=CE=D2=C3=C7=CC= =AC=B6=C8=B7=C7=B3=A3=BA=C3=A3=AC=BF=C9=CA=C7=BE=CD=CA=C7=B2=BB=CF=C2= =B5=A5=A3=BF =09 3=A1=A2=CE=AA=CA=B2=C3=B4=D3=D0=D0=A9=BF=CD=BB=A7=C8=C3=CE=D2=C3=C7=B8= =D0=BE=F5=B8=DF=B8=DF=D4=DA=C9=CF=A3=AC=BB=A8=C7=AE=CA=C7=B4=F3=D2=AF= =A3=BF=C4=D1=B5=C0=CB=FB=C3=C7=CB=D8=D6=CA=D5=E6=B5=C4=B2=EE=A3=BF = =09 4=A1=A2=BF=CD=BB=A7=D7=D4=C9=ED=BB=E1=D3=D0=C4=C46=B8=F6=D1=B9=C1=A6= =A3=BF =09 =09 =B0=B8=C0=FD=A3=BA=BF=CD=BB=A7=CC=E1=B3=F6=BA=CF=C0=ED=CC=F5=BC=FE=A3= =AC=CA=C7=B7=F1=CE=D2=BE=CD=D3=A6=B8=C3=BD=B5=BC=DB=A3=BF =09 =B0=B8=C0=FD=A3=BA=C8=E7=BA=CE=B7=D6=C7=E5=BF=CD=BB=A7=D2=EC=D2=E9=B5= =C4=D5=E6=CA=B5=D0=D4=A3=BF =09 =B0=B8=C0=FD=A3=BA=B5=B1=CC=B8=C5=D0=B3=F6=CF=D6=BD=A9=BE=D6=CA=B1=D4= =F5=C3=B4=B0=EC=A3=BF =09 =B0=B8=C0=FD=A3=BA=CE=AA=CA=B2=C3=B4=CE=D2=B4=F0=D3=A6=BF=CD=BB=A7=CC= =E1=B3=F6=B5=C4=CB=F9=D3=D0=B5=C4=CC=F5=BC=FE=A3=AC=B7=B4=B6=F8=CA=A7= =C8=A5=C1=CB=B6=A9=B5=A5=A3=BF =09 =B0=B8=C0=FD=A3=BA=BF=CD=BB=A7=D2=BB=D4=D9=B5=D8=CC=E1=B3=F6=B2=BB=CD= =AC=B5=C4=CC=F5=BC=FE=A3=AC=D4=F5=C3=B4=B4=A6=C0=ED=A3=BF =09 =B0=B8=C0=FD=A3=BA=BF=CD=BB=A7=D2=AA=C7=F3=CE=D2=BD=B5=BC=DB=CA=B1,=D4= =F5=C3=B4=B0=EC?=C7=EB=B7=D68=B8=F6=B2=BD=D6=E8=B4=A6=C0=ED =09 =09 =B5=DA=CB=C4=D5=C2 =C8=E7=BA=CE=BD=A8=C1=A2=C1=BC=BA=C3=B5=C4=BF=CD= =C7=E9=B9=D8=CF=B5=A3=BF =09 =B0=B8=C0=FD=A3=BA=D7=F6=CF=FA=CA=DB=B9=A4=D7=F7=CA=C7=B7=F1=BE=CD=D0= =E8=D2=AA=B7=E8=BF=F1=A1=A2=D4=B2=BB=AC=A1=A2=B7=EE=B3=D0=A1=A2=BC=FB= =C8=CB=CB=B5=C8=CB=BB=B0=A3=AC=BC=FB=B9=ED=CB=B5=B9=ED=BB=B0=C2=F0=A3= =BF =09 =09 =B5=DA=D2=BB=BD=DA =D7=F6=BB=D8=D5=E6=CA=B5=BA=CD=D5=E6=B3=CF=B5=C4=D7= =D4=BC=BA=A3=AC=B1=ED=C0=EF=C8=E7=D2=BB =09 1=A1=A2=D1=DD=B1=F0=C8=CB,=D4=D9=BA=C3=B5=C4=D1=DD=BC=BC=D2=B2=BB=E1= =B8=E3=D4=D2=A3=AC=CF=EB=D7=F6=B1=F0=C8=CB=B5=C4=CA=B1=BA=F2,=C4=E3=BE= =CD=BB=E1=C0=EB=D7=D4=BC=BA=BA=DC=D4=B6=A3=BB =09 2=A1=A2=B2=BB=CD=AC=B5=C4=C8=CB,=D0=E8=C7=F3=B2=BB=CD=AC,=D4=BD=B8=C4= =D4=BD=C0=DB,=D4=BD=B8=C4=D4=BD=C6=F8,=D6=BB=BB=E1=B0=D1=D7=D4=BC=BA= =D5=DB=C4=A5=B5=C3=D0=C4=B8=A1=C6=F8=D4=EA,=B2=BB=B5=C3=C8=CB=D0=C4=A3= =BB =09 3=A1=A2=D2=D4=C5=F3=D3=D1=B5=C4=D0=C4=CC=AC=D3=EB=BF=CD=BB=A7=BD=BB=CD= =F9=A3=AC=B9=FD=B6=E0=B5=C4=C9=CC=D2=B5=BB=AF=D3=EF=D1=D4=A1=A2=D0=D0= =CE=AA=A1=A2=B9=FD=B6=E0=B5=C4=C0=F1=D2=C7=D6=BB=BB=E1=C8=C3=BF=CD=BB= =A7=B8=D0=BE=F5=B5=BD=C9=FA=D3=B2=A1=A2=BE=E0=C0=EB=A1=A2 =09 =C5=C5=B3=E2=A1=A2=B9=AB=CA=C2=B9=AB=B0=EC=A3=AC=C3=BB=D3=D0=B8=D0=C7= =E9=A3=BB =09 4=A1=A2=CA=CA=B5=B1=B5=C4=B1=A9=C2=B6=D7=D4=BC=BA=B5=C4=C8=B1=B5=E3=A3= =AC=D4=BD=CD=EA=C3=C0=B5=C4=C8=CB=D4=BD=B2=BB=BF=C9=D0=C5=A3=BB = =09 5=A1=A2=CA=D8=CA=B1,=CA=D8=D0=C5,=CA=D8=D4=BC,=BC=B0=CA=B1=B4=AB=B5=DD= =BD=F8=B3=CC=D3=EB=D0=C5=CF=A2=A3=AC=C8=C3=BF=CD=BB=A7=B8=D0=BE=F5=B5= =BD=BF=C9=BF=D8=D0=D4=A3=BB =09 =09 =B5=DA=B6=FE=BD=DA =B8=D0=D0=BB=C9=CB=BA=A6=CE=D2=B5=C4=C8=CB=A3=AC=CA= =C7=D2=F2=CE=AA=CE=D2=D7=D4=BC=BA=B4=ED=C1=CB=A3=BB =09 =B0=B8=C0=FD=A3=BA=BC=B0=CA=B1=B7=A2=CF=D6=BF=CD=BB=A7=B5=C4=C7=B1=D2= =E2=CA=B6=A3=BA =09 1=A1=A2=D2=BB=CE=B6=CB=B3=B4=D3:=B6=D4=CF=FA=CA=DB=C8=CB=D4=B1=C3=BF= =D2=BB=BE=E4=BB=B0=B6=BC=B1=ED=CA=BE=BE=F8=B6=D4=D4=DE=CD=AC; =09 2=A1=A2=CD=C6=D0=B6=D4=F0=C8=CE:=C8=CF=CE=AA=B6=BC=CA=C7=B1=F0=C8=CB= =B5=C4=D4=AD=D2=F2,=B6=F8=D3=EB=D7=D4=BC=BA=CE=DE=B9=D8; =09 3=A1=A2=C0=ED=C2=DB=BD=BB=CC=B8:=BF=CD=BB=A7=D3=C3=D7=A8=D2=B5=CA=F5= =D3=EF=D3=EB=D2=B5=CE=F1=D4=B1=CC=B8,=C7=B1=D2=E2=CA=B6=CA=C7=B6=D4=D2= =B5=CE=F1=D4=B1=BB=B3=D2=C9; =09 4=A1=A2=CC=B8=C2=DB=D0=A1=CA=C2:=BF=CD=BB=A7=B6=D4=BB=E1=CC=B8=D6=D0= =CE=DE=B9=D8=BD=F4=D2=AA=B5=C4=D0=A1=CA=C2=CC=B8=C2=DB=B2=BB=D6=B9; = =09 5=A1=A2=CE=DE=B3=CF=D0=C5:=B2=BB=B0=B4=D4=BC=B6=A8=B5=C4=CA=B1=BC=E4= =BC=FB=C3=E6,=BB=F2=BD=E8=B9=CA=B3=D9=B5=BD=BB=F2=D5=D2=C0=ED=D3=C9=D4= =E7=CD=CB,=B2=BB=B0=B4=D4=BC=B6=A8=D2=AA=C7=F3=CC=E1=B9=A9=D0=C5=CF=A2= =D7=CA=C1=CF,=B2=BB=B8=B6=BB=F2=D1=D3=B8=B6 =09 =B6=A9=BD=F0; =09 =09 =B5=DA=C8=FD=BD=DA =B0=DA=D5=FD=D7=D4=BC=BA=B5=C4=CE=BB=D6=C3 =09 1=A1=A2=C7=BF=CA=C6=CA=C7=CC=E5=CF=D6=D4=DA=B9=AB=CB=BE=D2=D4=BC=B0=B2= =FA=C6=B7=B1=BE=C9=ED=A3=AC=B6=F8=B2=BB=CA=C7=CC=E5=CF=D6=D4=DA=CF=FA= =CA=DB=C8=CB=D4=B1=B1=BE=C8=CB=A3=BB =09 2=A1=A2=C8=C3=B1=F0=C8=CB=B1=E4=B5=C3=CE=B0=B4=F3=A3=AC=B6=F8=B2=BB=CA= =C7=D7=D4=BC=BA=A3=AC=B2=BB=D2=AA=B1=E1=B5=CD=C8=CE=BA=CE=C8=CB=A3=BB = =09 3=A1=A2=B5=CD=B5=F7=CA=C7=D7=EE=C5=A3=B5=C4=EC=C5=D2=AB=A3=AC=B5=D8=B5= =CD=CE=AA=BA=A3=A3=AC=C8=CB=B5=CD=CE=AA=CD=F5=A3=BB =09 4=A1=A2=BB=E1=BF=DE=B5=C4=BA=A2=D7=D3=D3=D0=C4=CC=B3=D4=A3=AC=BB=E1=BF= =DE=B5=C4=C5=AE=C8=CB=D7=EE=B4=CF=C3=F7=A1=A3 =09 =09 =B0=B8=C0=FD=A3=BA=D7=D4=CE=D2=B1=A9=C2=B6=B5=C4=CB=C4=B8=F6=B2=E3=B4= =CE: =09 =B5=DA=D2=BB=B2=E3:=D0=CB=C8=A4=B0=AE=BA=C3=A1=A2=D2=FB=CA=B3=CF=B0=B9= =DF=A1=A2=C6=AB=BA=C3=B5=C8; =09 =B5=DA=B6=FE=B2=E3:=B6=D4=D6=DC=B1=DF=B5=C4=C8=CB(=B7=C7=BC=D2=C8=CB)= =BB=F2=CA=C2=B5=C4=BF=B4=B7=A8=A3=BB =09 =B5=DA=C8=FD=B2=E3:=D7=D4=BC=BA=B5=C4=D7=D4=B1=B0=C7=E9=BD=DA=A1=A2=BA= =CD=BC=D2=C8=CB=B5=C4=C7=D7=C3=DC=B9=D8=CF=B5=A3=BB =09 =B5=DA=CB=C4=B2=E3: =B8=F6=CC=E5=B2=BB=CE=AA=C9=E7=BB=E1=BD=D3=CA=DC= =B5=C4=D2=BB=D0=A9=CF=EB=B7=A8=BA=CD=D0=D0=CE=AA=A1=A3 =09 =09 =B0=B8=C0=FD=A3=BA=C9=FA=D2=E2=B2=BB=B3=C9=C8=CA=D2=E5=D4=DA=A3=AC=D4= =DB=C1=A9=BD=BB=B8=F6=C5=F3=D3=D1=A3=AC=D5=E2=BE=E4=BB=B0=D3=A6=B8=C3= =D3=C9=CB=AD=CB=B5=A3=BF =09 =B0=B8=C0=FD=A3=BA=D1=FB=C7=EB=BF=CD=BB=A7=B3=D4=B7=B9=A3=AC=C4=E3=D3= =A6=B8=C3=D4=F5=C3=B4=CB=B5=A3=BF =09 =B0=B8=C0=FD=A3=BA=B5=B1=BF=CD=BB=A7=B1=ED=D1=EF=C1=CB=C4=E3=A3=AC=C4= =E3=BB=E1=D4=F5=C3=B4=BB=D8=B4=F0=A3=BF =09 =B0=B8=C0=FD=A3=BA=CE=D2=B4=FA=B1=ED=B9=AB=CB=BE=B5=C4=D0=CE=CF=F3=A3= =AC=CA=C7=B7=F1=CE=D2=D3=A6=B8=C3=B1=ED=CF=D6=D7=D4=BC=BA=BA=DC=C7=BF= =CA=C6=A3=BF =09 =B0=B8=C0=FD=A3=BA=CE=AA=C1=CB=BB=F1=B5=C3=BF=CD=BB=A7=B5=C4=D0=C5=C8= =CE=A3=AC=CE=D2=CA=C7=B7=F1=D3=A6=B8=C3=BB=A8=D6=D8=BD=F0=B0=FC=D7=B0= =D7=D4=BC=BA=A3=BF=C8=C3=D7=D4=BC=BA=BA=DC=CD=EA=C3=C0=A3=BF =09 =B0=B8=C0=FD=A3=BA=CE=AA=CA=B2=C3=B4=CE=D2=B6=D4=BF=CD=BB=A7=B7=C7=B3= =A3=D3=D0=C0=F1=C3=B2=A3=AC=B5=AB=C8=B4=B8=D0=BE=F5=B5=BD=D3=D0=BA=DC= =BE=E0=C0=EB=A3=BF =09 =09 =B5=DA=CE=E5=D5=C2 =CD=C5=B6=D3=C5=E4=BA=CF=A3=AC=BE=A1=BC=BA=D6=AE= =C1=A6=A3=AC=B2=BB=C8=E7=BE=A1=C8=CB=D6=AE=C1=A6 =09 =B0=B8=C0=FD=A3=BA=B5=B1=BF=CD=BB=A7=C0=CF=B0=E5=B2=BB=BD=D3=CA=DC=CE= =D2=B5=C4=CA=B1=BA=F2=A3=AC=D3=A6=B8=C3=D4=F5=C3=B4=B0=EC=A3=BF = =09 =B0=B8=C0=FD=A3=BA=CE=D2=B2=BB=B8=D2=C4=B0=B0=DD=D4=F5=C3=B4=B0=EC=A3= =BF=CE=D2=BC=BC=CA=F5=D6=AA=CA=B6=C8=B1=B7=A6=D4=F5=C3=B4=B0=EC=A3=BF= =CE=D2=B2=BB=BB=E1=D3=A6=B3=EA=D4=F5=C3=B4=B0=EC?... =09 =B0=B8=C0=FD=A3=BA=B6=E0=B4=CE=C9=CF=C3=C5=B0=DD=B7=C3=B1=BB=BE=DC=BE= =F8=A3=AC=C3=BB=D3=D0=D0=C5=D0=C4=D4=F5=C3=B4=B0=EC=A3=BF =09 =B0=B8=C0=FD=A3=BA=D0=C2=D4=B1=B9=A4=BD=F8=C8=EB=B9=AB=CB=BE=BA=F3=C3= =BB=D3=D0=B7=BD=CF=F2=D4=F5=C3=B4=B0=EC=A3=BF =09 =B0=B8=C0=FD=A3=BA=CA=C7=B2=BB=CA=C7=CA=C0=BD=E7=C9=CF=C8=CE=BA=CE=C1= =BD=B8=F6=C8=CB=D4=DA=D2=BB=C6=F0=B6=BC=BB=E1=D3=D0=CD=C5=B6=D3=BE=AB= =C9=F1=A3=BF =09 =09 =B5=DA=D2=BB=BD=DA=A1=A2=CD=C5=B6=D3=C5=E4=BA=CF=B5=C4=D6=D8=D2=AA=D0= =D4=A3=BA =09 1=A1=A2=D2=BB=D2=D1=CA=C7=C8=CB=A3=AC=D6=DA=C8=CB=CA=C7=CC=EC=A3=BB=C4= =B1=CA=C2=D4=DA=C8=CB=A3=AC=B3=C9=CA=C2=D4=DA=CC=EC=A3=BB =09 2=A1=A2=C3=BB=D3=D0=CD=EA=C3=C0=B5=C4=B8=F6=C8=CB=A3=AC=D6=BB=D3=D0=CD= =EA=C3=C0=B5=C4=CD=C5=B6=D3=A3=BB=B3=C9=B9=A6=CA=C7=D2=F2=CE=AA=D3=C5= =CA=C6=A3=AC=C3=D6=B2=B9=C8=B1=B5=E3=D6=BB=C4=DC=B1=E4=B5=C3=C6=BD=D3= =B9=A3=BB =09 4=A1=A2=B6=FE=B0=CB=B7=A8=D4=F2=BE=F6=B6=A8=C1=CB80%=C8=CB=CF=EB=B3=C9= =B9=A6=D0=E8=D2=AA=BD=E8=D6=FA20%=C8=CB=B5=C4=C1=A6=C1=BF=A3=BB = =09 5=A1=A2=B2=BB=D2=AA=D3=C3=D7=D4=BC=BA=B5=C4=C8=B1=B5=E3=D3=EB=B1=F0=C8= =CB=B5=C4=D3=C5=CA=C6=CF=E0=B1=C8=A3=BB =09 6=A1=A2=B2=BB=D2=AA=B0=D1=D7=A8=B2=C5=B5=B1=C8=AB=B2=C5=D3=C3=A3=AC=C4= =E3=CC=D6=D1=E1=D7=F6=B5=C4=CA=C2=A3=AC=B8=D5=BA=C3=CA=C7=B1=F0=C8=CB= =CF=B2=BB=B6=D7=F6=B5=C4=CA=C2=A1=A3 =09 =09 =B5=DA=B6=FE=BD=DA=A1=A2=D6=D8=D0=C2=CA=F7=C1=A2=B6=D4=CD=C5=B6=D3=B5= =C4=C8=CF=CA=B6 =09 =CD=C5=B6=D3=C7=B0=CC=E1=D2=BB=A3=BA=BB=A5=B2=B9=D0=D4=A3=AC=CD=AC=D0= =D4=CF=E0=B3=E2=A3=AC=D2=EC=D0=D4=CF=E0=CE=FC=A3=AC=D2=BB=C9=BD=B2=BB= =C8=DD=B6=FE=BB=A2=A3=BB =09 1.1 =B6=D4=CF=FA=CA=DB=B9=A4=D7=F7=B8=DA=CE=BB=BD=F8=D0=D0=B7=D6=CE= =F6=A3=AC=C7=F8=B7=D612=D6=D6=B2=BB=CD=AC=B5=C4=BC=BC=C4=DC=A3=BB = =09 1.2 =D0=D4=B8=F1=B5=C4=BB=A5=B2=B9=A3=AC6=D6=D6=B2=BB=CD=AC=D0=D4= =B8=F1=CC=D8=D5=F7=A3=BB =09 1.3 =BC=DB=D6=B5=BB=A5=B2=B9=A3=BA=D7=B7=C7=F3=C8=A8=A1=A2=D7=B7=C7= =F3=C7=AE=A1=A2=D7=B7=C7=F3=C7=E9=B8=D0 =09 =09 =CD=C5=B6=D3=C7=B0=CC=E1=B6=FE=A3=BA=C0=FB=D2=E6=BD=BB=BB=BB=A3=AC=C3= =BB=D3=D0=D3=C0=D4=B6=B5=C4=C5=F3=D3=D1=A3=AC=D6=BB=D3=D0=D3=C0=D4=B6= =B5=C4=C0=FB=D2=E6=A3=BB =09 =CD=C5=B6=D3=C7=B0=CC=E1=C8=FD=A3=BA=C7=E9=B8=D0=C8=CF=BF=C9=A3=AC=CD= =C5=B6=D3=B3=C9=D4=B1=B5=C4=B8=D0=C7=E9=CA=C7=CC=EC=C9=FA=B5=C4=A3=BB = =09 =09 =B0=B8=C0=FD=A3=BA=B5=EA=C3=E6/=D5=B9=CC=FC=CF=FA=CA=DB=B5=C4=CD=C5=B6= =D3=BA=CF=D7=F7=C4=A3=CA=BD =09 =B0=B8=C0=FD=A3=BA=B4=F3=BF=CD=BB=A7=CF=FA=CA=DB=B5=C4=CD=C5=B6=D3=BA= =CF=D7=F7=C4=A3=CA=BD =09 =B0=B8=C0=FD=A3=BA=BF=CD=BB=A7=D0=C5=CF=A2=C1=BF=B4=F3=B5=C4=CD=C5=B6= =D3=BA=CF=D7=F7=C4=A3=CA=BD =09 =B0=B8=C0=FD=A3=BA=D0=C2=D4=B1=B9=A4=CD=C5=B6=D3=BA=CF=D7=F7=C4=A3=CA= =BD=BD=A8=D2=E9 =09 =09 =B5=DA=C8=FD=BD=DA=A1=A2=B2=BB=CD=AC=BF=CD=BB=A7=CF=B2=BB=B6=B2=BB=CD= =AC=B7=E7=B8=F1=B5=C4=CF=FA=CA=DB=C8=CB=D4=B1 =09 1=A1=A2 =CF=FA=CA=DB=C8=CB=D4=B1=D0=CE=CF=F3=D3=EB=BE=D9=D6=B9=A3=AC= =D7=A2=D2=E2=D7=D4=BC=BA=B5=C4=D0=CE=CF=F3=A3=BB =09 2=A1=A2 =CA=C7=B7=F1=BE=DF=B1=B8=CF=E0=CB=C6=B5=C4=B1=B3=BE=B0=A3=AC= =C3=C5=B5=B1=BB=A7=B6=D4=A3=BB =09 3=A1=A2 =CA=C7=B7=F1=BE=DF=B1=B8=CF=E0=CD=AC=B5=C4=C8=CF=CA=B6=A3=AC= =B5=C0=B2=BB=CD=AC=B2=BB=CF=E0=CE=AA=C3=CB=A3=BB =09 4=A1=A2 =CA=C7=B7=F1=A1=B0=CD=B6=C6=E4=CB=F9=BA=C3=A1=B1=A3=AC=BB=B0= =B2=BB=CD=B6=BB=FA=B0=EB=BE=E4=B6=E0=A3=BB =09 5=A1=A2 =D4=DE=C3=C0=A3=AC=CF=B2=BB=B6=B6=D4=B7=BD=A3=AC=CE=D2=C3=C7= =CD=AC=D1=F9=B6=D4=CF=B2=BB=B6=CE=D2=C3=C7=B5=C4=C8=CB=D3=D0=BA=C3=B8= =D0=A3=BB =09 =CF=C8=BD=BB=C1=F7=B8=D0=C7=E9,=D4=F6=BD=F8=BB=A5=D0=C5,=D3=FB=CB= =D9=D4=F2=B2=BB=B4=EF; =09 6=A1=A2 =CA=C7=B7=F1=B6=D4=CF=FA=CA=DB=C8=CB=D4=B1=CA=EC=CF=A4=A3=AC= =CF=FA=CA=DB=D7=EE=BC=C9=BB=E4=BD=BB=C7=B3=D1=D4=C9=EE=A3=BB =09 =B3=F5=B4=CE=BC=FB=C3=E6=BE=CD=C6=F3=CD=BC=B8=FA=B1=F0=C8=CB=B3=C9= =CE=AA=C5=F3=D3=D1=B5=C4=D0=D0=CE=AA=BA=DC=D3=D7=D6=C9=A3=BB =09 =B3=F5=B4=CE=BC=FB=C3=E6=BE=CD=B0=B5=CA=BE=BA=C3=B4=A6=B5=C4=D0=D0= =CE=AA=BA=DC=B7=F4=C7=B3=A3=BB =09 =B8=D5=BC=FB=C3=E6=BE=CD=C7=BF=B5=F7=BC=DB=B8=F1=BA=DC=B1=E3=D2=CB= =B5=C4=D0=D0=CE=AA=BA=DC=D3=DE=B4=C0=A3=BB =09 7=A1=A2 =CF=FA=CA=DB=C8=CB=D4=B1=CA=C7=B7=F1=BE=DF=B1=B8=C7=D7=BA=CD= =C1=A6=A3=AC=B1=F0=C8=CB=B5=C4=C1=B3=CA=C7=D7=D4=BC=BA=B5=C4=D2=BB=C3= =E6=BE=B5=D7=D3=A3=BB =09 =B3=C9=BD=BB=B2=A2=B2=BB=C8=A1=BE=F6=D3=DA=CB=B5=C0=ED=A3=AC=B6=F8= =CA=C7=C8=A1=BE=F6=D3=DA=D0=C4=C7=E9 =09 8=A1=A2 =CF=FA=CA=DB=C8=CB=D4=B1=CA=C7=B7=F1=D6=B5=B5=C3=D0=C5=C0=B5= =A1=A3 =09 =09 =B5=DA=C1=F9=D5=C2 =D0=C2=BF=CD=BB=A7=BF=AA=B7=A2 =09 =D2=BB=A1=A2=BF=CD=BB=A7=CA=C7=B8=F9=BE=DD=D7=D4=BC=BA=CB=F9=CD=B6=C8= =EB=B5=C4=BE=AB=C1=A6=A1=A2=BD=F0=C7=AE=C0=B4=C8=B7=B6=A8=D7=D4=BC=BA= =B5=C4=CC=AC=B6=C8=A3=BB =09 =B6=FE=A1=A2=C8=E7=BA=CE=B2=C5=C4=DC=D2=FD=B5=BC=BF=CD=BB=A7=D7=F7=D7= =D4=CE=D2=CB=B5=B7=FE=A3=BF =09 =B0=B8=C0=FD=A3=BA=CE=AA=CA=B2=C3=B4=BF=CD=BB=A7=D2=BB=BF=AA=CA=BC=BA= =DC=D3=D0=D0=CB=C8=A4=A3=AC=B5=AB=B3=D9=B3=D9=B2=BB=CF=C2=B5=A5=A3=BF = =09 =B0=B8=C0=FD=A3=BA=C7=B0=CC=EC=C3=F7=C3=F7=CB=B5=B2=BB=C2=F2=B5=C4=BF= =CD=BB=A7=BE=D3=C8=BB=BD=F1=CC=EC=C8=B4=C2=F2=C1=CB=A3=AC=CE=AA=CA=B2= =C3=B4=A3=BF =09 =B0=B8=C0=FD=A3=BA=BF=CD=BB=A7=B4=F0=D3=A6=C2=F2=CE=D2=CB=BE=B5=C4=B2= =FA=C6=B7=A3=AC=C8=B4=CD=BB=C8=BB=B1=E4=D8=D4=C2=F2=B1=F0=C8=CB=B5=C4= =C1=CB=A3=AC=CE=AA=CA=B2=C3=B4=A3=BF =09 =B0=B8=C0=FD=A3=BA=CE=AA=CA=B2=C3=B4=CE=D2=C3=C7=BB=E1=C2=F2=BA=DC=B6= =E0=D7=D4=BC=BA=C3=BB=D3=D0=D0=CB=C8=A4=B5=C4=B6=F8=C7=D2=B2=A2=B2=BB= =D0=E8=D2=AA=B5=C4=B2=FA=C6=B7=A3=BF =09 =B0=B8=C0=FD=A3=BA=BA=CF=CD=AC=C7=A9=B6=A9=BA=F3=A3=AC=D3=A6=B8=C3=CE= =CA=C4=C44=BE=E4=BB=B0=A3=AC=CC=E1=C9=FD=BF=CD=BB=A7=D6=D2=B3=CF=B6=C8= =A3=BF =09 =09 =B5=DA=C6=DF=D5=C2 =BC=FB=CA=B2=C3=B4=C8=CB,=CB=B5=CA=B2=C3=B4=BB=B0;= =09 =CA=B1=BC=E4=A1=A2=C4=DC=C1=A6=A1=A2=BE=AB=C1=A6=A1=A2=D0=CB=C8=A4=A1= =A2=CE=C4=BB=AF=CB=AE=C6=BD=A1=A2=B2=BB=CD=AC=B5=C4=D6=B0=CE=BB=B5=C8= =B5=C4=D3=B0=CF=EC=D2=F2=CB=D8 =09 1. =CA=B2=C3=B4=C7=E9=BF=F6=CF=C2=C6=AB=D6=D8=D3=DA=C0=ED=D0=D4=CB=B5= =B7=FE,=B4=F2=B6=AF=B1=F0=C8=CB=B5=C4=C4=D4? =09 2. =CA=B2=C3=B4=C7=E9=BF=F6=CF=C2=C6=AB=D6=D8=D3=DA=C7=E9=B8=D0=CB=B5= =B7=FE,=B4=F2=B6=AF=B1=F0=C8=CB=B5=C4=D0=C4? =09 3. =BA=CE=D6=D6=C7=E9=BF=F6=CF=C2=D6=BB=BD=B2=D3=C5=CA=C6=B2=BB=BD=B2= =C1=D3=CA=C6=A3=BF =09 4. =BA=CE=D6=D6=C7=E9=BF=F6=CF=C2=BC=B4=BD=B2=D3=C5=CA=C6=D3=D6=BD=B2= =C1=D3=CA=C6=A3=BF =09 =09 =B5=DA=B0=CB=D5=C2 =BD=A8=C1=A2=B3=A4=C6=DA=B5=C4=D6=B0=D2=B5=B9=E6=BB= =AE =09 1=A1=A2=B9=A6=C0=FB=D0=C4=CC=AB=D6=D8,=B5=BC=D6=C2=BF=CD=BB=A7=BE=DC= =BE=F8,=C7=AE=CA=C7=B8=F8=C4=DA=D0=D0=B5=C4=C8=CB=D7=AC=B5=C4=A3=BB = =09 2=A1=A2=CA=C0=BD=E7=C9=CF=C3=BB=D3=D0=BA=C3=B9=A4=D7=F7,=BA=C3=B9=A4= =D7=F7=CA=C7=D7=D4=BC=BA=D7=F6=B3=F6=C0=B4=B5=C4; =09 3=A1=A2=D2=D4=C7=B0=B5=C4=BE=AD=D1=E9=D4=DA=D0=C2=B9=A4=D7=F7=D6=D0=B2= =BB=D2=BB=B6=A8=BD=E2=BE=F6=C4=BF=C7=B0=B5=C4=CE=CA=CC=E2=A3=BB = =09 4=A1=A2=B2=BB=D2=AA=D3=D0=CD=D0=B8=B6=D0=C4=CC=AC,=C4=D0=C5=C2=C8=EB= =B4=ED=D0=D0,=C5=AE=C5=C2=BC=DE=B4=ED=C0=C9; =09 5=A1=A2=BC=EC=CC=D6=D7=D4=BC=BA=CA=C7=B3=C9=B9=A6=B5=C4=BF=AA=CA=BC=A3= =AC=BC=EC=CC=D6=B1=F0=C8=CB=CA=C7=CA=A7=B0=DC=B5=C4=BF=AA=CA=BC; = =09 =09 =A1=BE=BD=B2=CA=A6=BD=E9=C9=DC=A1=BF=A3=BA =09 =09 =CD=F5=D4=BD =C0=CF=CA=A6 =09 =09 1=A1=A2=D4=F8=C8=CE=BF=C9=BF=DA=BF=C9=C0=D6=A3=A8=D6=D0=B9=FA=A3=A9=B9= =AB=CB=BE=D2=B5=CE=F1=BE=AD=C0=ED=A3=BB=B0=A2=C0=EF=B0=CD=B0=CD=A3=A8= =D6=D0=B9=FA=A3=A9=CD=F8=C2=E7=BC=BC=CA=F5=D3=D0=CF=DE=B9=AB=CB=BE=D2= =B5=CE=F1=BE=AD=C0=ED=A3=BB =09 2=A1=A2=C7=E5=BB=AA=B4=F3=D1=A7.=C4=CF=BE=A9=B4=F3=D1=A7EMBA=CC=D8=D1= =FB=C5=E0=D1=B5=BD=B2=CA=A6=A3=BB=D0=C2=BC=D3=C6=C2=C0=B3=B7=F0=CA=BF= =D1=A7=D4=BA=CC=D8=D4=BC=BD=B2=CA=A6; =09 3=A1=A22000=C4=EA=D6=C1=BD=F1=D2=BB=D6=B1=B4=D3=CA=C2=CF=FA=CA=DB=D3= =EB=CF=FA=CA=DB=C8=CB=D4=B1=BC=A4=C0=F8=D3=EB=D1=B5=C1=B7=B9=A4=D7=F7,= =D4=F8=C8=CE=BF=C9=BF=DA=BF=C9=C0=D6=B5=C4=D2=B5=CE=F1=BE=AD=C0=ED=A3= =AC=C8=AB=C7=F2=D6=AA=C3=FB=C6=F3=D2=B5 =09 =B0=A2=C0=EF=B0=CD=B0=CD=B9=AB=CB=BE=B5=C4=D2=B5=CE=F1=BE=AD=C0=ED=A3= =AC=D4=F8=C3=BF=D4=C2=B7=E8=BF=F1=C9=CF=C3=C5=B0=DD=B7=C3100=BC=D2=D2= =D4=C9=CF=B5=C4=BF=CD=BB=A7=A3=AC=B0=EB=BE=FC=CA=C2=BB=AF=B5=C4=CF=FA= =CA=DB=D6=B0=D2=B5=C9=FA=D1=C4=A3=AC=B8=DF=C7=BF =09 =B6=C8=B5=C4=B9=A4=D7=F7=D1=B9=C1=A6,=C8=AB=C3=E6=CF=B5=CD=B3=B5=C4=CA= =DC=D1=B5=BE=AD=C0=FA=A3=AC=BB=FD=C0=DB=C1=CB=B7=E1=B8=BB=B5=C4=BF=CD= =BB=A7=CA=D5=BC=AF=A1=A2=CF=FA=CA=DB=CC=B8=C5=D0=A1=A2=BF=CD=BB=A7=B8= =FA=BD=F8=A1=A2=BF=CD=BB=A7=B7=FE=CE=F1=A1=A2=D7=D4 =09 =CE=D2=BC=A4=C0=F8=B5=C4=BE=AD=D1=E9=A3=AC=D4=DA=B9=AB=CB=BE=D4=F8=BB= =F1=A1=B0=BA=B7=BD=AB=B1=AD=A1=B1=B0=F1=D1=DB=A1=A3 =09 =09 =A1=BE=D4=F8=BE=AD=C5=E0*=D1=B5=B9=FD=B5=C4=B2=BF=B7=DD=BF=CD=BB=A7=A1= =BF=A3=BA =09 =09 =BB=AA=CE=AA=B9=AB=CB=BE/=C1=A2=B0=EE=C6=E1=D2=B5/=CC=AB=C6=BD=B1=A3= =CF=D5/=C5=B7=C6=D5=D5=D5=C3=F7/=BF=C9=BF=DA=BF=C9=C0=D6/=D1=EF=D7=D3= =CA=AF=BB=AF/=B7=C9=C0=FB=C6=D6/=B0=D9=B6=C8/=D6=D0=B9=FA=D2=C6=B6=AF/= =B1=B1=BE=A9=B6=AB=D0=C5=B1=B1=D3=CA =09 /=D6=D0=B9=FA=C1=AA=CD=A8/=B3=C9=B6=BC=CD=A8=B7=A2=BC=AF=CD=C5/=D0=AF= =B3=CC=CD=F8=C2=E7/=B9=E3=D6=DD=B7=BD=D4=B2=B7=BF=B2=FA/=C9=EE=DB=DA= =C4=CF=BA=A3=BE=C6=B5=EA/=B9=F0=C1=D6=C8=FD=BD=F0=D2=A9=D2=B5/=C8=FD= =D2=BB=D6=D8=B9=A4/=C9=EE=DB=DA=B1=A6=B5=C2 =09 =BC=AF=CD=C5/=D2=E5=CE=DA=D3=CA=D5=FE=BE=D6/=B9=E3=CE=F7=CB=AE=B5=E7= =B9=A4=B3=CC=BE=D6/=D6=D8=C7=EC=C3=BA=BF=C6=D4=BA/=C9=EE=DB=DA=CC=D8= =B7=A2=B9=C9=B7=DD/=B1=B1=BE=A9=C7=FA =09 =C3=C0=BC=D2=CB=BD/=BE=C5=D1=F4=B5=E7=C6=F7/=D6=E9=B8=DB=BB=FA=B3=A1/= =B3=B2=BA=FE=D3=CA=D5=FE/=BC=C3=C4=CF=D3=CA=D5=FE/=C4=CF=BE=A9=D2=BD= =D2=A9=D7=DC=B9=AB=CB=BE/=B9=FA=C3=C0=B5=E7=C6=F7/=D3=EA=C8=F3=BC=AF= =CD=C5/=D6=D0=B9=FA=D2=BB=CD=CF=BC=AF=CD=C5 =09 =C4=DC=D4=B4=B7=D6=B9=AB=CB=BE/=D6=D8=C7=EC=BF=C6=B4=B4=D1=A7=D4=BA = =09 =09 ------=ryulh576_5130_214774475.712531-- From webmaster@dev102.magizz.com Thu Aug 14 21:13: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=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 B9C5E7F53 for ; Thu, 14 Aug 2014 21:13:44 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 959E48F809E for ; Thu, 14 Aug 2014 19:13:41 -0700 (PDT) X-ASG-Debug-ID: 1408068816-04bdf018571b270001-NocioJ Received: from vps.magizz.com (vps.magizz.com [162.251.83.157]) by cuda.sgi.com with ESMTP id hXmpya0rqRjOZHMc (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 14 Aug 2014 19:13:37 -0700 (PDT) X-Barracuda-Envelope-From: webmaster@dev102.magizz.com X-Barracuda-Apparent-Source-IP: 162.251.83.157 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=dev102.magizz.com; s=default; h=Content-Type:Content-Transfer-Encoding:MIME-Version:List-Unsubscribe:Message-ID:Reply-To:From:Date:Subject:To; bh=/ghb0Pe4at666Uy2r6SBKlGrOhAhRojJ8HljdVVdRyI=; b=oEDdfoq1OA6zXp9r5zswvx99IJ56JrJLprrpAeMa5vmL0K5on5ZNp/EmWFvP1hZsATMhoCZlT4CJyA+yNKmn93XDwqZ7Xa2qXM8X1vByWKJACzH9LZKhjAq2Q/eCj+fNhfMXc81fD1eFKFKgSyEJ+pLKNuT2WtoC3vCIUJ/tpLw=; Received: from dev102magizz by vps.magizz.com with local (Exim 4.82) (envelope-from ) id 1XI71P-0007Rf-CV for xfs@oss.sgi.com; Fri, 15 Aug 2014 06:13:39 +0400 To: xfs@oss.sgi.com Subject: Goodbye from our newsletter X-PHP-Script: dev102.magizz.com/mailz/index.php for 66.249.64.99 X-ASG-Orig-Subj: Goodbye from our newsletter Received: from crawl-66-249-64-99.googlebot.com [66.249.64.99] by dev102.magizz.com with HTTP; Fri, 15 Aug 2014 02:13:37 +0000 Date: Fri, 15 Aug 2014 02:13:39 +0000 From: Webmaster Reply-To: Webmaster Message-ID: <8785445b037e7851c106ac8acbb19c65@dev102.magizz.com> X-Priority: 3 X-Mailer: PHPMailer 5.2.5 (https://github.com/Synchro/PHPMailer/) X-phpList-version: 3.0.6 X-MessageID: systemmessage X-ListMember: xfs@oss.sgi.com Precedence: bulk Bounces-To: webmaster@dev102.magizz.com List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Content-Type: text/plain; charset=UTF-8 X-AntiAbuse: This header was added to track abuse, please include it with any abuse report X-AntiAbuse: Primary Hostname - vps.magizz.com X-AntiAbuse: Original Domain - oss.sgi.com X-AntiAbuse: Originator/Caller UID/GID - [503 514] / [47 12] X-AntiAbuse: Sender Address Domain - dev102.magizz.com X-Get-Message-Sender-Via: vps.magizz.com: authenticated_id: dev102magizz/from_h X-Barracuda-Connect: vps.magizz.com[162.251.83.157] X-Barracuda-Start-Time: 1408068817 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 X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.8455 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature Goodbye from our Newsletter, sorry to see you go. You have been unsubscribed from our newsletters. This is the last email you will receive from us. Our newsletter system, phpList, will refuse to send you any further messages, without manual intervention by our administrator. If there is an error in this information, you can re-subscribe: please go to http://dev102.magizz.com/mailz/?p=subscribe and follow the steps. Thank you From dave@fromorbit.com Fri Aug 15 01:39: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 (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id C08567F3F for ; Fri, 15 Aug 2014 01:39:15 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 81755304039 for ; Thu, 14 Aug 2014 23:39:15 -0700 (PDT) X-ASG-Debug-ID: 1408084751-04bdf01855215d0002-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id QV3zD7A3OiF2V64m for ; Thu, 14 Aug 2014 23:39:13 -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: AjUPAJmq7VN5LDJ8PGdsb2JhbABagw2BKoczp2YBAQEBAQEGpzQXBQEBAQE4NoQEAQUnLzMIGDE5AwcUGYhBxT6FfIlthDYFqD+MZysvgk8BAQE Received: from ppp121-44-50-124.lns20.syd6.internode.on.net (HELO dastard) ([121.44.50.124]) by ipmail06.adl6.internode.on.net with ESMTP; 15 Aug 2014 16:09:10 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1XIBAL-0001ZR-AU for xfs@oss.sgi.com; Fri, 15 Aug 2014 16:39:09 +1000 Received: from dave by disappointment with local (Exim 4.82_1-5b7a7c0-XX) (envelope-from ) id 1XIBAL-0001UO-9k for xfs@oss.sgi.com; Fri, 15 Aug 2014 16:39:09 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 3/9] xfs: rework xfs_buf_bio_endio error handling Date: Fri, 15 Aug 2014 16:39:01 +1000 X-ASG-Orig-Subj: [PATCH 3/9] xfs: rework xfs_buf_bio_endio error handling Message-Id: <1408084747-4540-4-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 2.0.0 In-Reply-To: <1408084747-4540-1-git-send-email-david@fromorbit.com> References: <1408084747-4540-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1408084753 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.8461 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner Currently the report of a bio error from completion immediately marks the buffer with an error. The issue is that this is racy w.r.t. synchronous IO - the submitter can see b_error being set before the IO is complete, and hence we cannot differentiate between submission failures and completion failures. Add an internal b_io_error field protected by the b_lock to catch IO completion errors, and only propagate that to the buffer during final IO completion handling. Hence we can tell in xfs_buf_iorequest if we've had a submission failure bey checking bp->b_error before dropping our b_io_remaining reference - that reference will prevent b_io_error values from being propagated to b_error in the event that completion races with submission. In doing so, allow xfs_buf_iorequest to return an error. That way, the caller can check for submission errors safely if required, and easily distinguish them from completion errors that come from xfs_buf_iowait(). Signed-off-by: Dave Chinner --- fs/xfs/xfs_buf.c | 18 ++++++++++++++++-- fs/xfs/xfs_buf.h | 1 + 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/fs/xfs/xfs_buf.c b/fs/xfs/xfs_buf.c index 1b7f0bc..58ae34c 100644 --- a/fs/xfs/xfs_buf.c +++ b/fs/xfs/xfs_buf.c @@ -1008,6 +1008,13 @@ xfs_buf_ioend( bp->b_flags &= ~(XBF_READ | XBF_WRITE | XBF_READ_AHEAD); + /* + * Pull in IO completion errors now. We are guaranteed to be running + * single threaded, so we don't need the lock to read b_io_error. + */ + if (!bp->b_error && bp->b_io_error) + xfs_buf_ioerror(bp, bp->b_io_error); + if (!bp->b_error) { bp->b_flags |= XBF_DONE; @@ -1186,8 +1193,12 @@ xfs_buf_bio_end_io( * don't overwrite existing errors - otherwise we can lose errors on * buffers that require multiple bios to complete. */ - if (!bp->b_error) - xfs_buf_ioerror(bp, error); + if (error) { + spin_lock(&bp->b_lock); + if (!bp->b_io_error) + bp->b_io_error = error; + spin_unlock(&bp->b_lock); + } if (!bp->b_error && xfs_buf_is_vmapped(bp) && (bp->b_flags & XBF_READ)) invalidate_kernel_vmap_range(bp->b_addr, xfs_buf_vmap_len(bp)); @@ -1373,6 +1384,9 @@ xfs_buf_iorequest( if (bp->b_flags & XBF_WRITE) xfs_buf_wait_unpin(bp); + /* clear the internal error state to avoid spurious errors */ + bp->b_io_error = 0; + /* * Take references to the buffer. For XBF_ASYNC buffers, holding a * reference for as long as submission takes is all that is necessary diff --git a/fs/xfs/xfs_buf.h b/fs/xfs/xfs_buf.h index 4585c15..44db8cd 100644 --- a/fs/xfs/xfs_buf.h +++ b/fs/xfs/xfs_buf.h @@ -158,6 +158,7 @@ typedef struct xfs_buf { struct list_head b_lru; /* lru list */ spinlock_t b_lock; /* internal state lock */ unsigned int b_state; /* internal state flags */ + int b_io_error; /* internal IO error state */ wait_queue_head_t b_waiters; /* unpin waiters */ struct list_head b_list; struct xfs_perag *b_pag; /* contains rbtree root */ -- 2.0.0 From dave@fromorbit.com Fri Aug 15 01: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 (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id E7CBA7F3F for ; Fri, 15 Aug 2014 01:39:16 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id B94928F8084 for ; Thu, 14 Aug 2014 23:39:16 -0700 (PDT) X-ASG-Debug-ID: 1408084751-04bdf01855215d0003-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id bC7dqnQFtzshcOdF for ; Thu, 14 Aug 2014 23:39:14 -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: Ak0PAJmq7VN5LDJ8PGdsb2JhbABagw2BKoczp2YBAQEBAQEGhVGhYxcFAQEBATg2hAQBBScvMwgYMTkDBxQZiEHFPoV8iW2ENgWGEKIvjGcrL4JPAQEB Received: from ppp121-44-50-124.lns20.syd6.internode.on.net (HELO dastard) ([121.44.50.124]) by ipmail06.adl6.internode.on.net with ESMTP; 15 Aug 2014 16:09:10 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1XIBAL-0001ZU-C0 for xfs@oss.sgi.com; Fri, 15 Aug 2014 16:39:09 +1000 Received: from dave by disappointment with local (Exim 4.82_1-5b7a7c0-XX) (envelope-from ) id 1XIBAL-0001Ue-BC for xfs@oss.sgi.com; Fri, 15 Aug 2014 16:39:09 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 6/9] xfs: kill xfs_bioerror_relse Date: Fri, 15 Aug 2014 16:39:04 +1000 X-ASG-Orig-Subj: [PATCH 6/9] xfs: kill xfs_bioerror_relse Message-Id: <1408084747-4540-7-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 2.0.0 In-Reply-To: <1408084747-4540-1-git-send-email-david@fromorbit.com> References: <1408084747-4540-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1408084754 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.8461 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner There is only one caller now - xfs_trans_read_buf_map() - and it has very well defined call semantics - read, synchronous, and b_iodone is NULL. Hence it's pretty clear what error handling is necessary for this case. The bigger problem of untangling xfs_trans_read_buf_map error handling is left to a future patch. Signed-off-by: Dave Chinner --- fs/xfs/xfs_buf.c | 39 --------------------------------------- fs/xfs/xfs_buf.h | 2 -- fs/xfs/xfs_trans_buf.c | 8 +++++--- 3 files changed, 5 insertions(+), 44 deletions(-) diff --git a/fs/xfs/xfs_buf.c b/fs/xfs/xfs_buf.c index f444285..352e9219 100644 --- a/fs/xfs/xfs_buf.c +++ b/fs/xfs/xfs_buf.c @@ -1071,45 +1071,6 @@ xfs_buf_ioerror_alert( (__uint64_t)XFS_BUF_ADDR(bp), func, -bp->b_error, bp->b_length); } -/* - * Same as xfs_bioerror, except that we are releasing the buffer - * here ourselves, and avoiding the xfs_buf_ioend call. - * This is meant for userdata errors; metadata bufs come with - * iodone functions attached, so that we can track down errors. - */ -int -xfs_bioerror_relse( - struct xfs_buf *bp) -{ - int64_t fl = bp->b_flags; - /* - * No need to wait until the buffer is unpinned. - * We aren't flushing it. - * - * chunkhold expects B_DONE to be set, whether - * we actually finish the I/O or not. We don't want to - * change that interface. - */ - XFS_BUF_UNREAD(bp); - XFS_BUF_DONE(bp); - xfs_buf_stale(bp); - bp->b_iodone = NULL; - if (!(fl & XBF_ASYNC)) { - /* - * Mark b_error and B_ERROR _both_. - * Lot's of chunkcache code assumes that. - * There's no reason to mark error for - * ASYNC buffers. - */ - xfs_buf_ioerror(bp, -EIO); - complete(&bp->b_iowait); - } else { - xfs_buf_relse(bp); - } - - return -EIO; -} - int xfs_bwrite( struct xfs_buf *bp) diff --git a/fs/xfs/xfs_buf.h b/fs/xfs/xfs_buf.h index 44db8cd..d8f57f6 100644 --- a/fs/xfs/xfs_buf.h +++ b/fs/xfs/xfs_buf.h @@ -297,8 +297,6 @@ extern void xfs_buf_iomove(xfs_buf_t *, size_t, size_t, void *, #define xfs_buf_zero(bp, off, len) \ xfs_buf_iomove((bp), (off), (len), NULL, XBRW_ZERO) -extern int xfs_bioerror_relse(struct xfs_buf *); - /* Buffer Utility Routines */ extern xfs_caddr_t xfs_buf_offset(xfs_buf_t *, size_t); diff --git a/fs/xfs/xfs_trans_buf.c b/fs/xfs/xfs_trans_buf.c index 96c898e..758c07d 100644 --- a/fs/xfs/xfs_trans_buf.c +++ b/fs/xfs/xfs_trans_buf.c @@ -324,11 +324,13 @@ xfs_trans_read_buf_map( */ if (XFS_FORCED_SHUTDOWN(mp)) { trace_xfs_bdstrat_shut(bp, _RET_IP_); - xfs_bioerror_relse(bp); - } else { - xfs_buf_iorequest(bp); + bp->b_flags &= ~(XBF_READ | XBF_DONE); + xfs_buf_ioerror(bp, -EIO); + xfs_buf_stale(bp); + return -EIO; } + xfs_buf_iorequest(bp); error = xfs_buf_iowait(bp); if (error) { xfs_buf_ioerror_alert(bp, __func__); -- 2.0.0 From dave@fromorbit.com Fri Aug 15 01:39: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 72BD37F47 for ; Fri, 15 Aug 2014 01:39:17 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 617A9304043 for ; Thu, 14 Aug 2014 23:39:17 -0700 (PDT) X-ASG-Debug-ID: 1408084755-04cbb054851f0d0001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id VJ9s7AMB8H2MOqii for ; Thu, 14 Aug 2014 23:39:15 -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: Ak0PAJmq7VN5LDJ8PGdsb2JhbABagw2BKoczp2YBAQEBAQEGhVGhYxcFAQEBATg2hAQBBScvMwgYMTkDBxQZiEHFPoV8jiMFhhCiL4xnKy+CTwEBAQ Received: from ppp121-44-50-124.lns20.syd6.internode.on.net (HELO dastard) ([121.44.50.124]) by ipmail06.adl6.internode.on.net with ESMTP; 15 Aug 2014 16:09:10 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1XIBAL-0001ZT-BY for xfs@oss.sgi.com; Fri, 15 Aug 2014 16:39:09 +1000 Received: from dave by disappointment with local (Exim 4.82_1-5b7a7c0-XX) (envelope-from ) id 1XIBAL-0001UZ-Ah for xfs@oss.sgi.com; Fri, 15 Aug 2014 16:39:09 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 5/9] xfs: xfs_bioerror can die. Date: Fri, 15 Aug 2014 16:39:03 +1000 X-ASG-Orig-Subj: [PATCH 5/9] xfs: xfs_bioerror can die. Message-Id: <1408084747-4540-6-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 2.0.0 In-Reply-To: <1408084747-4540-1-git-send-email-david@fromorbit.com> References: <1408084747-4540-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1408084755 X-Barracuda-URL: http://192.48.176.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.8461 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner Internal buffer write error handling is a mess due to the unnatural split between xfs_bioerror and xfs_bioerror_relse(). The buffer reference counting is also wrong for the xfs_bioerror path for xfs_bwrite - it uses sync IO and so xfs_buf_ioend will release a hold count that was never taken. Further, xfs_bwrite only does sync IO and determines the handler to call based on b_iodone, so for this caller the only difference between xfs_bioerror() and xfs_bioerror_release() is the XBF_DONE flag. We don't care what the XBF_DONE flag state is because we stale the buffer in both paths - the next buffer lookup will clear XBF_DONE anyway because XBF_STALE is set. Hence we can use common error handling for xfs_bwrite(). __xfs_buf_delwri_submit() is a similar - it's only ever called on writes - all sync or async - and again there's no reason to handle them any differently at all. Clean up the nasty error handling and remove xfs_bioerror(). Signed-off-by: Dave Chinner --- fs/xfs/xfs_buf.c | 67 +++++++++++++++++--------------------------------------- 1 file changed, 20 insertions(+), 47 deletions(-) diff --git a/fs/xfs/xfs_buf.c b/fs/xfs/xfs_buf.c index 98fcf5a..f444285 100644 --- a/fs/xfs/xfs_buf.c +++ b/fs/xfs/xfs_buf.c @@ -1072,36 +1072,6 @@ xfs_buf_ioerror_alert( } /* - * Called when we want to stop a buffer from getting written or read. - * We attach the EIO error, muck with its flags, and call xfs_buf_ioend - * so that the proper iodone callbacks get called. - */ -STATIC int -xfs_bioerror( - xfs_buf_t *bp) -{ -#ifdef XFSERRORDEBUG - ASSERT(XFS_BUF_ISREAD(bp) || bp->b_iodone); -#endif - - /* - * No need to wait until the buffer is unpinned, we aren't flushing it. - */ - xfs_buf_ioerror(bp, -EIO); - - /* - * We're calling xfs_buf_ioend, so delete XBF_DONE flag. - */ - XFS_BUF_UNREAD(bp); - XFS_BUF_UNDONE(bp); - xfs_buf_stale(bp); - - xfs_buf_ioend(bp); - - return -EIO; -} - -/* * Same as xfs_bioerror, except that we are releasing the buffer * here ourselves, and avoiding the xfs_buf_ioend call. * This is meant for userdata errors; metadata bufs come with @@ -1149,19 +1119,19 @@ xfs_bwrite( ASSERT(xfs_buf_islocked(bp)); bp->b_flags |= XBF_WRITE; - bp->b_flags &= ~(XBF_ASYNC | XBF_READ | _XBF_DELWRI_Q | XBF_WRITE_FAIL); + bp->b_flags &= ~(XBF_ASYNC | XBF_READ | _XBF_DELWRI_Q | + XBF_WRITE_FAIL | XBF_DONE); if (XFS_FORCED_SHUTDOWN(bp->b_target->bt_mount)) { trace_xfs_bdstrat_shut(bp, _RET_IP_); - /* - * Metadata write that didn't get logged but written anyway. - * These aren't associated with a transaction, and can be - * ignored. - */ - if (!bp->b_iodone) - return xfs_bioerror_relse(bp); - return xfs_bioerror(bp); + xfs_buf_ioerror(bp, -EIO); + xfs_buf_stale(bp); + + /* sync IO, xfs_buf_ioend is going to remove a ref here */ + xfs_buf_hold(bp); + xfs_buf_ioend(bp); + return -EIO; } xfs_buf_iorequest(bp); @@ -1848,16 +1818,19 @@ __xfs_buf_delwri_submit( if (XFS_FORCED_SHUTDOWN(bp->b_target->bt_mount)) { trace_xfs_bdstrat_shut(bp, _RET_IP_); + xfs_buf_ioerror(bp, -EIO); + xfs_buf_stale(bp); + /* - * Metadata write that didn't get logged but written anyway. - * These aren't associated with a transaction, and can be - * ignored. + * if sync IO, xfs_buf_ioend is going to remove a + * ref here. We need to add that so we can collect + * all the buffer errors in the wait loop. */ - if (!bp->b_iodone) - return xfs_bioerror_relse(bp); - return xfs_bioerror(bp); - } - xfs_buf_iorequest(bp); + if (wait) + xfs_buf_hold(bp); + xfs_buf_ioend(bp); + } else + xfs_buf_iorequest(bp); } blk_finish_plug(&plug); -- 2.0.0 From dave@fromorbit.com Fri Aug 15 01:39: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 CD3D67F4E for ; Fri, 15 Aug 2014 01:39:17 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id BBF098F8084 for ; Thu, 14 Aug 2014 23:39:17 -0700 (PDT) X-ASG-Debug-ID: 1408084753-04cbb054881f0d0002-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id CDIZXBM9OhjnkpDe for ; Thu, 14 Aug 2014 23:39:15 -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: AgclAJmq7VN5LDJ8PGdsb2JhbABagw2BKoczp2YBAQEBAQEGhVGfFoJNFwUBAQEBODaEBAEFJy8zCBgxOQMHFBmIQcU+hXyOIwWGEKIvjGcrL4EIJIEjAQEB Received: from ppp121-44-50-124.lns20.syd6.internode.on.net (HELO dastard) ([121.44.50.124]) by ipmail06.adl6.internode.on.net with ESMTP; 15 Aug 2014 16:09:10 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1XIBAL-0001ZQ-A3 for xfs@oss.sgi.com; Fri, 15 Aug 2014 16:39:09 +1000 Received: from dave by disappointment with local (Exim 4.82_1-5b7a7c0-XX) (envelope-from ) id 1XIBAL-0001UJ-9C for xfs@oss.sgi.com; Fri, 15 Aug 2014 16:39:09 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 2/9] xfs: xfs_buf_ioend and xfs_buf_iodone_work duplicate functionality Date: Fri, 15 Aug 2014 16:39:00 +1000 X-ASG-Orig-Subj: [PATCH 2/9] xfs: xfs_buf_ioend and xfs_buf_iodone_work duplicate functionality Message-Id: <1408084747-4540-3-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 2.0.0 In-Reply-To: <1408084747-4540-1-git-send-email-david@fromorbit.com> References: <1408084747-4540-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1408084755 X-Barracuda-URL: http://192.48.176.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.8461 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner We do some work in xfs_buf_ioend, and some work in xfs_buf_iodone_work, but much of that functionality is the same. This work can all be done in a single function, leaving xfs_buf_iodone just a wrapper to determine if we should execute it by workqueue or directly. hence rename xfs_buf_iodone_work to xfs_buf_ioend(), and add a new xfs_buf_ioend_async() for places that need async processing. Signed-off-by: Dave Chinner --- fs/xfs/xfs_buf.c | 79 +++++++++++++++++++++--------------------------- fs/xfs/xfs_buf.h | 2 +- fs/xfs/xfs_buf_item.c | 4 +-- fs/xfs/xfs_inode.c | 2 +- fs/xfs/xfs_log.c | 2 +- fs/xfs/xfs_log_recover.c | 2 +- 6 files changed, 40 insertions(+), 51 deletions(-) diff --git a/fs/xfs/xfs_buf.c b/fs/xfs/xfs_buf.c index 5d86bbd..1b7f0bc 100644 --- a/fs/xfs/xfs_buf.c +++ b/fs/xfs/xfs_buf.c @@ -999,54 +999,49 @@ xfs_buf_wait_unpin( */ STATIC void -xfs_buf_iodone_work( - struct work_struct *work) +xfs_buf_ioend( + struct xfs_buf *bp) { - struct xfs_buf *bp = - container_of(work, xfs_buf_t, b_iodone_work); - bool read = !!(bp->b_flags & XBF_READ); + bool read = !!(bp->b_flags & XBF_READ); + + trace_xfs_buf_iodone(bp, _RET_IP_); bp->b_flags &= ~(XBF_READ | XBF_WRITE | XBF_READ_AHEAD); - /* only validate buffers that were read without errors */ - if (read && bp->b_ops && !bp->b_error && (bp->b_flags & XBF_DONE)) - bp->b_ops->verify_read(bp); + if (!bp->b_error) { + bp->b_flags |= XBF_DONE; + + /* only validate buffers that were read without errors */ + if (read && bp->b_ops) + bp->b_ops->verify_read(bp); + } if (bp->b_iodone) (*(bp->b_iodone))(bp); else if (bp->b_flags & XBF_ASYNC) xfs_buf_relse(bp); else { - ASSERT(read && bp->b_ops); complete(&bp->b_iowait); xfs_buf_rele(bp); } } -void -xfs_buf_ioend( - struct xfs_buf *bp, - int schedule) +static void +xfs_buf_ioend_work( + struct work_struct *work) { - bool read = !!(bp->b_flags & XBF_READ); - - trace_xfs_buf_iodone(bp, _RET_IP_); + struct xfs_buf *bp = + container_of(work, xfs_buf_t, b_iodone_work); - if (bp->b_error == 0) - bp->b_flags |= XBF_DONE; + xfs_buf_ioend(bp); +} - if (bp->b_iodone || (read && bp->b_ops) || (bp->b_flags & XBF_ASYNC)) { - if (schedule) { - INIT_WORK(&bp->b_iodone_work, xfs_buf_iodone_work); - queue_work(xfslogd_workqueue, &bp->b_iodone_work); - } else { - xfs_buf_iodone_work(&bp->b_iodone_work); - } - } else { - bp->b_flags &= ~(XBF_READ | XBF_WRITE | XBF_READ_AHEAD); - complete(&bp->b_iowait); - xfs_buf_rele(bp); - } +void +xfs_buf_ioend_async( + struct xfs_buf *bp) +{ + INIT_WORK(&bp->b_iodone_work, xfs_buf_ioend_work); + queue_work(xfslogd_workqueue, &bp->b_iodone_work); } void @@ -1094,7 +1089,7 @@ xfs_bioerror( XFS_BUF_UNDONE(bp); xfs_buf_stale(bp); - xfs_buf_ioend(bp, 0); + xfs_buf_ioend(bp); return -EIO; } @@ -1181,15 +1176,6 @@ xfs_bwrite( } STATIC void -_xfs_buf_ioend( - xfs_buf_t *bp, - int schedule) -{ - if (atomic_dec_and_test(&bp->b_io_remaining) == 1) - xfs_buf_ioend(bp, schedule); -} - -STATIC void xfs_buf_bio_end_io( struct bio *bio, int error) @@ -1206,7 +1192,8 @@ xfs_buf_bio_end_io( if (!bp->b_error && xfs_buf_is_vmapped(bp) && (bp->b_flags & XBF_READ)) invalidate_kernel_vmap_range(bp->b_addr, xfs_buf_vmap_len(bp)); - _xfs_buf_ioend(bp, 1); + if (atomic_dec_and_test(&bp->b_io_remaining) == 1) + xfs_buf_ioend_async(bp); bio_put(bio); } @@ -1425,10 +1412,12 @@ xfs_buf_iorequest( * waiting, and in the synchronous IO case it avoids unnecessary context * switches an latency for high-peformance devices. */ - if (bp->b_error || !(bp->b_flags & XBF_ASYNC)) - _xfs_buf_ioend(bp, 0); - else - _xfs_buf_ioend(bp, 1); + if (atomic_dec_and_test(&bp->b_io_remaining) == 1) { + if (bp->b_error || !(bp->b_flags & XBF_ASYNC)) + xfs_buf_ioend(bp); + else + xfs_buf_ioend_async(bp); + } xfs_buf_rele(bp); } diff --git a/fs/xfs/xfs_buf.h b/fs/xfs/xfs_buf.h index c753183..4585c15 100644 --- a/fs/xfs/xfs_buf.h +++ b/fs/xfs/xfs_buf.h @@ -286,7 +286,7 @@ extern void xfs_buf_unlock(xfs_buf_t *); /* Buffer Read and Write Routines */ extern int xfs_bwrite(struct xfs_buf *bp); -extern void xfs_buf_ioend(xfs_buf_t *, int); +extern void xfs_buf_ioend(struct xfs_buf *bp); extern void xfs_buf_ioerror(xfs_buf_t *, int); extern void xfs_buf_ioerror_alert(struct xfs_buf *, const char *func); extern void xfs_buf_iorequest(xfs_buf_t *); diff --git a/fs/xfs/xfs_buf_item.c b/fs/xfs/xfs_buf_item.c index 76007de..4fd41b5 100644 --- a/fs/xfs/xfs_buf_item.c +++ b/fs/xfs/xfs_buf_item.c @@ -491,7 +491,7 @@ xfs_buf_item_unpin( xfs_buf_ioerror(bp, -EIO); XFS_BUF_UNDONE(bp); xfs_buf_stale(bp); - xfs_buf_ioend(bp, 0); + xfs_buf_ioend(bp); } } @@ -1115,7 +1115,7 @@ do_callbacks: xfs_buf_do_callbacks(bp); bp->b_fspriv = NULL; bp->b_iodone = NULL; - xfs_buf_ioend(bp, 0); + xfs_buf_ioend(bp); } /* diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c index fea3c92..00d210b 100644 --- a/fs/xfs/xfs_inode.c +++ b/fs/xfs/xfs_inode.c @@ -3056,7 +3056,7 @@ cluster_corrupt_out: XFS_BUF_UNDONE(bp); xfs_buf_stale(bp); xfs_buf_ioerror(bp, -EIO); - xfs_buf_ioend(bp, 0); + xfs_buf_ioend(bp); } else { xfs_buf_stale(bp); xfs_buf_relse(bp); diff --git a/fs/xfs/xfs_log.c b/fs/xfs/xfs_log.c index 8eaa8f5..e4665db 100644 --- a/fs/xfs/xfs_log.c +++ b/fs/xfs/xfs_log.c @@ -1689,7 +1689,7 @@ xlog_bdstrat( if (iclog->ic_state & XLOG_STATE_IOERROR) { xfs_buf_ioerror(bp, -EIO); xfs_buf_stale(bp); - xfs_buf_ioend(bp, 0); + xfs_buf_ioend(bp); /* * It would seem logical to return EIO here, but we rely on * the log state machine to propagate I/O errors instead of diff --git a/fs/xfs/xfs_log_recover.c b/fs/xfs/xfs_log_recover.c index 1fd5787..4ba19bf 100644 --- a/fs/xfs/xfs_log_recover.c +++ b/fs/xfs/xfs_log_recover.c @@ -383,7 +383,7 @@ xlog_recover_iodone( SHUTDOWN_META_IO_ERROR); } bp->b_iodone = NULL; - xfs_buf_ioend(bp, 0); + xfs_buf_ioend(bp); } /* -- 2.0.0 From dave@fromorbit.com Fri Aug 15 01:39: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 3CA6E7F47 for ; Fri, 15 Aug 2014 01:39:18 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id DB59C8F8052 for ; Thu, 14 Aug 2014 23:39:17 -0700 (PDT) X-ASG-Debug-ID: 1408084751-04bdf01855215d0004-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id NlDlE2l2t1H5LwXg for ; Thu, 14 Aug 2014 23:39:16 -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: Ak0PAJmq7VN5LDJ8PGdsb2JhbABagw2BKoczp2YBAQEBAQEGhVGhYxcFAQEBATg2hAQBBScvMwgYMTkDBxQZiEHFPoV8iW2ENgWGEKIvjGcrL4EIJIEjAQEB Received: from ppp121-44-50-124.lns20.syd6.internode.on.net (HELO dastard) ([121.44.50.124]) by ipmail06.adl6.internode.on.net with ESMTP; 15 Aug 2014 16:09:10 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1XIBAL-0001ZX-Dv for xfs@oss.sgi.com; Fri, 15 Aug 2014 16:39:09 +1000 Received: from dave by disappointment with local (Exim 4.82_1-5b7a7c0-XX) (envelope-from ) id 1XIBAL-0001Ut-Cp for xfs@oss.sgi.com; Fri, 15 Aug 2014 16:39:09 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 9/9] xfs: check xfs_buf_read_uncached returns correctly Date: Fri, 15 Aug 2014 16:39:07 +1000 X-ASG-Orig-Subj: [PATCH 9/9] xfs: check xfs_buf_read_uncached returns correctly Message-Id: <1408084747-4540-10-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 2.0.0 In-Reply-To: <1408084747-4540-1-git-send-email-david@fromorbit.com> References: <1408084747-4540-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1408084755 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.8461 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner xfs_buf_read_uncached() has two failure modes. If can either return NULL or bp->b_error != 0 depending on the type of failure, and not all callers check for both. Fix it up. Signed-off-by: Dave Chinner --- fs/xfs/xfs_mount.c | 55 ++++++++++++++++++++++++++++++------------------------ 1 file changed, 31 insertions(+), 24 deletions(-) diff --git a/fs/xfs/xfs_mount.c b/fs/xfs/xfs_mount.c index d0ef01e..10a365a 100644 --- a/fs/xfs/xfs_mount.c +++ b/fs/xfs/xfs_mount.c @@ -304,13 +304,8 @@ xfs_readsb( reread: bp = xfs_buf_read_uncached(mp->m_ddev_targp, XFS_SB_DADDR, BTOBB(sector_size), 0, buf_ops); - if (!bp) { - if (loud) - xfs_warn(mp, "SB buffer read failed"); - return -EIO; - } - if (bp->b_error) { - error = bp->b_error; + if (!bp || bp->b_error) { + error = bp ? bp->b_error : -ENOMEM; if (loud) xfs_warn(mp, "SB validate failed with error %d.", error); /* bad CRC means corrupted metadata */ @@ -368,7 +363,8 @@ reread: return 0; release_buf: - xfs_buf_relse(bp); + if (bp) + xfs_buf_relse(bp); return error; } @@ -546,10 +542,12 @@ xfs_set_inoalignment(xfs_mount_t *mp) * Check that the data (and log if separate) is an ok size. */ STATIC int -xfs_check_sizes(xfs_mount_t *mp) +xfs_check_sizes( + struct xfs_mount *mp) { - xfs_buf_t *bp; + struct xfs_buf *bp; xfs_daddr_t d; + int error; d = (xfs_daddr_t)XFS_FSB_TO_BB(mp, mp->m_sb.sb_dblocks); if (XFS_BB_TO_FSB(mp, d) != mp->m_sb.sb_dblocks) { @@ -559,28 +557,37 @@ xfs_check_sizes(xfs_mount_t *mp) bp = xfs_buf_read_uncached(mp->m_ddev_targp, d - XFS_FSS_TO_BB(mp, 1), XFS_FSS_TO_BB(mp, 1), 0, NULL); - if (!bp) { + if (!bp || bp->b_error) { xfs_warn(mp, "last sector read failed"); - return -EIO; + goto out_fail; } xfs_buf_relse(bp); - if (mp->m_logdev_targp != mp->m_ddev_targp) { - d = (xfs_daddr_t)XFS_FSB_TO_BB(mp, mp->m_sb.sb_logblocks); - if (XFS_BB_TO_FSB(mp, d) != mp->m_sb.sb_logblocks) { - xfs_warn(mp, "log size mismatch detected"); - return -EFBIG; - } - bp = xfs_buf_read_uncached(mp->m_logdev_targp, + if (mp->m_logdev_targp == mp->m_ddev_targp) + return 0; + + d = (xfs_daddr_t)XFS_FSB_TO_BB(mp, mp->m_sb.sb_logblocks); + if (XFS_BB_TO_FSB(mp, d) != mp->m_sb.sb_logblocks) { + xfs_warn(mp, "log size mismatch detected"); + return -EFBIG; + } + bp = xfs_buf_read_uncached(mp->m_logdev_targp, d - XFS_FSB_TO_BB(mp, 1), XFS_FSB_TO_BB(mp, 1), 0, NULL); - if (!bp) { - xfs_warn(mp, "log device read failed"); - return -EIO; - } - xfs_buf_relse(bp); + if (!bp || bp->b_error) { + xfs_warn(mp, "log device read failed"); + goto out_fail; } + xfs_buf_relse(bp); return 0; + +out_fail: + if (!bp) + return -EIO; + error = bp->b_error; + xfs_buf_relse(bp); + return error; + } /* -- 2.0.0 From dave@fromorbit.com Fri Aug 15 01:39: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 9DA247F3F for ; Fri, 15 Aug 2014 01:39:17 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 6FE13304048 for ; Thu, 14 Aug 2014 23:39:14 -0700 (PDT) X-ASG-Debug-ID: 1408084751-04bdf01855215d0001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id Ff6RqmwKtYRsyE99 for ; Thu, 14 Aug 2014 23:39:12 -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: At8NAJmq7VN5LDJ8PGdsb2JhbABagw2IXadmAQEBAQEBBqc0FwUBAQEBODaEYDuBAgMHiG6gPaUBhXyJbYQ2BY8KmTWKPoIpK4J+AQEB Received: from ppp121-44-50-124.lns20.syd6.internode.on.net (HELO dastard) ([121.44.50.124]) by ipmail06.adl6.internode.on.net with ESMTP; 15 Aug 2014 16:09:10 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1XIBAL-0001ZO-9J for xfs@oss.sgi.com; Fri, 15 Aug 2014 16:39:09 +1000 Received: from dave by disappointment with local (Exim 4.82_1-5b7a7c0-XX) (envelope-from ) id 1XIBAL-0001UB-7U for xfs@oss.sgi.com; Fri, 15 Aug 2014 16:39:09 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [RFC PATCH 0/9] xfs: clean up xfs_buf io interfaces Date: Fri, 15 Aug 2014 16:38:58 +1000 X-ASG-Orig-Subj: [RFC PATCH 0/9] xfs: clean up xfs_buf io interfaces Message-Id: <1408084747-4540-1-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 2.0.0 X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1408084751 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.8461 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Hi folks, This patch set has come from the conversion Brian and I have been having over how to fix a use-after-free issue related to IO completions racing with synchronous IO submission. It seemed to me we were having trouble grasping all the different things that were wrong and putting them in a line, so I figured the easiest way to do with was to write a patchset that fixed the original bug, everything else we'd noticed, and changed the IO API such that we wouldn't have problems in the future. So, this patch contains: a) initial fix for the use after free issue (patch 1) b) clear separation of IO submission errors at the XFS level from IO errors reported through BIO completion callbacks (patches 2,3) c) removal of some historic cruft around IO submission (patch 4) d) rework of unnecessarily complex historic error handling paths (patches 5,6,7) e) a new API for clear and concise asynchronous and synchronous IO. (patch 8) The last patch fixes a bug I found writing patch 8, and can probably be moved to first in the series... I was just going to send this compile tested for comments, but I threw it at a couple of VMs and it's half way through xfstests now without any failures. That means I haven't broken anything badly, though the error hendling changes will be interesting to test. The error handling changes have something in common - a buffer that took an IO error was mostly marked stale, but not always. Sometimes they were marked as "not done" indicating that IO needed to be done on them before the contents were valid. Some got marked stale and done, and so on. The thing is, when we mark a buffer stale, it is essentially the same thing as marking it !XBF_DONE. So all the error handling paths now stale the buffer and clear XBF_DONE. Nice, consistent error handling. This enabled some significant cleanups - xfs_trans_buf_read_map() finally got the love it's been needing for long time. It also defines a specific, safe way for waiting on XBF_ASYNC buffer IO, and makes use of that in the buffer delayed write code. Hence the patchset also solves the problem of how do async dispatch, some work, then wait for IO completion as separate steps as opposed to issuing synchronous IO that is waited on immediately. Also, the rework of the IO submission interfaces removes the fixes added in the first patch to solve the use-after-free issue - we no longer need an extra reference to protect parts of the IO completion path because the reference we take during submission is held until after the IO completion wait has occurred. Anyway, I figured patches would speak louder than any description, and most especially a diffstat that looks like this: 9 files changed, 286 insertions(+), 360 deletions(-) Comments welcome. -Dave. From dave@fromorbit.com Fri Aug 15 01:39: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 26A237F59 for ; Fri, 15 Aug 2014 01:39:19 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 0615B8F8052 for ; Thu, 14 Aug 2014 23:39:15 -0700 (PDT) X-ASG-Debug-ID: 1408084753-04cbb054881f0d0001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id nJUazeS1axm4KoZR for ; Thu, 14 Aug 2014 23:39:14 -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: AjUPAJmq7VN5LDJ8PGdsb2JhbABagw2BKoczp2YBAQEBAQEGpzQXBQEBAQE4NoQEAQUnLzMIGDE5AwcUGYhBxT6FfI4jBbUmKy+CTwEBAQ Received: from ppp121-44-50-124.lns20.syd6.internode.on.net (HELO dastard) ([121.44.50.124]) by ipmail06.adl6.internode.on.net with ESMTP; 15 Aug 2014 16:09:10 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1XIBAL-0001ZP-9U for xfs@oss.sgi.com; Fri, 15 Aug 2014 16:39:09 +1000 Received: from dave by disappointment with local (Exim 4.82_1-5b7a7c0-XX) (envelope-from ) id 1XIBAL-0001UE-8L for xfs@oss.sgi.com; Fri, 15 Aug 2014 16:39:09 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 1/9] xfs: synchronous buffer IO needs a reference Date: Fri, 15 Aug 2014 16:38:59 +1000 X-ASG-Orig-Subj: [PATCH 1/9] xfs: synchronous buffer IO needs a reference Message-Id: <1408084747-4540-2-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 2.0.0 In-Reply-To: <1408084747-4540-1-git-send-email-david@fromorbit.com> References: <1408084747-4540-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1408084753 X-Barracuda-URL: http://192.48.176.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.8461 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner When synchronous IO runs IO completion work, it does so without an IO reference or a hold reference on the buffer. The IO "hold reference" is owned by the submitter, and released when the submission is complete. The IO reference is released when both the submitter and the bio end_io processing is run, and so if the io completion work is run from IO completion context, it is run without an IO reference. Hence we can get the situation where the submitter can submit the IO, see an error on the buffer and unlock and free the buffer while there is still IO in progress. This leads to use-after-free and memory corruption. Fix this by taking a "sync IO hold" reference that is owned by the IO and not released until after the buffer completion calls are run to wake up synchronous waiters. This means that the buffer will not be freed in any circumstance until all IO processing is completed. Signed-off-by: Dave Chinner --- fs/xfs/xfs_buf.c | 46 ++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 38 insertions(+), 8 deletions(-) diff --git a/fs/xfs/xfs_buf.c b/fs/xfs/xfs_buf.c index cd7b8ca..5d86bbd 100644 --- a/fs/xfs/xfs_buf.c +++ b/fs/xfs/xfs_buf.c @@ -1019,6 +1019,7 @@ xfs_buf_iodone_work( else { ASSERT(read && bp->b_ops); complete(&bp->b_iowait); + xfs_buf_rele(bp); } } @@ -1044,6 +1045,7 @@ xfs_buf_ioend( } else { bp->b_flags &= ~(XBF_READ | XBF_WRITE | XBF_READ_AHEAD); complete(&bp->b_iowait); + xfs_buf_rele(bp); } } @@ -1383,22 +1385,50 @@ xfs_buf_iorequest( if (bp->b_flags & XBF_WRITE) xfs_buf_wait_unpin(bp); + + /* + * Take references to the buffer. For XBF_ASYNC buffers, holding a + * reference for as long as submission takes is all that is necessary + * here. The IO inherits the lock and hold count from the submitter, + * and these are release during IO completion processing. Taking a hold + * over submission ensures that the buffer is not freed until we have + * completed all processing, regardless of when IO errors occur or are + * reported. + * + * However, for synchronous IO, the IO does not inherit the submitters + * reference count, nor the buffer lock. Hence we need to take an extra + * reference to the buffer for the for the IO context so that we can + * guarantee the buffer is not freed until all IO completion processing + * is done. Otherwise the caller can drop their reference while the IO + * is still in progress and hence trigger a use-after-free situation. + */ xfs_buf_hold(bp); + if (!(bp->b_flags & XBF_ASYNC)) + xfs_buf_hold(bp); + /* - * Set the count to 1 initially, this will stop an I/O - * completion callout which happens before we have started - * all the I/O from calling xfs_buf_ioend too early. + * Set the count to 1 initially, this will stop an I/O completion + * callout which happens before we have started all the I/O from calling + * xfs_buf_ioend too early. */ atomic_set(&bp->b_io_remaining, 1); _xfs_buf_ioapply(bp); + /* - * If _xfs_buf_ioapply failed, we'll get back here with - * only the reference we took above. _xfs_buf_ioend will - * drop it to zero, so we'd better not queue it for later, - * or we'll free it before it's done. + * If _xfs_buf_ioapply failed or we are doing synchronous IO that + * completes extremely quickly, we can get back here with only the IO + * reference we took above. _xfs_buf_ioend will drop it to zero, so + * we'd better run completion processing synchronously so that the we + * don't return to the caller with completion still pending. In the + * error case, this allows the caller to check b_error safely without + * waiting, and in the synchronous IO case it avoids unnecessary context + * switches an latency for high-peformance devices. */ - _xfs_buf_ioend(bp, bp->b_error ? 0 : 1); + if (bp->b_error || !(bp->b_flags & XBF_ASYNC)) + _xfs_buf_ioend(bp, 0); + else + _xfs_buf_ioend(bp, 1); xfs_buf_rele(bp); } -- 2.0.0 From dave@fromorbit.com Fri Aug 15 01:39: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 7E3FB29DFA for ; Fri, 15 Aug 2014 01:39:19 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 54E028F8089 for ; Thu, 14 Aug 2014 23:39:19 -0700 (PDT) X-ASG-Debug-ID: 1408084755-04cbb054851f0d0002-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id 2u5e5YIRHwej1GM1 for ; Thu, 14 Aug 2014 23:39:17 -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: Ak0PAJmq7VN5LDJ8PGdsb2JhbABSCIMNgSqHM6dmAQEBAQEBBoVRoWMXBQEBAQE4NoQEAQUnLzMIGDE5AwcUGYhBxT6FfIh6hSkFhhCiL4xnKy+CTwEBAQ Received: from ppp121-44-50-124.lns20.syd6.internode.on.net (HELO dastard) ([121.44.50.124]) by ipmail06.adl6.internode.on.net with ESMTP; 15 Aug 2014 16:09:10 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1XIBAL-0001ZV-CZ for xfs@oss.sgi.com; Fri, 15 Aug 2014 16:39:09 +1000 Received: from dave by disappointment with local (Exim 4.82_1-5b7a7c0-XX) (envelope-from ) id 1XIBAL-0001Uj-Bk for xfs@oss.sgi.com; Fri, 15 Aug 2014 16:39:09 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 7/9] xfs: clean up xfs_trans_buf_read_map Date: Fri, 15 Aug 2014 16:39:05 +1000 X-ASG-Orig-Subj: [PATCH 7/9] xfs: clean up xfs_trans_buf_read_map Message-Id: <1408084747-4540-8-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 2.0.0 In-Reply-To: <1408084747-4540-1-git-send-email-david@fromorbit.com> References: <1408084747-4540-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1408084756 X-Barracuda-URL: http://192.48.176.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.8461 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner The error handling is a mess of inconsistent spaghetti. Clean it up like Christoph's comment from long ago said we should. While there, get rid of the "xfs_do_error" error injection debug code. If we need to do error injection, we can do it on demand via kprobes rather than needing to run the kernel under a debug and poke magic variables. Signed-off-by: Dave Chinner --- fs/xfs/xfs_trans_buf.c | 187 ++++++++++++++++++------------------------------- 1 file changed, 69 insertions(+), 118 deletions(-) diff --git a/fs/xfs/xfs_trans_buf.c b/fs/xfs/xfs_trans_buf.c index 758c07d..9c3e610 100644 --- a/fs/xfs/xfs_trans_buf.c +++ b/fs/xfs/xfs_trans_buf.c @@ -229,13 +229,6 @@ xfs_trans_getsb(xfs_trans_t *tp, return bp; } -#ifdef DEBUG -xfs_buftarg_t *xfs_error_target; -int xfs_do_error; -int xfs_req_num; -int xfs_error_mod = 33; -#endif - /* * Get and lock the buffer for the caller if it is not already * locked within the given transaction. If it has not yet been @@ -257,165 +250,123 @@ xfs_trans_read_buf_map( struct xfs_buf **bpp, const struct xfs_buf_ops *ops) { - xfs_buf_t *bp; - xfs_buf_log_item_t *bip; + struct xfs_buf *bp = NULL; int error; + bool release = true; *bpp = NULL; - if (!tp) { - bp = xfs_buf_read_map(target, map, nmaps, flags, ops); - if (!bp) - return (flags & XBF_TRYLOCK) ? - -EAGAIN : -ENOMEM; - - if (bp->b_error) { - error = bp->b_error; - xfs_buf_ioerror_alert(bp, __func__); - XFS_BUF_UNDONE(bp); - xfs_buf_stale(bp); - xfs_buf_relse(bp); - - /* bad CRC means corrupted metadata */ - if (error == -EFSBADCRC) - error = -EFSCORRUPTED; - return error; - } -#ifdef DEBUG - if (xfs_do_error) { - if (xfs_error_target == target) { - if (((xfs_req_num++) % xfs_error_mod) == 0) { - xfs_buf_relse(bp); - xfs_debug(mp, "Returning error!"); - return -EIO; - } - } - } -#endif - if (XFS_FORCED_SHUTDOWN(mp)) - goto shutdown_abort; - *bpp = bp; - return 0; - } /* - * If we find the buffer in the cache with this transaction - * pointer in its b_fsprivate2 field, then we know we already - * have it locked. If it is already read in we just increment - * the lock recursion count and return the buffer to the caller. - * If the buffer is not yet read in, then we read it in, increment - * the lock recursion count, and return it to the caller. + * If we find the buffer in this transaction's item list, then we know + * we already have it locked. If it is already read in we just + * increment the lock recursion count and return the buffer to the + * caller. */ - bp = xfs_trans_buf_item_match(tp, target, map, nmaps); - if (bp != NULL) { + if (tp) + bp = xfs_trans_buf_item_match(tp, target, map, nmaps); + + if (bp) { + struct xfs_buf_log_item *bip; + + /* + * We don't own this buffer ourselves, so we shouldn't release + * it if we come across any errors in processing it. + */ + release = false; + ASSERT(xfs_buf_islocked(bp)); ASSERT(bp->b_transp == tp); ASSERT(bp->b_fspriv != NULL); ASSERT(!bp->b_error); - if (!(XFS_BUF_ISDONE(bp))) { + if (!(bp->b_flags & XBF_DONE)) { trace_xfs_trans_read_buf_io(bp, _RET_IP_); - ASSERT(!XFS_BUF_ISASYNC(bp)); + ASSERT(!(bp->b_flags & XBF_ASYNC)); ASSERT(bp->b_iodone == NULL); - XFS_BUF_READ(bp); + + bp->b_flags |= XBF_READ; bp->b_ops = ops; - /* - * XXX(hch): clean up the error handling here to be less - * of a mess.. - */ if (XFS_FORCED_SHUTDOWN(mp)) { trace_xfs_bdstrat_shut(bp, _RET_IP_); - bp->b_flags &= ~(XBF_READ | XBF_DONE); - xfs_buf_ioerror(bp, -EIO); - xfs_buf_stale(bp); - return -EIO; + error = -EIO; + goto out_stale; } xfs_buf_iorequest(bp); error = xfs_buf_iowait(bp); if (error) { xfs_buf_ioerror_alert(bp, __func__); - xfs_buf_relse(bp); - /* - * We can gracefully recover from most read - * errors. Ones we can't are those that happen - * after the transaction's already dirty. - */ - if (tp->t_flags & XFS_TRANS_DIRTY) - xfs_force_shutdown(tp->t_mountp, - SHUTDOWN_META_IO_ERROR); - /* bad CRC means corrupted metadata */ - if (error == -EFSBADCRC) - error = -EFSCORRUPTED; - return error; + goto out_do_shutdown; + } } - /* - * We never locked this buf ourselves, so we shouldn't - * brelse it either. Just get out. - */ + if (XFS_FORCED_SHUTDOWN(mp)) { trace_xfs_trans_read_buf_shut(bp, _RET_IP_); - *bpp = NULL; return -EIO; } - + /* good buffer! */ bip = bp->b_fspriv; bip->bli_recur++; - ASSERT(atomic_read(&bip->bli_refcount) > 0); trace_xfs_trans_read_buf_recur(bip); *bpp = bp; return 0; } + /* + * Read the buffer from disk as there is no transaction context or we + * didn't find a matching buffer in the transaction item list. + */ bp = xfs_buf_read_map(target, map, nmaps, flags, ops); - if (bp == NULL) { - *bpp = NULL; - return (flags & XBF_TRYLOCK) ? - 0 : -ENOMEM; + if (!bp) { + /* XXX(dgc): should always return -EAGAIN on trylock failure */ + if (!(flags & XBF_TRYLOCK)) + return -ENOMEM; + if (!tp) + return -EAGAIN; + return 0; } if (bp->b_error) { - error = bp->b_error; - xfs_buf_stale(bp); - XFS_BUF_DONE(bp); xfs_buf_ioerror_alert(bp, __func__); - if (tp->t_flags & XFS_TRANS_DIRTY) - xfs_force_shutdown(tp->t_mountp, SHUTDOWN_META_IO_ERROR); - xfs_buf_relse(bp); - - /* bad CRC means corrupted metadata */ - if (error == -EFSBADCRC) - error = -EFSCORRUPTED; - return error; + error = bp->b_error; + goto out_do_shutdown; } -#ifdef DEBUG - if (xfs_do_error && !(tp->t_flags & XFS_TRANS_DIRTY)) { - if (xfs_error_target == target) { - if (((xfs_req_num++) % xfs_error_mod) == 0) { - xfs_force_shutdown(tp->t_mountp, - SHUTDOWN_META_IO_ERROR); - xfs_buf_relse(bp); - xfs_debug(mp, "Returning trans error!"); - return -EIO; - } - } + + if (XFS_FORCED_SHUTDOWN(mp)) { + trace_xfs_trans_read_buf_shut(bp, _RET_IP_); + error = -EIO; + goto out_stale; } -#endif - if (XFS_FORCED_SHUTDOWN(mp)) - goto shutdown_abort; - _xfs_trans_bjoin(tp, bp, 1); - trace_xfs_trans_read_buf(bp->b_fspriv); + if (tp) { + _xfs_trans_bjoin(tp, bp, 1); + trace_xfs_trans_read_buf(bp->b_fspriv); + } *bpp = bp; return 0; -shutdown_abort: - trace_xfs_trans_read_buf_shut(bp, _RET_IP_); - xfs_buf_relse(bp); - *bpp = NULL; - return -EIO; + +out_do_shutdown: + /* + * We can gracefully recover from most read errors. Ones we can't are + * those that happen after the transaction's already dirty. + */ + if (tp && (tp->t_flags & XFS_TRANS_DIRTY)) + xfs_force_shutdown(tp->t_mountp, SHUTDOWN_META_IO_ERROR); +out_stale: + bp->b_flags &= ~(XBF_READ | XBF_DONE); + xfs_buf_ioerror(bp, error); + xfs_buf_stale(bp); + if (release) + xfs_buf_relse(bp); + + /* bad CRC means corrupted metadata */ + if (error == -EFSBADCRC) + error = -EFSCORRUPTED; + return error; } /* -- 2.0.0 From dave@fromorbit.com Fri Aug 15 01:39: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 (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 7D3F029DF9 for ; Fri, 15 Aug 2014 01:39:19 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id F2D5B304039 for ; Thu, 14 Aug 2014 23:39:18 -0700 (PDT) X-ASG-Debug-ID: 1408084751-04bdf01855215d0005-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id BiLXs6cKcCev9Grk for ; Thu, 14 Aug 2014 23:39:17 -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: Ak0PAJmq7VN5LDJ8PGdsb2JhbABagw2BKoczp2YBAQEBAQEGhVGhYxcFAQEBATg2hAQBBScvMwgYMTkDBxQZiEHFPoV8iW2ENgWGEKIvjGcrL4JPAQEB Received: from ppp121-44-50-124.lns20.syd6.internode.on.net (HELO dastard) ([121.44.50.124]) by ipmail06.adl6.internode.on.net with ESMTP; 15 Aug 2014 16:09:11 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1XIBAL-0001ZS-Az for xfs@oss.sgi.com; Fri, 15 Aug 2014 16:39:09 +1000 Received: from dave by disappointment with local (Exim 4.82_1-5b7a7c0-XX) (envelope-from ) id 1XIBAL-0001UT-A9 for xfs@oss.sgi.com; Fri, 15 Aug 2014 16:39:09 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 4/9] xfs: kill xfs_bdstrat_cb Date: Fri, 15 Aug 2014 16:39:02 +1000 X-ASG-Orig-Subj: [PATCH 4/9] xfs: kill xfs_bdstrat_cb Message-Id: <1408084747-4540-5-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 2.0.0 In-Reply-To: <1408084747-4540-1-git-send-email-david@fromorbit.com> References: <1408084747-4540-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1408084756 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.8461 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner Only has two callers, and is just a shutdown check and error handler around xfs_buf_iorequest. However, the error handling is a mess of read and write semantics, and both internal callers only call it for writes. Hence kill the wrapper, and follow up with a patch to sanitise the error handling. Signed-off-by: Dave Chinner --- fs/xfs/xfs_buf.c | 51 ++++++++++++++++++++++++++++----------------------- 1 file changed, 28 insertions(+), 23 deletions(-) diff --git a/fs/xfs/xfs_buf.c b/fs/xfs/xfs_buf.c index 58ae34c..98fcf5a 100644 --- a/fs/xfs/xfs_buf.c +++ b/fs/xfs/xfs_buf.c @@ -1140,27 +1140,6 @@ xfs_bioerror_relse( return -EIO; } -STATIC int -xfs_bdstrat_cb( - struct xfs_buf *bp) -{ - if (XFS_FORCED_SHUTDOWN(bp->b_target->bt_mount)) { - trace_xfs_bdstrat_shut(bp, _RET_IP_); - /* - * Metadata write that didn't get logged but - * written delayed anyway. These aren't associated - * with a transaction, and can be ignored. - */ - if (!bp->b_iodone && !XFS_BUF_ISREAD(bp)) - return xfs_bioerror_relse(bp); - else - return xfs_bioerror(bp); - } - - xfs_buf_iorequest(bp); - return 0; -} - int xfs_bwrite( struct xfs_buf *bp) @@ -1172,7 +1151,20 @@ xfs_bwrite( bp->b_flags |= XBF_WRITE; bp->b_flags &= ~(XBF_ASYNC | XBF_READ | _XBF_DELWRI_Q | XBF_WRITE_FAIL); - xfs_bdstrat_cb(bp); + if (XFS_FORCED_SHUTDOWN(bp->b_target->bt_mount)) { + trace_xfs_bdstrat_shut(bp, _RET_IP_); + + /* + * Metadata write that didn't get logged but written anyway. + * These aren't associated with a transaction, and can be + * ignored. + */ + if (!bp->b_iodone) + return xfs_bioerror_relse(bp); + return xfs_bioerror(bp); + } + + xfs_buf_iorequest(bp); error = xfs_buf_iowait(bp); if (error) { @@ -1852,7 +1844,20 @@ __xfs_buf_delwri_submit( bp->b_flags |= XBF_ASYNC; list_del_init(&bp->b_list); } - xfs_bdstrat_cb(bp); + + if (XFS_FORCED_SHUTDOWN(bp->b_target->bt_mount)) { + trace_xfs_bdstrat_shut(bp, _RET_IP_); + + /* + * Metadata write that didn't get logged but written anyway. + * These aren't associated with a transaction, and can be + * ignored. + */ + if (!bp->b_iodone) + return xfs_bioerror_relse(bp); + return xfs_bioerror(bp); + } + xfs_buf_iorequest(bp); } blk_finish_plug(&plug); -- 2.0.0 From dave@fromorbit.com Fri Aug 15 01:39: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 17B7B29DFD for ; Fri, 15 Aug 2014 01:39:20 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id EB8B48F8052 for ; Thu, 14 Aug 2014 23:39:19 -0700 (PDT) X-ASG-Debug-ID: 1408084753-04cbb054881f0d0003-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id YedCTnHiRhJFUiV4 for ; Thu, 14 Aug 2014 23:39:17 -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: Ak0PAJmq7VN5LDJ8PGdsb2JhbABagw2BKoczp2YBAQEBAQEGhVGhYxcFAQEBATg2hAQBBScvMwgYMTkDBxQQCYhBxT6FfI4jBYYQoi+MZysvgk8BAQE Received: from ppp121-44-50-124.lns20.syd6.internode.on.net (HELO dastard) ([121.44.50.124]) by ipmail06.adl6.internode.on.net with ESMTP; 15 Aug 2014 16:09:11 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1XIBAL-0001ZW-DB for xfs@oss.sgi.com; Fri, 15 Aug 2014 16:39:09 +1000 Received: from dave by disappointment with local (Exim 4.82_1-5b7a7c0-XX) (envelope-from ) id 1XIBAL-0001Uo-CI for xfs@oss.sgi.com; Fri, 15 Aug 2014 16:39:09 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 8/9] xfs: introduce xfs_buf_submit[_wait] Date: Fri, 15 Aug 2014 16:39:06 +1000 X-ASG-Orig-Subj: [PATCH 8/9] xfs: introduce xfs_buf_submit[_wait] Message-Id: <1408084747-4540-9-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 2.0.0 In-Reply-To: <1408084747-4540-1-git-send-email-david@fromorbit.com> References: <1408084747-4540-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1408084756 X-Barracuda-URL: http://192.48.176.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.8461 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner There is a lot of cookie-cutter code that looks like: if (shutdown) handle buffer error xfs_buf_iorequest(bp) error = xfs_buf_iowait(bp) if (error) handle buffer error spread through XFS. There's significant complexity now in xfs_buf_iorequest() to specifically handle this sort of synchronous IO pattern, but there's all sorts of nasty surprises in different error handling code dependent on who owns the buffer references and the locks. Pull this pattern into a single helper, where we can hide all the synchronous IO warts and hence make the error handling for all the callers much saner. This removes the need for a special extra reference to protect IO completion processing, as we can now hold a single reference across dispatch and waiting, simplifying the sync IO smeantics and error handling. In doing this, also rename xfs_buf_iorequest to xfs_buf_submit and make it explicitly handle on asynchronous IO. This forces all users to be switched specifically to one interface or the other and removes any ambiguity between how the interfaces are to be used. It also means that xfs_buf_iowait() goes away. For the special case of delwri buffer submission and waiting, we don't need to issue IO synchronously at all. The second pass to cal xfs_buf_iowait() can now just block on xfs_buf_lock() - the buffer will be unlocked when the async IO is complete. This formalises a sane the method of waiting for async IO - take an extra reference, submit the IO, call xfs_buf_lock() when you want to wait for IO completion. i.e.: bp = xfs_buf_find(); xfs_buf_hold(bp); bp->b_flags |= XBF_ASYNC; xfs_buf_iosubmit(bp); xfs_buf_lock(bp) error = bp->b_error; .... xfs_buf_relse(bp); Signed-off-by: Dave Chinner --- fs/xfs/xfs_bmap_util.c | 14 +--- fs/xfs/xfs_buf.c | 186 ++++++++++++++++++++++++++--------------------- fs/xfs/xfs_buf.h | 4 +- fs/xfs/xfs_buf_item.c | 4 +- fs/xfs/xfs_log.c | 2 +- fs/xfs/xfs_log_recover.c | 22 ++---- fs/xfs/xfs_trans_buf.c | 17 ++--- 7 files changed, 122 insertions(+), 127 deletions(-) diff --git a/fs/xfs/xfs_bmap_util.c b/fs/xfs/xfs_bmap_util.c index 2f1e30d..c53cc03 100644 --- a/fs/xfs/xfs_bmap_util.c +++ b/fs/xfs/xfs_bmap_util.c @@ -1157,12 +1157,7 @@ xfs_zero_remaining_bytes( XFS_BUF_READ(bp); XFS_BUF_SET_ADDR(bp, xfs_fsb_to_db(ip, imap.br_startblock)); - if (XFS_FORCED_SHUTDOWN(mp)) { - error = -EIO; - break; - } - xfs_buf_iorequest(bp); - error = xfs_buf_iowait(bp); + error = xfs_buf_submit_wait(bp); if (error) { xfs_buf_ioerror_alert(bp, "xfs_zero_remaining_bytes(read)"); @@ -1175,12 +1170,7 @@ xfs_zero_remaining_bytes( XFS_BUF_UNREAD(bp); XFS_BUF_WRITE(bp); - if (XFS_FORCED_SHUTDOWN(mp)) { - error = -EIO; - break; - } - xfs_buf_iorequest(bp); - error = xfs_buf_iowait(bp); + error = xfs_buf_submit_wait(bp); if (error) { xfs_buf_ioerror_alert(bp, "xfs_zero_remaining_bytes(write)"); diff --git a/fs/xfs/xfs_buf.c b/fs/xfs/xfs_buf.c index 352e9219..a2599f9 100644 --- a/fs/xfs/xfs_buf.c +++ b/fs/xfs/xfs_buf.c @@ -623,10 +623,11 @@ _xfs_buf_read( bp->b_flags &= ~(XBF_WRITE | XBF_ASYNC | XBF_READ_AHEAD); bp->b_flags |= flags & (XBF_READ | XBF_ASYNC | XBF_READ_AHEAD); - xfs_buf_iorequest(bp); - if (flags & XBF_ASYNC) + if (flags & XBF_ASYNC) { + xfs_buf_submit(bp); return 0; - return xfs_buf_iowait(bp); + } + return xfs_buf_submit_wait(bp); } xfs_buf_t * @@ -708,12 +709,7 @@ xfs_buf_read_uncached( bp->b_flags |= XBF_READ; bp->b_ops = ops; - if (XFS_FORCED_SHUTDOWN(target->bt_mount)) { - xfs_buf_relse(bp); - return NULL; - } - xfs_buf_iorequest(bp); - xfs_buf_iowait(bp); + xfs_buf_submit_wait(bp); return bp; } @@ -1027,10 +1023,8 @@ xfs_buf_ioend( (*(bp->b_iodone))(bp); else if (bp->b_flags & XBF_ASYNC) xfs_buf_relse(bp); - else { + else complete(&bp->b_iowait); - xfs_buf_rele(bp); - } } static void @@ -1083,21 +1077,7 @@ xfs_bwrite( bp->b_flags &= ~(XBF_ASYNC | XBF_READ | _XBF_DELWRI_Q | XBF_WRITE_FAIL | XBF_DONE); - if (XFS_FORCED_SHUTDOWN(bp->b_target->bt_mount)) { - trace_xfs_bdstrat_shut(bp, _RET_IP_); - - xfs_buf_ioerror(bp, -EIO); - xfs_buf_stale(bp); - - /* sync IO, xfs_buf_ioend is going to remove a ref here */ - xfs_buf_hold(bp); - xfs_buf_ioend(bp); - return -EIO; - } - - xfs_buf_iorequest(bp); - - error = xfs_buf_iowait(bp); + error = xfs_buf_submit_wait(bp); if (error) { xfs_force_shutdown(bp->b_target->bt_mount, SHUTDOWN_META_IO_ERROR); @@ -1206,7 +1186,7 @@ next_chunk: } else { /* * This is guaranteed not to be the last io reference count - * because the caller (xfs_buf_iorequest) holds a count itself. + * because the caller (xfs_buf_submit) holds a count itself. */ atomic_dec(&bp->b_io_remaining); xfs_buf_ioerror(bp, -EIO); @@ -1296,13 +1276,29 @@ _xfs_buf_ioapply( blk_finish_plug(&plug); } +/* + * Asynchronous IO submission path. This transfers the buffer lock ownership and + * the current reference to the IO. It is not safe to reference the buffer after + * a call to this function unless the caller holds an additional reference + * itself. + */ void -xfs_buf_iorequest( - xfs_buf_t *bp) +xfs_buf_submit( + struct xfs_buf *bp) { trace_xfs_buf_iorequest(bp, _RET_IP_); ASSERT(!(bp->b_flags & _XBF_DELWRI_Q)); + ASSERT(bp->b_flags & XBF_ASYNC); + + /* on shutdown we stale and complete the buffer immediately */ + if (XFS_FORCED_SHUTDOWN(bp->b_target->bt_mount)) { + xfs_buf_ioerror(bp, -EIO); + bp->b_flags &= ~XBF_DONE; + xfs_buf_stale(bp); + xfs_buf_ioend(bp); + return; + } if (bp->b_flags & XBF_WRITE) xfs_buf_wait_unpin(bp); @@ -1311,25 +1307,10 @@ xfs_buf_iorequest( bp->b_io_error = 0; /* - * Take references to the buffer. For XBF_ASYNC buffers, holding a - * reference for as long as submission takes is all that is necessary - * here. The IO inherits the lock and hold count from the submitter, - * and these are release during IO completion processing. Taking a hold - * over submission ensures that the buffer is not freed until we have - * completed all processing, regardless of when IO errors occur or are - * reported. - * - * However, for synchronous IO, the IO does not inherit the submitters - * reference count, nor the buffer lock. Hence we need to take an extra - * reference to the buffer for the for the IO context so that we can - * guarantee the buffer is not freed until all IO completion processing - * is done. Otherwise the caller can drop their reference while the IO - * is still in progress and hence trigger a use-after-free situation. + * Take an extra reference so that we don't have to guess when it's no + * longer safe to reference the buffer that was passed to us. */ xfs_buf_hold(bp); - if (!(bp->b_flags & XBF_ASYNC)) - xfs_buf_hold(bp); - /* * Set the count to 1 initially, this will stop an I/O completion @@ -1340,14 +1321,13 @@ xfs_buf_iorequest( _xfs_buf_ioapply(bp); /* - * If _xfs_buf_ioapply failed or we are doing synchronous IO that - * completes extremely quickly, we can get back here with only the IO + * If _xfs_buf_ioapply failed, + * we can get back here with only the IO * reference we took above. _xfs_buf_ioend will drop it to zero, so * we'd better run completion processing synchronously so that the we - * don't return to the caller with completion still pending. In the - * error case, this allows the caller to check b_error safely without - * waiting, and in the synchronous IO case it avoids unnecessary context - * switches an latency for high-peformance devices. + * don't return to the caller with completion still pending. + * this allows the caller to check b_error safely without + * waiting */ if (atomic_dec_and_test(&bp->b_io_remaining) == 1) { if (bp->b_error || !(bp->b_flags & XBF_ASYNC)) @@ -1357,25 +1337,70 @@ xfs_buf_iorequest( } xfs_buf_rele(bp); + /* Note: it is not safe to reference bp now we've dropped our ref */ } /* - * Waits for I/O to complete on the buffer supplied. It returns immediately if - * no I/O is pending or there is already a pending error on the buffer, in which - * case nothing will ever complete. It returns the I/O error code, if any, or - * 0 if there was no error. + * Synchronous buffer IO submission path, read or write. */ int -xfs_buf_iowait( - xfs_buf_t *bp) +xfs_buf_submit_wait( + struct xfs_buf *bp) { - trace_xfs_buf_iowait(bp, _RET_IP_); + int error; + + trace_xfs_buf_iorequest(bp, _RET_IP_); - if (!bp->b_error) - wait_for_completion(&bp->b_iowait); + ASSERT(!(bp->b_flags & (_XBF_DELWRI_Q | XBF_ASYNC))); + + if (XFS_FORCED_SHUTDOWN(bp->b_target->bt_mount)) { + xfs_buf_ioerror(bp, -EIO); + xfs_buf_stale(bp); + bp->b_flags &= ~XBF_DONE; + return -EIO; + } + if (bp->b_flags & XBF_WRITE) + xfs_buf_wait_unpin(bp); + + /* clear the internal error state to avoid spurious errors */ + bp->b_io_error = 0; + + /* + * For synchronous IO, the IO does not inherit the submitters reference + * count, nor the buffer lock. Hence we cannot release the reference we + * are about to take until we've waited for all IO completion to occur, + * including any xfs_buf_ioend_async() work that may be pending. + */ + xfs_buf_hold(bp); + + /* + * Set the count to 1 initially, this will stop an I/O completion + * callout which happens before we have started all the I/O from calling + * xfs_buf_ioend too early. + */ + atomic_set(&bp->b_io_remaining, 1); + _xfs_buf_ioapply(bp); + + /* + * make sure we run completion synchronously if it raced with us and is + * already complete. + */ + if (atomic_dec_and_test(&bp->b_io_remaining) == 1) + xfs_buf_ioend(bp); + + /* wait for completion before gathering the error from the buffer */ + trace_xfs_buf_iowait(bp, _RET_IP_); + wait_for_completion(&bp->b_iowait); trace_xfs_buf_iowait_done(bp, _RET_IP_); - return bp->b_error; + error = bp->b_error; + + /* + * all done now, we can release the hold that keeps the buffer + * referenced for the entire IO. + */ + xfs_buf_rele(bp); + return error; } xfs_caddr_t @@ -1769,29 +1794,19 @@ __xfs_buf_delwri_submit( blk_start_plug(&plug); list_for_each_entry_safe(bp, n, io_list, b_list) { bp->b_flags &= ~(_XBF_DELWRI_Q | XBF_ASYNC | XBF_WRITE_FAIL); - bp->b_flags |= XBF_WRITE; + bp->b_flags |= XBF_WRITE | XBF_ASYNC; - if (!wait) { - bp->b_flags |= XBF_ASYNC; + /* + * we do all Io submission async. This means if we need to wait + * for IO completion we need to take an extra reference so the + * buffer is still valid on the other side. + */ + if (!wait) list_del_init(&bp->b_list); - } - - if (XFS_FORCED_SHUTDOWN(bp->b_target->bt_mount)) { - trace_xfs_bdstrat_shut(bp, _RET_IP_); - - xfs_buf_ioerror(bp, -EIO); - xfs_buf_stale(bp); + else + xfs_buf_hold(bp); - /* - * if sync IO, xfs_buf_ioend is going to remove a - * ref here. We need to add that so we can collect - * all the buffer errors in the wait loop. - */ - if (wait) - xfs_buf_hold(bp); - xfs_buf_ioend(bp); - } else - xfs_buf_iorequest(bp); + xfs_buf_submit(bp); } blk_finish_plug(&plug); @@ -1838,7 +1853,10 @@ xfs_buf_delwri_submit( bp = list_first_entry(&io_list, struct xfs_buf, b_list); list_del_init(&bp->b_list); - error2 = xfs_buf_iowait(bp); + + /* locking the buffer will wait for async IO completion. */ + xfs_buf_lock(bp); + error2 = bp->b_error; xfs_buf_relse(bp); if (!error) error = error2; diff --git a/fs/xfs/xfs_buf.h b/fs/xfs/xfs_buf.h index d8f57f6..0acfc30 100644 --- a/fs/xfs/xfs_buf.h +++ b/fs/xfs/xfs_buf.h @@ -290,8 +290,8 @@ extern int xfs_bwrite(struct xfs_buf *bp); extern void xfs_buf_ioend(struct xfs_buf *bp); extern void xfs_buf_ioerror(xfs_buf_t *, int); extern void xfs_buf_ioerror_alert(struct xfs_buf *, const char *func); -extern void xfs_buf_iorequest(xfs_buf_t *); -extern int xfs_buf_iowait(xfs_buf_t *); +extern void xfs_buf_submit(struct xfs_buf *bp); +extern int xfs_buf_submit_wait(struct xfs_buf *bp); extern void xfs_buf_iomove(xfs_buf_t *, size_t, size_t, void *, xfs_buf_rw_t); #define xfs_buf_zero(bp, off, len) \ diff --git a/fs/xfs/xfs_buf_item.c b/fs/xfs/xfs_buf_item.c index 4fd41b5..cbea909 100644 --- a/fs/xfs/xfs_buf_item.c +++ b/fs/xfs/xfs_buf_item.c @@ -1081,7 +1081,7 @@ xfs_buf_iodone_callbacks( * a way to shut the filesystem down if the writes keep failing. * * In practice we'll shut the filesystem down soon as non-transient - * erorrs tend to affect the whole device and a failing log write + * errors tend to affect the whole device and a failing log write * will make us give up. But we really ought to do better here. */ if (XFS_BUF_ISASYNC(bp)) { @@ -1094,7 +1094,7 @@ xfs_buf_iodone_callbacks( if (!(bp->b_flags & (XBF_STALE|XBF_WRITE_FAIL))) { bp->b_flags |= XBF_WRITE | XBF_ASYNC | XBF_DONE | XBF_WRITE_FAIL; - xfs_buf_iorequest(bp); + xfs_buf_submit(bp); } else { xfs_buf_relse(bp); } diff --git a/fs/xfs/xfs_log.c b/fs/xfs/xfs_log.c index e4665db..c4d7f79 100644 --- a/fs/xfs/xfs_log.c +++ b/fs/xfs/xfs_log.c @@ -1699,7 +1699,7 @@ xlog_bdstrat( return 0; } - xfs_buf_iorequest(bp); + xfs_buf_submit(bp); return 0; } diff --git a/fs/xfs/xfs_log_recover.c b/fs/xfs/xfs_log_recover.c index 4ba19bf..1e14452 100644 --- a/fs/xfs/xfs_log_recover.c +++ b/fs/xfs/xfs_log_recover.c @@ -193,12 +193,8 @@ xlog_bread_noalign( bp->b_io_length = nbblks; bp->b_error = 0; - if (XFS_FORCED_SHUTDOWN(log->l_mp)) - return -EIO; - - xfs_buf_iorequest(bp); - error = xfs_buf_iowait(bp); - if (error) + error = xfs_buf_submit_wait(bp); + if (error && !XFS_FORCED_SHUTDOWN(log->l_mp)) xfs_buf_ioerror_alert(bp, __func__); return error; } @@ -4427,16 +4423,12 @@ xlog_do_recover( XFS_BUF_UNASYNC(bp); bp->b_ops = &xfs_sb_buf_ops; - if (XFS_FORCED_SHUTDOWN(log->l_mp)) { - xfs_buf_relse(bp); - return -EIO; - } - - xfs_buf_iorequest(bp); - error = xfs_buf_iowait(bp); + error = xfs_buf_submit_wait(bp); if (error) { - xfs_buf_ioerror_alert(bp, __func__); - ASSERT(0); + if (XFS_FORCED_SHUTDOWN(log->l_mp)) { + xfs_buf_ioerror_alert(bp, __func__); + ASSERT(0); + } xfs_buf_relse(bp); return error; } diff --git a/fs/xfs/xfs_trans_buf.c b/fs/xfs/xfs_trans_buf.c index 9c3e610..4bdf02c 100644 --- a/fs/xfs/xfs_trans_buf.c +++ b/fs/xfs/xfs_trans_buf.c @@ -286,18 +286,13 @@ xfs_trans_read_buf_map( bp->b_flags |= XBF_READ; bp->b_ops = ops; - if (XFS_FORCED_SHUTDOWN(mp)) { - trace_xfs_bdstrat_shut(bp, _RET_IP_); - error = -EIO; - goto out_stale; - } - - xfs_buf_iorequest(bp); - error = xfs_buf_iowait(bp); + error = xfs_buf_submit_wait(bp); if (error) { - xfs_buf_ioerror_alert(bp, __func__); - goto out_do_shutdown; - + if (!XFS_FORCED_SHUTDOWN(mp)) { + xfs_buf_ioerror_alert(bp, __func__); + goto out_do_shutdown; + } + goto out_stale; } } -- 2.0.0 From BATV+7522b9d5d1019e41b41d+4009+infradead.org+hch@bombadil.srs.infradead.org Fri Aug 15 07:56: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 (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id EDCEB7F3F for ; Fri, 15 Aug 2014 07: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 7CB56AC006 for ; Fri, 15 Aug 2014 05:56:10 -0700 (PDT) X-ASG-Debug-ID: 1408107368-04cbb054872a430001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id AbSJb1D9BNaeIYSL (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 15 Aug 2014 05:56:09 -0700 (PDT) X-Barracuda-Envelope-From: BATV+7522b9d5d1019e41b41d+4009+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 1XIH3A-0001RS-Bc; Fri, 15 Aug 2014 12:56:08 +0000 Date: Fri, 15 Aug 2014 05:56:08 -0700 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 9/9] xfs: check xfs_buf_read_uncached returns correctly Message-ID: <20140815125608.GA27856@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 9/9] xfs: check xfs_buf_read_uncached returns correctly References: <1408084747-4540-1-git-send-email-david@fromorbit.com> <1408084747-4540-10-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1408084747-4540-10-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.23 (2014-03-12) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1408107369 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.8470 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Fri, Aug 15, 2014 at 04:39:07PM +1000, Dave Chinner wrote: > From: Dave Chinner > > xfs_buf_read_uncached() has two failure modes. If can either return > NULL or bp->b_error != 0 depending on the type of failure, and not > all callers check for both. Fix it up. I'd rather get rid of these annoying calling conventions. Make it return and errno, and the bp in a pointer argument, with the bp never non-NULL in case of error. From BATV+7522b9d5d1019e41b41d+4009+infradead.org+hch@bombadil.srs.infradead.org Fri Aug 15 08:10: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 (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id B09967F3F for ; Fri, 15 Aug 2014 08:10:25 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 73AA18F8089 for ; Fri, 15 Aug 2014 06:10:22 -0700 (PDT) X-ASG-Debug-ID: 1408108220-04bdf018552d090001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id CzsAbCThTgyHv5v3 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 15 Aug 2014 06:10:20 -0700 (PDT) X-Barracuda-Envelope-From: BATV+7522b9d5d1019e41b41d+4009+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 1XIHGu-000836-AS; Fri, 15 Aug 2014 13:10:20 +0000 Date: Fri, 15 Aug 2014 06:10:20 -0700 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 8/9] xfs: introduce xfs_buf_submit[_wait] Message-ID: <20140815131020.GB27856@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 8/9] xfs: introduce xfs_buf_submit[_wait] References: <1408084747-4540-1-git-send-email-david@fromorbit.com> <1408084747-4540-9-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1408084747-4540-9-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.23 (2014-03-12) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1408108220 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.8470 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS > diff --git a/fs/xfs/xfs_bmap_util.c b/fs/xfs/xfs_bmap_util.c > index 2f1e30d..c53cc03 100644 > --- a/fs/xfs/xfs_bmap_util.c > +++ b/fs/xfs/xfs_bmap_util.c > @@ -1157,12 +1157,7 @@ xfs_zero_remaining_bytes( xfs_zero_remaining_bytes really should be switched to xfs_buf_read_uncached + xfs_bwrite instead of all this mess just to micro-optimize a few memory allocation away that don't even happen for the common case of blocksize == PAGE_SIZE. I'm not even sure we should be using the buffer cache at all for something inside a regular file, but that's a discussion for another time. > void > +xfs_buf_submit( > + struct xfs_buf *bp) > { > trace_xfs_buf_iorequest(bp, _RET_IP_); I suspect these two should have properly name and separate trace points now? It also seems like a lot of the guts of the two functions are still the same, so factoring that into a __xfs_buf_submit helper would be useful. > + * If _xfs_buf_ioapply failed, > + * we can get back here with only the IO > * reference we took above. _xfs_buf_ioend will drop it to zero, so > * we'd better run completion processing synchronously so that the we > + * don't return to the caller with completion still pending. > + * this allows the caller to check b_error safely without > + * waiting > */ > if (atomic_dec_and_test(&bp->b_io_remaining) == 1) { > if (bp->b_error || !(bp->b_flags & XBF_ASYNC)) I don't think the !ASYNC case can happen here, can it? > + if (!wait) > list_del_init(&bp->b_list); > + else > + xfs_buf_hold(bp); Maybe switch this around to avoid the negated condition in the if else? Also might this be worth a change of it's own? > +++ b/fs/xfs/xfs_trans_buf.c > @@ -286,18 +286,13 @@ xfs_trans_read_buf_map( > bp->b_flags |= XBF_READ; > bp->b_ops = ops; > > + error = xfs_buf_submit_wait(bp); > if (error) { > + if (!XFS_FORCED_SHUTDOWN(mp)) { > + xfs_buf_ioerror_alert(bp, __func__); > + goto out_do_shutdown; > + } > + goto out_stale; Again maybe reverse the conditions here for a cleaner flow? From bfoster@redhat.com Fri Aug 15 08:18: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 68A927F3F for ; Fri, 15 Aug 2014 08:18:14 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 3A649304043 for ; Fri, 15 Aug 2014 06:18:11 -0700 (PDT) X-ASG-Debug-ID: 1408108689-04bdf018542d520001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id AKluUN1lukmcygm3 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 15 Aug 2014 06:18: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-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 s7FDI78I015174 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Fri, 15 Aug 2014 09:18:07 -0400 Received: from laptop.bfoster (vpn-59-245.rdu2.redhat.com [10.10.59.245]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s7FDI4ql020228 (version=TLSv1/SSLv3 cipher=AES128-GCM-SHA256 bits=128 verify=NO); Fri, 15 Aug 2014 09:18:06 -0400 Date: Fri, 15 Aug 2014 09:18:04 -0400 From: Brian Foster To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 1/9] xfs: synchronous buffer IO needs a reference Message-ID: <20140815131804.GA4096@laptop.bfoster> X-ASG-Orig-Subj: Re: [PATCH 1/9] xfs: synchronous buffer IO needs a reference References: <1408084747-4540-1-git-send-email-david@fromorbit.com> <1408084747-4540-2-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1408084747-4540-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.22 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1408108689 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Fri, Aug 15, 2014 at 04:38:59PM +1000, Dave Chinner wrote: > From: Dave Chinner > > When synchronous IO runs IO completion work, it does so without an > IO reference or a hold reference on the buffer. The IO "hold > reference" is owned by the submitter, and released when the > submission is complete. The IO reference is released when both the > submitter and the bio end_io processing is run, and so if the io > completion work is run from IO completion context, it is run without > an IO reference. > > Hence we can get the situation where the submitter can submit the > IO, see an error on the buffer and unlock and free the buffer while > there is still IO in progress. This leads to use-after-free and > memory corruption. > > Fix this by taking a "sync IO hold" reference that is owned by the > IO and not released until after the buffer completion calls are run > to wake up synchronous waiters. This means that the buffer will not > be freed in any circumstance until all IO processing is completed. > > Signed-off-by: Dave Chinner > --- > fs/xfs/xfs_buf.c | 46 ++++++++++++++++++++++++++++++++++++++-------- > 1 file changed, 38 insertions(+), 8 deletions(-) > > diff --git a/fs/xfs/xfs_buf.c b/fs/xfs/xfs_buf.c > index cd7b8ca..5d86bbd 100644 > --- a/fs/xfs/xfs_buf.c > +++ b/fs/xfs/xfs_buf.c > @@ -1019,6 +1019,7 @@ xfs_buf_iodone_work( > else { > ASSERT(read && bp->b_ops); > complete(&bp->b_iowait); > + xfs_buf_rele(bp); /* !XBF_ASYNC ref */ > } > } > > @@ -1044,6 +1045,7 @@ xfs_buf_ioend( > } else { > bp->b_flags &= ~(XBF_READ | XBF_WRITE | XBF_READ_AHEAD); > complete(&bp->b_iowait); > + xfs_buf_rele(bp); /* !XBF_ASYNC ref */ > } > } > > @@ -1383,22 +1385,50 @@ xfs_buf_iorequest( > > if (bp->b_flags & XBF_WRITE) > xfs_buf_wait_unpin(bp); > + > + /* > + * Take references to the buffer. For XBF_ASYNC buffers, holding a > + * reference for as long as submission takes is all that is necessary > + * here. The IO inherits the lock and hold count from the submitter, > + * and these are release during IO completion processing. Taking a hold > + * over submission ensures that the buffer is not freed until we have > + * completed all processing, regardless of when IO errors occur or are > + * reported. > + * > + * However, for synchronous IO, the IO does not inherit the submitters > + * reference count, nor the buffer lock. Hence we need to take an extra > + * reference to the buffer for the for the IO context so that we can > + * guarantee the buffer is not freed until all IO completion processing > + * is done. Otherwise the caller can drop their reference while the IO > + * is still in progress and hence trigger a use-after-free situation. > + */ > xfs_buf_hold(bp); > + if (!(bp->b_flags & XBF_ASYNC)) > + xfs_buf_hold(bp); > + > > /* > - * Set the count to 1 initially, this will stop an I/O > - * completion callout which happens before we have started > - * all the I/O from calling xfs_buf_ioend too early. > + * Set the count to 1 initially, this will stop an I/O completion > + * callout which happens before we have started all the I/O from calling > + * xfs_buf_ioend too early. > */ > atomic_set(&bp->b_io_remaining, 1); > _xfs_buf_ioapply(bp); > + > /* > - * If _xfs_buf_ioapply failed, we'll get back here with > - * only the reference we took above. _xfs_buf_ioend will > - * drop it to zero, so we'd better not queue it for later, > - * or we'll free it before it's done. > + * If _xfs_buf_ioapply failed or we are doing synchronous IO that > + * completes extremely quickly, we can get back here with only the IO > + * reference we took above. _xfs_buf_ioend will drop it to zero, so > + * we'd better run completion processing synchronously so that the we > + * don't return to the caller with completion still pending. In the > + * error case, this allows the caller to check b_error safely without > + * waiting, and in the synchronous IO case it avoids unnecessary context > + * switches an latency for high-peformance devices. > */ AFAICT there is no real wait if the buf has completed at this point. The wait just decrements the completion counter. So what's the benefit of "not waiting?" Where is the potential context switch? Are you referring to the case where error is set but I/O is not complete? Are you saying the advantage to the caller is it doesn't have to care about the state of further I/O once it has been determined at least one error has occurred? (If so, who cares about latency given that some operation that depends on this I/O is already doomed to fail?). The code looks fine, but I'm trying to understand the reasoning better (and I suspect we can clarify the comment). > - _xfs_buf_ioend(bp, bp->b_error ? 0 : 1); > + if (bp->b_error || !(bp->b_flags & XBF_ASYNC)) > + _xfs_buf_ioend(bp, 0); > + else > + _xfs_buf_ioend(bp, 1); Not related to this patch, but it seems like the problem this code tries to address is still possible. Perhaps this papers over a particular instance. Consider the case where an I/O fails immediately after this call completes, but not before. We have an extra reference now for completion, but we can still return to the caller with completion pending. I suppose its fine if we consider the "problem" to be that the reference goes away underneath the completion, as opposed to the caller caring about the status of completion. Brian > > xfs_buf_rele(bp); > } > -- > 2.0.0 > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From bfoster@redhat.com Fri Aug 15 08:18: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.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 3F03A7F3F for ; Fri, 15 Aug 2014 08:18:27 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 1FACC304043 for ; Fri, 15 Aug 2014 06:18:27 -0700 (PDT) X-ASG-Debug-ID: 1408108705-04cb6c54fd27890001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id VaY5IgbfASTKNuei (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 15 Aug 2014 06:18: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-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 s7FDINZU003433 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Fri, 15 Aug 2014 09:18:24 -0400 Received: from laptop.bfoster (vpn-59-245.rdu2.redhat.com [10.10.59.245]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s7FDILm6015910 (version=TLSv1/SSLv3 cipher=AES128-GCM-SHA256 bits=128 verify=NO); Fri, 15 Aug 2014 09:18:23 -0400 Date: Fri, 15 Aug 2014 09:18:21 -0400 From: Brian Foster To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 2/9] xfs: xfs_buf_ioend and xfs_buf_iodone_work duplicate functionality Message-ID: <20140815131820.GB4096@laptop.bfoster> X-ASG-Orig-Subj: Re: [PATCH 2/9] xfs: xfs_buf_ioend and xfs_buf_iodone_work duplicate functionality References: <1408084747-4540-1-git-send-email-david@fromorbit.com> <1408084747-4540-3-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1408084747-4540-3-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.23 (2014-03-12) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.26 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1408108705 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Fri, Aug 15, 2014 at 04:39:00PM +1000, Dave Chinner wrote: > From: Dave Chinner > > We do some work in xfs_buf_ioend, and some work in > xfs_buf_iodone_work, but much of that functionality is the same. > This work can all be done in a single function, leaving > xfs_buf_iodone just a wrapper to determine if we should execute it > by workqueue or directly. hence rename xfs_buf_iodone_work to > xfs_buf_ioend(), and add a new xfs_buf_ioend_async() for places that > need async processing. > > Signed-off-by: Dave Chinner > --- > fs/xfs/xfs_buf.c | 79 +++++++++++++++++++++--------------------------- > fs/xfs/xfs_buf.h | 2 +- > fs/xfs/xfs_buf_item.c | 4 +-- > fs/xfs/xfs_inode.c | 2 +- > fs/xfs/xfs_log.c | 2 +- > fs/xfs/xfs_log_recover.c | 2 +- > 6 files changed, 40 insertions(+), 51 deletions(-) > > diff --git a/fs/xfs/xfs_buf.c b/fs/xfs/xfs_buf.c > index 5d86bbd..1b7f0bc 100644 > --- a/fs/xfs/xfs_buf.c > +++ b/fs/xfs/xfs_buf.c > @@ -999,54 +999,49 @@ xfs_buf_wait_unpin( > */ > > STATIC void > -xfs_buf_iodone_work( > - struct work_struct *work) > +xfs_buf_ioend( > + struct xfs_buf *bp) Compile failure here due to STATIC. > { > - struct xfs_buf *bp = > - container_of(work, xfs_buf_t, b_iodone_work); > - bool read = !!(bp->b_flags & XBF_READ); > + bool read = !!(bp->b_flags & XBF_READ); > + > + trace_xfs_buf_iodone(bp, _RET_IP_); > > bp->b_flags &= ~(XBF_READ | XBF_WRITE | XBF_READ_AHEAD); > > - /* only validate buffers that were read without errors */ > - if (read && bp->b_ops && !bp->b_error && (bp->b_flags & XBF_DONE)) > - bp->b_ops->verify_read(bp); > + if (!bp->b_error) { > + bp->b_flags |= XBF_DONE; > + > + /* only validate buffers that were read without errors */ > + if (read && bp->b_ops) > + bp->b_ops->verify_read(bp); > + } Probably not a cause of errors, but this code is now executed twice for I/O with b_iodone callbacks. Once for the initial call from bio_end_io, again from the callback via the b_iodone handler. The flags bits are probably fine, but we don't want to be running the verifiers multiple times unnecessarily. > > if (bp->b_iodone) > (*(bp->b_iodone))(bp); > else if (bp->b_flags & XBF_ASYNC) > xfs_buf_relse(bp); > else { > - ASSERT(read && bp->b_ops); > complete(&bp->b_iowait); > xfs_buf_rele(bp); > } > } > > -void > -xfs_buf_ioend( > - struct xfs_buf *bp, > - int schedule) > +static void > +xfs_buf_ioend_work( > + struct work_struct *work) > { > - bool read = !!(bp->b_flags & XBF_READ); > - > - trace_xfs_buf_iodone(bp, _RET_IP_); > + struct xfs_buf *bp = > + container_of(work, xfs_buf_t, b_iodone_work); > > - if (bp->b_error == 0) > - bp->b_flags |= XBF_DONE; > + xfs_buf_ioend(bp); > +} > > - if (bp->b_iodone || (read && bp->b_ops) || (bp->b_flags & XBF_ASYNC)) { > - if (schedule) { > - INIT_WORK(&bp->b_iodone_work, xfs_buf_iodone_work); > - queue_work(xfslogd_workqueue, &bp->b_iodone_work); > - } else { > - xfs_buf_iodone_work(&bp->b_iodone_work); > - } > - } else { > - bp->b_flags &= ~(XBF_READ | XBF_WRITE | XBF_READ_AHEAD); > - complete(&bp->b_iowait); > - xfs_buf_rele(bp); > - } > +void > +xfs_buf_ioend_async( > + struct xfs_buf *bp) > +{ > + INIT_WORK(&bp->b_iodone_work, xfs_buf_ioend_work); > + queue_work(xfslogd_workqueue, &bp->b_iodone_work); > } > > void > @@ -1094,7 +1089,7 @@ xfs_bioerror( > XFS_BUF_UNDONE(bp); > xfs_buf_stale(bp); > > - xfs_buf_ioend(bp, 0); > + xfs_buf_ioend(bp); > > return -EIO; > } > @@ -1181,15 +1176,6 @@ xfs_bwrite( > } > > STATIC void > -_xfs_buf_ioend( > - xfs_buf_t *bp, > - int schedule) > -{ > - if (atomic_dec_and_test(&bp->b_io_remaining) == 1) > - xfs_buf_ioend(bp, schedule); > -} > - > -STATIC void > xfs_buf_bio_end_io( > struct bio *bio, > int error) > @@ -1206,7 +1192,8 @@ xfs_buf_bio_end_io( > if (!bp->b_error && xfs_buf_is_vmapped(bp) && (bp->b_flags & XBF_READ)) > invalidate_kernel_vmap_range(bp->b_addr, xfs_buf_vmap_len(bp)); > > - _xfs_buf_ioend(bp, 1); > + if (atomic_dec_and_test(&bp->b_io_remaining) == 1) > + xfs_buf_ioend_async(bp); > bio_put(bio); > } > > @@ -1425,10 +1412,12 @@ xfs_buf_iorequest( > * waiting, and in the synchronous IO case it avoids unnecessary context > * switches an latency for high-peformance devices. > */ > - if (bp->b_error || !(bp->b_flags & XBF_ASYNC)) > - _xfs_buf_ioend(bp, 0); > - else > - _xfs_buf_ioend(bp, 1); > + if (atomic_dec_and_test(&bp->b_io_remaining) == 1) { > + if (bp->b_error || !(bp->b_flags & XBF_ASYNC)) > + xfs_buf_ioend(bp); > + else > + xfs_buf_ioend_async(bp); > + } This looks cleaner, but the comment is out of whack at this point. Brian > > xfs_buf_rele(bp); > } > diff --git a/fs/xfs/xfs_buf.h b/fs/xfs/xfs_buf.h > index c753183..4585c15 100644 > --- a/fs/xfs/xfs_buf.h > +++ b/fs/xfs/xfs_buf.h > @@ -286,7 +286,7 @@ extern void xfs_buf_unlock(xfs_buf_t *); > > /* Buffer Read and Write Routines */ > extern int xfs_bwrite(struct xfs_buf *bp); > -extern void xfs_buf_ioend(xfs_buf_t *, int); > +extern void xfs_buf_ioend(struct xfs_buf *bp); > extern void xfs_buf_ioerror(xfs_buf_t *, int); > extern void xfs_buf_ioerror_alert(struct xfs_buf *, const char *func); > extern void xfs_buf_iorequest(xfs_buf_t *); > diff --git a/fs/xfs/xfs_buf_item.c b/fs/xfs/xfs_buf_item.c > index 76007de..4fd41b5 100644 > --- a/fs/xfs/xfs_buf_item.c > +++ b/fs/xfs/xfs_buf_item.c > @@ -491,7 +491,7 @@ xfs_buf_item_unpin( > xfs_buf_ioerror(bp, -EIO); > XFS_BUF_UNDONE(bp); > xfs_buf_stale(bp); > - xfs_buf_ioend(bp, 0); > + xfs_buf_ioend(bp); > } > } > > @@ -1115,7 +1115,7 @@ do_callbacks: > xfs_buf_do_callbacks(bp); > bp->b_fspriv = NULL; > bp->b_iodone = NULL; > - xfs_buf_ioend(bp, 0); > + xfs_buf_ioend(bp); > } > > /* > diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c > index fea3c92..00d210b 100644 > --- a/fs/xfs/xfs_inode.c > +++ b/fs/xfs/xfs_inode.c > @@ -3056,7 +3056,7 @@ cluster_corrupt_out: > XFS_BUF_UNDONE(bp); > xfs_buf_stale(bp); > xfs_buf_ioerror(bp, -EIO); > - xfs_buf_ioend(bp, 0); > + xfs_buf_ioend(bp); > } else { > xfs_buf_stale(bp); > xfs_buf_relse(bp); > diff --git a/fs/xfs/xfs_log.c b/fs/xfs/xfs_log.c > index 8eaa8f5..e4665db 100644 > --- a/fs/xfs/xfs_log.c > +++ b/fs/xfs/xfs_log.c > @@ -1689,7 +1689,7 @@ xlog_bdstrat( > if (iclog->ic_state & XLOG_STATE_IOERROR) { > xfs_buf_ioerror(bp, -EIO); > xfs_buf_stale(bp); > - xfs_buf_ioend(bp, 0); > + xfs_buf_ioend(bp); > /* > * It would seem logical to return EIO here, but we rely on > * the log state machine to propagate I/O errors instead of > diff --git a/fs/xfs/xfs_log_recover.c b/fs/xfs/xfs_log_recover.c > index 1fd5787..4ba19bf 100644 > --- a/fs/xfs/xfs_log_recover.c > +++ b/fs/xfs/xfs_log_recover.c > @@ -383,7 +383,7 @@ xlog_recover_iodone( > SHUTDOWN_META_IO_ERROR); > } > bp->b_iodone = NULL; > - xfs_buf_ioend(bp, 0); > + xfs_buf_ioend(bp); > } > > /* > -- > 2.0.0 > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From bfoster@redhat.com Fri Aug 15 08:18: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 8E79E7F3F for ; Fri, 15 Aug 2014 08:18:42 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 7CFE130404E for ; Fri, 15 Aug 2014 06:18:42 -0700 (PDT) X-ASG-Debug-ID: 1408108721-04cb6c5500278d0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id Q8QZNhcRaDF7CaEQ (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 15 Aug 2014 06:18:41 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx14.intmail.prod.int.phx2.redhat.com (int-mx14.intmail.prod.int.phx2.redhat.com [10.5.11.27]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s7FDId5u001656 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Fri, 15 Aug 2014 09:18:39 -0400 Received: from laptop.bfoster (vpn-59-245.rdu2.redhat.com [10.10.59.245]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s7FDIbDc017080 (version=TLSv1/SSLv3 cipher=AES128-GCM-SHA256 bits=128 verify=NO); Fri, 15 Aug 2014 09:18:39 -0400 Date: Fri, 15 Aug 2014 09:18:37 -0400 From: Brian Foster To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 3/9] xfs: rework xfs_buf_bio_endio error handling Message-ID: <20140815131836.GC4096@laptop.bfoster> X-ASG-Orig-Subj: Re: [PATCH 3/9] xfs: rework xfs_buf_bio_endio error handling References: <1408084747-4540-1-git-send-email-david@fromorbit.com> <1408084747-4540-4-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1408084747-4540-4-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.23 (2014-03-12) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.27 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1408108721 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Fri, Aug 15, 2014 at 04:39:01PM +1000, Dave Chinner wrote: > From: Dave Chinner > > Currently the report of a bio error from completion > immediately marks the buffer with an error. The issue is that this > is racy w.r.t. synchronous IO - the submitter can see b_error being > set before the IO is complete, and hence we cannot differentiate > between submission failures and completion failures. > > Add an internal b_io_error field protected by the b_lock to catch IO > completion errors, and only propagate that to the buffer during > final IO completion handling. Hence we can tell in xfs_buf_iorequest > if we've had a submission failure bey checking bp->b_error before > dropping our b_io_remaining reference - that reference will prevent > b_io_error values from being propagated to b_error in the event that > completion races with submission. > > In doing so, allow xfs_buf_iorequest to return an error. That way, > the caller can check for submission errors safely if required, and > easily distinguish them from completion errors that come from > xfs_buf_iowait(). > I don't see any changes to xfs_buf_iorequest() at all in this one. That aside, it looks fine. It's not how I was thinking about it, but a clear separation of submission error regardless. Brian > Signed-off-by: Dave Chinner > --- > fs/xfs/xfs_buf.c | 18 ++++++++++++++++-- > fs/xfs/xfs_buf.h | 1 + > 2 files changed, 17 insertions(+), 2 deletions(-) > > diff --git a/fs/xfs/xfs_buf.c b/fs/xfs/xfs_buf.c > index 1b7f0bc..58ae34c 100644 > --- a/fs/xfs/xfs_buf.c > +++ b/fs/xfs/xfs_buf.c > @@ -1008,6 +1008,13 @@ xfs_buf_ioend( > > bp->b_flags &= ~(XBF_READ | XBF_WRITE | XBF_READ_AHEAD); > > + /* > + * Pull in IO completion errors now. We are guaranteed to be running > + * single threaded, so we don't need the lock to read b_io_error. > + */ > + if (!bp->b_error && bp->b_io_error) > + xfs_buf_ioerror(bp, bp->b_io_error); > + > if (!bp->b_error) { > bp->b_flags |= XBF_DONE; > > @@ -1186,8 +1193,12 @@ xfs_buf_bio_end_io( > * don't overwrite existing errors - otherwise we can lose errors on > * buffers that require multiple bios to complete. > */ > - if (!bp->b_error) > - xfs_buf_ioerror(bp, error); > + if (error) { > + spin_lock(&bp->b_lock); > + if (!bp->b_io_error) > + bp->b_io_error = error; > + spin_unlock(&bp->b_lock); > + } > > if (!bp->b_error && xfs_buf_is_vmapped(bp) && (bp->b_flags & XBF_READ)) > invalidate_kernel_vmap_range(bp->b_addr, xfs_buf_vmap_len(bp)); > @@ -1373,6 +1384,9 @@ xfs_buf_iorequest( > if (bp->b_flags & XBF_WRITE) > xfs_buf_wait_unpin(bp); > > + /* clear the internal error state to avoid spurious errors */ > + bp->b_io_error = 0; > + > /* > * Take references to the buffer. For XBF_ASYNC buffers, holding a > * reference for as long as submission takes is all that is necessary > diff --git a/fs/xfs/xfs_buf.h b/fs/xfs/xfs_buf.h > index 4585c15..44db8cd 100644 > --- a/fs/xfs/xfs_buf.h > +++ b/fs/xfs/xfs_buf.h > @@ -158,6 +158,7 @@ typedef struct xfs_buf { > struct list_head b_lru; /* lru list */ > spinlock_t b_lock; /* internal state lock */ > unsigned int b_state; /* internal state flags */ > + int b_io_error; /* internal IO error state */ > wait_queue_head_t b_waiters; /* unpin waiters */ > struct list_head b_list; > struct xfs_perag *b_pag; /* contains rbtree root */ > -- > 2.0.0 > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From topjob@compamedia.de Fri Aug 15 09:27: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=3.8 required=5.0 tests=HTML_MESSAGE,LOTS_OF_MONEY, MILLION_USD 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 699477F3F for ; Fri, 15 Aug 2014 09:27:51 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 498F9304039 for ; Fri, 15 Aug 2014 07:27:51 -0700 (PDT) X-ASG-Debug-ID: 1408112866-04cb6c54fd2ac80001-NocioJ Received: from burgcom.burg-halle.de (burgcom.burg-halle.de [212.122.56.1]) by cuda.sgi.com with ESMTP id Htj87kRu18zoyUeW (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 15 Aug 2014 07:27:47 -0700 (PDT) X-Barracuda-Envelope-From: topjob@compamedia.de X-Barracuda-Apparent-Source-IP: 212.122.56.1 Received: from localhost (localhost [127.0.0.1]) by burgcom.burg-halle.de (Postfix) with ESMTP id 29989300E53B4 for ; Fri, 15 Aug 2014 16:18:07 +0200 (CEST) Received: from (localhost [127.0.0.1]) by localhost (AvMailGate-3.2.1.26) id 6992-BO8tZN; Fri, 15 Aug 2014 14:15:45 -0000 Received: from WIN-HJGJ9BL9LP4 (unknown [208.89.215.50]) (Authenticated sender: hug) by burgcom.burg-halle.de (Postfix) with ESMTPA id 5360D3027DAC0 for ; Fri, 15 Aug 2014 15:48:26 +0200 (CEST) From: "Asare Akuffo " Subject: Fri, Aug 15, 2014 To: xfs@oss.sgi.com X-ASG-Orig-Subj: Fri, Aug 15, 2014 Content-Type: multipart/alternative; boundary="9Qdh43BxvjASo4uXwhVo5WV=_zm03wPtms0" MIME-Version: 1.0 Reply-To: asakuf@gmail.com Disposition-Notification-To: "Asare Akuffo " Date: Fri, 15 Aug 2014 06:48:21 -0700 X-AntiVirus: checked by Avira MailGate (version: 3.2.1.26; AVE: 8.3.24.12; VDF: 7.11.167.126; host: burgcom.burg-halle.de); id=6992-BO8tZN Message-Id: <20140815141807.29989300E53B4@burgcom.burg-halle.de> X-Barracuda-Connect: burgcom.burg-halle.de[212.122.56.1] X-Barracuda-Start-Time: 1408112867 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: 1.79 X-Barracuda-Spam-Status: No, SCORE=1.79 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=ADVANCE_FEE_1, HTML_MESSAGE, MILLION_USD, MILLION_USD_2 X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.8472 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.01 MILLION_USD BODY: Talks about millions of dollars 0.00 HTML_MESSAGE BODY: HTML included in message 0.00 ADVANCE_FEE_1 Appears to be advance fee fraud (Nigerian 419) 1.78 MILLION_USD_2 Talks about millions of dollars This is a multi-part message in MIME format --9Qdh43BxvjASo4uXwhVo5WV=_zm03wPtms0 Content-Type: text/plain Content-Transfer-Encoding: quoted-printable - This mail is in HTML. Some elements may be ommited in plain text. - Greetings, I am a Financial Consultant with the HFC Bank Limited in Ghana I am in control of privately owned funds placed for long term investme= nts. Our interest is to fund projects in form of Loan. Viable projects rang= ing from 1-500 Million USD would be funded at a guaranteed 3% Fixed In= terest Rate per annum. If you have credible projects for investments or business clients in n= eed of funds to expand existing projects, we would be obliged to work with you. Regards, Asare Akuffo --9Qdh43BxvjASo4uXwhVo5WV=_zm03wPtms0 Content-Type: text/html Content-Transfer-Encoding: quoted-printable

Greetings,

I am a Financial Consultant with the HFC Bank Limited in Ghana<= /EM>

I am in control of privately owned funds placed for long term i= nvestments.

Our interest is to fund projects in form of Loan. Viable projec= ts ranging from 1-500 Million USD would be funded at a guaranteed 3% F= ixed Interest Rate per annum.

If you have credible projects for investments or business clien= ts in need of funds to expand existing projects, we would be obliged t= o work
with you.

Regards,

Asare Akuffo

--9Qdh43BxvjASo4uXwhVo5WV=_zm03wPtms0-- From lczerner@redhat.com Fri Aug 15 09:30: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 84F047F3F for ; Fri, 15 Aug 2014 09:30:33 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 73C1A8F8089 for ; Fri, 15 Aug 2014 07:30:30 -0700 (PDT) X-ASG-Debug-ID: 1408113028-04cbb054872e5f0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id B7RbTeRvclfuH9bU (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 15 Aug 2014 07:30:29 -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-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 s7FEUQcM006087 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Fri, 15 Aug 2014 10:30:26 -0400 Received: from dhcp-1-195.brq.redhat.com (dhcp-1-195.brq.redhat.com [10.34.1.195]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s7FEUM2U030461 (version=TLSv1/SSLv3 cipher=AES256-SHA bits=256 verify=NO); Fri, 15 Aug 2014 10:30:24 -0400 Date: Fri, 15 Aug 2014 16:30:21 +0200 (CEST) From: =?ISO-8859-15?Q?Luk=E1=A8_Czerner?= X-X-Sender: lczerner@localhost.localdomain To: linux-fsdevel@vger.kernel.org, linux-ext4@vger.kernel.org, xfs@oss.sgi.com, linux-btrfs@vger.kernel.org, util-linux@vger.kernel.org cc: Ric Wheeler , Hannes Reinecke Subject: 2014 Linux Plumbers Call for File and Storage Systems Microconference Proposals Message-ID: X-ASG-Orig-Subj: 2014 Linux Plumbers Call for File and Storage Systems Microconference Proposals 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.22 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1408113029 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 Submission for Microconferences discussion topics and BOFs are now open [1] and as a File and Storage Systems [2] microconference leads we'd like to invite you to submit your proposals. You can find the instructions on how to propose a discussion topic here: http://www.linuxplumbersconf.org/2014/how-to-submit-microconference-discussions-topics/ The Linux Plumbers Conference has officially sold out all of the places, so we encourage submissions for our file and storage microconference from people who have already registered. We will work to get exceptionally compelling session leaders registered, but our ability is limited, so please submit your topics early. Deadline for submissions is Friday, August 30th at midnight and we will announce the topics on Monday, September 1st. If you have any questions, please let us know. Thanks! -Lukas -- [1] http://www.linuxplumbersconf.org/2014/submissions-for-microconferences-discussion-topics-and-bofs-are-now-open/ [2] http://www.linuxplumbersconf.org/2014/ocw/events/LPC2014/tracks/303 [3] http://www.linuxplumbersconf.org/2014/how-to-submit-microconference-discussions-topics/ [4] http://wiki.linuxplumbersconf.org/2014:file_and_storage_systems From bfoster@redhat.com Fri Aug 15 09:35: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 (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 091827F3F for ; Fri, 15 Aug 2014 09:35:47 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id D06FB304043 for ; Fri, 15 Aug 2014 07:35:46 -0700 (PDT) X-ASG-Debug-ID: 1408113345-04cb6c54fd2b350001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id Y04sZoE659CcZnAj (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 15 Aug 2014 07:35:46 -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 s7FEZh9D007145 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Fri, 15 Aug 2014 10:35:43 -0400 Received: from laptop.bfoster (vpn-59-245.rdu2.redhat.com [10.10.59.245]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s7FEZfRg009023 (version=TLSv1/SSLv3 cipher=AES128-GCM-SHA256 bits=128 verify=NO); Fri, 15 Aug 2014 10:35:43 -0400 Date: Fri, 15 Aug 2014 10:35:41 -0400 From: Brian Foster To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 5/9] xfs: xfs_bioerror can die. Message-ID: <20140815143540.GD4096@laptop.bfoster> X-ASG-Orig-Subj: Re: [PATCH 5/9] xfs: xfs_bioerror can die. References: <1408084747-4540-1-git-send-email-david@fromorbit.com> <1408084747-4540-6-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1408084747-4540-6-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.23 (2014-03-12) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1408113345 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Fri, Aug 15, 2014 at 04:39:03PM +1000, Dave Chinner wrote: > From: Dave Chinner > > Internal buffer write error handling is a mess due to the unnatural > split between xfs_bioerror and xfs_bioerror_relse(). The buffer > reference counting is also wrong for the xfs_bioerror path for > xfs_bwrite - it uses sync IO and so xfs_buf_ioend will release a > hold count that was never taken. > > Further, xfs_bwrite only does sync IO and determines the handler to > call based on b_iodone, so for this caller the only difference > between xfs_bioerror() and xfs_bioerror_release() is the XBF_DONE > flag. We don't care what the XBF_DONE flag state is because we stale > the buffer in both paths - the next buffer lookup will clear > XBF_DONE anyway because XBF_STALE is set. Hence we can use common > error handling for xfs_bwrite(). > > __xfs_buf_delwri_submit() is a similar - it's only ever called > on writes - all sync or async - and again there's no reason to > handle them any differently at all. > > Clean up the nasty error handling and remove xfs_bioerror(). > > Signed-off-by: Dave Chinner > --- > fs/xfs/xfs_buf.c | 67 +++++++++++++++++--------------------------------------- > 1 file changed, 20 insertions(+), 47 deletions(-) > > diff --git a/fs/xfs/xfs_buf.c b/fs/xfs/xfs_buf.c > index 98fcf5a..f444285 100644 > --- a/fs/xfs/xfs_buf.c > +++ b/fs/xfs/xfs_buf.c > @@ -1072,36 +1072,6 @@ xfs_buf_ioerror_alert( > } > > /* > - * Called when we want to stop a buffer from getting written or read. > - * We attach the EIO error, muck with its flags, and call xfs_buf_ioend > - * so that the proper iodone callbacks get called. > - */ > -STATIC int > -xfs_bioerror( > - xfs_buf_t *bp) > -{ > -#ifdef XFSERRORDEBUG > - ASSERT(XFS_BUF_ISREAD(bp) || bp->b_iodone); > -#endif > - > - /* > - * No need to wait until the buffer is unpinned, we aren't flushing it. > - */ > - xfs_buf_ioerror(bp, -EIO); > - > - /* > - * We're calling xfs_buf_ioend, so delete XBF_DONE flag. > - */ > - XFS_BUF_UNREAD(bp); > - XFS_BUF_UNDONE(bp); > - xfs_buf_stale(bp); > - > - xfs_buf_ioend(bp); > - > - return -EIO; > -} > - > -/* > * Same as xfs_bioerror, except that we are releasing the buffer > * here ourselves, and avoiding the xfs_buf_ioend call. > * This is meant for userdata errors; metadata bufs come with > @@ -1149,19 +1119,19 @@ xfs_bwrite( > ASSERT(xfs_buf_islocked(bp)); > > bp->b_flags |= XBF_WRITE; > - bp->b_flags &= ~(XBF_ASYNC | XBF_READ | _XBF_DELWRI_Q | XBF_WRITE_FAIL); > + bp->b_flags &= ~(XBF_ASYNC | XBF_READ | _XBF_DELWRI_Q | > + XBF_WRITE_FAIL | XBF_DONE); > > if (XFS_FORCED_SHUTDOWN(bp->b_target->bt_mount)) { > trace_xfs_bdstrat_shut(bp, _RET_IP_); > > - /* > - * Metadata write that didn't get logged but written anyway. > - * These aren't associated with a transaction, and can be > - * ignored. > - */ > - if (!bp->b_iodone) > - return xfs_bioerror_relse(bp); > - return xfs_bioerror(bp); > + xfs_buf_ioerror(bp, -EIO); > + xfs_buf_stale(bp); > + > + /* sync IO, xfs_buf_ioend is going to remove a ref here */ > + xfs_buf_hold(bp); Looks correct, but that's kind of ugly. The reference serves no purpose except to appease the error sequence. It gives the impression that the reference management should be handled at a higher level (and with truly synchronous I/O primitives/mechanisms, it is ;). At the very least, can we reorganize the ioend side of things to handle this? We already have the duplicate execution issue previously mentioned that has to get resolved. Some duplicate code is fine if it improves clarity, imo. Brian > + xfs_buf_ioend(bp); > + return -EIO; > } > > xfs_buf_iorequest(bp); > @@ -1848,16 +1818,19 @@ __xfs_buf_delwri_submit( > if (XFS_FORCED_SHUTDOWN(bp->b_target->bt_mount)) { > trace_xfs_bdstrat_shut(bp, _RET_IP_); > > + xfs_buf_ioerror(bp, -EIO); > + xfs_buf_stale(bp); > + > /* > - * Metadata write that didn't get logged but written anyway. > - * These aren't associated with a transaction, and can be > - * ignored. > + * if sync IO, xfs_buf_ioend is going to remove a > + * ref here. We need to add that so we can collect > + * all the buffer errors in the wait loop. > */ > - if (!bp->b_iodone) > - return xfs_bioerror_relse(bp); > - return xfs_bioerror(bp); > - } > - xfs_buf_iorequest(bp); > + if (wait) > + xfs_buf_hold(bp); > + xfs_buf_ioend(bp); > + } else > + xfs_buf_iorequest(bp); > } > blk_finish_plug(&plug); > > -- > 2.0.0 > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From bfoster@redhat.com Fri Aug 15 09:36: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 82D077F3F for ; Fri, 15 Aug 2014 09:36:04 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 36CD0304059 for ; Fri, 15 Aug 2014 07:36:04 -0700 (PDT) X-ASG-Debug-ID: 1408113362-04bdf01856310a0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 3xQVt8dB1H3iOTKG (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 15 Aug 2014 07:36: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 s7FEa17S008597 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Fri, 15 Aug 2014 10:36:01 -0400 Received: from laptop.bfoster (vpn-59-245.rdu2.redhat.com [10.10.59.245]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s7FEZwNP009094 (version=TLSv1/SSLv3 cipher=AES128-GCM-SHA256 bits=128 verify=NO); Fri, 15 Aug 2014 10:36:00 -0400 Date: Fri, 15 Aug 2014 10:35:58 -0400 From: Brian Foster To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 8/9] xfs: introduce xfs_buf_submit[_wait] Message-ID: <20140815143558.GE4096@laptop.bfoster> X-ASG-Orig-Subj: Re: [PATCH 8/9] xfs: introduce xfs_buf_submit[_wait] References: <1408084747-4540-1-git-send-email-david@fromorbit.com> <1408084747-4540-9-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1408084747-4540-9-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.23 (2014-03-12) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1408113362 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Fri, Aug 15, 2014 at 04:39:06PM +1000, Dave Chinner wrote: > From: Dave Chinner > > There is a lot of cookie-cutter code that looks like: > > if (shutdown) > handle buffer error > xfs_buf_iorequest(bp) > error = xfs_buf_iowait(bp) > if (error) > handle buffer error > > spread through XFS. There's significant complexity now in > xfs_buf_iorequest() to specifically handle this sort of synchronous > IO pattern, but there's all sorts of nasty surprises in different > error handling code dependent on who owns the buffer references and > the locks. > > Pull this pattern into a single helper, where we can hide all the > synchronous IO warts and hence make the error handling for all the > callers much saner. This removes the need for a special extra > reference to protect IO completion processing, as we can now hold a > single reference across dispatch and waiting, simplifying the sync > IO smeantics and error handling. > > In doing this, also rename xfs_buf_iorequest to xfs_buf_submit and > make it explicitly handle on asynchronous IO. This forces all users > to be switched specifically to one interface or the other and > removes any ambiguity between how the interfaces are to be used. It > also means that xfs_buf_iowait() goes away. > > For the special case of delwri buffer submission and waiting, we > don't need to issue IO synchronously at all. The second pass to cal > xfs_buf_iowait() can now just block on xfs_buf_lock() - the buffer > will be unlocked when the async IO is complete. This formalises a > sane the method of waiting for async IO - take an extra reference, > submit the IO, call xfs_buf_lock() when you want to wait for IO > completion. i.e.: > > bp = xfs_buf_find(); > xfs_buf_hold(bp); > bp->b_flags |= XBF_ASYNC; > xfs_buf_iosubmit(bp); > xfs_buf_lock(bp) > error = bp->b_error; > .... > xfs_buf_relse(bp); > > Signed-off-by: Dave Chinner > --- On a quick look at submit_wait this looks pretty good. It actually implements the general model I've been looking for for sync I/O. E.g., send the I/O, wait on synchronization, then check for errors. In other words, a pure synchronous mechanism. The refactoring and new helpers and whatnot are additional bonus and abstract it nicely. I still have to take a closer look to review the actual code, but since we go and remove the additional sync I/O reference counting business, why do we even add that stuff early on? Can't we get from where the current code is to here in a more direct manner? Brian > fs/xfs/xfs_bmap_util.c | 14 +--- > fs/xfs/xfs_buf.c | 186 ++++++++++++++++++++++++++--------------------- > fs/xfs/xfs_buf.h | 4 +- > fs/xfs/xfs_buf_item.c | 4 +- > fs/xfs/xfs_log.c | 2 +- > fs/xfs/xfs_log_recover.c | 22 ++---- > fs/xfs/xfs_trans_buf.c | 17 ++--- > 7 files changed, 122 insertions(+), 127 deletions(-) > > diff --git a/fs/xfs/xfs_bmap_util.c b/fs/xfs/xfs_bmap_util.c > index 2f1e30d..c53cc03 100644 > --- a/fs/xfs/xfs_bmap_util.c > +++ b/fs/xfs/xfs_bmap_util.c > @@ -1157,12 +1157,7 @@ xfs_zero_remaining_bytes( > XFS_BUF_READ(bp); > XFS_BUF_SET_ADDR(bp, xfs_fsb_to_db(ip, imap.br_startblock)); > > - if (XFS_FORCED_SHUTDOWN(mp)) { > - error = -EIO; > - break; > - } > - xfs_buf_iorequest(bp); > - error = xfs_buf_iowait(bp); > + error = xfs_buf_submit_wait(bp); > if (error) { > xfs_buf_ioerror_alert(bp, > "xfs_zero_remaining_bytes(read)"); > @@ -1175,12 +1170,7 @@ xfs_zero_remaining_bytes( > XFS_BUF_UNREAD(bp); > XFS_BUF_WRITE(bp); > > - if (XFS_FORCED_SHUTDOWN(mp)) { > - error = -EIO; > - break; > - } > - xfs_buf_iorequest(bp); > - error = xfs_buf_iowait(bp); > + error = xfs_buf_submit_wait(bp); > if (error) { > xfs_buf_ioerror_alert(bp, > "xfs_zero_remaining_bytes(write)"); > diff --git a/fs/xfs/xfs_buf.c b/fs/xfs/xfs_buf.c > index 352e9219..a2599f9 100644 > --- a/fs/xfs/xfs_buf.c > +++ b/fs/xfs/xfs_buf.c > @@ -623,10 +623,11 @@ _xfs_buf_read( > bp->b_flags &= ~(XBF_WRITE | XBF_ASYNC | XBF_READ_AHEAD); > bp->b_flags |= flags & (XBF_READ | XBF_ASYNC | XBF_READ_AHEAD); > > - xfs_buf_iorequest(bp); > - if (flags & XBF_ASYNC) > + if (flags & XBF_ASYNC) { > + xfs_buf_submit(bp); > return 0; > - return xfs_buf_iowait(bp); > + } > + return xfs_buf_submit_wait(bp); > } > > xfs_buf_t * > @@ -708,12 +709,7 @@ xfs_buf_read_uncached( > bp->b_flags |= XBF_READ; > bp->b_ops = ops; > > - if (XFS_FORCED_SHUTDOWN(target->bt_mount)) { > - xfs_buf_relse(bp); > - return NULL; > - } > - xfs_buf_iorequest(bp); > - xfs_buf_iowait(bp); > + xfs_buf_submit_wait(bp); > return bp; > } > > @@ -1027,10 +1023,8 @@ xfs_buf_ioend( > (*(bp->b_iodone))(bp); > else if (bp->b_flags & XBF_ASYNC) > xfs_buf_relse(bp); > - else { > + else > complete(&bp->b_iowait); > - xfs_buf_rele(bp); > - } > } > > static void > @@ -1083,21 +1077,7 @@ xfs_bwrite( > bp->b_flags &= ~(XBF_ASYNC | XBF_READ | _XBF_DELWRI_Q | > XBF_WRITE_FAIL | XBF_DONE); > > - if (XFS_FORCED_SHUTDOWN(bp->b_target->bt_mount)) { > - trace_xfs_bdstrat_shut(bp, _RET_IP_); > - > - xfs_buf_ioerror(bp, -EIO); > - xfs_buf_stale(bp); > - > - /* sync IO, xfs_buf_ioend is going to remove a ref here */ > - xfs_buf_hold(bp); > - xfs_buf_ioend(bp); > - return -EIO; > - } > - > - xfs_buf_iorequest(bp); > - > - error = xfs_buf_iowait(bp); > + error = xfs_buf_submit_wait(bp); > if (error) { > xfs_force_shutdown(bp->b_target->bt_mount, > SHUTDOWN_META_IO_ERROR); > @@ -1206,7 +1186,7 @@ next_chunk: > } else { > /* > * This is guaranteed not to be the last io reference count > - * because the caller (xfs_buf_iorequest) holds a count itself. > + * because the caller (xfs_buf_submit) holds a count itself. > */ > atomic_dec(&bp->b_io_remaining); > xfs_buf_ioerror(bp, -EIO); > @@ -1296,13 +1276,29 @@ _xfs_buf_ioapply( > blk_finish_plug(&plug); > } > > +/* > + * Asynchronous IO submission path. This transfers the buffer lock ownership and > + * the current reference to the IO. It is not safe to reference the buffer after > + * a call to this function unless the caller holds an additional reference > + * itself. > + */ > void > -xfs_buf_iorequest( > - xfs_buf_t *bp) > +xfs_buf_submit( > + struct xfs_buf *bp) > { > trace_xfs_buf_iorequest(bp, _RET_IP_); > > ASSERT(!(bp->b_flags & _XBF_DELWRI_Q)); > + ASSERT(bp->b_flags & XBF_ASYNC); > + > + /* on shutdown we stale and complete the buffer immediately */ > + if (XFS_FORCED_SHUTDOWN(bp->b_target->bt_mount)) { > + xfs_buf_ioerror(bp, -EIO); > + bp->b_flags &= ~XBF_DONE; > + xfs_buf_stale(bp); > + xfs_buf_ioend(bp); > + return; > + } > > if (bp->b_flags & XBF_WRITE) > xfs_buf_wait_unpin(bp); > @@ -1311,25 +1307,10 @@ xfs_buf_iorequest( > bp->b_io_error = 0; > > /* > - * Take references to the buffer. For XBF_ASYNC buffers, holding a > - * reference for as long as submission takes is all that is necessary > - * here. The IO inherits the lock and hold count from the submitter, > - * and these are release during IO completion processing. Taking a hold > - * over submission ensures that the buffer is not freed until we have > - * completed all processing, regardless of when IO errors occur or are > - * reported. > - * > - * However, for synchronous IO, the IO does not inherit the submitters > - * reference count, nor the buffer lock. Hence we need to take an extra > - * reference to the buffer for the for the IO context so that we can > - * guarantee the buffer is not freed until all IO completion processing > - * is done. Otherwise the caller can drop their reference while the IO > - * is still in progress and hence trigger a use-after-free situation. > + * Take an extra reference so that we don't have to guess when it's no > + * longer safe to reference the buffer that was passed to us. > */ > xfs_buf_hold(bp); > - if (!(bp->b_flags & XBF_ASYNC)) > - xfs_buf_hold(bp); > - > > /* > * Set the count to 1 initially, this will stop an I/O completion > @@ -1340,14 +1321,13 @@ xfs_buf_iorequest( > _xfs_buf_ioapply(bp); > > /* > - * If _xfs_buf_ioapply failed or we are doing synchronous IO that > - * completes extremely quickly, we can get back here with only the IO > + * If _xfs_buf_ioapply failed, > + * we can get back here with only the IO > * reference we took above. _xfs_buf_ioend will drop it to zero, so > * we'd better run completion processing synchronously so that the we > - * don't return to the caller with completion still pending. In the > - * error case, this allows the caller to check b_error safely without > - * waiting, and in the synchronous IO case it avoids unnecessary context > - * switches an latency for high-peformance devices. > + * don't return to the caller with completion still pending. > + * this allows the caller to check b_error safely without > + * waiting > */ > if (atomic_dec_and_test(&bp->b_io_remaining) == 1) { > if (bp->b_error || !(bp->b_flags & XBF_ASYNC)) > @@ -1357,25 +1337,70 @@ xfs_buf_iorequest( > } > > xfs_buf_rele(bp); > + /* Note: it is not safe to reference bp now we've dropped our ref */ > } > > /* > - * Waits for I/O to complete on the buffer supplied. It returns immediately if > - * no I/O is pending or there is already a pending error on the buffer, in which > - * case nothing will ever complete. It returns the I/O error code, if any, or > - * 0 if there was no error. > + * Synchronous buffer IO submission path, read or write. > */ > int > -xfs_buf_iowait( > - xfs_buf_t *bp) > +xfs_buf_submit_wait( > + struct xfs_buf *bp) > { > - trace_xfs_buf_iowait(bp, _RET_IP_); > + int error; > + > + trace_xfs_buf_iorequest(bp, _RET_IP_); > > - if (!bp->b_error) > - wait_for_completion(&bp->b_iowait); > + ASSERT(!(bp->b_flags & (_XBF_DELWRI_Q | XBF_ASYNC))); > + > + if (XFS_FORCED_SHUTDOWN(bp->b_target->bt_mount)) { > + xfs_buf_ioerror(bp, -EIO); > + xfs_buf_stale(bp); > + bp->b_flags &= ~XBF_DONE; > + return -EIO; > + } > > + if (bp->b_flags & XBF_WRITE) > + xfs_buf_wait_unpin(bp); > + > + /* clear the internal error state to avoid spurious errors */ > + bp->b_io_error = 0; > + > + /* > + * For synchronous IO, the IO does not inherit the submitters reference > + * count, nor the buffer lock. Hence we cannot release the reference we > + * are about to take until we've waited for all IO completion to occur, > + * including any xfs_buf_ioend_async() work that may be pending. > + */ > + xfs_buf_hold(bp); > + > + /* > + * Set the count to 1 initially, this will stop an I/O completion > + * callout which happens before we have started all the I/O from calling > + * xfs_buf_ioend too early. > + */ > + atomic_set(&bp->b_io_remaining, 1); > + _xfs_buf_ioapply(bp); > + > + /* > + * make sure we run completion synchronously if it raced with us and is > + * already complete. > + */ > + if (atomic_dec_and_test(&bp->b_io_remaining) == 1) > + xfs_buf_ioend(bp); > + > + /* wait for completion before gathering the error from the buffer */ > + trace_xfs_buf_iowait(bp, _RET_IP_); > + wait_for_completion(&bp->b_iowait); > trace_xfs_buf_iowait_done(bp, _RET_IP_); > - return bp->b_error; > + error = bp->b_error; > + > + /* > + * all done now, we can release the hold that keeps the buffer > + * referenced for the entire IO. > + */ > + xfs_buf_rele(bp); > + return error; > } > > xfs_caddr_t > @@ -1769,29 +1794,19 @@ __xfs_buf_delwri_submit( > blk_start_plug(&plug); > list_for_each_entry_safe(bp, n, io_list, b_list) { > bp->b_flags &= ~(_XBF_DELWRI_Q | XBF_ASYNC | XBF_WRITE_FAIL); > - bp->b_flags |= XBF_WRITE; > + bp->b_flags |= XBF_WRITE | XBF_ASYNC; > > - if (!wait) { > - bp->b_flags |= XBF_ASYNC; > + /* > + * we do all Io submission async. This means if we need to wait > + * for IO completion we need to take an extra reference so the > + * buffer is still valid on the other side. > + */ > + if (!wait) > list_del_init(&bp->b_list); > - } > - > - if (XFS_FORCED_SHUTDOWN(bp->b_target->bt_mount)) { > - trace_xfs_bdstrat_shut(bp, _RET_IP_); > - > - xfs_buf_ioerror(bp, -EIO); > - xfs_buf_stale(bp); > + else > + xfs_buf_hold(bp); > > - /* > - * if sync IO, xfs_buf_ioend is going to remove a > - * ref here. We need to add that so we can collect > - * all the buffer errors in the wait loop. > - */ > - if (wait) > - xfs_buf_hold(bp); > - xfs_buf_ioend(bp); > - } else > - xfs_buf_iorequest(bp); > + xfs_buf_submit(bp); > } > blk_finish_plug(&plug); > > @@ -1838,7 +1853,10 @@ xfs_buf_delwri_submit( > bp = list_first_entry(&io_list, struct xfs_buf, b_list); > > list_del_init(&bp->b_list); > - error2 = xfs_buf_iowait(bp); > + > + /* locking the buffer will wait for async IO completion. */ > + xfs_buf_lock(bp); > + error2 = bp->b_error; > xfs_buf_relse(bp); > if (!error) > error = error2; > diff --git a/fs/xfs/xfs_buf.h b/fs/xfs/xfs_buf.h > index d8f57f6..0acfc30 100644 > --- a/fs/xfs/xfs_buf.h > +++ b/fs/xfs/xfs_buf.h > @@ -290,8 +290,8 @@ extern int xfs_bwrite(struct xfs_buf *bp); > extern void xfs_buf_ioend(struct xfs_buf *bp); > extern void xfs_buf_ioerror(xfs_buf_t *, int); > extern void xfs_buf_ioerror_alert(struct xfs_buf *, const char *func); > -extern void xfs_buf_iorequest(xfs_buf_t *); > -extern int xfs_buf_iowait(xfs_buf_t *); > +extern void xfs_buf_submit(struct xfs_buf *bp); > +extern int xfs_buf_submit_wait(struct xfs_buf *bp); > extern void xfs_buf_iomove(xfs_buf_t *, size_t, size_t, void *, > xfs_buf_rw_t); > #define xfs_buf_zero(bp, off, len) \ > diff --git a/fs/xfs/xfs_buf_item.c b/fs/xfs/xfs_buf_item.c > index 4fd41b5..cbea909 100644 > --- a/fs/xfs/xfs_buf_item.c > +++ b/fs/xfs/xfs_buf_item.c > @@ -1081,7 +1081,7 @@ xfs_buf_iodone_callbacks( > * a way to shut the filesystem down if the writes keep failing. > * > * In practice we'll shut the filesystem down soon as non-transient > - * erorrs tend to affect the whole device and a failing log write > + * errors tend to affect the whole device and a failing log write > * will make us give up. But we really ought to do better here. > */ > if (XFS_BUF_ISASYNC(bp)) { > @@ -1094,7 +1094,7 @@ xfs_buf_iodone_callbacks( > if (!(bp->b_flags & (XBF_STALE|XBF_WRITE_FAIL))) { > bp->b_flags |= XBF_WRITE | XBF_ASYNC | > XBF_DONE | XBF_WRITE_FAIL; > - xfs_buf_iorequest(bp); > + xfs_buf_submit(bp); > } else { > xfs_buf_relse(bp); > } > diff --git a/fs/xfs/xfs_log.c b/fs/xfs/xfs_log.c > index e4665db..c4d7f79 100644 > --- a/fs/xfs/xfs_log.c > +++ b/fs/xfs/xfs_log.c > @@ -1699,7 +1699,7 @@ xlog_bdstrat( > return 0; > } > > - xfs_buf_iorequest(bp); > + xfs_buf_submit(bp); > return 0; > } > > diff --git a/fs/xfs/xfs_log_recover.c b/fs/xfs/xfs_log_recover.c > index 4ba19bf..1e14452 100644 > --- a/fs/xfs/xfs_log_recover.c > +++ b/fs/xfs/xfs_log_recover.c > @@ -193,12 +193,8 @@ xlog_bread_noalign( > bp->b_io_length = nbblks; > bp->b_error = 0; > > - if (XFS_FORCED_SHUTDOWN(log->l_mp)) > - return -EIO; > - > - xfs_buf_iorequest(bp); > - error = xfs_buf_iowait(bp); > - if (error) > + error = xfs_buf_submit_wait(bp); > + if (error && !XFS_FORCED_SHUTDOWN(log->l_mp)) > xfs_buf_ioerror_alert(bp, __func__); > return error; > } > @@ -4427,16 +4423,12 @@ xlog_do_recover( > XFS_BUF_UNASYNC(bp); > bp->b_ops = &xfs_sb_buf_ops; > > - if (XFS_FORCED_SHUTDOWN(log->l_mp)) { > - xfs_buf_relse(bp); > - return -EIO; > - } > - > - xfs_buf_iorequest(bp); > - error = xfs_buf_iowait(bp); > + error = xfs_buf_submit_wait(bp); > if (error) { > - xfs_buf_ioerror_alert(bp, __func__); > - ASSERT(0); > + if (XFS_FORCED_SHUTDOWN(log->l_mp)) { > + xfs_buf_ioerror_alert(bp, __func__); > + ASSERT(0); > + } > xfs_buf_relse(bp); > return error; > } > diff --git a/fs/xfs/xfs_trans_buf.c b/fs/xfs/xfs_trans_buf.c > index 9c3e610..4bdf02c 100644 > --- a/fs/xfs/xfs_trans_buf.c > +++ b/fs/xfs/xfs_trans_buf.c > @@ -286,18 +286,13 @@ xfs_trans_read_buf_map( > bp->b_flags |= XBF_READ; > bp->b_ops = ops; > > - if (XFS_FORCED_SHUTDOWN(mp)) { > - trace_xfs_bdstrat_shut(bp, _RET_IP_); > - error = -EIO; > - goto out_stale; > - } > - > - xfs_buf_iorequest(bp); > - error = xfs_buf_iowait(bp); > + error = xfs_buf_submit_wait(bp); > if (error) { > - xfs_buf_ioerror_alert(bp, __func__); > - goto out_do_shutdown; > - > + if (!XFS_FORCED_SHUTDOWN(mp)) { > + xfs_buf_ioerror_alert(bp, __func__); > + goto out_do_shutdown; > + } > + goto out_stale; > } > } > > -- > 2.0.0 > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From bfoster@redhat.com Fri Aug 15 11:13: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 3D8007F3F for ; Fri, 15 Aug 2014 11:13:32 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 19CF230404E for ; Fri, 15 Aug 2014 09:13:29 -0700 (PDT) X-ASG-Debug-ID: 1408119206-04cb6c550030040001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id t0sHg7Vz2nQwiy0f (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 15 Aug 2014 09:13: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-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 s7FGDMQf027217 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Fri, 15 Aug 2014 12:13:24 -0400 Received: from laptop.bfoster (vpn-59-245.rdu2.redhat.com [10.10.59.245]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s7FGDKjg025301 (version=TLSv1/SSLv3 cipher=AES128-GCM-SHA256 bits=128 verify=NO); Fri, 15 Aug 2014 12:13:22 -0400 Date: Fri, 15 Aug 2014 12:13:20 -0400 From: Brian Foster To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 8/9] xfs: introduce xfs_buf_submit[_wait] Message-ID: <20140815161319.GF4096@laptop.bfoster> X-ASG-Orig-Subj: Re: [PATCH 8/9] xfs: introduce xfs_buf_submit[_wait] References: <1408084747-4540-1-git-send-email-david@fromorbit.com> <1408084747-4540-9-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1408084747-4540-9-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.23 (2014-03-12) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.27 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1408119207 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Fri, Aug 15, 2014 at 04:39:06PM +1000, Dave Chinner wrote: > From: Dave Chinner > > There is a lot of cookie-cutter code that looks like: > > if (shutdown) > handle buffer error > xfs_buf_iorequest(bp) > error = xfs_buf_iowait(bp) > if (error) > handle buffer error > > spread through XFS. There's significant complexity now in > xfs_buf_iorequest() to specifically handle this sort of synchronous > IO pattern, but there's all sorts of nasty surprises in different > error handling code dependent on who owns the buffer references and > the locks. > > Pull this pattern into a single helper, where we can hide all the > synchronous IO warts and hence make the error handling for all the > callers much saner. This removes the need for a special extra > reference to protect IO completion processing, as we can now hold a > single reference across dispatch and waiting, simplifying the sync > IO smeantics and error handling. > > In doing this, also rename xfs_buf_iorequest to xfs_buf_submit and > make it explicitly handle on asynchronous IO. This forces all users > to be switched specifically to one interface or the other and > removes any ambiguity between how the interfaces are to be used. It > also means that xfs_buf_iowait() goes away. > > For the special case of delwri buffer submission and waiting, we > don't need to issue IO synchronously at all. The second pass to cal > xfs_buf_iowait() can now just block on xfs_buf_lock() - the buffer > will be unlocked when the async IO is complete. This formalises a > sane the method of waiting for async IO - take an extra reference, > submit the IO, call xfs_buf_lock() when you want to wait for IO > completion. i.e.: > > bp = xfs_buf_find(); > xfs_buf_hold(bp); > bp->b_flags |= XBF_ASYNC; > xfs_buf_iosubmit(bp); > xfs_buf_lock(bp) > error = bp->b_error; > .... > xfs_buf_relse(bp); > > Signed-off-by: Dave Chinner > --- > fs/xfs/xfs_bmap_util.c | 14 +--- > fs/xfs/xfs_buf.c | 186 ++++++++++++++++++++++++++--------------------- > fs/xfs/xfs_buf.h | 4 +- > fs/xfs/xfs_buf_item.c | 4 +- > fs/xfs/xfs_log.c | 2 +- > fs/xfs/xfs_log_recover.c | 22 ++---- > fs/xfs/xfs_trans_buf.c | 17 ++--- > 7 files changed, 122 insertions(+), 127 deletions(-) > > diff --git a/fs/xfs/xfs_bmap_util.c b/fs/xfs/xfs_bmap_util.c > index 2f1e30d..c53cc03 100644 > --- a/fs/xfs/xfs_bmap_util.c > +++ b/fs/xfs/xfs_bmap_util.c > @@ -1157,12 +1157,7 @@ xfs_zero_remaining_bytes( > XFS_BUF_READ(bp); > XFS_BUF_SET_ADDR(bp, xfs_fsb_to_db(ip, imap.br_startblock)); > > - if (XFS_FORCED_SHUTDOWN(mp)) { > - error = -EIO; > - break; > - } > - xfs_buf_iorequest(bp); > - error = xfs_buf_iowait(bp); > + error = xfs_buf_submit_wait(bp); > if (error) { > xfs_buf_ioerror_alert(bp, > "xfs_zero_remaining_bytes(read)"); > @@ -1175,12 +1170,7 @@ xfs_zero_remaining_bytes( > XFS_BUF_UNREAD(bp); > XFS_BUF_WRITE(bp); > > - if (XFS_FORCED_SHUTDOWN(mp)) { > - error = -EIO; > - break; > - } > - xfs_buf_iorequest(bp); > - error = xfs_buf_iowait(bp); > + error = xfs_buf_submit_wait(bp); > if (error) { > xfs_buf_ioerror_alert(bp, > "xfs_zero_remaining_bytes(write)"); > diff --git a/fs/xfs/xfs_buf.c b/fs/xfs/xfs_buf.c > index 352e9219..a2599f9 100644 > --- a/fs/xfs/xfs_buf.c > +++ b/fs/xfs/xfs_buf.c > @@ -623,10 +623,11 @@ _xfs_buf_read( > bp->b_flags &= ~(XBF_WRITE | XBF_ASYNC | XBF_READ_AHEAD); > bp->b_flags |= flags & (XBF_READ | XBF_ASYNC | XBF_READ_AHEAD); > > - xfs_buf_iorequest(bp); > - if (flags & XBF_ASYNC) > + if (flags & XBF_ASYNC) { > + xfs_buf_submit(bp); > return 0; > - return xfs_buf_iowait(bp); > + } > + return xfs_buf_submit_wait(bp); > } > > xfs_buf_t * > @@ -708,12 +709,7 @@ xfs_buf_read_uncached( > bp->b_flags |= XBF_READ; > bp->b_ops = ops; > > - if (XFS_FORCED_SHUTDOWN(target->bt_mount)) { > - xfs_buf_relse(bp); > - return NULL; > - } > - xfs_buf_iorequest(bp); > - xfs_buf_iowait(bp); > + xfs_buf_submit_wait(bp); > return bp; > } > > @@ -1027,10 +1023,8 @@ xfs_buf_ioend( > (*(bp->b_iodone))(bp); > else if (bp->b_flags & XBF_ASYNC) > xfs_buf_relse(bp); > - else { > + else > complete(&bp->b_iowait); > - xfs_buf_rele(bp); > - } > } > > static void > @@ -1083,21 +1077,7 @@ xfs_bwrite( > bp->b_flags &= ~(XBF_ASYNC | XBF_READ | _XBF_DELWRI_Q | > XBF_WRITE_FAIL | XBF_DONE); > > - if (XFS_FORCED_SHUTDOWN(bp->b_target->bt_mount)) { > - trace_xfs_bdstrat_shut(bp, _RET_IP_); > - > - xfs_buf_ioerror(bp, -EIO); > - xfs_buf_stale(bp); > - > - /* sync IO, xfs_buf_ioend is going to remove a ref here */ > - xfs_buf_hold(bp); > - xfs_buf_ioend(bp); > - return -EIO; > - } > - > - xfs_buf_iorequest(bp); > - > - error = xfs_buf_iowait(bp); > + error = xfs_buf_submit_wait(bp); > if (error) { > xfs_force_shutdown(bp->b_target->bt_mount, > SHUTDOWN_META_IO_ERROR); > @@ -1206,7 +1186,7 @@ next_chunk: > } else { > /* > * This is guaranteed not to be the last io reference count > - * because the caller (xfs_buf_iorequest) holds a count itself. > + * because the caller (xfs_buf_submit) holds a count itself. > */ > atomic_dec(&bp->b_io_remaining); > xfs_buf_ioerror(bp, -EIO); > @@ -1296,13 +1276,29 @@ _xfs_buf_ioapply( > blk_finish_plug(&plug); > } > > +/* > + * Asynchronous IO submission path. This transfers the buffer lock ownership and > + * the current reference to the IO. It is not safe to reference the buffer after > + * a call to this function unless the caller holds an additional reference > + * itself. > + */ > void > -xfs_buf_iorequest( > - xfs_buf_t *bp) > +xfs_buf_submit( > + struct xfs_buf *bp) > { > trace_xfs_buf_iorequest(bp, _RET_IP_); > > ASSERT(!(bp->b_flags & _XBF_DELWRI_Q)); > + ASSERT(bp->b_flags & XBF_ASYNC); > + > + /* on shutdown we stale and complete the buffer immediately */ > + if (XFS_FORCED_SHUTDOWN(bp->b_target->bt_mount)) { > + xfs_buf_ioerror(bp, -EIO); > + bp->b_flags &= ~XBF_DONE; > + xfs_buf_stale(bp); > + xfs_buf_ioend(bp); > + return; > + } > > if (bp->b_flags & XBF_WRITE) > xfs_buf_wait_unpin(bp); > @@ -1311,25 +1307,10 @@ xfs_buf_iorequest( > bp->b_io_error = 0; > I know this is from the previous patch, but I wonder if it's cleaner to reset b_io_error when the error is transferred to b_error. That seems slightly more future proof at least. > /* > - * Take references to the buffer. For XBF_ASYNC buffers, holding a > - * reference for as long as submission takes is all that is necessary > - * here. The IO inherits the lock and hold count from the submitter, > - * and these are release during IO completion processing. Taking a hold > - * over submission ensures that the buffer is not freed until we have > - * completed all processing, regardless of when IO errors occur or are > - * reported. > - * > - * However, for synchronous IO, the IO does not inherit the submitters > - * reference count, nor the buffer lock. Hence we need to take an extra > - * reference to the buffer for the for the IO context so that we can > - * guarantee the buffer is not freed until all IO completion processing > - * is done. Otherwise the caller can drop their reference while the IO > - * is still in progress and hence trigger a use-after-free situation. > + * Take an extra reference so that we don't have to guess when it's no > + * longer safe to reference the buffer that was passed to us. > */ Assuming my understanding is correct: /* * The caller's reference is released by buffer I/O completion. Technically * this should not occur until we release the last b_io_remaining reference. * Take a direct reference across the I/O submission anyways to be sure it's * safe to access the buffer until we release it. */ > xfs_buf_hold(bp); > - if (!(bp->b_flags & XBF_ASYNC)) > - xfs_buf_hold(bp); > - > > /* > * Set the count to 1 initially, this will stop an I/O completion > @@ -1340,14 +1321,13 @@ xfs_buf_iorequest( > _xfs_buf_ioapply(bp); > > /* > - * If _xfs_buf_ioapply failed or we are doing synchronous IO that > - * completes extremely quickly, we can get back here with only the IO > + * If _xfs_buf_ioapply failed, > + * we can get back here with only the IO > * reference we took above. _xfs_buf_ioend will drop it to zero, so > * we'd better run completion processing synchronously so that the we > - * don't return to the caller with completion still pending. In the > - * error case, this allows the caller to check b_error safely without > - * waiting, and in the synchronous IO case it avoids unnecessary context > - * switches an latency for high-peformance devices. > + * don't return to the caller with completion still pending. > + * this allows the caller to check b_error safely without > + * waiting > */ > if (atomic_dec_and_test(&bp->b_io_remaining) == 1) { > if (bp->b_error || !(bp->b_flags & XBF_ASYNC)) > @@ -1357,25 +1337,70 @@ xfs_buf_iorequest( > } > > xfs_buf_rele(bp); > + /* Note: it is not safe to reference bp now we've dropped our ref */ > } > > /* > - * Waits for I/O to complete on the buffer supplied. It returns immediately if > - * no I/O is pending or there is already a pending error on the buffer, in which > - * case nothing will ever complete. It returns the I/O error code, if any, or > - * 0 if there was no error. > + * Synchronous buffer IO submission path, read or write. > */ > int > -xfs_buf_iowait( > - xfs_buf_t *bp) > +xfs_buf_submit_wait( > + struct xfs_buf *bp) > { > - trace_xfs_buf_iowait(bp, _RET_IP_); > + int error; > + > + trace_xfs_buf_iorequest(bp, _RET_IP_); > > - if (!bp->b_error) > - wait_for_completion(&bp->b_iowait); > + ASSERT(!(bp->b_flags & (_XBF_DELWRI_Q | XBF_ASYNC))); > + > + if (XFS_FORCED_SHUTDOWN(bp->b_target->bt_mount)) { > + xfs_buf_ioerror(bp, -EIO); > + xfs_buf_stale(bp); > + bp->b_flags &= ~XBF_DONE; > + return -EIO; > + } > > + if (bp->b_flags & XBF_WRITE) > + xfs_buf_wait_unpin(bp); > + > + /* clear the internal error state to avoid spurious errors */ > + bp->b_io_error = 0; > + > + /* > + * For synchronous IO, the IO does not inherit the submitters reference > + * count, nor the buffer lock. Hence we cannot release the reference we > + * are about to take until we've waited for all IO completion to occur, > + * including any xfs_buf_ioend_async() work that may be pending. > + */ > + xfs_buf_hold(bp); > + Harmless, but why is this necessary? The caller should have the reference, the I/O completion won't release it and we wait on b_iowait before we return. Isn't the caller's reference sufficient? > + /* > + * Set the count to 1 initially, this will stop an I/O completion > + * callout which happens before we have started all the I/O from calling > + * xfs_buf_ioend too early. > + */ > + atomic_set(&bp->b_io_remaining, 1); > + _xfs_buf_ioapply(bp); > + > + /* > + * make sure we run completion synchronously if it raced with us and is > + * already complete. > + */ > + if (atomic_dec_and_test(&bp->b_io_remaining) == 1) > + xfs_buf_ioend(bp); > + > + /* wait for completion before gathering the error from the buffer */ > + trace_xfs_buf_iowait(bp, _RET_IP_); > + wait_for_completion(&bp->b_iowait); > trace_xfs_buf_iowait_done(bp, _RET_IP_); > - return bp->b_error; > + error = bp->b_error; > + > + /* > + * all done now, we can release the hold that keeps the buffer > + * referenced for the entire IO. > + */ > + xfs_buf_rele(bp); > + return error; > } > > xfs_caddr_t > @@ -1769,29 +1794,19 @@ __xfs_buf_delwri_submit( > blk_start_plug(&plug); > list_for_each_entry_safe(bp, n, io_list, b_list) { > bp->b_flags &= ~(_XBF_DELWRI_Q | XBF_ASYNC | XBF_WRITE_FAIL); > - bp->b_flags |= XBF_WRITE; > + bp->b_flags |= XBF_WRITE | XBF_ASYNC; > > - if (!wait) { > - bp->b_flags |= XBF_ASYNC; > + /* > + * we do all Io submission async. This means if we need to wait > + * for IO completion we need to take an extra reference so the > + * buffer is still valid on the other side. > + */ > + if (!wait) > list_del_init(&bp->b_list); > - } > - > - if (XFS_FORCED_SHUTDOWN(bp->b_target->bt_mount)) { > - trace_xfs_bdstrat_shut(bp, _RET_IP_); > - > - xfs_buf_ioerror(bp, -EIO); > - xfs_buf_stale(bp); > + else > + xfs_buf_hold(bp); > > - /* > - * if sync IO, xfs_buf_ioend is going to remove a > - * ref here. We need to add that so we can collect > - * all the buffer errors in the wait loop. > - */ > - if (wait) > - xfs_buf_hold(bp); > - xfs_buf_ioend(bp); > - } else > - xfs_buf_iorequest(bp); > + xfs_buf_submit(bp); > } > blk_finish_plug(&plug); > > @@ -1838,7 +1853,10 @@ xfs_buf_delwri_submit( > bp = list_first_entry(&io_list, struct xfs_buf, b_list); > > list_del_init(&bp->b_list); > - error2 = xfs_buf_iowait(bp); > + > + /* locking the buffer will wait for async IO completion. */ > + xfs_buf_lock(bp); > + error2 = bp->b_error; Interesting delwri cleanup overall. The lock here works for synchronization (blocking), but it doesn't look safe for error processing. Once the buffer lock is dropped, who says b_error is from our write (and not a subsequent, for example) and thus this caller's responsibility to handle the error? I suspect this is a reason the lock is typically held across a sync I/O, so the error is valid after the I/O. Also, it looks like blocking on async I/O as such opens up the possibility of blocking indefinitely on failing writes if the right combination of delwri and b_iodone handler is used (see xfs_buf_iodone_callbacks()). I'm not sure if that's a real problem today, though. > xfs_buf_relse(bp); > if (!error) > error = error2; > diff --git a/fs/xfs/xfs_buf.h b/fs/xfs/xfs_buf.h > index d8f57f6..0acfc30 100644 > --- a/fs/xfs/xfs_buf.h > +++ b/fs/xfs/xfs_buf.h > @@ -290,8 +290,8 @@ extern int xfs_bwrite(struct xfs_buf *bp); > extern void xfs_buf_ioend(struct xfs_buf *bp); > extern void xfs_buf_ioerror(xfs_buf_t *, int); > extern void xfs_buf_ioerror_alert(struct xfs_buf *, const char *func); > -extern void xfs_buf_iorequest(xfs_buf_t *); > -extern int xfs_buf_iowait(xfs_buf_t *); > +extern void xfs_buf_submit(struct xfs_buf *bp); > +extern int xfs_buf_submit_wait(struct xfs_buf *bp); > extern void xfs_buf_iomove(xfs_buf_t *, size_t, size_t, void *, > xfs_buf_rw_t); > #define xfs_buf_zero(bp, off, len) \ > diff --git a/fs/xfs/xfs_buf_item.c b/fs/xfs/xfs_buf_item.c > index 4fd41b5..cbea909 100644 > --- a/fs/xfs/xfs_buf_item.c > +++ b/fs/xfs/xfs_buf_item.c > @@ -1081,7 +1081,7 @@ xfs_buf_iodone_callbacks( > * a way to shut the filesystem down if the writes keep failing. > * > * In practice we'll shut the filesystem down soon as non-transient > - * erorrs tend to affect the whole device and a failing log write > + * errors tend to affect the whole device and a failing log write > * will make us give up. But we really ought to do better here. > */ > if (XFS_BUF_ISASYNC(bp)) { > @@ -1094,7 +1094,7 @@ xfs_buf_iodone_callbacks( > if (!(bp->b_flags & (XBF_STALE|XBF_WRITE_FAIL))) { > bp->b_flags |= XBF_WRITE | XBF_ASYNC | > XBF_DONE | XBF_WRITE_FAIL; > - xfs_buf_iorequest(bp); > + xfs_buf_submit(bp); > } else { > xfs_buf_relse(bp); > } > diff --git a/fs/xfs/xfs_log.c b/fs/xfs/xfs_log.c > index e4665db..c4d7f79 100644 > --- a/fs/xfs/xfs_log.c > +++ b/fs/xfs/xfs_log.c > @@ -1699,7 +1699,7 @@ xlog_bdstrat( > return 0; > } > > - xfs_buf_iorequest(bp); > + xfs_buf_submit(bp); > return 0; > } > > diff --git a/fs/xfs/xfs_log_recover.c b/fs/xfs/xfs_log_recover.c > index 4ba19bf..1e14452 100644 > --- a/fs/xfs/xfs_log_recover.c > +++ b/fs/xfs/xfs_log_recover.c > @@ -193,12 +193,8 @@ xlog_bread_noalign( > bp->b_io_length = nbblks; > bp->b_error = 0; > > - if (XFS_FORCED_SHUTDOWN(log->l_mp)) > - return -EIO; > - > - xfs_buf_iorequest(bp); > - error = xfs_buf_iowait(bp); > - if (error) > + error = xfs_buf_submit_wait(bp); > + if (error && !XFS_FORCED_SHUTDOWN(log->l_mp)) > xfs_buf_ioerror_alert(bp, __func__); > return error; > } > @@ -4427,16 +4423,12 @@ xlog_do_recover( > XFS_BUF_UNASYNC(bp); > bp->b_ops = &xfs_sb_buf_ops; > > - if (XFS_FORCED_SHUTDOWN(log->l_mp)) { > - xfs_buf_relse(bp); > - return -EIO; > - } > - > - xfs_buf_iorequest(bp); > - error = xfs_buf_iowait(bp); > + error = xfs_buf_submit_wait(bp); > if (error) { > - xfs_buf_ioerror_alert(bp, __func__); > - ASSERT(0); > + if (XFS_FORCED_SHUTDOWN(log->l_mp)) { Should this be !XFS_FORCED_SHUTDOWN()? Brian > + xfs_buf_ioerror_alert(bp, __func__); > + ASSERT(0); > + } > xfs_buf_relse(bp); > return error; > } > diff --git a/fs/xfs/xfs_trans_buf.c b/fs/xfs/xfs_trans_buf.c > index 9c3e610..4bdf02c 100644 > --- a/fs/xfs/xfs_trans_buf.c > +++ b/fs/xfs/xfs_trans_buf.c > @@ -286,18 +286,13 @@ xfs_trans_read_buf_map( > bp->b_flags |= XBF_READ; > bp->b_ops = ops; > > - if (XFS_FORCED_SHUTDOWN(mp)) { > - trace_xfs_bdstrat_shut(bp, _RET_IP_); > - error = -EIO; > - goto out_stale; > - } > - > - xfs_buf_iorequest(bp); > - error = xfs_buf_iowait(bp); > + error = xfs_buf_submit_wait(bp); > if (error) { > - xfs_buf_ioerror_alert(bp, __func__); > - goto out_do_shutdown; > - > + if (!XFS_FORCED_SHUTDOWN(mp)) { > + xfs_buf_ioerror_alert(bp, __func__); > + goto out_do_shutdown; > + } > + goto out_stale; > } > } > > -- > 2.0.0 > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From david@fromorbit.com Fri Aug 15 18:18: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 9C6617F3F for ; Fri, 15 Aug 2014 18:18:00 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 6A6EA30408F for ; Fri, 15 Aug 2014 16:17:57 -0700 (PDT) X-ASG-Debug-ID: 1408144670-04bdf0185546f70001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id QLc6gZnfrDG4qQDZ for ; Fri, 15 Aug 2014 16:17: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: AhcHABuU7lN5LDJ8/2dsb2JhbABZgw2BKq8wAQEBAQEBBqAehXsBgQ8Xd4QDAQEEAScTHCMFCwgDDgoJJQ8FJQMhE4g6B8QDFxiFZIQDhU0HhEwFjw6NL5UAg24rL4JPAQEB Received: from ppp121-44-50-124.lns20.syd6.internode.on.net (HELO dastard) ([121.44.50.124]) by ipmail07.adl2.internode.on.net with ESMTP; 16 Aug 2014 08:47:49 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1XIQka-0003pj-7m; Sat, 16 Aug 2014 09:17:36 +1000 Date: Sat, 16 Aug 2014 09:17:36 +1000 From: Dave Chinner To: Brian Foster Cc: xfs@oss.sgi.com Subject: Re: [PATCH 1/9] xfs: synchronous buffer IO needs a reference Message-ID: <20140815231736.GT26465@dastard> X-ASG-Orig-Subj: Re: [PATCH 1/9] xfs: synchronous buffer IO needs a reference References: <1408084747-4540-1-git-send-email-david@fromorbit.com> <1408084747-4540-2-git-send-email-david@fromorbit.com> <20140815131804.GA4096@laptop.bfoster> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140815131804.GA4096@laptop.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: 1408144670 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.8489 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Fri, Aug 15, 2014 at 09:18:04AM -0400, Brian Foster wrote: > On Fri, Aug 15, 2014 at 04:38:59PM +1000, Dave Chinner wrote: .... > > if (bp->b_flags & XBF_WRITE) > > xfs_buf_wait_unpin(bp); > > + > > + /* > > + * Take references to the buffer. For XBF_ASYNC buffers, holding a > > + * reference for as long as submission takes is all that is necessary > > + * here. The IO inherits the lock and hold count from the submitter, > > + * and these are release during IO completion processing. Taking a hold > > + * over submission ensures that the buffer is not freed until we have > > + * completed all processing, regardless of when IO errors occur or are > > + * reported. > > + * > > + * However, for synchronous IO, the IO does not inherit the submitters > > + * reference count, nor the buffer lock. Hence we need to take an extra > > + * reference to the buffer for the for the IO context so that we can > > + * guarantee the buffer is not freed until all IO completion processing > > + * is done. Otherwise the caller can drop their reference while the IO > > + * is still in progress and hence trigger a use-after-free situation. > > + */ > > xfs_buf_hold(bp); > > + if (!(bp->b_flags & XBF_ASYNC)) > > + xfs_buf_hold(bp); > > + > > > > /* > > - * Set the count to 1 initially, this will stop an I/O > > - * completion callout which happens before we have started > > - * all the I/O from calling xfs_buf_ioend too early. > > + * Set the count to 1 initially, this will stop an I/O completion > > + * callout which happens before we have started all the I/O from calling > > + * xfs_buf_ioend too early. > > */ > > atomic_set(&bp->b_io_remaining, 1); > > _xfs_buf_ioapply(bp); > > + > > /* > > - * If _xfs_buf_ioapply failed, we'll get back here with > > - * only the reference we took above. _xfs_buf_ioend will > > - * drop it to zero, so we'd better not queue it for later, > > - * or we'll free it before it's done. > > + * If _xfs_buf_ioapply failed or we are doing synchronous IO that > > + * completes extremely quickly, we can get back here with only the IO > > + * reference we took above. _xfs_buf_ioend will drop it to zero, so > > + * we'd better run completion processing synchronously so that the we > > + * don't return to the caller with completion still pending. In the > > + * error case, this allows the caller to check b_error safely without > > + * waiting, and in the synchronous IO case it avoids unnecessary context > > + * switches an latency for high-peformance devices. > > */ > > AFAICT there is no real wait if the buf has completed at this point. The > wait just decrements the completion counter. If the IO has completed, then we run the completion code. > So what's the benefit of > "not waiting?" Where is the potential context switch? async work for completion processing on synchrnous IO means we queue the work, then sleep in xfs_buf_iowait(). Two context switches, plus a work queue execution > Are you referring > to the case where error is set but I/O is not complete? Are you saying > the advantage to the caller is it doesn't have to care about the state > of further I/O once it has been determined at least one error has > occurred? (If so, who cares about latency given that some operation that > depends on this I/O is already doomed to fail?). No, you're reading *way* too much into this. For sync IO, it's always best to process completion inline. For async, it doesn't matter, but if there's a submission error is *more effecient* to process it in the current context. > The code looks fine, but I'm trying to understand the reasoning better > (and I suspect we can clarify the comment). > > > - _xfs_buf_ioend(bp, bp->b_error ? 0 : 1); > > + if (bp->b_error || !(bp->b_flags & XBF_ASYNC)) > > + _xfs_buf_ioend(bp, 0); > > + else > > + _xfs_buf_ioend(bp, 1); > > Not related to this patch, but it seems like the problem this code tries > to address is still possible. The race condition is still possible - it just won't result in a use-after-free. The race condition is not fixed until patch 8, but as a backportable fix, this patch is much, much simpler. > Perhaps this papers over a particular > instance. Consider the case where an I/O fails immediately after this > call completes, but not before. We have an extra reference now for > completion, but we can still return to the caller with completion > pending. I suppose its fine if we consider the "problem" to be that the > reference goes away underneath the completion, as opposed to the caller > caring about the status of completion. Precisely. Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Fri Aug 15 18:21: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 618837F50 for ; Fri, 15 Aug 2014 18:21:52 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id D792EAC003 for ; Fri, 15 Aug 2014 16:21:51 -0700 (PDT) X-ASG-Debug-ID: 1408144909-04cbb05485436b0001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id 3murMwwpWhBlfYLu for ; Fri, 15 Aug 2014 16:21: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: AoUPADeV7lN5LDJ8/2dsb2JhbABZgw2BKq8wAQEBAQEBBqAehD6BPQGBEBd3hAMBAQQBJxMcIwULCAMOBwMJJQ8FJQMhE4g6B8QKFxiFZIlQB4RMBYYRliyMB4h5ghaBWCsvgQgkgSMBAQE Received: from ppp121-44-50-124.lns20.syd6.internode.on.net (HELO dastard) ([121.44.50.124]) by ipmail07.adl2.internode.on.net with ESMTP; 16 Aug 2014 08:51:48 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1XIQoR-0003q2-Ti; Sat, 16 Aug 2014 09:21:35 +1000 Date: Sat, 16 Aug 2014 09:21:35 +1000 From: Dave Chinner To: Brian Foster Cc: xfs@oss.sgi.com Subject: Re: [PATCH 2/9] xfs: xfs_buf_ioend and xfs_buf_iodone_work duplicate functionality Message-ID: <20140815232135.GU26465@dastard> X-ASG-Orig-Subj: Re: [PATCH 2/9] xfs: xfs_buf_ioend and xfs_buf_iodone_work duplicate functionality References: <1408084747-4540-1-git-send-email-david@fromorbit.com> <1408084747-4540-3-git-send-email-david@fromorbit.com> <20140815131820.GB4096@laptop.bfoster> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140815131820.GB4096@laptop.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: 1408144909 X-Barracuda-URL: http://192.48.176.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.8490 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Fri, Aug 15, 2014 at 09:18:21AM -0400, Brian Foster wrote: > On Fri, Aug 15, 2014 at 04:39:00PM +1000, Dave Chinner wrote: > > From: Dave Chinner > > > > We do some work in xfs_buf_ioend, and some work in > > xfs_buf_iodone_work, but much of that functionality is the same. > > This work can all be done in a single function, leaving > > xfs_buf_iodone just a wrapper to determine if we should execute it > > by workqueue or directly. hence rename xfs_buf_iodone_work to > > xfs_buf_ioend(), and add a new xfs_buf_ioend_async() for places that > > need async processing. > > > > Signed-off-by: Dave Chinner > > --- > > fs/xfs/xfs_buf.c | 79 +++++++++++++++++++++--------------------------- > > fs/xfs/xfs_buf.h | 2 +- > > fs/xfs/xfs_buf_item.c | 4 +-- > > fs/xfs/xfs_inode.c | 2 +- > > fs/xfs/xfs_log.c | 2 +- > > fs/xfs/xfs_log_recover.c | 2 +- > > 6 files changed, 40 insertions(+), 51 deletions(-) > > > > diff --git a/fs/xfs/xfs_buf.c b/fs/xfs/xfs_buf.c > > index 5d86bbd..1b7f0bc 100644 > > --- a/fs/xfs/xfs_buf.c > > +++ b/fs/xfs/xfs_buf.c > > @@ -999,54 +999,49 @@ xfs_buf_wait_unpin( > > */ > > > > STATIC void > > -xfs_buf_iodone_work( > > - struct work_struct *work) > > +xfs_buf_ioend( > > + struct xfs_buf *bp) > > Compile failure here due to STATIC. > > > { > > - struct xfs_buf *bp = > > - container_of(work, xfs_buf_t, b_iodone_work); > > - bool read = !!(bp->b_flags & XBF_READ); > > + bool read = !!(bp->b_flags & XBF_READ); > > + > > + trace_xfs_buf_iodone(bp, _RET_IP_); > > > > bp->b_flags &= ~(XBF_READ | XBF_WRITE | XBF_READ_AHEAD); > > > > - /* only validate buffers that were read without errors */ > > - if (read && bp->b_ops && !bp->b_error && (bp->b_flags & XBF_DONE)) > > - bp->b_ops->verify_read(bp); > > + if (!bp->b_error) { > > + bp->b_flags |= XBF_DONE; > > + > > + /* only validate buffers that were read without errors */ > > + if (read && bp->b_ops) > > + bp->b_ops->verify_read(bp); > > + } > > Probably not a cause of errors, but this code is now executed twice for > I/O with b_iodone callbacks. reads don't have b_iodone callbacks. > Once for the initial call from bio_end_io, > again from the callback via the b_iodone handler. The flags bits are > probably fine, but we don't want to be running the verifiers multiple > times unnecessarily. Which we don't ;) > > @@ -1425,10 +1412,12 @@ xfs_buf_iorequest( > > * waiting, and in the synchronous IO case it avoids unnecessary context > > * switches an latency for high-peformance devices. > > */ > > - if (bp->b_error || !(bp->b_flags & XBF_ASYNC)) > > - _xfs_buf_ioend(bp, 0); > > - else > > - _xfs_buf_ioend(bp, 1); > > + if (atomic_dec_and_test(&bp->b_io_remaining) == 1) { > > + if (bp->b_error || !(bp->b_flags & XBF_ASYNC)) > > + xfs_buf_ioend(bp); > > + else > > + xfs_buf_ioend_async(bp); > > + } > > This looks cleaner, but the comment is out of whack at this point. The code is functionally identical, so the comment didn't get changed. As it is, the behaviour that exists in this patch goes away in later patches, so it's mostly irrelevant that a comment is absoultely correct in an intermediate point within the patch set. Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Fri Aug 15 18:26: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 D98BF7F53 for ; Fri, 15 Aug 2014 18:26:15 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 6AAE8AC001 for ; Fri, 15 Aug 2014 16:26:15 -0700 (PDT) X-ASG-Debug-ID: 1408145172-04cbb0548643890001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id mRbCgBgtOYaPYg3u for ; Fri, 15 Aug 2014 16:26:13 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.131 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AhcHAG2W7lN5LDJ8/2dsb2JhbABZgw2BKq8wAQEBAQEBBqAehXsBgRAXd4QDAQEFJxMcIxAIAw4HAwklDwUlAyETiEHECxcYhWSJUAeETAWcPYwHiHmDbisvgk8BAQE Received: from ppp121-44-50-124.lns20.syd6.internode.on.net (HELO dastard) ([121.44.50.124]) by ipmail07.adl2.internode.on.net with ESMTP; 16 Aug 2014 08:56:11 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1XIQsh-0003qe-GU; Sat, 16 Aug 2014 09:25:59 +1000 Date: Sat, 16 Aug 2014 09:25:59 +1000 From: Dave Chinner To: Brian Foster Cc: xfs@oss.sgi.com Subject: Re: [PATCH 3/9] xfs: rework xfs_buf_bio_endio error handling Message-ID: <20140815232559.GV26465@dastard> X-ASG-Orig-Subj: Re: [PATCH 3/9] xfs: rework xfs_buf_bio_endio error handling References: <1408084747-4540-1-git-send-email-david@fromorbit.com> <1408084747-4540-4-git-send-email-david@fromorbit.com> <20140815131836.GC4096@laptop.bfoster> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140815131836.GC4096@laptop.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: 1408145172 X-Barracuda-URL: http://192.48.176.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.8490 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Fri, Aug 15, 2014 at 09:18:37AM -0400, Brian Foster wrote: > On Fri, Aug 15, 2014 at 04:39:01PM +1000, Dave Chinner wrote: > > From: Dave Chinner > > > > Currently the report of a bio error from completion > > immediately marks the buffer with an error. The issue is that this > > is racy w.r.t. synchronous IO - the submitter can see b_error being > > set before the IO is complete, and hence we cannot differentiate > > between submission failures and completion failures. > > > > Add an internal b_io_error field protected by the b_lock to catch IO > > completion errors, and only propagate that to the buffer during > > final IO completion handling. Hence we can tell in xfs_buf_iorequest > > if we've had a submission failure bey checking bp->b_error before > > dropping our b_io_remaining reference - that reference will prevent > > b_io_error values from being propagated to b_error in the event that > > completion races with submission. > > > > In doing so, allow xfs_buf_iorequest to return an error. That way, > > the caller can check for submission errors safely if required, and > > easily distinguish them from completion errors that come from > > xfs_buf_iowait(). > > > > I don't see any changes to xfs_buf_iorequest() at all in this one. That > aside, it looks fine. It's not how I was thinking about it, but a clear > separation of submission error regardless. Apart from adding a zeroing of b_io_error, no, it doesn't change. What I meant to describe was the new capability this adds. I'll rewrite the paragraph to say: In doing so, xfs_buf_iorequest now has the capability to distinguish between submission and completion errors, and hence if we need to we can return submission errors directly and allow callers to gather completion errors from xfs_buf_iowait(). Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Fri Aug 15 18:28: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 AFCE129DF9 for ; Fri, 15 Aug 2014 18:28:11 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 9D2968F8078 for ; Fri, 15 Aug 2014 16:28:08 -0700 (PDT) X-ASG-Debug-ID: 1408145285-04cb6c54fe3fb20001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id W1CCTfJm4SohxvC2 for ; Fri, 15 Aug 2014 16:28:06 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.131 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AhcHAG2W7lN5LDJ8/2dsb2JhbABZgw2BKq8wAQEBAQEBBqAehXsBgRAXd4QDAQEEAScTHCMFCwgDDgoJJQ8FJQMhE4g6B8QLFxiFZIlQB4RMBZw9jAeIeYNuKy+BBiSBJQEBAQ Received: from ppp121-44-50-124.lns20.syd6.internode.on.net (HELO dastard) ([121.44.50.124]) by ipmail07.adl2.internode.on.net with ESMTP; 16 Aug 2014 08:58:04 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1XIQuL-0003rJ-B3; Sat, 16 Aug 2014 09:27:41 +1000 Date: Sat, 16 Aug 2014 09:27:41 +1000 From: Dave Chinner To: Brian Foster Cc: xfs@oss.sgi.com Subject: Re: [PATCH 5/9] xfs: xfs_bioerror can die. Message-ID: <20140815232741.GW26465@dastard> X-ASG-Orig-Subj: Re: [PATCH 5/9] xfs: xfs_bioerror can die. References: <1408084747-4540-1-git-send-email-david@fromorbit.com> <1408084747-4540-6-git-send-email-david@fromorbit.com> <20140815143540.GD4096@laptop.bfoster> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140815143540.GD4096@laptop.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: 1408145285 X-Barracuda-URL: http://192.48.176.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.8490 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Fri, Aug 15, 2014 at 10:35:41AM -0400, Brian Foster wrote: > On Fri, Aug 15, 2014 at 04:39:03PM +1000, Dave Chinner wrote: > > @@ -1149,19 +1119,19 @@ xfs_bwrite( > > ASSERT(xfs_buf_islocked(bp)); > > > > bp->b_flags |= XBF_WRITE; > > - bp->b_flags &= ~(XBF_ASYNC | XBF_READ | _XBF_DELWRI_Q | XBF_WRITE_FAIL); > > + bp->b_flags &= ~(XBF_ASYNC | XBF_READ | _XBF_DELWRI_Q | > > + XBF_WRITE_FAIL | XBF_DONE); > > > > if (XFS_FORCED_SHUTDOWN(bp->b_target->bt_mount)) { > > trace_xfs_bdstrat_shut(bp, _RET_IP_); > > > > - /* > > - * Metadata write that didn't get logged but written anyway. > > - * These aren't associated with a transaction, and can be > > - * ignored. > > - */ > > - if (!bp->b_iodone) > > - return xfs_bioerror_relse(bp); > > - return xfs_bioerror(bp); > > + xfs_buf_ioerror(bp, -EIO); > > + xfs_buf_stale(bp); > > + > > + /* sync IO, xfs_buf_ioend is going to remove a ref here */ > > + xfs_buf_hold(bp); > > Looks correct, but that's kind of ugly. The reference serves no purpose > except to appease the error sequence. It gives the impression that the > reference management should be handled at a higher level (and with truly > synchronous I/O primitives/mechanisms, it is ;). Oh, yeah, it's nasty ugly, but that goes away with patch 8. This is just a temporary state that then gets factored neatly when the new interfaces are introduced. > At the very least, can we reorganize the ioend side of things to handle > this? We already have the duplicate execution issue previously mentioned > that has to get resolved. Some duplicate code is fine if it improves > clarity, imo. patch 8 does that - this is just preparing the code for being easy to factor. Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Fri Aug 15 18:37: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 AD1A029DF9 for ; Fri, 15 Aug 2014 18:37:59 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 894B18F8084 for ; Fri, 15 Aug 2014 16:37:59 -0700 (PDT) X-ASG-Debug-ID: 1408145877-04cbb0548843d90001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id S1RYVlhA3dtXNx7O for ; Fri, 15 Aug 2014 16:37:57 -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: AhcHAPOY7lN5LDJ8/2dsb2JhbABZgw2BKq8wAQEBAQEBBqAehXsBgRAXd4QDAQEEAScTHCMFCwgDDgoJJQ8FJQMhE4g6B8N5FxiFZIQDhU0HhEwFnD2MB4h5g24rL4JPAQEB Received: from ppp121-44-50-124.lns20.syd6.internode.on.net (HELO dastard) ([121.44.50.124]) by ipmail07.adl2.internode.on.net with ESMTP; 16 Aug 2014 09:07:56 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1XIR43-0003sT-EM; Sat, 16 Aug 2014 09:37:43 +1000 Date: Sat, 16 Aug 2014 09:37:43 +1000 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com Subject: Re: [PATCH 8/9] xfs: introduce xfs_buf_submit[_wait] Message-ID: <20140815233743.GX26465@dastard> X-ASG-Orig-Subj: Re: [PATCH 8/9] xfs: introduce xfs_buf_submit[_wait] References: <1408084747-4540-1-git-send-email-david@fromorbit.com> <1408084747-4540-9-git-send-email-david@fromorbit.com> <20140815131020.GB27856@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140815131020.GB27856@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: 1408145877 X-Barracuda-URL: http://192.48.176.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.8490 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Fri, Aug 15, 2014 at 06:10:20AM -0700, Christoph Hellwig wrote: > > diff --git a/fs/xfs/xfs_bmap_util.c b/fs/xfs/xfs_bmap_util.c > > index 2f1e30d..c53cc03 100644 > > --- a/fs/xfs/xfs_bmap_util.c > > +++ b/fs/xfs/xfs_bmap_util.c > > @@ -1157,12 +1157,7 @@ xfs_zero_remaining_bytes( > > xfs_zero_remaining_bytes really should be switched to > xfs_buf_read_uncached + xfs_bwrite instead of all this mess just to > micro-optimize a few memory allocation away that don't even happen for > the common case of blocksize == PAGE_SIZE. I'm not even sure we > should be using the buffer cache at all for something inside a regular > file, but that's a discussion for another time. xfs_zero_remaining_bytes is uses an uncached buffer, so we're not using the buffer cache at all for the blocks being zeroed. That is why it does the flag twiddling dance it does. However, consolidation all the different block zeroing functions we have is an exercise for a different day.... > > > void > > +xfs_buf_submit( > > + struct xfs_buf *bp) > > { > > trace_xfs_buf_iorequest(bp, _RET_IP_); > > I suspect these two should have properly name and separate trace > points now? Yes. Just haven't got to it. > It also seems like a lot of the guts of the two functions are > still the same, so factoring that into a __xfs_buf_submit helper > would be useful. Possibly, if we can ensure that the helper it never called directly by any other code. Then we end up back in the mess we are currently in. > > + * If _xfs_buf_ioapply failed, > > + * we can get back here with only the IO > > * reference we took above. _xfs_buf_ioend will drop it to zero, so > > * we'd better run completion processing synchronously so that the we > > + * don't return to the caller with completion still pending. > > + * this allows the caller to check b_error safely without > > + * waiting > > */ > > if (atomic_dec_and_test(&bp->b_io_remaining) == 1) { > > if (bp->b_error || !(bp->b_flags & XBF_ASYNC)) > > I don't think the !ASYNC case can happen here, can it? Right, I forget to clean that part up when I was splitting up the functions. > > > + if (!wait) > > list_del_init(&bp->b_list); > > + else > > + xfs_buf_hold(bp); > > Maybe switch this around to avoid the negated condition in the if else? > > Also might this be worth a change of it's own? Yeah, that's probably a good idea - the algorithm change is not directly related to the interface change. Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Fri Aug 15 18:40: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 38D8029DF9 for ; Fri, 15 Aug 2014 18:40:10 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 239DE8F804C for ; Fri, 15 Aug 2014 16:40:10 -0700 (PDT) X-ASG-Debug-ID: 1408146007-04cbb0548543e80001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id 14e81ipnRQCiFFXL for ; Fri, 15 Aug 2014 16:40:08 -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: AhcHACCa7lN5LDJ8/2dsb2JhbABZgw2BKq8wAQEBAQEBBqAehXsBgRAXd4QDAQEFJxMcIxAIAw4HAwklDwUlAyETiEHDehcYhWSJUAeETAWcPYwHiHmDbisvgk8BAQE Received: from ppp121-44-50-124.lns20.syd6.internode.on.net (HELO dastard) ([121.44.50.124]) by ipmail07.adl2.internode.on.net with ESMTP; 16 Aug 2014 09:09:48 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1XIR5r-0003sk-3s; Sat, 16 Aug 2014 09:39:35 +1000 Date: Sat, 16 Aug 2014 09:39:35 +1000 From: Dave Chinner To: Brian Foster Cc: xfs@oss.sgi.com Subject: Re: [PATCH 8/9] xfs: introduce xfs_buf_submit[_wait] Message-ID: <20140815233935.GY26465@dastard> X-ASG-Orig-Subj: Re: [PATCH 8/9] xfs: introduce xfs_buf_submit[_wait] References: <1408084747-4540-1-git-send-email-david@fromorbit.com> <1408084747-4540-9-git-send-email-david@fromorbit.com> <20140815143558.GE4096@laptop.bfoster> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140815143558.GE4096@laptop.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: 1408146007 X-Barracuda-URL: http://192.48.176.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.8490 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Fri, Aug 15, 2014 at 10:35:58AM -0400, Brian Foster wrote: > On Fri, Aug 15, 2014 at 04:39:06PM +1000, Dave Chinner wrote: > > From: Dave Chinner > > > > There is a lot of cookie-cutter code that looks like: > > > > if (shutdown) > > handle buffer error > > xfs_buf_iorequest(bp) > > error = xfs_buf_iowait(bp) > > if (error) > > handle buffer error > > > > spread through XFS. There's significant complexity now in > > xfs_buf_iorequest() to specifically handle this sort of synchronous > > IO pattern, but there's all sorts of nasty surprises in different > > error handling code dependent on who owns the buffer references and > > the locks. > > > > Pull this pattern into a single helper, where we can hide all the > > synchronous IO warts and hence make the error handling for all the > > callers much saner. This removes the need for a special extra > > reference to protect IO completion processing, as we can now hold a > > single reference across dispatch and waiting, simplifying the sync > > IO smeantics and error handling. > > > > In doing this, also rename xfs_buf_iorequest to xfs_buf_submit and > > make it explicitly handle on asynchronous IO. This forces all users > > to be switched specifically to one interface or the other and > > removes any ambiguity between how the interfaces are to be used. It > > also means that xfs_buf_iowait() goes away. > > > > For the special case of delwri buffer submission and waiting, we > > don't need to issue IO synchronously at all. The second pass to cal > > xfs_buf_iowait() can now just block on xfs_buf_lock() - the buffer > > will be unlocked when the async IO is complete. This formalises a > > sane the method of waiting for async IO - take an extra reference, > > submit the IO, call xfs_buf_lock() when you want to wait for IO > > completion. i.e.: > > > > bp = xfs_buf_find(); > > xfs_buf_hold(bp); > > bp->b_flags |= XBF_ASYNC; > > xfs_buf_iosubmit(bp); > > xfs_buf_lock(bp) > > error = bp->b_error; > > .... > > xfs_buf_relse(bp); > > > > Signed-off-by: Dave Chinner > > --- > > On a quick look at submit_wait this looks pretty good. It actually > implements the general model I've been looking for for sync I/O. E.g., > send the I/O, wait on synchronization, then check for errors. In other > words, a pure synchronous mechanism. The refactoring and new helpers and > whatnot are additional bonus and abstract it nicely. > > I still have to take a closer look to review the actual code, but since > we go and remove the additional sync I/O reference counting business, > why do we even add that stuff early on? Can't we get from where the > current code is to here in a more direct manner? Simply because we need a fix that we can backport, and that fix is a simple addition that does not significantly affect the rest of the patchset... Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Fri Aug 15 18:58: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 (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 6D6DF29DF9 for ; Fri, 15 Aug 2014 18:58:21 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 587133040A4 for ; Fri, 15 Aug 2014 16:58:21 -0700 (PDT) X-ASG-Debug-ID: 1408147097-04cb6c54ff40620001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id CAZyZPL3oz9ZgYHt for ; Fri, 15 Aug 2014 16:58:18 -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: AhcHAKSd7lN5LDJ8/2dsb2JhbABZgw2BKq8wAQEBAQEBBqAehXsBgRAXd4QDAQEEAScTHCMFCwgDDgoJJQ8FJQMhCgmIOgfDfhcYhWSIeAtNB4RMBZw9jAeIeYNuKy+BBgEfgSkBAQE Received: from ppp121-44-50-124.lns20.syd6.internode.on.net (HELO dastard) ([121.44.50.124]) by ipmail07.adl2.internode.on.net with ESMTP; 16 Aug 2014 09:28:17 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1XIRNk-0003uO-8U; Sat, 16 Aug 2014 09:58:04 +1000 Date: Sat, 16 Aug 2014 09:58:04 +1000 From: Dave Chinner To: Brian Foster Cc: xfs@oss.sgi.com Subject: Re: [PATCH 8/9] xfs: introduce xfs_buf_submit[_wait] Message-ID: <20140815235804.GZ26465@dastard> X-ASG-Orig-Subj: Re: [PATCH 8/9] xfs: introduce xfs_buf_submit[_wait] References: <1408084747-4540-1-git-send-email-david@fromorbit.com> <1408084747-4540-9-git-send-email-david@fromorbit.com> <20140815161319.GF4096@laptop.bfoster> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140815161319.GF4096@laptop.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: 1408147097 X-Barracuda-URL: http://192.48.176.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.8491 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Fri, Aug 15, 2014 at 12:13:20PM -0400, Brian Foster wrote: > On Fri, Aug 15, 2014 at 04:39:06PM +1000, Dave Chinner wrote: > > + if (XFS_FORCED_SHUTDOWN(bp->b_target->bt_mount)) { > > + xfs_buf_ioerror(bp, -EIO); > > + bp->b_flags &= ~XBF_DONE; > > + xfs_buf_stale(bp); > > + xfs_buf_ioend(bp); > > + return; > > + } > > > > if (bp->b_flags & XBF_WRITE) > > xfs_buf_wait_unpin(bp); > > @@ -1311,25 +1307,10 @@ xfs_buf_iorequest( > > bp->b_io_error = 0; > > > > I know this is from the previous patch, but I wonder if it's cleaner to > reset b_io_error when the error is transferred to b_error. That seems > slightly more future proof at least. I much prefer zeroing just before the variable is needed to be zero, simply to indicate the context in which we care that the value is correct. Outside of actively submitted IO, the value of b_io_error is irrelevant, so it's value really doesn't matter. The other advantage of leaving it untocuhed is for debug purposes - the caller might clear b_error, but we still know what the state of the last IO that was completed in the buffer was... > > > /* > > - * Take references to the buffer. For XBF_ASYNC buffers, holding a > > - * reference for as long as submission takes is all that is necessary > > - * here. The IO inherits the lock and hold count from the submitter, > > - * and these are release during IO completion processing. Taking a hold > > - * over submission ensures that the buffer is not freed until we have > > - * completed all processing, regardless of when IO errors occur or are > > - * reported. > > - * > > - * However, for synchronous IO, the IO does not inherit the submitters > > - * reference count, nor the buffer lock. Hence we need to take an extra > > - * reference to the buffer for the for the IO context so that we can > > - * guarantee the buffer is not freed until all IO completion processing > > - * is done. Otherwise the caller can drop their reference while the IO > > - * is still in progress and hence trigger a use-after-free situation. > > + * Take an extra reference so that we don't have to guess when it's no > > + * longer safe to reference the buffer that was passed to us. > > */ > > Assuming my understanding is correct: > > /* > * The caller's reference is released by buffer I/O completion. Technically > * this should not occur until we release the last b_io_remaining reference. That's not quite right. The caller's reference is released some time *after* b_io_remaining goes to zero. That's the reason we need to hold a reference - after we drop our b_io_remaining count, we have to have some other method of ensuring the buffer doesn't go away until we have finished with the buffer. I'll rewrite the comment. > > +xfs_buf_submit_wait( > > + struct xfs_buf *bp) > > { > > - trace_xfs_buf_iowait(bp, _RET_IP_); > > + int error; > > + > > + trace_xfs_buf_iorequest(bp, _RET_IP_); > > > > - if (!bp->b_error) > > - wait_for_completion(&bp->b_iowait); > > + ASSERT(!(bp->b_flags & (_XBF_DELWRI_Q | XBF_ASYNC))); > > + > > + if (XFS_FORCED_SHUTDOWN(bp->b_target->bt_mount)) { > > + xfs_buf_ioerror(bp, -EIO); > > + xfs_buf_stale(bp); > > + bp->b_flags &= ~XBF_DONE; > > + return -EIO; > > + } > > > > + if (bp->b_flags & XBF_WRITE) > > + xfs_buf_wait_unpin(bp); > > + > > + /* clear the internal error state to avoid spurious errors */ > > + bp->b_io_error = 0; > > + > > + /* > > + * For synchronous IO, the IO does not inherit the submitters reference > > + * count, nor the buffer lock. Hence we cannot release the reference we > > + * are about to take until we've waited for all IO completion to occur, > > + * including any xfs_buf_ioend_async() work that may be pending. > > + */ > > + xfs_buf_hold(bp); > > + > > Harmless, but why is this necessary? The caller should have the > reference, the I/O completion won't release it and we wait on b_iowait > before we return. Isn't the caller's reference sufficient? Consistency - I'd prefer that all IO has the same reference counting behaviour. i.e. that the IO holds it's own reference to ensure, regardless of anything else that happens, that the buffer has a valid reference count the entire time the IO subsystem processing the buffer. > > @@ -1838,7 +1853,10 @@ xfs_buf_delwri_submit( > > bp = list_first_entry(&io_list, struct xfs_buf, b_list); > > > > list_del_init(&bp->b_list); > > - error2 = xfs_buf_iowait(bp); > > + > > + /* locking the buffer will wait for async IO completion. */ > > + xfs_buf_lock(bp); > > + error2 = bp->b_error; > > Interesting delwri cleanup overall. The lock here works for > synchronization (blocking), but it doesn't look safe for error > processing. Once the buffer lock is dropped, who says b_error is from > our write (and not a subsequent, for example) and thus this caller's > responsibility to handle the error? I suspect this is a reason the lock > is typically held across a sync I/O, so the error is valid after the > I/O. It's fine because there is only a limited set of blocking callers, all of which are special cases. The only callers that use this blocking xfs_buf_delwri_submit() interface are: 1. log recovery: running single threaded, so isn't going to be racing with anything else that can modify the error 2. quotacheck: also running single threaded 3. quota shrinker, which has nowhere to report an error to, so the error status simply doesn't matter. > Also, it looks like blocking on async I/O as such opens up the > possibility of blocking indefinitely on failing writes if the right > combination of delwri and b_iodone handler is used (see > xfs_buf_iodone_callbacks()). I'm not sure if that's a real problem > today, though. I don't think it is - we don't permanently rewrite metadata writes from IO completion anymore. We retry once, but then require higher layers to restart the IO again (e.g. the xfsaild). Hence we can't get stuck forever on async write errors. > > diff --git a/fs/xfs/xfs_log_recover.c b/fs/xfs/xfs_log_recover.c > > index 4ba19bf..1e14452 100644 > > --- a/fs/xfs/xfs_log_recover.c > > +++ b/fs/xfs/xfs_log_recover.c > > @@ -193,12 +193,8 @@ xlog_bread_noalign( > > bp->b_io_length = nbblks; > > bp->b_error = 0; > > > > - if (XFS_FORCED_SHUTDOWN(log->l_mp)) > > - return -EIO; > > - > > - xfs_buf_iorequest(bp); > > - error = xfs_buf_iowait(bp); > > - if (error) > > + error = xfs_buf_submit_wait(bp); > > + if (error && !XFS_FORCED_SHUTDOWN(log->l_mp)) > > xfs_buf_ioerror_alert(bp, __func__); > > return error; > > } > > @@ -4427,16 +4423,12 @@ xlog_do_recover( > > XFS_BUF_UNASYNC(bp); > > bp->b_ops = &xfs_sb_buf_ops; > > > > - if (XFS_FORCED_SHUTDOWN(log->l_mp)) { > > - xfs_buf_relse(bp); > > - return -EIO; > > - } > > - > > - xfs_buf_iorequest(bp); > > - error = xfs_buf_iowait(bp); > > + error = xfs_buf_submit_wait(bp); > > if (error) { > > - xfs_buf_ioerror_alert(bp, __func__); > > - ASSERT(0); > > + if (XFS_FORCED_SHUTDOWN(log->l_mp)) { > > Should this be !XFS_FORCED_SHUTDOWN()? Right, good catch, especially after reading all that code ;) Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Fri Aug 15 18:58: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 6A66829DF9 for ; Fri, 15 Aug 2014 18:58:58 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 56BE38F8078 for ; Fri, 15 Aug 2014 16:58:58 -0700 (PDT) X-ASG-Debug-ID: 1408147136-04cbb0548744500001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id VVm4MY4oBYhFIZ9q for ; Fri, 15 Aug 2014 16:58: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: AhcHAKSd7lN5LDJ8/2dsb2JhbABZgw2BKq8wAQEBAQEBBqAehXsBgRAXd4QDAQEFJxMcIxAIAw4HAwklDwUlAyETiEHDfhcYhWSJUAeDL4EdAQScPYwHiHmDbisvgk8BAQE Received: from ppp121-44-50-124.lns20.syd6.internode.on.net (HELO dastard) ([121.44.50.124]) by ipmail07.adl2.internode.on.net with ESMTP; 16 Aug 2014 09:28:55 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1XIRON-0003up-4k; Sat, 16 Aug 2014 09:58:43 +1000 Date: Sat, 16 Aug 2014 09:58:43 +1000 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com Subject: Re: [PATCH 9/9] xfs: check xfs_buf_read_uncached returns correctly Message-ID: <20140815235843.GA26465@dastard> X-ASG-Orig-Subj: Re: [PATCH 9/9] xfs: check xfs_buf_read_uncached returns correctly References: <1408084747-4540-1-git-send-email-david@fromorbit.com> <1408084747-4540-10-git-send-email-david@fromorbit.com> <20140815125608.GA27856@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140815125608.GA27856@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: 1408147136 X-Barracuda-URL: http://192.48.176.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.8491 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Fri, Aug 15, 2014 at 05:56:08AM -0700, Christoph Hellwig wrote: > On Fri, Aug 15, 2014 at 04:39:07PM +1000, Dave Chinner wrote: > > From: Dave Chinner > > > > xfs_buf_read_uncached() has two failure modes. If can either return > > NULL or bp->b_error != 0 depending on the type of failure, and not > > all callers check for both. Fix it up. > > I'd rather get rid of these annoying calling conventions. Make it > return and errno, and the bp in a pointer argument, with the bp > never non-NULL in case of error. Ok. I considered that, then just did the simple thing. Cheers, Dave. -- Dave Chinner david@fromorbit.com From BATV+9d7b80a238e785b35dc7+4010+infradead.org+hch@bombadil.srs.infradead.org Fri Aug 15 23:55: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 EB2617F3F for ; Fri, 15 Aug 2014 23:55:36 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id D45A28F8039 for ; Fri, 15 Aug 2014 21:55:33 -0700 (PDT) X-ASG-Debug-ID: 1408164931-04cbb054864a740001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id kNa2gUWul0xlYUHI (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 15 Aug 2014 21:55:32 -0700 (PDT) X-Barracuda-Envelope-From: BATV+9d7b80a238e785b35dc7+4010+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 1XIW1b-0004Sw-EH; Sat, 16 Aug 2014 04:55:31 +0000 Date: Fri, 15 Aug 2014 21:55:31 -0700 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 8/9] xfs: introduce xfs_buf_submit[_wait] Message-ID: <20140816045531.GA7876@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 8/9] xfs: introduce xfs_buf_submit[_wait] References: <1408084747-4540-1-git-send-email-david@fromorbit.com> <1408084747-4540-9-git-send-email-david@fromorbit.com> <20140815131020.GB27856@infradead.org> <20140815233743.GX26465@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140815233743.GX26465@dastard> User-Agent: Mutt/1.5.23 (2014-03-12) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1408164932 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.8498 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Sat, Aug 16, 2014 at 09:37:43AM +1000, Dave Chinner wrote: > xfs_zero_remaining_bytes is uses an uncached buffer, so we're not > using the buffer cache at all for the blocks being zeroed. That is > why it does the flag twiddling dance it does. However, consolidation > all the different block zeroing functions we have is an exercise for > a different day.... Well, we're using buffers. Anyway, below is what I think it should look like when using buffers. Although I wonder how either the old or new variant pass the verifier check in _xfs_buf_ioapply for v5 filesystems given that we don't pass any ops in. diff --git a/fs/xfs/xfs_bmap_util.c b/fs/xfs/xfs_bmap_util.c index 2f1e30d..c495dce 100644 --- a/fs/xfs/xfs_bmap_util.c +++ b/fs/xfs/xfs_bmap_util.c @@ -1122,14 +1122,6 @@ xfs_zero_remaining_bytes( if (endoff > XFS_ISIZE(ip)) endoff = XFS_ISIZE(ip); - bp = xfs_buf_get_uncached(XFS_IS_REALTIME_INODE(ip) ? - mp->m_rtdev_targp : mp->m_ddev_targp, - BTOBB(mp->m_sb.sb_blocksize), 0); - if (!bp) - return -ENOMEM; - - xfs_buf_unlock(bp); - for (offset = startoff; offset <= endoff; offset = lastoffset + 1) { uint lock_mode; @@ -1152,42 +1144,26 @@ xfs_zero_remaining_bytes( ASSERT(imap.br_startblock != DELAYSTARTBLOCK); if (imap.br_state == XFS_EXT_UNWRITTEN) continue; - XFS_BUF_UNDONE(bp); - XFS_BUF_UNWRITE(bp); - XFS_BUF_READ(bp); - XFS_BUF_SET_ADDR(bp, xfs_fsb_to_db(ip, imap.br_startblock)); - if (XFS_FORCED_SHUTDOWN(mp)) { - error = -EIO; - break; - } - xfs_buf_iorequest(bp); - error = xfs_buf_iowait(bp); - if (error) { - xfs_buf_ioerror_alert(bp, - "xfs_zero_remaining_bytes(read)"); - break; + bp = xfs_buf_read_uncached(XFS_IS_REALTIME_INODE(ip) ? + mp->m_rtdev_targp : mp->m_ddev_targp, + xfs_fsb_to_db(ip, imap.br_startblock), + BTOBB(mp->m_sb.sb_blocksize), + 0, NULL); + if (!bp) + return -ENOMEM; + if (bp->b_error) { + error = bp->b_error; + xfs_buf_relse(bp); + return error; } + memset(bp->b_addr + (offset - XFS_FSB_TO_B(mp, imap.br_startoff)), 0, lastoffset - offset + 1); - XFS_BUF_UNDONE(bp); - XFS_BUF_UNREAD(bp); - XFS_BUF_WRITE(bp); - if (XFS_FORCED_SHUTDOWN(mp)) { - error = -EIO; - break; - } - xfs_buf_iorequest(bp); - error = xfs_buf_iowait(bp); - if (error) { - xfs_buf_ioerror_alert(bp, - "xfs_zero_remaining_bytes(write)"); - break; - } + xfs_bwrite(bp); } - xfs_buf_free(bp); return error; } From webmaster@dev102.magizz.com Sat Aug 16 04:46: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=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 13E077F37 for ; Sat, 16 Aug 2014 04: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 E7822304032 for ; Sat, 16 Aug 2014 02:46:50 -0700 (PDT) X-ASG-Debug-ID: 1408182407-04cb6c54fd4e580001-NocioJ Received: from vps.magizz.com (vps.magizz.com [162.251.83.157]) by cuda.sgi.com with ESMTP id BBxETQbeGNQ4bxqZ (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Sat, 16 Aug 2014 02:46:47 -0700 (PDT) X-Barracuda-Envelope-From: webmaster@dev102.magizz.com X-Barracuda-Apparent-Source-IP: 162.251.83.157 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=dev102.magizz.com; s=default; h=Content-Type:Content-Transfer-Encoding:MIME-Version:List-Unsubscribe:Message-ID:Reply-To:From:Date:Subject:To; bh=/ghb0Pe4at666Uy2r6SBKlGrOhAhRojJ8HljdVVdRyI=; b=GdUbkyMcc+UUwLLYQotTMAZaEF2YeA1YvlCVEfrORaOTZZLH/5gF6ePPmmsE0Mkhzqe9MDKdwK1EBAZehpiDeQWqTp4KPtu9Qnx9aTsZS3XUGtE0BrlNGXe3WyiW8Qd5jZ00vckacGAtphB6xUzijgSHEYv5OgUuR+V2cnkJkKI=; Received: from dev102magizz by vps.magizz.com with local (Exim 4.82) (envelope-from ) id 1XIaZV-0002sj-KS for xfs@oss.sgi.com; Sat, 16 Aug 2014 13:46:49 +0400 To: xfs@oss.sgi.com Subject: Goodbye from our newsletter X-PHP-Script: dev102.magizz.com/mailz/index.php for 66.249.65.46 X-ASG-Orig-Subj: Goodbye from our newsletter Received: from crawl-66-249-65-46.googlebot.com [66.249.65.46] by dev102.magizz.com with HTTP; Sat, 16 Aug 2014 09:46:49 +0000 Date: Sat, 16 Aug 2014 09:46:49 +0000 From: Webmaster Reply-To: Webmaster Message-ID: <2d92b8a7a030a56ebd1280f341c28df6@dev102.magizz.com> X-Priority: 3 X-Mailer: PHPMailer 5.2.5 (https://github.com/Synchro/PHPMailer/) X-phpList-version: 3.0.6 X-MessageID: systemmessage X-ListMember: xfs@oss.sgi.com Precedence: bulk Bounces-To: webmaster@dev102.magizz.com List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Content-Type: text/plain; charset=UTF-8 X-AntiAbuse: This header was added to track abuse, please include it with any abuse report X-AntiAbuse: Primary Hostname - vps.magizz.com X-AntiAbuse: Original Domain - oss.sgi.com X-AntiAbuse: Originator/Caller UID/GID - [503 514] / [47 12] X-AntiAbuse: Sender Address Domain - dev102.magizz.com X-Get-Message-Sender-Via: vps.magizz.com: authenticated_id: dev102magizz/from_h X-Barracuda-Connect: vps.magizz.com[162.251.83.157] X-Barracuda-Start-Time: 1408182407 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.8504 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature Goodbye from our Newsletter, sorry to see you go. You have been unsubscribed from our newsletters. This is the last email you will receive from us. Our newsletter system, phpList, will refuse to send you any further messages, without manual intervention by our administrator. If there is an error in this information, you can re-subscribe: please go to http://dev102.magizz.com/mailz/?p=subscribe and follow the steps. Thank you From webmaster@dev101.magizz.com Sat Aug 16 20: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=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 C1EE87F47 for ; Sat, 16 Aug 2014 20:45:02 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id A1D758F8033 for ; Sat, 16 Aug 2014 18:44:59 -0700 (PDT) X-ASG-Debug-ID: 1408239891-04bdf010a102100001-NocioJ Received: from vps.magizz.com (vps.magizz.com [162.251.83.157]) by cuda.sgi.com with ESMTP id 3Haf4sYsjB33yLVB (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Sat, 16 Aug 2014 18:44:52 -0700 (PDT) X-Barracuda-Envelope-From: webmaster@dev101.magizz.com X-Barracuda-Apparent-Source-IP: 162.251.83.157 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=dev101.magizz.com; s=default; h=Content-Type:Content-Transfer-Encoding:MIME-Version:List-Unsubscribe:Message-ID:Reply-To:From:Date:Subject:To; bh=FvGqhmwKkD9ctnKfevRMDEc+ge/0eMcQoO8DbitSmE4=; b=t91H767LR7IHd7YW3KqVsUUP24QcleQ+bnt/054AaAdyTR165tYqipAQo931x0RzKKHjdjbjiIMTWz/Or2RPeXKyFOw7kySu9XmC6bIRuGmu/NwCdrwjGVldAnOCZ0H4Uwq/XGOHbS2c665MSSw1X/XPFduLnI1+5NAQ/CUECyw=; Received: from dev101magizz by vps.magizz.com with local (Exim 4.82) (envelope-from ) id 1XIpWg-0001Vj-0T for xfs@oss.sgi.com; Sun, 17 Aug 2014 05:44:54 +0400 To: xfs@oss.sgi.com Subject: Goodbye from our newsletter X-PHP-Script: dev101.magizz.com/mailz/index.php for 66.249.65.17 X-ASG-Orig-Subj: Goodbye from our newsletter Received: from crawl-66-249-65-17.googlebot.com [66.249.65.17] by dev101.magizz.com with HTTP; Sun, 17 Aug 2014 01:44:53 +0000 Date: Sun, 17 Aug 2014 01:44:53 +0000 From: Webmaster Reply-To: Webmaster Message-ID: <2e1262d12a75b011baaaee9e7aae434e@dev101.magizz.com> X-Priority: 3 X-Mailer: PHPMailer 5.2.5 (https://github.com/Synchro/PHPMailer/) X-phpList-version: 3.0.6 X-MessageID: systemmessage X-ListMember: xfs@oss.sgi.com Precedence: bulk Bounces-To: webmaster@dev101.magizz.com List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Content-Type: text/plain; charset=UTF-8 X-AntiAbuse: This header was added to track abuse, please include it with any abuse report X-AntiAbuse: Primary Hostname - vps.magizz.com X-AntiAbuse: Original Domain - oss.sgi.com X-AntiAbuse: Originator/Caller UID/GID - [502 513] / [47 12] X-AntiAbuse: Sender Address Domain - dev101.magizz.com X-Get-Message-Sender-Via: vps.magizz.com: authenticated_id: dev101magizz/from_h X-Barracuda-Connect: vps.magizz.com[162.251.83.157] X-Barracuda-Start-Time: 1408239892 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 X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.8526 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature Goodbye from our Newsletter, sorry to see you go. You have been unsubscribed from our newsletters. This is the last email you will receive from us. Our newsletter system, phpList, will refuse to send you any further messages, without manual intervention by our administrator. If there is an error in this information, you can re-subscribe: please go to http://dev101.magizz.com/mailz/?p=subscribe and follow the steps. Thank you From prithvi_rathore@outlook.com Sat Aug 16 21:06: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,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 D11CE7F47 for ; Sat, 16 Aug 2014 21:06:14 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id BF7268F8033 for ; Sat, 16 Aug 2014 19:06:11 -0700 (PDT) X-ASG-Debug-ID: 1408241166-04cb6c55006cc20001-NocioJ Received: from BLU004-OMC4S29.hotmail.com (blu004-omc4s29.hotmail.com [65.55.111.168]) by cuda.sgi.com with ESMTP id au8XEGsNuF2EfuC3 (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO) for ; Sat, 16 Aug 2014 19:06:06 -0700 (PDT) X-Barracuda-Envelope-From: prithvi_rathore@outlook.com X-Barracuda-Apparent-Source-IP: 65.55.111.168 Received: from BLU181-W30 ([65.55.111.135]) by BLU004-OMC4S29.hotmail.com with Microsoft SMTPSVC(7.5.7601.22712); Sat, 16 Aug 2014 19:06:06 -0700 X-TMN: [U+ozJsiDrQX6HTzzU9iliibds/uwX4uF] X-Originating-Email: [prithvi_rathore@outlook.com] Message-ID: Content-Type: multipart/alternative; boundary="_cc8907e2-2e31-4777-be6f-9f00e35dd3e4_" From: Prithvi Rathore To: "xfs@oss.sgi.com" Subject: Help setting up XFS Date: Sun, 17 Aug 2014 07:36:06 +0530 X-ASG-Orig-Subj: Help setting up XFS Importance: Normal MIME-Version: 1.0 X-OriginalArrivalTime: 17 Aug 2014 02:06:06.0345 (UTC) FILETIME=[CE065F90:01CFB9BF] X-Barracuda-Connect: blu004-omc4s29.hotmail.com[65.55.111.168] X-Barracuda-Start-Time: 1408241166 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=HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.8526 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 HTML_MESSAGE BODY: HTML included in message --_cc8907e2-2e31-4777-be6f-9f00e35dd3e4_ Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable Hi=2C I am a student currently pursuing my under-graduation and would lo= ve to use XFS. I believe it has a lot to offer and I Iook forwarding to tes= ting and using it on an external device like a pen-drive (USB) for starters= . I was a bit confused on how to set up XFS. I am currently using Ubuntu= 14.04 dual boot (via rEFInd) with Mac OS X on MacBook Air 2013. The va= rious documentation available at xfs.org=2C surely is very informative and = provides an elaborate description on XFS features. Setting XFS up however i= s where i am a bit stuck. From the various online material available=2C I f= ound the following ways: 1) From terminal # sudo apt-get install xfsprogs # sudo apt-get in= stall xfsdump I believe it sets up the version 3.1.9. 2) Another method was=2C that i tried was downloading the tar file from the= sgi link. It downloaded xfs-progs- 3.2.1.tar.gz =20 3) From various discussions done online i found people changing a few setti= ngs in the $ make menuconfig GUI screen=2C hence adding support for XFS= . I am also a bit confused on how to use the device name (USB pen drive) w= hen i will run the mkfs.xfs as I heard it doesn't work for a mounted device= . I know you may be busy and my mail might seem a bit amateur=2C but I wou= ld really appreciate if you could guide me on how to setup XFS and run it f= or a USB device. Any link explaining the same would also be really apprecia= ted. Thank you. Warm Regards = --_cc8907e2-2e31-4777-be6f-9f00e35dd3e4_ Content-Type: text/html; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable
Hi=2C
 =3B &n= bsp=3B I am a student currently pursuing my under-graduation and would love= to use XFS. I believe it has a lot to offer and I Iook forwarding to testi= ng and using it on an external device like a pen-drive (USB) for starters.<= /div>
 =3B  =3B I was a bit confused on how to set up XFS. I am= currently using Ubuntu 14.04 dual boot (via rEFInd) with Mac OS X on MacBo= ok Air 2013. =3B
 =3B  =3B The various documentation = available at xfs.org=2C surely is very informative and provides an elaborat= e description on XFS features. Setting XFS up however is where i am a bit s= tuck. From the various online material available=2C I found the following w= ays:

1) From terminal
 =3B  =3B =  =3B# sudo apt-get install xfsprogs =3B
 =3B  =3B=  =3B# sudo apt-get install xfsdump
 =3B  =3B I belie= ve it sets up the version 3.1.9.

2) Another method= was=2C that i tried was downloading the tar file from the sgi link. It dow= nloaded xfs-progs-  =3B =3B
 =3B  =3B 3.2.1.tar.g= z  =3B =3B

3) From various discussions don= e online i found people changing a few settings in the $ make menuconfig GU= I =3B
 =3B  =3B screen=2C hence adding support for XF= S.

 =3B  =3BI am also a bit confused on ho= w to use the device name (USB pen drive) when i will run the mkfs.xfs as I = heard it doesn't work for a mounted device.
 =3B I know you m= ay be busy and my mail might seem a bit amateur=2C but I would really appre= ciate if you could guide me on how to setup XFS and run it for a USB device= . Any link explaining the same would also be really appreciated. Thank you.=

Warm Regards
= --_cc8907e2-2e31-4777-be6f-9f00e35dd3e4_-- From root@krios.tbi.univie.ac.at Sat Aug 16 23:25: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 D55917F4E for ; Sat, 16 Aug 2014 23:25:08 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id B555A3040BB for ; Sat, 16 Aug 2014 21:25:08 -0700 (PDT) X-ASG-Debug-ID: 1408249505-04bdf0109a06970001-NocioJ Received: from krios.tbi.univie.ac.at (krios.tbi.univie.ac.at [131.130.44.60]) by cuda.sgi.com with ESMTP id 0lxi2keh6xrVUq0O for ; Sat, 16 Aug 2014 21:25:06 -0700 (PDT) X-Barracuda-Envelope-From: root@krios.tbi.univie.ac.at X-Barracuda-Apparent-Source-IP: 131.130.44.60 Received: by krios.tbi.univie.ac.at (Postfix) id 0BABC5F458; Sun, 17 Aug 2014 06:25:03 +0200 (CEST) Delivered-To: root@krios.tbi.univie.ac.at Received: by krios.tbi.univie.ac.at (Postfix, from userid 0) id F12F35F4E2; Sun, 17 Aug 2014 06:25:02 +0200 (CEST) From: root@krios.tbi.univie.ac.at (Cron Daemon) To: root@krios.tbi.univie.ac.at Subject: Cron test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily ) Content-Type: text/plain; charset=UTF-8 X-ASG-Orig-Subj: Cron test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily ) X-Cron-Env: X-Cron-Env: X-Cron-Env: X-Cron-Env: Message-Id: <20140817042502.F12F35F4E2@krios.tbi.univie.ac.at> Date: Sun, 17 Aug 2014 06:25:02 +0200 (CEST) X-Barracuda-Connect: krios.tbi.univie.ac.at[131.130.44.60] X-Barracuda-Start-Time: 1408249506 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.70 X-Barracuda-Spam-Status: No, SCORE=0.70 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, BSF_SC0_SA_TO_FROM_ADDR_MATCH, PR0N_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.8530 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) 0.50 BSF_SC0_SA_TO_FROM_ADDR_MATCH Sender Address Matches Recipient Address /etc/cron.daily/logrotate: error: error opening /home/git/gitlab/log/application.log: Permission denied error: error opening /home/git/gitlab/log/githost.log: Permission denied error: error opening /home/git/gitlab/log/production.log: Permission denied error: error opening /home/git/gitlab/log/satellites.log: Permission denied error: error opening /home/git/gitlab/log/sidekiq.log: Permission denied error: error opening /home/git/gitlab/log/unicorn.stderr.log: Permission denied error: error opening /home/git/gitlab/log/unicorn.stdout.log: Permission denied error: error opening /home/git/gitlab-shell/gitlab-shell.log: Permission denied run-parts: /etc/cron.daily/logrotate exited with return code 1 From webmaster@dev103.magizz.com Sun Aug 17 00:44: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 (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 878CC7F50 for ; Sun, 17 Aug 2014 00:44:50 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 2332AAC002 for ; Sat, 16 Aug 2014 22:44:46 -0700 (PDT) X-ASG-Debug-ID: 1408254283-04bdf0109a087a0001-NocioJ Received: from vps.magizz.com (vps.magizz.com [162.251.83.157]) by cuda.sgi.com with ESMTP id NtLD5RNvYMGFL39c (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Sat, 16 Aug 2014 22:44:44 -0700 (PDT) X-Barracuda-Envelope-From: webmaster@dev103.magizz.com X-Barracuda-Apparent-Source-IP: 162.251.83.157 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=dev103.magizz.com; s=default; h=Content-Type:Content-Transfer-Encoding:MIME-Version:List-Unsubscribe:Message-ID:Reply-To:From:Date:Subject:To; bh=vdvUR47Hj9QJeV+I4hO9vbQExRMpEuj+NHP641YsaSM=; b=cfNCAUulWDfMWvP/bDTM/sd9Nvy2Yqyg2vXS4j3bZJ2/EuWH/E5wU/QqlEOUEVUKTj16k9uRY7ABxzPKGeXOqB3x9VpQuGdM9kNX1bnFqrue2oDUXV/e1N7/qczGQp/T97zQaRBGYdCJNbT5998mRYoNmufBnGmJ5GntW3z098k=; Received: from dev103magizz by vps.magizz.com with local (Exim 4.82) (envelope-from ) id 1XItGo-0001ra-Cs for xfs@oss.sgi.com; Sun, 17 Aug 2014 09:44:46 +0400 To: xfs@oss.sgi.com Subject: Goodbye from our newsletter X-PHP-Script: dev103.magizz.com/mailz/index.php for 66.249.65.54 X-ASG-Orig-Subj: Goodbye from our newsletter Received: from crawl-66-249-65-54.googlebot.com [66.249.65.54] by dev103.magizz.com with HTTP; Sun, 17 Aug 2014 05:44:44 +0000 Date: Sun, 17 Aug 2014 05:44:46 +0000 From: Webmaster Reply-To: Webmaster Message-ID: X-Priority: 3 X-Mailer: PHPMailer 5.2.5 (https://github.com/Synchro/PHPMailer/) X-phpList-version: 3.0.6 X-MessageID: systemmessage X-ListMember: xfs@oss.sgi.com Precedence: bulk Bounces-To: webmaster@dev103.magizz.com List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Content-Type: text/plain; charset=UTF-8 X-AntiAbuse: This header was added to track abuse, please include it with any abuse report X-AntiAbuse: Primary Hostname - vps.magizz.com X-AntiAbuse: Original Domain - oss.sgi.com X-AntiAbuse: Originator/Caller UID/GID - [506 517] / [47 12] X-AntiAbuse: Sender Address Domain - dev103.magizz.com X-Get-Message-Sender-Via: vps.magizz.com: authenticated_id: dev103magizz/from_h X-Barracuda-Connect: vps.magizz.com[162.251.83.157] X-Barracuda-Start-Time: 1408254284 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 X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.8531 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature Goodbye from our Newsletter, sorry to see you go. You have been unsubscribed from our newsletters. This is the last email you will receive from us. Our newsletter system, phpList, will refuse to send you any further messages, without manual intervention by our administrator. If there is an error in this information, you can re-subscribe: please go to http://dev103.magizz.com/mailz/?p=subscribe and follow the steps. Thank you From sandeen@sandeen.net Sun Aug 17 13:21: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 D2EBC7F3F for ; Sun, 17 Aug 2014 13:21:26 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id A3C988F8037 for ; Sun, 17 Aug 2014 11:21:23 -0700 (PDT) X-ASG-Debug-ID: 1408299677-04bdf010a11bf60001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id rSEtW7pzVAv9cJcZ for ; Sun, 17 Aug 2014 11:21: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 F14DE63C3BD2; Sun, 17 Aug 2014 13:21:16 -0500 (CDT) Message-ID: <53F0F29C.3080707@sandeen.net> Date: Sun, 17 Aug 2014 13:21:16 -0500 From: Eric Sandeen MIME-Version: 1.0 To: Prithvi Rathore , "xfs@oss.sgi.com" Subject: Re: Help setting up XFS References: X-ASG-Orig-Subj: Re: Help setting up XFS In-Reply-To: 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: 1408299677 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.8549 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- You don't yet need xfs-specific information, I think you need some very basic linux help. There is a lot of it out there if you look, for example: https://www.google.com/search?q=how+to+format+a+usb+drive+with+linux -Eric On 8/16/14, 9:06 PM, Prithvi Rathore wrote: > Hi, > I am a student currently pursuing my under-graduation and would love to use XFS. I believe it has a lot to offer and I Iook forwarding to testing and using it on an external device like a pen-drive (USB) for starters. > I was a bit confused on how to set up XFS. I am currently using Ubuntu 14.04 dual boot (via rEFInd) with Mac OS X on MacBook Air 2013. > The various documentation available at xfs.org, surely is very informative and provides an elaborate description on XFS features. Setting XFS up however is where i am a bit stuck. From the various online material available, I found the following ways: > > 1) From terminal > # sudo apt-get install xfsprogs > # sudo apt-get install xfsdump > I believe it sets up the version 3.1.9. > > 2) Another method was, that i tried was downloading the tar file from the sgi link. It downloaded xfs-progs- > 3.2.1.tar.gz > > 3) From various discussions done online i found people changing a few settings in the $ make menuconfig GUI > screen, hence adding support for XFS. > > I am also a bit confused on how to use the device name (USB pen drive) when i will run the mkfs.xfs as I heard it doesn't work for a mounted device. > I know you may be busy and my mail might seem a bit amateur, but I would really appreciate if you could guide me on how to setup XFS and run it for a USB device. Any link explaining the same would also be really appreciated. Thank you. > > Warm Regards > > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs > From mlsemon35@gmail.com Sun Aug 17 21:03: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.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 8F7137F3F for ; Sun, 17 Aug 2014 21:03:44 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 7B867304043 for ; Sun, 17 Aug 2014 19:03:41 -0700 (PDT) X-ASG-Debug-ID: 1408327416-04cb6c54fe884a0001-NocioJ Received: from mail-yk0-f179.google.com (mail-yk0-f179.google.com [209.85.160.179]) by cuda.sgi.com with ESMTP id WvZuwiWjPSo2sUYs (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Sun, 17 Aug 2014 19:03:36 -0700 (PDT) X-Barracuda-Envelope-From: mlsemon35@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.160.179 X-Barracuda-IPDD: Level1 [gmail.com/209.85.160.179] Received: by mail-yk0-f179.google.com with SMTP id 142so3821263ykq.38 for ; Sun, 17 Aug 2014 19:03:36 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.160.179] X-Barracuda-IPDD: Level1 [gmail.com/209.85.160.179] 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=SUl6LECrmILOnnRpjgH78o70tv2LLPlW7QCvjZspbck=; b=JkK1sVzVzJV5yr11lyhY8Cj9WNFJEF/1HRyNtgu+YX8Dr998RdmLCJXvikNA4FcDNa fRcOs9ts8wFFufFq9tUKeX4OYSZkUHfRzo4n1Mew1e8Wx63gdD5DJcb4SNdZrNq/P2jM DUMWYC8IMum8OuugJE2JIAJmVzJUdbqAoejjo9XOXcm5o0CRh0XtviUo+vanoT0eqA82 x85AtORhegjcE9M0TY+fPGdwK1qMExbAZnYqfsJBr2u9GVm+rUYK9C/IrxN/7u6A8zHf BpLXG2srg26ebRnG80Vg1AqFqjIvaqptGBKJAP3yfWV8xDYlBOvvcivAHOHjGCZmbumK ekgw== X-Received: by 10.236.135.212 with SMTP id u60mr1133415yhi.118.1408327416245; Sun, 17 Aug 2014 19:03:36 -0700 (PDT) Received: from yholen.semon.net (rrcs-97-76-23-49.se.biz.rr.com. [97.76.23.49]) by mx.google.com with ESMTPSA id m23sm180876yhi.44.2014.08.17.19.03.35 for (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sun, 17 Aug 2014 19:03:35 -0700 (PDT) Message-ID: <53F15EEF.4090308@gmail.com> Date: Sun, 17 Aug 2014 22:03:27 -0400 From: "Michael L. Semon" User-Agent: Mozilla/5.0 (X11; FreeBSD amd64; rv:31.0) Gecko/20100101 Thunderbird/31.0 MIME-Version: 1.0 To: "xfs@oss.sgi.com" Subject: xfsdump completes very prematurely in low RAM, commit found Content-Type: text/plain; charset=utf-8; format=flowed X-ASG-Orig-Subj: xfsdump completes very prematurely in low RAM, commit found Content-Transfer-Encoding: 7bit X-Barracuda-Connect: mail-yk0-f179.google.com[209.85.160.179] X-Barracuda-Start-Time: 1408327416 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.8562 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! I had some phantom issues that are chasing me through this 3.17 merge window period. While chasing those issues, I decided to do an xfsdump of a v5/finobt XFS system rescued from PEBKAC issues. The xfsdump completed rather prematurely, ending like this test case output... xfsdump: dumping special file ino 4194523 mode 0x21b0 xfsdump: dumping special file ino 4194524 mode 0x21b0 xfsdump: dumping special file ino 4194525 mode 0x21b0 xfsdump: dumping special file ino 4194526 mode 0x21b0 xfsdump: dumping special file ino 4194527 mode 0x21b0 xfsdump: ending media file xfsdump: media file size 4512992 bytes xfsdump: ending stream: 23 seconds elapsed xfsdump: dump size (non-dir files) : 4452088 bytes xfsdump: dump complete: 23 seconds elapsed xfsdump: Dump Summary: xfsdump: stream 0 /mnt/xfstests-scratch/blah.0.dump OK (success) xfsdump: Dump Status: SUCCESS That looks fine for a lack of obvious error messages. However, it should end like this: xfsdump: dumping regular file ino 13653551 offset 0 to offset 12154 (size 12154) xfsdump: dumping regular file ino 13653555 offset 0 to offset 16554 (size 16554) xfsdump: dumping regular file ino 13653556 offset 0 to offset 185 (size 185) xfsdump: dumping regular file ino 13653557 offset 0 to offset 471 (size 471) xfsdump: dumping special file ino 13653558 mode 0xa1ff xfsdump: ending media file xfsdump: media file size 1999127056 bytes xfsdump: ending stream: 465 seconds elapsed xfsdump: dump size (non-dir files) : 1963549104 bytes xfsdump: dump complete: 465 seconds elapsed xfsdump: Dump Summary: xfsdump: stream 0 /mnt/xfstests-scratch/blah.0.dump OK (success) xfsdump: Dump Status: SUCCESS Note that I haven't freed enough time to check this on v4-superblock XFS. I've tested v5 and v5/finobt XFS filesystems, 4k block size, no external logdev or rtdev. The earliest kernel tested was an old 3.16.0-rc2 kernel left lying around referenced by lilo.conf, and that kernel was OK. Not sure if this kernel has XFS quota support in it, need to recheck. The test commands, meant to back up $TEST_DEV to $SCRATCH_DEV, was this: #!/bin/sh mount $TEST_DEV $TEST_DIR mount $SCRATCH_DEV $SCRATCH_MNT rm -v $SCRATCH_MNT/blah.0.dump xfsdump -v 2 -l 0 -L tl -M tm -f $SCRATCH_MNT/blah.0.dump $TEST_DEV Bisect brought me here: root@oldsvrhw:/usr/src/kernel-git/linux# git bisect bad c7cb51dcb0a38624d42eeabb38502fa54a4d774b is the first bad commit commit c7cb51dcb0a38624d42eeabb38502fa54a4d774b Author: Jie Liu Date: Thu Jul 24 12:18:47 2014 +1000 xfs: fix error handling at xfs_inumbers 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. Signed-off-by: Jie Liu Reviewed-by: Dave Chinner Signed-off-by: Dave Chinner :040000 040000 ec78dc86468ee00df7a63bba97a135b8c6a84a95 2e447774a8f85b1b8d43ffa9fd28cbea3402d717 M fs Maybe Jeff's patch is doing its job. After all, on several successful test runs, the kernel was sending messages like (paraphrased) "BUG: bad state in page table" to remote syslog. The Pentium III PC has too little memory (512 MB) to do this job. However, I think that the xfsdump should last more than 23 seconds before causing issues. Might someone try an xfsdump or two to see if this are still working to most people's satisfaction, on a kernel past 3.16.0-rc2 that has this commit in it? Thanks! Michael [Full xfsdump for the failed case is below:] xfsdump: using file dump (drive_simple) strategy xfsdump: version 3.1.4 (dump format 3.0) xfsdump: level 0 dump of oldsvrhw:/mnt/xfstests-test xfsdump: dump date: Sun Aug 17 20:11:48 2014 xfsdump: session id: 8bc58167-a96a-4628-9143-13fa7fb20df9 xfsdump: session label: "tl" xfsdump: ino map phase 1: constructing initial dump list xfsdump: ino map phase 2: skipping (no pruning necessary) xfsdump: ino map phase 3: skipping (only one dump stream) xfsdump: ino map construction complete xfsdump: estimated dump size: 2178363264 bytes xfsdump: creating dump session media file 0 (media 0, file 0) xfsdump: dumping ino map xfsdump: dumping directories xfsdump: dumping directory ino 96 xfsdump: dumping directory ino 99 xfsdump: dumping non-directory files xfsdump: dumping special file ino 100 mode 0xa1ff xfsdump: dumping regular file ino 101 offset 0 to offset 35680 (size 35680) xfsdump: dumping regular file ino 102 offset 0 to offset 4468 (size 4468) xfsdump: dumping regular file ino 103 offset 0 to offset 109680 (size 109680) xfsdump: dumping special file ino 104 mode 0xa1ff xfsdump: dumping regular file ino 105 offset 0 to offset 32192 (size 32192) xfsdump: dumping regular file ino 106 offset 0 to offset 24640 (size 24640) xfsdump: dumping regular file ino 107 offset 0 to offset 925012 (size 925012) xfsdump: dumping special file ino 108 mode 0xa1ff xfsdump: dumping special file ino 109 mode 0xa1ff xfsdump: dumping regular file ino 110 offset 0 to offset 29252 (size 29252) xfsdump: dumping regular file ino 111 offset 0 to offset 9824 (size 9824) xfsdump: dumping regular file ino 112 offset 0 to offset 47008 (size 47008) xfsdump: dumping regular file ino 113 offset 0 to offset 53888 (size 53888) xfsdump: dumping regular file ino 114 offset 0 to offset 55232 (size 55232) xfsdump: dumping regular file ino 115 offset 0 to offset 51776 (size 51776) xfsdump: dumping regular file ino 116 offset 0 to offset 57312 (size 57312) xfsdump: dumping regular file ino 117 offset 0 to offset 30592 (size 30592) xfsdump: dumping regular file ino 118 offset 0 to offset 26784 (size 26784) xfsdump: dumping regular file ino 119 offset 0 to offset 30528 (size 30528) xfsdump: dumping special file ino 120 mode 0xa1ff xfsdump: dumping regular file ino 121 offset 0 to offset 129152 (size 129152) xfsdump: dumping regular file ino 122 offset 0 to offset 134348 (size 134348) xfsdump: dumping special file ino 123 mode 0xa1ff xfsdump: dumping regular file ino 124 offset 0 to offset 110432 (size 110432) xfsdump: dumping regular file ino 125 offset 0 to offset 39072 (size 39072) xfsdump: dumping regular file ino 126 offset 0 to offset 56704 (size 56704) xfsdump: dumping regular file ino 127 offset 0 to offset 60804 (size 60804) xfsdump: dumping regular file ino 128 offset 0 to offset 100648 (size 100648) xfsdump: dumping regular file ino 129 offset 0 to offset 195400 (size 195400) xfsdump: dumping regular file ino 130 offset 0 to offset 115296 (size 115296) xfsdump: dumping regular file ino 131 offset 0 to offset 33344 (size 33344) xfsdump: dumping regular file ino 132 offset 0 to offset 24096 (size 24096) xfsdump: dumping regular file ino 133 offset 0 to offset 20260 (size 20260) xfsdump: dumping special file ino 134 mode 0xa1ff xfsdump: dumping special file ino 135 mode 0xa1ff xfsdump: dumping regular file ino 136 offset 0 to offset 108544 (size 108544) xfsdump: dumping regular file ino 137 offset 0 to offset 25376 (size 25376) xfsdump: dumping regular file ino 138 offset 0 to offset 43832 (size 43832) xfsdump: dumping regular file ino 139 offset 0 to offset 137504 (size 137504) xfsdump: dumping regular file ino 140 offset 0 to offset 24576 (size 24576) xfsdump: dumping regular file ino 141 offset 0 to offset 27360 (size 27360) xfsdump: dumping regular file ino 142 offset 0 to offset 102080 (size 102080) xfsdump: dumping regular file ino 143 offset 0 to offset 108416 (size 108416) xfsdump: dumping regular file ino 144 offset 0 to offset 22720 (size 22720) xfsdump: dumping regular file ino 145 offset 0 to offset 104480 (size 104480) xfsdump: dumping regular file ino 146 offset 0 to offset 35040 (size 35040) xfsdump: dumping regular file ino 147 offset 0 to offset 32096 (size 32096) xfsdump: dumping regular file ino 148 offset 0 to offset 26976 (size 26976) xfsdump: dumping regular file ino 149 offset 0 to offset 7004 (size 7004) xfsdump: dumping regular file ino 150 offset 0 to offset 66212 (size 66212) xfsdump: dumping regular file ino 151 offset 0 to offset 24276 (size 24276) xfsdump: dumping special file ino 152 mode 0xa1ff xfsdump: dumping regular file ino 153 offset 0 to offset 534580 (size 534580) xfsdump: dumping regular file ino 154 offset 0 to offset 9848 (size 9848) xfsdump: dumping special file ino 155 mode 0xa1ff xfsdump: dumping regular file ino 156 offset 0 to offset 359024 (size 359024) xfsdump: dumping regular file ino 157 offset 0 to offset 27136 (size 27136) xfsdump: dumping regular file ino 158 offset 0 to offset 2301 (size 2301) xfsdump: dumping regular file ino 159 offset 0 to offset 5927 (size 5927) xfsdump: dumping special file ino 4194464 mode 0x21b0 xfsdump: dumping special file ino 4194465 mode 0x21b0 xfsdump: dumping special file ino 4194466 mode 0x21b0 xfsdump: dumping special file ino 4194467 mode 0x21b0 xfsdump: dumping special file ino 4194468 mode 0x21b0 xfsdump: dumping special file ino 4194469 mode 0x21b0 xfsdump: dumping special file ino 4194470 mode 0x21b0 xfsdump: dumping special file ino 4194471 mode 0x21b0 xfsdump: dumping special file ino 4194472 mode 0x21b0 xfsdump: dumping special file ino 4194473 mode 0x21b0 xfsdump: dumping special file ino 4194474 mode 0x21b0 xfsdump: dumping special file ino 4194475 mode 0x21b0 xfsdump: dumping special file ino 4194476 mode 0x21b0 xfsdump: dumping special file ino 4194477 mode 0x21b0 xfsdump: dumping special file ino 4194478 mode 0x21b0 xfsdump: dumping special file ino 4194479 mode 0x21b0 xfsdump: dumping special file ino 4194480 mode 0x21b0 xfsdump: dumping special file ino 4194481 mode 0x21b0 xfsdump: dumping special file ino 4194482 mode 0x21b0 xfsdump: dumping special file ino 4194483 mode 0x21b0 xfsdump: dumping special file ino 4194484 mode 0x21b0 xfsdump: dumping special file ino 4194485 mode 0x21b0 xfsdump: dumping special file ino 4194486 mode 0x21b0 xfsdump: dumping special file ino 4194487 mode 0x21b0 xfsdump: dumping special file ino 4194488 mode 0x21b0 xfsdump: dumping special file ino 4194489 mode 0x21b0 xfsdump: dumping special file ino 4194490 mode 0x21b0 xfsdump: dumping special file ino 4194491 mode 0x21b0 xfsdump: dumping special file ino 4194492 mode 0x21b0 xfsdump: dumping special file ino 4194493 mode 0x21b0 xfsdump: dumping special file ino 4194494 mode 0x21b0 xfsdump: dumping special file ino 4194495 mode 0x21b0 xfsdump: dumping special file ino 4194496 mode 0x21b0 xfsdump: dumping special file ino 4194497 mode 0x21b0 xfsdump: dumping special file ino 4194498 mode 0x21b0 xfsdump: dumping special file ino 4194499 mode 0x21b0 xfsdump: dumping special file ino 4194500 mode 0x21b0 xfsdump: dumping special file ino 4194501 mode 0x21b0 xfsdump: dumping special file ino 4194502 mode 0x21b0 xfsdump: dumping special file ino 4194503 mode 0x21b0 xfsdump: dumping special file ino 4194504 mode 0x21b0 xfsdump: dumping special file ino 4194505 mode 0x21b0 xfsdump: dumping special file ino 4194506 mode 0x21b0 xfsdump: dumping special file ino 4194507 mode 0x21b0 xfsdump: dumping special file ino 4194508 mode 0x21b0 xfsdump: dumping special file ino 4194509 mode 0x21b0 xfsdump: dumping special file ino 4194510 mode 0x21b0 xfsdump: dumping special file ino 4194511 mode 0x21b0 xfsdump: dumping special file ino 4194512 mode 0x21b0 xfsdump: dumping special file ino 4194513 mode 0x21b0 xfsdump: dumping special file ino 4194514 mode 0x21b0 xfsdump: dumping special file ino 4194515 mode 0x21b0 xfsdump: dumping special file ino 4194516 mode 0x21b0 xfsdump: dumping special file ino 4194517 mode 0x21b0 xfsdump: dumping special file ino 4194518 mode 0x21b0 xfsdump: dumping special file ino 4194519 mode 0x21b0 xfsdump: dumping special file ino 4194520 mode 0x21b0 xfsdump: dumping special file ino 4194521 mode 0x21b0 xfsdump: dumping special file ino 4194522 mode 0x21b0 xfsdump: dumping special file ino 4194523 mode 0x21b0 xfsdump: dumping special file ino 4194524 mode 0x21b0 xfsdump: dumping special file ino 4194525 mode 0x21b0 xfsdump: dumping special file ino 4194526 mode 0x21b0 xfsdump: dumping special file ino 4194527 mode 0x21b0 xfsdump: ending media file xfsdump: media file size 4512992 bytes xfsdump: ending stream: 23 seconds elapsed xfsdump: dump size (non-dir files) : 4452088 bytes xfsdump: dump complete: 23 seconds elapsed xfsdump: Dump Summary: xfsdump: stream 0 /mnt/xfstests-scratch/blah.0.dump OK (success) xfsdump: Dump Status: SUCCESS From david@fromorbit.com Sun Aug 17 21:41: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 366F77F50 for ; Sun, 17 Aug 2014 21:41:21 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id C4C97AC001 for ; Sun, 17 Aug 2014 19:41:20 -0700 (PDT) X-ASG-Debug-ID: 1408329677-04bdf010a0270d0001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id NMCQQYGcT1kKIm5G for ; Sun, 17 Aug 2014 19:41:18 -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: AhURAKNm8VN5LDJ8PGdsb2JhbABZgw2BKoIshQeoAQEBAQMGnnyFewGBEBcFAQEBATg2hAMBAQQBOhwjBQsIAxQBAwklDwUlAwcaE4g6B8EnFxiFZIkdMweETAWcQZZnHoFuKy+CTwEBAQ Received: from ppp121-44-50-124.lns20.syd6.internode.on.net (HELO dastard) ([121.44.50.124]) by ipmail06.adl2.internode.on.net with ESMTP; 18 Aug 2014 12:11:16 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1XJCsk-0000on-Ub; Mon, 18 Aug 2014 12:41:14 +1000 Date: Mon, 18 Aug 2014 12:41:14 +1000 From: Dave Chinner To: "Michael L. Semon" Cc: "xfs@oss.sgi.com" Subject: Re: xfsdump completes very prematurely in low RAM, commit found Message-ID: <20140818024114.GK20518@dastard> X-ASG-Orig-Subj: Re: xfsdump completes very prematurely in low RAM, commit found References: <53F15EEF.4090308@gmail.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-Transfer-Encoding: quoted-printable In-Reply-To: <53F15EEF.4090308@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: 1408329678 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-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.8563 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Sun, Aug 17, 2014 at 10:03:27PM -0400, Michael L. Semon wrote: > Hi! I had some phantom issues that are chasing me through this 3.17 > merge window period. While chasing those issues, I decided to do an > xfsdump of a v5/finobt XFS system rescued from PEBKAC issues. The > xfsdump completed rather prematurely, ending like this test case > output... >=20 > xfsdump: dumping special file ino 4194523 mode 0x21b0 > xfsdump: dumping special file ino 4194524 mode 0x21b0 > xfsdump: dumping special file ino 4194525 mode 0x21b0 > xfsdump: dumping special file ino 4194526 mode 0x21b0 > xfsdump: dumping special file ino 4194527 mode 0x21b0 > xfsdump: ending media file > xfsdump: media file size 4512992 bytes > xfsdump: ending stream: 23 seconds elapsed > xfsdump: dump size (non-dir files) : 4452088 bytes > xfsdump: dump complete: 23 seconds elapsed > xfsdump: Dump Summary: > xfsdump: stream 0 /mnt/xfstests-scratch/blah.0.dump OK (success) > xfsdump: Dump Status: SUCCESS >=20 > That looks fine for a lack of obvious error messages. However, it > should end like this: >=20 > xfsdump: dumping regular file ino 13653551 offset 0 to offset 12154 (size= 12154) > xfsdump: dumping regular file ino 13653555 offset 0 to offset 16554 (size= 16554) > xfsdump: dumping regular file ino 13653556 offset 0 to offset 185 (size 1= 85) > xfsdump: dumping regular file ino 13653557 offset 0 to offset 471 (size 4= 71) > xfsdump: dumping special file ino 13653558 mode 0xa1ff > xfsdump: ending media file > xfsdump: media file size 1999127056 bytes > xfsdump: ending stream: 465 seconds elapsed > xfsdump: dump size (non-dir files) : 1963549104 bytes > xfsdump: dump complete: 465 seconds elapsed > xfsdump: Dump Summary: > xfsdump: stream 0 /mnt/xfstests-scratch/blah.0.dump OK (success) > xfsdump: Dump Status: SUCCESS What's the inode number progression of a successful dump at the point at which the incomplete dump ends? i.e. around inode 4194527? That number is one inode chunk short of 2^22, which implies that there is a failure or some kind moving from one AG to the next. The progrssion of inode numbers will tell me whether this is the case or not... > Bisect brought me here: >=20 > root@oldsvrhw:/usr/src/kernel-git/linux# git bisect bad > c7cb51dcb0a38624d42eeabb38502fa54a4d774b is the first bad commit > =1B[33mcommit c7cb51dcb0a38624d42eeabb38502fa54a4d774b=1B[m > Author: Jie Liu > Date: Thu Jul 24 12:18:47 2014 +1000 >=20 > xfs: fix error handling at xfs_inumbers > 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. > Signed-off-by: Jie Liu > Reviewed-by: Dave Chinner > Signed-off-by: Dave Chinner >=20 > :040000 040000 ec78dc86468ee00df7a63bba97a135b8c6a84a95 2e447774a8f85b1b8= d43ffa9fd28cbea3402d717 M fs >=20 > Maybe Jeff's patch is doing its job. After all, on several successful > test runs, the kernel was sending messages like (paraphrased) "BUG: bad > state in page table" to remote syslog. The Pentium III PC has too > little memory (512 MB) to do this job. However, I think that the > xfsdump should last more than 23 seconds before causing issues. Memory should not matter for counting the number of inodes or extracting them from the kernel. Cheers, Dave. --=20 Dave Chinner david@fromorbit.com From stan@hardwarefreak.com Sun Aug 17 22:29: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 631367F54 for ; Sun, 17 Aug 2014 22:29:29 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 42F318F8037 for ; Sun, 17 Aug 2014 20:29:26 -0700 (PDT) X-ASG-Debug-ID: 1408332561-04cbb054879cac0001-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 Cu3E0fiuYkI5IsMQ for ; Sun, 17 Aug 2014 20:29:22 -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: by greer.hardwarefreak.com (Postfix, from userid 33) id 874046C190; Sun, 17 Aug 2014 22:29:21 -0500 (CDT) To: Subject: inode64 directory placement determinism X-PHP-Originating-Script: 0:func.inc X-ASG-Orig-Subj: inode64 directory placement determinism MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Date: Sun, 17 Aug 2014 22:29:21 -0500 From: Stan Hoeppner Message-ID: X-Sender: stan@hardwarefreak.com User-Agent: RoundCube Webmail/0.3.1 X-Barracuda-Connect: mo-65-41-216-221.sta.embarqhsd.net[65.41.216.221] X-Barracuda-Start-Time: 1408332562 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Say I have a single 4TB disk in an md linear device. The md device has a filesystem on it formatted with defaults. It has 4 AGs, 0-3. I have created 4 directories. Each should reside in a different AG, the first in AG0. Now I expand the linear device with an identical 4TB disk and execute xfs_growfs. I now have 4 more AGs, 4-7. I create 4 more directories. Will these 4 new dirs be created sequentially in AGs 4-7, or in the first 4 AGs? Is this deterministic, or is there any chance involved? On the real system these 4TB drives are actually 48TB LUNs. I'm after deterministic parallel bandwidth to subsequently added RAIDs after each grow operation by simply writing to the proper directory. Currently we have kernel 3.4.26 to work with if that's relevant. I may be able to get the kernel team to go for 3.4.103 for the bugfixes, but I don't know about anything newer. This is an embedded type development process. Thanks, Stan From prithvi_rathore@outlook.com Sun Aug 17 23: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=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 (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id E349C7F56 for ; Sun, 17 Aug 2014 23:52:39 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id C033F8F8035 for ; Sun, 17 Aug 2014 21:52:39 -0700 (PDT) X-ASG-Debug-ID: 1408337557-04bdf010a12a4f0001-NocioJ Received: from BLU004-OMC4S37.hotmail.com (blu004-omc4s37.hotmail.com [65.55.111.176]) by cuda.sgi.com with ESMTP id 6LeH0OKxDw2wiGjO (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO) for ; Sun, 17 Aug 2014 21:52:38 -0700 (PDT) X-Barracuda-Envelope-From: prithvi_rathore@outlook.com X-Barracuda-Apparent-Source-IP: 65.55.111.176 Received: from BLU181-W36 ([65.55.111.136]) by BLU004-OMC4S37.hotmail.com with Microsoft SMTPSVC(7.5.7601.22712); Sun, 17 Aug 2014 21:52:37 -0700 X-TMN: [YXPO/1GegugaOCR4z+2anEJ31vcvjl+UuFrEC+G7L0M=] X-Originating-Email: [prithvi_rathore@outlook.com] Message-ID: Content-Type: multipart/alternative; boundary="_778d5abc-5bb2-43e2-80ee-7e747e57d65a_" From: Prithvi Rathore To: Subject: [RFD]: Help in setting up XFS Date: Mon, 18 Aug 2014 10:22:37 +0530 X-ASG-Orig-Subj: [RFD]: Help in setting up XFS Importance: Normal MIME-Version: 1.0 X-OriginalArrivalTime: 18 Aug 2014 04:52:37.0529 (UTC) FILETIME=[3BA5D090:01CFBAA0] X-Barracuda-Connect: blu004-omc4s37.hotmail.com[65.55.111.176] X-Barracuda-Start-Time: 1408337558 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=HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.8566 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 HTML_MESSAGE BODY: HTML included in message --_778d5abc-5bb2-43e2-80ee-7e747e57d65a_ Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable Hi=2C As the subject states=2C I would like to setup and use XFS on an external U= SB drive. I am currently using Ubuntu 14.04 on MacBook Air 2013. My understanding is: 1) I will have to install the packages $ sudo apt-get install xfsprogs $ sudo apt-get install xfsdump 2) I will have to create the filesystem for the USB drive $ mkfs.xfs -f dev/sdab1 -f option needed to overwrite any exisitng filesytem I would appreciate if you could add any comments or guide me for the same. = Thanking you in anticipation=20 = --_778d5abc-5bb2-43e2-80ee-7e747e57d65a_ Content-Type: text/html; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable
Hi=2C
As the subject states= =2C I would like to setup and use XFS on an external USB drive. I am curren= tly using Ubuntu 14.04 on MacBook Air 2013.
My understanding is:

= 1) I will have to install the packages
$ sudo apt-get install xfsprogs$ sudo apt-get install xfsdump

2) I will have to create the filesy= stem for the USB drive
$ mkfs.xfs -f dev/sdab1
-f option needed to ov= erwrite any exisitng filesytem

I would appreciate if you could add a= ny comments or guide me for the same. Thanking you in anticipation
=
= --_778d5abc-5bb2-43e2-80ee-7e747e57d65a_-- From david@fromorbit.com Mon Aug 18 02:02: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 0D0AB7F56 for ; Mon, 18 Aug 2014 02:02:03 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id DA03F304062 for ; Mon, 18 Aug 2014 00:02:02 -0700 (PDT) X-ASG-Debug-ID: 1408345316-04bdf0109a2dab0001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id kbGMROBEgWgmBd9k for ; Mon, 18 Aug 2014 00:01: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: AhQRAD+k8VN5LDJ8PGdsb2JhbABZgw2BKoIshQeoBwEBAQMGnnyFewGBFRcFAQEBATg2hAMBAQQBOhwjBQsIAxgJJQ8FJQMHGhOIOgfBExcYhWSJUAeETAWcQZhzKy+CTwEBAQ Received: from ppp121-44-50-124.lns20.syd6.internode.on.net (HELO dastard) ([121.44.50.124]) by ipmail05.adl6.internode.on.net with ESMTP; 18 Aug 2014 16:31:55 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1XJGwz-0001JR-E6; Mon, 18 Aug 2014 17:01:53 +1000 Date: Mon, 18 Aug 2014 17:01:53 +1000 From: Dave Chinner To: Stan Hoeppner Cc: xfs@oss.sgi.com Subject: Re: inode64 directory placement determinism Message-ID: <20140818070153.GL20518@dastard> X-ASG-Orig-Subj: Re: inode64 directory placement determinism 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: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1408345316 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.8569 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Sun, Aug 17, 2014 at 10:29:21PM -0500, Stan Hoeppner wrote: > Say I have a single 4TB disk in an md linear device. The md device has a > filesystem on it formatted with defaults. It has 4 AGs, 0-3. I have > created 4 directories. Each should reside in a different AG, the first in > AG0. Now I expand the linear device with an identical 4TB disk and execute > xfs_growfs. I now have 4 more AGs, 4-7. I create 4 more directories. > > Will these 4 new dirs be created sequentially in AGs 4-7, or in the first > 4 AGs? Is this deterministic, or is there any chance involved? On the Deterministic, assuming single threaded *file-system-wide* directory creation. Completely unpredictable under concurrent directory creations. See xfs_ialloc_ag_select/xfs_ialloc_next_ag. Note that the rotor used to select the next AG is set to zero at mount. i.e. single threaded behaviour at agcount = 4: dir number rotor value destination AG 1 0 0 2 1 1 3 2 2 4 3 3 5 0 0 6 1 1 .... So, if you do what you suggest, and grow *after* the first 4 dirs are created, the above is what you'll get because the rotor goes back to zero on the fourth directory create. Now, with changing from 4 to 8 AGs after the first 4: dir number rotor value new inode location (AG) 1 0 0 2 1 1 3 2 2 4 3 3 5 0 0 6 1 1 7 2 2 8 3 3 9 4 4 10 5 5 11 6 6 13 7 7 14 0 0 > real system these 4TB drives are actually 48TB LUNs. I'm after > deterministic parallel bandwidth to subsequently added RAIDs after each > grow operation by simply writing to the proper directory. Just create new directories and use the inode number to determine their location. If the directory is not in the correct AG, remove it and create a new one, until you have directories located in the AGs you want. Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Mon Aug 18 02:03: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 1B6897F5A for ; Mon, 18 Aug 2014 02:03:16 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id EB1A7304032 for ; Mon, 18 Aug 2014 00:03:15 -0700 (PDT) X-ASG-Debug-ID: 1408345393-04bdf010a02db30001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id 48iE7WfVtMBDYEIH for ; Mon, 18 Aug 2014 00:03: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: AhMRAD+k8VN5LDJ8PGdsb2JhbABZgw2BKoIshQeoBwEBAQMGnnyFewGBFRcFAQEBATg2hAQBBTocIxAIAxgJJQ8FJQMHGhOIQcETFxiFZIlQB4RMAQScQYwHjGwrL4JPAQEB Received: from ppp121-44-50-124.lns20.syd6.internode.on.net (HELO dastard) ([121.44.50.124]) by ipmail05.adl6.internode.on.net with ESMTP; 18 Aug 2014 16:33:13 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1XJGyG-0001Jc-GD; Mon, 18 Aug 2014 17:03:12 +1000 Date: Mon, 18 Aug 2014 17:03:12 +1000 From: Dave Chinner To: Prithvi Rathore Cc: xfs@oss.sgi.com Subject: Re: [RFD]: Help in setting up XFS Message-ID: <20140818070312.GM20518@dastard> X-ASG-Orig-Subj: Re: [RFD]: Help in setting up 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: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1408345393 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.8569 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Mon, Aug 18, 2014 at 10:22:37AM +0530, Prithvi Rathore wrote: > Hi, > As the subject states, I would like to setup and use XFS on an external USB drive. I am currently using Ubuntu 14.04 on MacBook Air 2013. > My understanding is: > > 1) I will have to install the packages > $ sudo apt-get install xfsprogs > $ sudo apt-get install xfsdump > > 2) I will have to create the filesystem for the USB drive > $ mkfs.xfs -f dev/sdab1 > -f option needed to overwrite any exisitng filesytem And then mount it appropriately and it will be ready to use. Nothing more. Cheers, Dave. -- Dave Chinner david@fromorbit.com From prithvi_rathore@outlook.com Mon Aug 18 04:30: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=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 (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id F20CF7F5E for ; Mon, 18 Aug 2014 04:30:32 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id C29948F8033 for ; Mon, 18 Aug 2014 02:30:32 -0700 (PDT) X-ASG-Debug-ID: 1408354231-04cb6c54ff93c70001-NocioJ Received: from BLU004-OMC3S18.hotmail.com (blu004-omc3s18.hotmail.com [65.55.116.93]) by cuda.sgi.com with ESMTP id rlATVfdjVxrTuGhz (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO) for ; Mon, 18 Aug 2014 02:30:31 -0700 (PDT) X-Barracuda-Envelope-From: prithvi_rathore@outlook.com X-Barracuda-Apparent-Source-IP: 65.55.116.93 Received: from BLU181-W78 ([65.55.116.72]) by BLU004-OMC3S18.hotmail.com with Microsoft SMTPSVC(7.5.7601.22712); Mon, 18 Aug 2014 02:30:31 -0700 X-TMN: [Fcp6bJwZaVaKHFvQN1Y7x3TgrZGR6M3u] X-Originating-Email: [prithvi_rathore@outlook.com] Message-ID: Content-Type: multipart/alternative; boundary="_09d2918f-baef-4603-8baa-c49e0b391deb_" From: Prithvi Rathore To: Dave Chinner , "xfs@oss.sgi.com" Subject: RE: [RFD]: Help in setting up XFS Date: Mon, 18 Aug 2014 15:00:31 +0530 X-ASG-Orig-Subj: RE: [RFD]: Help in setting up XFS Importance: Normal In-Reply-To: <20140818070312.GM20518@dastard> References: ,<20140818070312.GM20518@dastard> MIME-Version: 1.0 X-OriginalArrivalTime: 18 Aug 2014 09:30:31.0219 (UTC) FILETIME=[0DF10030:01CFBAC7] X-Barracuda-Connect: blu004-omc3s18.hotmail.com[65.55.116.93] X-Barracuda-Start-Time: 1408354231 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=HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.8572 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 HTML_MESSAGE BODY: HTML included in message --_09d2918f-baef-4603-8baa-c49e0b391deb_ Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable Hi Dave=2C I really appreciate you help in this matter. > Date: Mon=2C 18 Aug 2014 17:03:12 +1000 > From: david@fromorbit.com > To: prithvi_rathore@outlook.com > CC: xfs@oss.sgi.com > Subject: Re: [RFD]: Help in setting up XFS >=20 > On Mon=2C Aug 18=2C 2014 at 10:22:37AM +0530=2C Prithvi Rathore wrote: > > Hi=2C > > As the subject states=2C I would like to setup and use XFS on an extern= al USB drive. I am currently using Ubuntu 14.04 on MacBook Air 2013. > > My understanding is: > >=20 > > 1) I will have to install the packages > > $ sudo apt-get install xfsprogs > > $ sudo apt-get install xfsdump > >=20 > > 2) I will have to create the filesystem for the USB drive > > $ mkfs.xfs -f dev/sdab1 > > -f option needed to overwrite any existing filesytem =20 > And then mount it appropriately and it will be ready to use. > Nothing more. About the part where you say mount it properly=2C I just wanted to check if= this is correct. 1)Create a mount point. $ mkdir /mnt/dat1 2)Mount the drive. $ mount -t xfs /dev/sdc1 /mnt/dat1 And i will have to do this every time I want to use the pendrive Warm Regards=2C Prithvi = --_09d2918f-baef-4603-8baa-c49e0b391deb_ Content-Type: text/html; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable
Hi Dave=2C
 =3B =3B I= really appreciate you help in this matter.

>=3B Date: Mon=2C= 18 Aug 2014 17:03:12 +1000
>=3B From: david@fromorbit.com
>=3B T= o: prithvi_rathore@outlook.com
>=3B CC: xfs@oss.sgi.com
>=3B Subj= ect: Re: [RFD]: Help in setting up XFS
>=3B
>=3B On Mon=2C Aug 1= 8=2C 2014 at 10:22:37AM +0530=2C Prithvi Rathore wrote:
>=3B >=3B Hi= =2C
>=3B >=3B As the subject states=2C I would like to setup and use= XFS on an external USB drive. I am currently using Ubuntu 14.04 on MacBook= Air 2013.
>=3B >=3B My understanding is:
>=3B >=3B
>= =3B >=3B 1) I will have to install the packages
>=3B >=3B $ sudo a= pt-get install xfsprogs
>=3B >=3B $ sudo apt-get install xfsdump
= >=3B >=3B
>=3B >=3B 2) I will have to create the filesystem for= the USB drive
>=3B >=3B $ mkfs.xfs -f dev/sdab1
>=3B >=3B -f= option needed to overwrite any existing filesytem
 =3B
>=3B An= d then mount it appropriately and it will be ready to use.
>=3B Nothin= g more.

About the part where you say mount it properly=2C I just wan= ted to check if this is correct.

1)Create a mount point.
 =3B=  =3B $ mkdir /mnt/dat1

2)Mount the drive.
 =3B =3B $= mount -t xfs /dev/sdc1 /mnt/dat1

And i will have to do this every t= ime I want to use the pendrive

Warm Regards=2C
Prithvi
=
= --_09d2918f-baef-4603-8baa-c49e0b391deb_-- From robin.listas@gmail.com Mon Aug 18 05:26: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=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 5381B7F3F for ; Mon, 18 Aug 2014 05:26:07 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 417058F8037 for ; Mon, 18 Aug 2014 03:26:04 -0700 (PDT) X-ASG-Debug-ID: 1408357561-04cb6c54fd95ed0001-NocioJ Received: from mail-we0-f176.google.com (mail-we0-f176.google.com [74.125.82.176]) by cuda.sgi.com with ESMTP id ED2WNJceL0q6S8o5 (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Mon, 18 Aug 2014 03:26:02 -0700 (PDT) X-Barracuda-Envelope-From: robin.listas@gmail.com X-Barracuda-Apparent-Source-IP: 74.125.82.176 Received: by mail-we0-f176.google.com with SMTP id q58so4802747wes.21 for ; Mon, 18 Aug 2014 03:26:01 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=sender:date:from:to:subject:in-reply-to:message-id:references :user-agent:mime-version:content-type:content-id; bh=xnnHzhDTWTXq8mQibeD5uqxygFg2wXOrLOrwPpM/nOk=; b=d6cFGH6nOk5j+ZKs6czkG9/0JUnjz/RhduCxlqixk3j3Cu8xEvFy4f0ZnYw6Uzbo/8 UbUgJkAeneIbV5IEq6nEZ93+QhBomZIQYpRtjgsTx2sscw9AilNHVJh45IJKbSNc5m5N oKQhISTfAjFP7LRTr8vR/4Q3RTPcmchJZ/CNfbohQsBn6UHf9LDUiMrRy2Bcou1btrpj jgM9e0Lbn9c3NIqUOtLqGILluDs3JGj/yqKBDnH3sgwNXxdeg65QRAHlqxtKNZmgQoNi my0Ti9XUOrL2sIRTjMK92WlKHnUefqW7zjZsbfwdIV4DLzdl125RTX6kqSpn+JQyZQMx zjMA== X-Received: by 10.180.96.196 with SMTP id du4mr70756320wib.44.1408357560980; Mon, 18 Aug 2014 03:26:00 -0700 (PDT) Received: from Telcontar.valinor (177.Red-79-159-63.staticIP.rima-tde.net. [79.159.63.177]) by mx.google.com with ESMTPSA id di7sm41197518wjb.34.2014.08.18.03.25.59 for (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 18 Aug 2014 03:26:00 -0700 (PDT) Sender: Carlos Robinson Received: from localhost (localhost [127.0.0.1]) by Telcontar.valinor (Postfix) with ESMTP id 2007160E5A for ; Mon, 18 Aug 2014 12:25:58 +0200 (CEST) X-Virus-Scanned: amavisd-new at valinor Received: from Telcontar.valinor ([127.0.0.1]) by localhost (Telcontar.valinor [127.0.0.1]) (amavisd-new, port 10024) with LMTP id 8jiCUQhFfb_7 for ; Mon, 18 Aug 2014 12:25:58 +0200 (CEST) Received: from localhost (localhost [127.0.0.1]) by Telcontar.valinor (Postfix) with ESMTP id F2189605B8 for ; Mon, 18 Aug 2014 12:25:57 +0200 (CEST) Date: Mon, 18 Aug 2014 12:25:57 +0200 (CEST) From: "Carlos E. R." X-X-Sender: cer@Telcontar.valinor To: XFS mailing list Subject: RE: [RFD]: Help in setting up XFS In-Reply-To: X-ASG-Orig-Subj: RE: [RFD]: Help in setting up XFS Message-ID: References: , <20140818070312.GM20518@dastard> User-Agent: Alpine 2.11 (LSU 23 2013-08-11) MIME-Version: 1.0 Content-Type: MULTIPART/MIXED; BOUNDARY="-1463808511-172924305-1408357446=:5417" Content-ID: X-Barracuda-Connect: mail-we0-f176.google.com[74.125.82.176] X-Barracuda-Start-Time: 1408357562 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.8574 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 This message is in MIME format. The first part should be readable text, while the remaining parts are likely unreadable without MIME-aware tools. ---1463808511-172924305-1408357446=:5417 Content-Type: TEXT/PLAIN; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8BIT Content-ID: -----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 Content-ID: On Monday, 2014-08-18 at 15:00 +0530, Prithvi Rathore wrote: > About the part where you say mount it properly, I just wanted to check if this is correct. > > 1)Create a mount point. >     $ mkdir /mnt/dat1 Just plug in the stick and click on the icon to mount it. No different than any other filesystem. If it doesn't work, just ask on the help forum or mail lists of your distribution. - -- Cheers, Carlos E. R. (from 13.1 x86_64 "Bottle" at Telcontar) -----BEGIN PGP SIGNATURE----- Version: GnuPG v2.0.22 (GNU/Linux) iEYEARECAAYFAlPx1LUACgkQtTMYHG2NR9Xm5wCgiOtmi49VqkGLNsvs7UsJzLN5 d4cAn04RTjfL3Di13AStVgR4+UJVvgV6 =paC3 -----END PGP SIGNATURE----- ---1463808511-172924305-1408357446=:5417-- From robin.listas@gmail.com Mon Aug 18 05:31: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=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 B72C57F3F for ; Mon, 18 Aug 2014 05:31:23 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id A22B08F8035 for ; Mon, 18 Aug 2014 03:31:23 -0700 (PDT) X-ASG-Debug-ID: 1408357881-04cb6c550096490001-NocioJ Received: from mail-we0-f175.google.com (mail-we0-f175.google.com [74.125.82.175]) by cuda.sgi.com with ESMTP id z8y1smWrnoAYkPmk (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Mon, 18 Aug 2014 03:31:22 -0700 (PDT) X-Barracuda-Envelope-From: robin.listas@gmail.com X-Barracuda-Apparent-Source-IP: 74.125.82.175 Received: by mail-we0-f175.google.com with SMTP id t60so4789564wes.20 for ; Mon, 18 Aug 2014 03:31:21 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=sender:date:from:to:subject:in-reply-to:message-id:references :user-agent:mime-version:content-type; bh=dcAX/w3s+5ABx+iBwExGuAHm84xOn1cXpiGEpFEoRXU=; b=dfTVjep3hG8ut6+BfzcurCjoS5YkqHqR4cSEy8ITfa4EkUcVa7NxOPjgljFZ4f9d9z WWL1IQKveGjZi29A4rHPb9OtgYgJgqUpcpnhvKHFzYNDYcpEGUIAUFSayAxkuS0fF3M+ B27ErXRrbCjWw9LtfCijJNZ1OreeByIPh2VCkKSQYnrLbuDDniKEaEkRQr27pJGm6xqt 1Us6lgI5JB+yL6REvbMl/wrNZiUozTPo0hUGRxT86o3eTsL438S3yO2K1jC2W2NSzjrl eln5BRl8wvLmRluYOMDz2jxzkQyYlFeQzY36SN7ofGI1XM5BS/hX7QYhM0hXT4P+ursm gZfQ== X-Received: by 10.194.173.234 with SMTP id bn10mr41399458wjc.81.1408357881061; Mon, 18 Aug 2014 03:31:21 -0700 (PDT) Received: from Telcontar.valinor (177.Red-79-159-63.staticIP.rima-tde.net. [79.159.63.177]) by mx.google.com with ESMTPSA id a4sm36536700wie.21.2014.08.18.03.31.19 for (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 18 Aug 2014 03:31:20 -0700 (PDT) Sender: Carlos Robinson Received: from localhost (localhost [127.0.0.1]) by Telcontar.valinor (Postfix) with ESMTP id 5844860E5A for ; Mon, 18 Aug 2014 12:31:18 +0200 (CEST) X-Virus-Scanned: amavisd-new at valinor Received: from Telcontar.valinor ([127.0.0.1]) by localhost (Telcontar.valinor [127.0.0.1]) (amavisd-new, port 10024) with LMTP id PLIOvkKKjOsp for ; Mon, 18 Aug 2014 12:31:18 +0200 (CEST) Received: from localhost (localhost [127.0.0.1]) by Telcontar.valinor (Postfix) with ESMTP id 327E8605B8 for ; Mon, 18 Aug 2014 12:31:18 +0200 (CEST) Date: Mon, 18 Aug 2014 12:31:18 +0200 (CEST) From: "Carlos E. R." X-X-Sender: cer@Telcontar.valinor To: XFS mailing list Subject: Re: Help setting up XFS In-Reply-To: X-ASG-Orig-Subj: Re: Help setting up XFS Message-ID: References: User-Agent: Alpine 2.11 (LSU 23 2013-08-11) MIME-Version: 1.0 Content-Type: MULTIPART/MIXED; BOUNDARY="-1463808511-487602297-1408357878=:5417" X-Barracuda-Connect: mail-we0-f175.google.com[74.125.82.175] X-Barracuda-Start-Time: 1408357882 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.8574 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 This message is in MIME format. The first part should be readable text, while the remaining parts are likely unreadable without MIME-aware tools. ---1463808511-487602297-1408357878=:5417 Content-Type: TEXT/PLAIN; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8BIT -----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 On Sunday, 2014-08-17 at 07:36 +0530, Prithvi Rathore wrote: > Hi, >     I am a student currently pursuing my under-graduation and would love to use XFS. I believe it has a lot to offer and I Iook forwarding to > testing and using it on an external device like a pen-drive (USB) for starters. >     I was a bit confused on how to set up XFS. I am currently using Ubuntu 14.04 dual boot (via rEFInd) with Mac OS X on MacBook Air 2013.  I don't know about Ubuntu. In openSUSE I just open the graphical tool to format any device and format it, just selecting in the drop list XFS or any other type I want. On other distributions I would use gparted. The procedure is exactly the same for any filesystem you choose. I rather think that what you need is help on using Linux, not XFS. - -- Cheers, Carlos E. R. (from 13.1 x86_64 "Bottle" at Telcontar) -----BEGIN PGP SIGNATURE----- Version: GnuPG v2.0.22 (GNU/Linux) iEYEARECAAYFAlPx1fYACgkQtTMYHG2NR9X0PQCeLq7Q5/uEOzxtiAhdY4QlZjb5 cHAAn0w7eXWilM+IVH852cLmg076zEYv =cMGX -----END PGP SIGNATURE----- ---1463808511-487602297-1408357878=:5417-- From david@fromorbit.com Mon Aug 18 08: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 4CA057F3F for ; Mon, 18 Aug 2014 08:12:08 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id D0D13AC004 for ; Mon, 18 Aug 2014 06:12:07 -0700 (PDT) X-ASG-Debug-ID: 1408367522-04bdf010a03d5a0001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id NgK1i6QkaLwG4aqE for ; Mon, 18 Aug 2014 06:12: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: AkQHAIb68VN5LDJ8/2dsb2JhbABZgw2BKoIsrSIBAQEBAQaefIV7AYEaF3eEAwEBBAE6HCMFCwgDEQMBAgEJJQ8FJQMTDhOILgMJB7tLGIUoFxiFZIlQB4RMBZxBjAeIfYNvKy+CTwEBAQ Received: from ppp121-44-50-124.lns20.syd6.internode.on.net (HELO dastard) ([121.44.50.124]) by ipmail07.adl2.internode.on.net with ESMTP; 18 Aug 2014 22:42:01 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1XJMiy-0002Hc-6H; Mon, 18 Aug 2014 23:11:48 +1000 Date: Mon, 18 Aug 2014 23:11:48 +1000 From: Dave Chinner To: Prithvi Rathore Cc: "xfs@oss.sgi.com" Subject: Re: [RFD]: Help in setting up XFS Message-ID: <20140818131148.GN20518@dastard> X-ASG-Orig-Subj: Re: [RFD]: Help in setting up XFS References: <20140818070312.GM20518@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: 1408367522 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.8577 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Mon, Aug 18, 2014 at 03:00:31PM +0530, Prithvi Rathore wrote: > Hi Dave, > I really appreciate you help in this matter. > > > Date: Mon, 18 Aug 2014 17:03:12 +1000 > > From: david@fromorbit.com > > To: prithvi_rathore@outlook.com > > CC: xfs@oss.sgi.com > > Subject: Re: [RFD]: Help in setting up XFS > > > > On Mon, Aug 18, 2014 at 10:22:37AM +0530, Prithvi Rathore wrote: > > > Hi, > > > As the subject states, I would like to setup and use XFS on an external USB drive. I am currently using Ubuntu 14.04 on MacBook Air 2013. > > > My understanding is: > > > > > > 1) I will have to install the packages > > > $ sudo apt-get install xfsprogs > > > $ sudo apt-get install xfsdump > > > > > > 2) I will have to create the filesystem for the USB drive > > > $ mkfs.xfs -f dev/sdab1 > > > -f option needed to overwrite any existing filesytem > > > And then mount it appropriately and it will be ready to use. > > Nothing more. > > About the part where you say mount it properly, I just wanted to check if this is correct. > > 1)Create a mount point. > $ mkdir /mnt/dat1 > > 2)Mount the drive. > $ mount -t xfs /dev/sdc1 /mnt/dat1 mount will work out that it contains XFS and do the right thing automatically. i.e. this should work just fine: $ mount /dev/sdc1 /mnt/dat1 Look in dmesg to see what happens at the kernel level when you run the command, and compare the difference with and without the "-t xfs".... > And i will have to do this every time I want to use the pendrive Only the mount command. the mount point won't go away unless you remove it. Cheers, Dave. -- Dave Chinner david@fromorbit.com From mlsemon35@gmail.com Mon Aug 18 08:12: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.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 0C8737F3F for ; Mon, 18 Aug 2014 08:12:40 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id EDCF28F8035 for ; Mon, 18 Aug 2014 06:12:36 -0700 (PDT) X-ASG-Debug-ID: 1408367555-04cbb05486b2350001-NocioJ Received: from mail-yh0-f43.google.com (mail-yh0-f43.google.com [209.85.213.43]) by cuda.sgi.com with ESMTP id rjMLYjFRQhFIv5Q2 (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Mon, 18 Aug 2014 06:12:35 -0700 (PDT) X-Barracuda-Envelope-From: mlsemon35@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.213.43 X-Barracuda-IPDD: Level1 [gmail.com/209.85.213.43] Received: by mail-yh0-f43.google.com with SMTP id 29so4437748yhl.16 for ; Mon, 18 Aug 2014 06:12:34 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.213.43] X-Barracuda-IPDD: Level1 [gmail.com/209.85.213.43] 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=Eu60ctdRHsn1+K9pWaVLR7TjRTJSaaDTKkCctKaSCdY=; b=svLMibb5TcMt4t7VrlmSMkXIy9kHluJINcY4EQB/5f0aV+Mr+/BI+WCoTRz/W4TsOZ 8+GATKV+DC/xyKAP/DzmQxvldGvs4pv/vp1tZMPYIknwmdI/5mRxCPgemM4Tbx1l5Hw2 5czT76xTkHJq8lT47dkYdvlCITnGVPgITJrcSRHey4Ch+NnbRN+bf1QROF/Lc2OpVo6N 9vBAdmxqjISPjI6PGNeFSAf3GTc4YUnZ4EHp7j2zqD4tIEeTm9n+bQp+TApoVa3JtG6S Y0SYggAsDW0JinVwxngAMNqngspgTB1OqgcAVBIja+X0y/4+oqvRP9uvTjCCNHuTiY8Y AxOA== X-Received: by 10.236.111.34 with SMTP id v22mr10627772yhg.81.1408367554758; Mon, 18 Aug 2014 06:12:34 -0700 (PDT) Received: from yholen.semon.net (rrcs-97-76-23-49.se.biz.rr.com. [97.76.23.49]) by mx.google.com with ESMTPSA id v50sm35582233yhv.22.2014.08.18.06.12.33 for (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 18 Aug 2014 06:12:34 -0700 (PDT) Message-ID: <53F1FBBC.8000903@gmail.com> Date: Mon, 18 Aug 2014 09:12:28 -0400 From: "Michael L. Semon" User-Agent: Mozilla/5.0 (X11; FreeBSD amd64; rv:31.0) Gecko/20100101 Thunderbird/31.0 MIME-Version: 1.0 To: Dave Chinner CC: "xfs@oss.sgi.com" Subject: Re: xfsdump completes very prematurely in low RAM, commit found References: <53F15EEF.4090308@gmail.com> <20140818024114.GK20518@dastard> X-ASG-Orig-Subj: Re: xfsdump completes very prematurely in low RAM, commit found In-Reply-To: <20140818024114.GK20518@dastard> Content-Type: text/plain; charset=windows-1252; format=flowed Content-Transfer-Encoding: 7bit X-Barracuda-Connect: mail-yh0-f43.google.com[209.85.213.43] X-Barracuda-Start-Time: 1408367555 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.8577 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 08/17/14 22:41, Dave Chinner wrote: > On Sun, Aug 17, 2014 at 10:03:27PM -0400, Michael L. Semon wrote: >> Hi! I had some phantom issues that are chasing me through this 3.17 >> merge window period. While chasing those issues, I decided to do an >> xfsdump of a v5/finobt XFS system rescued from PEBKAC issues. The >> xfsdump completed rather prematurely, ending like this test case >> output... >> >> xfsdump: dumping special file ino 4194523 mode 0x21b0 >> xfsdump: dumping special file ino 4194524 mode 0x21b0 >> xfsdump: dumping special file ino 4194525 mode 0x21b0 >> xfsdump: dumping special file ino 4194526 mode 0x21b0 >> xfsdump: dumping special file ino 4194527 mode 0x21b0 >> xfsdump: ending media file >> xfsdump: media file size 4512992 bytes >> xfsdump: ending stream: 23 seconds elapsed >> xfsdump: dump size (non-dir files) : 4452088 bytes >> xfsdump: dump complete: 23 seconds elapsed >> xfsdump: Dump Summary: >> xfsdump: stream 0 /mnt/xfstests-scratch/blah.0.dump OK (success) >> xfsdump: Dump Status: SUCCESS >> >> That looks fine for a lack of obvious error messages. However, it >> should end like this: >> >> xfsdump: dumping regular file ino 13653551 offset 0 to offset 12154 (size 12154) >> xfsdump: dumping regular file ino 13653555 offset 0 to offset 16554 (size 16554) >> xfsdump: dumping regular file ino 13653556 offset 0 to offset 185 (size 185) >> xfsdump: dumping regular file ino 13653557 offset 0 to offset 471 (size 471) >> xfsdump: dumping special file ino 13653558 mode 0xa1ff >> xfsdump: ending media file >> xfsdump: media file size 1999127056 bytes >> xfsdump: ending stream: 465 seconds elapsed >> xfsdump: dump size (non-dir files) : 1963549104 bytes >> xfsdump: dump complete: 465 seconds elapsed >> xfsdump: Dump Summary: >> xfsdump: stream 0 /mnt/xfstests-scratch/blah.0.dump OK (success) >> xfsdump: Dump Status: SUCCESS > > What's the inode number progression of a successful dump at the > point at which the incomplete dump ends? i.e. around inode 4194527? > That number is one inode chunk short of 2^22, which implies that > there is a failure or some kind moving from one AG to the next. > The progrssion of inode numbers will tell me whether this is the > case or not... It is this, run a bit longer to show xfsdump start to dump regular files again: xfsdump: dumping special file ino 4194520 mode 0x21b0 xfsdump: dumping special file ino 4194521 mode 0x21b0 xfsdump: dumping special file ino 4194522 mode 0x21b0 xfsdump: dumping special file ino 4194523 mode 0x21b0 xfsdump: dumping special file ino 4194524 mode 0x21b0 xfsdump: dumping special file ino 4194525 mode 0x21b0 xfsdump: dumping special file ino 4194526 mode 0x21b0 xfsdump: dumping special file ino 4194527 mode 0x21b0 xfsdump: dumping special file ino 4194528 mode 0x21b0 xfsdump: dumping special file ino 4194529 mode 0x21b0 xfsdump: dumping special file ino 4194530 mode 0x21b0 xfsdump: dumping special file ino 4194531 mode 0x21b0 xfsdump: dumping special file ino 4194532 mode 0x21b0 xfsdump: dumping special file ino 4194533 mode 0x21b0 xfsdump: dumping special file ino 4194534 mode 0x21b0 xfsdump: dumping special file ino 4194535 mode 0x21b0 xfsdump: dumping special file ino 4194536 mode 0x21b0 xfsdump: dumping special file ino 4194537 mode 0x21b0 xfsdump: dumping special file ino 4194538 mode 0x21b0 xfsdump: dumping special file ino 4194539 mode 0x21b0 xfsdump: dumping special file ino 4194540 mode 0x21b0 xfsdump: dumping special file ino 4194541 mode 0x21b0 xfsdump: dumping special file ino 4194542 mode 0x21b0 xfsdump: dumping special file ino 4194543 mode 0x21b0 xfsdump: dumping special file ino 4194544 mode 0x21b0 xfsdump: dumping special file ino 4194545 mode 0x21b0 xfsdump: dumping special file ino 4194546 mode 0x21b0 xfsdump: dumping special file ino 4194547 mode 0x21b0 xfsdump: dumping special file ino 4194548 mode 0x21b0 xfsdump: dumping special file ino 4194549 mode 0x21b0 xfsdump: dumping special file ino 4194550 mode 0x21b0 xfsdump: dumping special file ino 4194551 mode 0x21b0 xfsdump: dumping special file ino 4194552 mode 0x21b0 xfsdump: dumping special file ino 4194553 mode 0x21b0 xfsdump: dumping special file ino 4194554 mode 0x21b0 xfsdump: dumping special file ino 4194555 mode 0x21b0 xfsdump: dumping special file ino 4194556 mode 0x21b0 xfsdump: dumping special file ino 4194557 mode 0x21b0 xfsdump: dumping special file ino 4194558 mode 0x21b0 xfsdump: dumping special file ino 4194559 mode 0x21b0 xfsdump: dumping special file ino 4194560 mode 0x21b0 xfsdump: dumping special file ino 4194561 mode 0x21b0 xfsdump: dumping special file ino 4194562 mode 0x21b0 xfsdump: dumping special file ino 4194563 mode 0x21b0 xfsdump: dumping special file ino 4194564 mode 0x21b0 xfsdump: dumping special file ino 4194565 mode 0x21b0 xfsdump: dumping special file ino 4194566 mode 0x21b0 xfsdump: dumping special file ino 4194567 mode 0x21b0 xfsdump: dumping special file ino 4194568 mode 0x21b0 xfsdump: dumping special file ino 4194569 mode 0x21b0 xfsdump: dumping special file ino 4194570 mode 0x21b0 xfsdump: dumping special file ino 4194571 mode 0x21b0 xfsdump: dumping special file ino 4194572 mode 0x21b0 xfsdump: dumping special file ino 4194573 mode 0x21b0 xfsdump: dumping special file ino 4194574 mode 0x21b0 xfsdump: dumping special file ino 4194575 mode 0x21b0 xfsdump: dumping special file ino 4194576 mode 0x21b0 xfsdump: dumping special file ino 4194577 mode 0x21b0 xfsdump: dumping special file ino 4194578 mode 0x21b0 xfsdump: dumping special file ino 4194579 mode 0x21b0 xfsdump: dumping special file ino 4194580 mode 0x21b0 xfsdump: dumping special file ino 4194581 mode 0x21b0 xfsdump: dumping special file ino 4194582 mode 0x21b0 xfsdump: dumping special file ino 4194583 mode 0x21b0 xfsdump: dumping special file ino 4194584 mode 0x21b0 xfsdump: dumping special file ino 4194585 mode 0x21b0 xfsdump: dumping special file ino 4194586 mode 0x21b0 xfsdump: dumping special file ino 4194587 mode 0x21b0 xfsdump: dumping special file ino 4194588 mode 0x21b0 xfsdump: dumping special file ino 4194589 mode 0x21b0 xfsdump: dumping special file ino 4194590 mode 0x21b0 xfsdump: dumping special file ino 4194591 mode 0x21b0 xfsdump: dumping special file ino 4194592 mode 0x21b0 xfsdump: dumping special file ino 4194593 mode 0x21b0 xfsdump: dumping special file ino 4194594 mode 0x21b0 xfsdump: dumping special file ino 4194595 mode 0x21b0 xfsdump: dumping special file ino 4194596 mode 0x21b0 xfsdump: dumping special file ino 4194597 mode 0x21b0 xfsdump: dumping special file ino 4194598 mode 0x21b0 xfsdump: dumping special file ino 4194599 mode 0x21b0 xfsdump: dumping special file ino 4194600 mode 0x21b0 xfsdump: dumping special file ino 4194601 mode 0x21b0 xfsdump: dumping special file ino 4194602 mode 0x21b0 xfsdump: dumping special file ino 4194603 mode 0x21b0 xfsdump: dumping special file ino 4194604 mode 0x21b0 xfsdump: dumping special file ino 4194605 mode 0x21b0 xfsdump: dumping special file ino 4194606 mode 0x21b0 xfsdump: dumping special file ino 4194607 mode 0x21b0 xfsdump: dumping special file ino 4194608 mode 0x21b0 xfsdump: dumping special file ino 4194609 mode 0x21b0 xfsdump: dumping special file ino 4194610 mode 0x21b0 xfsdump: dumping special file ino 4194611 mode 0x21b0 xfsdump: dumping special file ino 4194612 mode 0x21b0 xfsdump: dumping special file ino 4194613 mode 0x21b0 xfsdump: dumping special file ino 4194614 mode 0x21b0 xfsdump: dumping special file ino 4194615 mode 0x21b0 xfsdump: dumping special file ino 4194616 mode 0x21b0 xfsdump: dumping special file ino 4194617 mode 0x21b0 xfsdump: dumping special file ino 4194618 mode 0x21b0 xfsdump: dumping special file ino 4194619 mode 0x21b0 xfsdump: dumping special file ino 4194621 mode 0x21b0 xfsdump: dumping special file ino 4194622 mode 0x21b0 xfsdump: dumping special file ino 4194623 mode 0x21b0 xfsdump: dumping special file ino 4194624 mode 0x21b0 xfsdump: dumping special file ino 4194625 mode 0x21b0 xfsdump: dumping special file ino 4194626 mode 0x21b0 xfsdump: dumping special file ino 4194627 mode 0x21b0 xfsdump: dumping special file ino 4194628 mode 0x21b0 xfsdump: dumping special file ino 4194629 mode 0x21b0 xfsdump: dumping special file ino 4194630 mode 0x21b0 xfsdump: dumping special file ino 4194631 mode 0x21b0 xfsdump: dumping special file ino 4194632 mode 0x21b0 xfsdump: dumping special file ino 4194633 mode 0x21b0 xfsdump: dumping special file ino 4194634 mode 0x21b0 xfsdump: dumping special file ino 4194635 mode 0x21b0 xfsdump: dumping special file ino 4194636 mode 0x21b0 xfsdump: dumping special file ino 4194637 mode 0x21b0 xfsdump: dumping special file ino 4194638 mode 0x21b0 xfsdump: dumping special file ino 4194639 mode 0x21b0 xfsdump: dumping special file ino 4194640 mode 0x21b0 xfsdump: dumping special file ino 4194641 mode 0x21b0 xfsdump: dumping special file ino 4194642 mode 0x21b0 xfsdump: dumping special file ino 4194643 mode 0x21b0 xfsdump: dumping special file ino 4194644 mode 0x21b0 xfsdump: dumping special file ino 4194645 mode 0x21b0 xfsdump: dumping special file ino 4194646 mode 0x21b0 xfsdump: dumping special file ino 4194647 mode 0x21b0 xfsdump: dumping special file ino 4194648 mode 0x21b0 xfsdump: dumping special file ino 4194649 mode 0x21b0 xfsdump: dumping special file ino 4194650 mode 0x21b0 xfsdump: dumping special file ino 4194651 mode 0x21b0 xfsdump: dumping special file ino 4194652 mode 0x21b0 xfsdump: dumping special file ino 4194653 mode 0x21b0 xfsdump: dumping special file ino 4194654 mode 0x21b0 xfsdump: dumping special file ino 4194655 mode 0x21b0 xfsdump: dumping special file ino 4194688 mode 0x21b0 xfsdump: dumping special file ino 4194689 mode 0x21b0 xfsdump: dumping special file ino 4194690 mode 0x21b0 xfsdump: dumping special file ino 4194691 mode 0x21b0 xfsdump: dumping special file ino 4194692 mode 0x21b0 xfsdump: dumping special file ino 4194693 mode 0x21b0 xfsdump: dumping special file ino 4194694 mode 0x21b0 xfsdump: dumping special file ino 4194695 mode 0x21b0 xfsdump: dumping special file ino 4194696 mode 0x21b0 xfsdump: dumping special file ino 4194697 mode 0x21b0 xfsdump: dumping special file ino 4194698 mode 0x21b0 xfsdump: dumping special file ino 4194699 mode 0x21b0 xfsdump: dumping special file ino 4194700 mode 0x21b0 xfsdump: dumping special file ino 4194701 mode 0x21b0 xfsdump: dumping special file ino 4194702 mode 0x21b0 xfsdump: dumping special file ino 4194703 mode 0x21b0 xfsdump: dumping special file ino 4194704 mode 0x21b0 xfsdump: dumping special file ino 4194705 mode 0x21b0 xfsdump: dumping special file ino 4194706 mode 0x21b0 xfsdump: dumping special file ino 4194707 mode 0x21b0 xfsdump: dumping special file ino 4194708 mode 0x21b0 xfsdump: dumping special file ino 4194709 mode 0x21b0 xfsdump: dumping special file ino 4194710 mode 0x21b0 xfsdump: dumping special file ino 4194711 mode 0x21b0 xfsdump: dumping special file ino 4194712 mode 0x21b0 xfsdump: dumping special file ino 4194713 mode 0x21b0 xfsdump: dumping special file ino 4194714 mode 0x21b0 xfsdump: dumping special file ino 4194715 mode 0x21b0 xfsdump: dumping special file ino 4194716 mode 0x21b0 xfsdump: dumping special file ino 4194717 mode 0x21b0 xfsdump: dumping regular file ino 4194719 offset 0 to offset 314 (size 314) xfsdump: dumping regular file ino 4194721 offset 0 to offset 851 (size 851) xfsdump: dumping regular file ino 4194722 offset 0 to offset 3716 (size 3716) xfsdump: dumping regular file ino 4194723 offset 0 to offset 1077 (size 1077) xfsdump: dumping regular file ino 4194724 offset 0 to offset 5568 (size 5568) xfsdump: dumping regular file ino 4194725 offset 0 to offset 770 (size 770) xfsdump: dumping regular file ino 4194726 offset 0 to offset 1100 (size 1100) xfsdump: dumping regular file ino 4194727 offset 0 to offset 1738 (size 1738) xfsdump: dumping regular file ino 4194728 offset 0 to offset 647 (size 647) xfsdump: dumping regular file ino 4194730 offset 0 to offset 940 (size 940) xfsdump: dumping regular file ino 4194731 offset 0 to offset 6747 (size 6747) xfsdump: dumping regular file ino 4194733 offset 0 to offset 226 (size 226) Thanks again! Michael From david@fromorbit.com Mon Aug 18 08:20: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 E4F457F3F for ; Mon, 18 Aug 2014 08:20:41 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id B2F958F804B for ; Mon, 18 Aug 2014 06:20:41 -0700 (PDT) X-ASG-Debug-ID: 1408368039-04bdf010a13dca0001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id ECkyLvqvbn4SNQu4 for ; Mon, 18 Aug 2014 06:20: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: AkMHANz88VN5LDJ8/2dsb2JhbABZgw2BKoIsrSIBAQEBAQaefIV7AYEaF3eEAwEBBAEyASMYCwULCAMYCSUPBSUDIROIOgfBDxcYhWSIfwEBTweETAWPEo0vjAeIfYFlHIFuKy+BD4FAAQEB Received: from ppp121-44-50-124.lns20.syd6.internode.on.net (HELO dastard) ([121.44.50.124]) by ipmail07.adl2.internode.on.net with ESMTP; 18 Aug 2014 22:50:39 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1XJMrK-0002JC-DE; Mon, 18 Aug 2014 23:20:26 +1000 Date: Mon, 18 Aug 2014 23:20:26 +1000 From: Dave Chinner To: "Carlos E. R." Cc: XFS mailing list Subject: Re: [RFD]: Help in setting up XFS Message-ID: <20140818132026.GO20518@dastard> X-ASG-Orig-Subj: Re: [RFD]: Help in setting up XFS References: <20140818070312.GM20518@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Disposition: inline Content-Transfer-Encoding: 8bit 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: 1408368039 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-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.8578 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Mon, Aug 18, 2014 at 12:25:57PM +0200, Carlos E. R. wrote: > -----BEGIN PGP SIGNED MESSAGE----- > Hash: SHA1 > > Content-ID: > > > On Monday, 2014-08-18 at 15:00 +0530, Prithvi Rathore wrote: > > >About the part where you say mount it properly, I just wanted to check if this is correct. > > > >1)Create a mount point. > >    $ mkdir /mnt/dat1 > > Just plug in the stick and click on the icon to mount it. No > different than any other filesystem. That doesn't work for machines with no desktop or ones that you access via ssh. Learn the command line first then you can always get the machine to do what you want regardless of how you need to access it. Indeed, typing commands is often faster than using the mouse, especially if you know how to use command history search effectively... > If it doesn't work, just ask on the help forum or mail lists of your > distribution. That's just wrong. If you've got an XFS problem or question, then this mailing list is exactly the right place to be asking for help. Cheers, Dave. -- Dave Chinner david@fromorbit.com From bfoster@redhat.com Mon Aug 18 09:15: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 (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 7384B7F3F for ; Mon, 18 Aug 2014 09:15:42 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 44E518F8040 for ; Mon, 18 Aug 2014 07:15:39 -0700 (PDT) X-ASG-Debug-ID: 1408371337-04bdf0109740b60001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id BbssFtF6byBtqJmq (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 18 Aug 2014 07:15: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 s7IEFREn018833 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Mon, 18 Aug 2014 10:15:29 -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 s7IEFRuw029515; Mon, 18 Aug 2014 10:15:27 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 2502212577C; Mon, 18 Aug 2014 10:15:26 -0400 (EDT) Date: Mon, 18 Aug 2014 10:15:26 -0400 From: Brian Foster To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 1/9] xfs: synchronous buffer IO needs a reference Message-ID: <20140818141525.GA30093@bfoster.bfoster> X-ASG-Orig-Subj: Re: [PATCH 1/9] xfs: synchronous buffer IO needs a reference References: <1408084747-4540-1-git-send-email-david@fromorbit.com> <1408084747-4540-2-git-send-email-david@fromorbit.com> <20140815131804.GA4096@laptop.bfoster> <20140815231736.GT26465@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140815231736.GT26465@dastard> User-Agent: Mutt/1.5.23 (2014-03-12) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.24 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1408371338 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Sat, Aug 16, 2014 at 09:17:36AM +1000, Dave Chinner wrote: > On Fri, Aug 15, 2014 at 09:18:04AM -0400, Brian Foster wrote: > > On Fri, Aug 15, 2014 at 04:38:59PM +1000, Dave Chinner wrote: > .... > > > if (bp->b_flags & XBF_WRITE) > > > xfs_buf_wait_unpin(bp); > > > + > > > + /* > > > + * Take references to the buffer. For XBF_ASYNC buffers, holding a > > > + * reference for as long as submission takes is all that is necessary > > > + * here. The IO inherits the lock and hold count from the submitter, > > > + * and these are release during IO completion processing. Taking a hold > > > + * over submission ensures that the buffer is not freed until we have > > > + * completed all processing, regardless of when IO errors occur or are > > > + * reported. > > > + * > > > + * However, for synchronous IO, the IO does not inherit the submitters > > > + * reference count, nor the buffer lock. Hence we need to take an extra > > > + * reference to the buffer for the for the IO context so that we can > > > + * guarantee the buffer is not freed until all IO completion processing > > > + * is done. Otherwise the caller can drop their reference while the IO > > > + * is still in progress and hence trigger a use-after-free situation. > > > + */ > > > xfs_buf_hold(bp); > > > + if (!(bp->b_flags & XBF_ASYNC)) > > > + xfs_buf_hold(bp); > > > + > > > > > > /* > > > - * Set the count to 1 initially, this will stop an I/O > > > - * completion callout which happens before we have started > > > - * all the I/O from calling xfs_buf_ioend too early. > > > + * Set the count to 1 initially, this will stop an I/O completion > > > + * callout which happens before we have started all the I/O from calling > > > + * xfs_buf_ioend too early. > > > */ > > > atomic_set(&bp->b_io_remaining, 1); > > > _xfs_buf_ioapply(bp); > > > + > > > /* > > > - * If _xfs_buf_ioapply failed, we'll get back here with > > > - * only the reference we took above. _xfs_buf_ioend will > > > - * drop it to zero, so we'd better not queue it for later, > > > - * or we'll free it before it's done. > > > + * If _xfs_buf_ioapply failed or we are doing synchronous IO that > > > + * completes extremely quickly, we can get back here with only the IO > > > + * reference we took above. _xfs_buf_ioend will drop it to zero, so > > > + * we'd better run completion processing synchronously so that the we > > > + * don't return to the caller with completion still pending. In the > > > + * error case, this allows the caller to check b_error safely without > > > + * waiting, and in the synchronous IO case it avoids unnecessary context > > > + * switches an latency for high-peformance devices. > > > */ > > > > AFAICT there is no real wait if the buf has completed at this point. The > > wait just decrements the completion counter. > > If the IO has completed, then we run the completion code. > > > So what's the benefit of > > "not waiting?" Where is the potential context switch? > > async work for completion processing on synchrnous IO means we queue > the work, then sleep in xfs_buf_iowait(). Two context switches, plus > a work queue execution > Right... > > Are you referring > > to the case where error is set but I/O is not complete? Are you saying > > the advantage to the caller is it doesn't have to care about the state > > of further I/O once it has been determined at least one error has > > occurred? (If so, who cares about latency given that some operation that > > depends on this I/O is already doomed to fail?). > > No, you're reading *way* too much into this. For sync IO, it's > always best to process completion inline. For async, it doesn't > matter, but if there's a submission error is *more effecient* to > process it in the current context. > Heh. Sure, that makes sense. Perhaps it's just the way I read it, implying that how we process I/O completion effects what the calling code should look like. Simple case of the comment being a bit more confusing than the code. ;) FWIW, the following is more clear to me: /* * If _xfs_buf_ioapply failed or we are doing synchronous IO that * completes extremely quickly, we can get back here with only the IO * reference we took above. _xfs_buf_ioend will drop it to zero. Run * completion processing synchronously so that we don't return to the * caller with completion still pending. This avoids unnecessary context * switches associated with the end_io workqueue. */ Thanks for the explanation. Brian > > The code looks fine, but I'm trying to understand the reasoning better > > (and I suspect we can clarify the comment). > > > > > - _xfs_buf_ioend(bp, bp->b_error ? 0 : 1); > > > + if (bp->b_error || !(bp->b_flags & XBF_ASYNC)) > > > + _xfs_buf_ioend(bp, 0); > > > + else > > > + _xfs_buf_ioend(bp, 1); > > > > Not related to this patch, but it seems like the problem this code tries > > to address is still possible. > > The race condition is still possible - it just won't result in a > use-after-free. The race condition is not fixed until patch 8, > but as a backportable fix, this patch is much, much simpler. > > > Perhaps this papers over a particular > > instance. Consider the case where an I/O fails immediately after this > > call completes, but not before. We have an extra reference now for > > completion, but we can still return to the caller with completion > > pending. I suppose its fine if we consider the "problem" to be that the > > reference goes away underneath the completion, as opposed to the caller > > caring about the status of completion. > > Precisely. > > Cheers, > > Dave. > -- > Dave Chinner > david@fromorbit.com > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From bfoster@redhat.com Mon Aug 18 09:16: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 A00247F3F for ; Mon, 18 Aug 2014 09:16:04 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 8E75E304066 for ; Mon, 18 Aug 2014 07:16:01 -0700 (PDT) X-ASG-Debug-ID: 1408371359-04cbb05487b5110001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id HPNsAWT1ZBwcqsuc (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 18 Aug 2014 07:16: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 s7IEFuvT029654 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Mon, 18 Aug 2014 10:15:57 -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 s7IEFtsD029716; Mon, 18 Aug 2014 10:15:55 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 935D912577C; Mon, 18 Aug 2014 10:15:54 -0400 (EDT) Date: Mon, 18 Aug 2014 10:15:54 -0400 From: Brian Foster To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 2/9] xfs: xfs_buf_ioend and xfs_buf_iodone_work duplicate functionality Message-ID: <20140818141553.GB30093@bfoster.bfoster> X-ASG-Orig-Subj: Re: [PATCH 2/9] xfs: xfs_buf_ioend and xfs_buf_iodone_work duplicate functionality References: <1408084747-4540-1-git-send-email-david@fromorbit.com> <1408084747-4540-3-git-send-email-david@fromorbit.com> <20140815131820.GB4096@laptop.bfoster> <20140815232135.GU26465@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140815232135.GU26465@dastard> User-Agent: Mutt/1.5.23 (2014-03-12) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.27 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1408371360 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Sat, Aug 16, 2014 at 09:21:35AM +1000, Dave Chinner wrote: > On Fri, Aug 15, 2014 at 09:18:21AM -0400, Brian Foster wrote: > > On Fri, Aug 15, 2014 at 04:39:00PM +1000, Dave Chinner wrote: > > > From: Dave Chinner > > > > > > We do some work in xfs_buf_ioend, and some work in > > > xfs_buf_iodone_work, but much of that functionality is the same. > > > This work can all be done in a single function, leaving > > > xfs_buf_iodone just a wrapper to determine if we should execute it > > > by workqueue or directly. hence rename xfs_buf_iodone_work to > > > xfs_buf_ioend(), and add a new xfs_buf_ioend_async() for places that > > > need async processing. > > > > > > Signed-off-by: Dave Chinner > > > --- > > > fs/xfs/xfs_buf.c | 79 +++++++++++++++++++++--------------------------- > > > fs/xfs/xfs_buf.h | 2 +- > > > fs/xfs/xfs_buf_item.c | 4 +-- > > > fs/xfs/xfs_inode.c | 2 +- > > > fs/xfs/xfs_log.c | 2 +- > > > fs/xfs/xfs_log_recover.c | 2 +- > > > 6 files changed, 40 insertions(+), 51 deletions(-) > > > > > > diff --git a/fs/xfs/xfs_buf.c b/fs/xfs/xfs_buf.c > > > index 5d86bbd..1b7f0bc 100644 > > > --- a/fs/xfs/xfs_buf.c > > > +++ b/fs/xfs/xfs_buf.c > > > @@ -999,54 +999,49 @@ xfs_buf_wait_unpin( > > > */ > > > > > > STATIC void > > > -xfs_buf_iodone_work( > > > - struct work_struct *work) > > > +xfs_buf_ioend( > > > + struct xfs_buf *bp) > > > > Compile failure here due to STATIC. > > > > > { > > > - struct xfs_buf *bp = > > > - container_of(work, xfs_buf_t, b_iodone_work); > > > - bool read = !!(bp->b_flags & XBF_READ); > > > + bool read = !!(bp->b_flags & XBF_READ); > > > + > > > + trace_xfs_buf_iodone(bp, _RET_IP_); > > > > > > bp->b_flags &= ~(XBF_READ | XBF_WRITE | XBF_READ_AHEAD); > > > > > > - /* only validate buffers that were read without errors */ > > > - if (read && bp->b_ops && !bp->b_error && (bp->b_flags & XBF_DONE)) > > > - bp->b_ops->verify_read(bp); > > > + if (!bp->b_error) { > > > + bp->b_flags |= XBF_DONE; > > > + > > > + /* only validate buffers that were read without errors */ > > > + if (read && bp->b_ops) > > > + bp->b_ops->verify_read(bp); > > > + } > > > > Probably not a cause of errors, but this code is now executed twice for > > I/O with b_iodone callbacks. > > reads don't have b_iodone callbacks. > Ah, Ok. > > Once for the initial call from bio_end_io, > > again from the callback via the b_iodone handler. The flags bits are > > probably fine, but we don't want to be running the verifiers multiple > > times unnecessarily. > > Which we don't ;) > Good point, but that's still a landmine IMO. It looks like the previous code would avoid it for sync I/O, but not for async. You could probably avoid it generally via a new flag or just by going off of XBF_DONE. The latter seems logical to me. A comment wouldn't hurt either. > > > @@ -1425,10 +1412,12 @@ xfs_buf_iorequest( > > > * waiting, and in the synchronous IO case it avoids unnecessary context > > > * switches an latency for high-peformance devices. > > > */ > > > - if (bp->b_error || !(bp->b_flags & XBF_ASYNC)) > > > - _xfs_buf_ioend(bp, 0); > > > - else > > > - _xfs_buf_ioend(bp, 1); > > > + if (atomic_dec_and_test(&bp->b_io_remaining) == 1) { > > > + if (bp->b_error || !(bp->b_flags & XBF_ASYNC)) > > > + xfs_buf_ioend(bp); > > > + else > > > + xfs_buf_ioend_async(bp); > > > + } > > > > This looks cleaner, but the comment is out of whack at this point. > > The code is functionally identical, so the comment didn't get > changed. As it is, the behaviour that exists in this patch goes away > in later patches, so it's mostly irrelevant that a comment is > absoultely correct in an intermediate point within the patch set. > This was just a minor point that the comment refers to _xfs_buf_ioend(). That obviously no longer exists but the comment is still around at the end of the series. Brian > Cheers, > > Dave. > -- > Dave Chinner > david@fromorbit.com > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From bfoster@redhat.com Mon Aug 18 09:16: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 (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 394777F57 for ; Mon, 18 Aug 2014 09:16:15 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id EF806304066 for ; Mon, 18 Aug 2014 07:16:14 -0700 (PDT) X-ASG-Debug-ID: 1408371373-04bdf010a140bd0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 4AAZUkOU2yQ0uvBy (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 18 Aug 2014 07:16: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-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 s7IEGAeo029730 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Mon, 18 Aug 2014 10:16:11 -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 s7IEGAKp029801; Mon, 18 Aug 2014 10:16:10 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 48AA112577C; Mon, 18 Aug 2014 10:16:09 -0400 (EDT) Date: Mon, 18 Aug 2014 10:16:09 -0400 From: Brian Foster To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 8/9] xfs: introduce xfs_buf_submit[_wait] Message-ID: <20140818141608.GC30093@bfoster.bfoster> X-ASG-Orig-Subj: Re: [PATCH 8/9] xfs: introduce xfs_buf_submit[_wait] References: <1408084747-4540-1-git-send-email-david@fromorbit.com> <1408084747-4540-9-git-send-email-david@fromorbit.com> <20140815143558.GE4096@laptop.bfoster> <20140815233935.GY26465@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140815233935.GY26465@dastard> User-Agent: Mutt/1.5.23 (2014-03-12) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.27 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1408371373 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Sat, Aug 16, 2014 at 09:39:35AM +1000, Dave Chinner wrote: > On Fri, Aug 15, 2014 at 10:35:58AM -0400, Brian Foster wrote: > > On Fri, Aug 15, 2014 at 04:39:06PM +1000, Dave Chinner wrote: > > > From: Dave Chinner > > > > > > There is a lot of cookie-cutter code that looks like: > > > > > > if (shutdown) > > > handle buffer error > > > xfs_buf_iorequest(bp) > > > error = xfs_buf_iowait(bp) > > > if (error) > > > handle buffer error > > > > > > spread through XFS. There's significant complexity now in > > > xfs_buf_iorequest() to specifically handle this sort of synchronous > > > IO pattern, but there's all sorts of nasty surprises in different > > > error handling code dependent on who owns the buffer references and > > > the locks. > > > > > > Pull this pattern into a single helper, where we can hide all the > > > synchronous IO warts and hence make the error handling for all the > > > callers much saner. This removes the need for a special extra > > > reference to protect IO completion processing, as we can now hold a > > > single reference across dispatch and waiting, simplifying the sync > > > IO smeantics and error handling. > > > > > > In doing this, also rename xfs_buf_iorequest to xfs_buf_submit and > > > make it explicitly handle on asynchronous IO. This forces all users > > > to be switched specifically to one interface or the other and > > > removes any ambiguity between how the interfaces are to be used. It > > > also means that xfs_buf_iowait() goes away. > > > > > > For the special case of delwri buffer submission and waiting, we > > > don't need to issue IO synchronously at all. The second pass to cal > > > xfs_buf_iowait() can now just block on xfs_buf_lock() - the buffer > > > will be unlocked when the async IO is complete. This formalises a > > > sane the method of waiting for async IO - take an extra reference, > > > submit the IO, call xfs_buf_lock() when you want to wait for IO > > > completion. i.e.: > > > > > > bp = xfs_buf_find(); > > > xfs_buf_hold(bp); > > > bp->b_flags |= XBF_ASYNC; > > > xfs_buf_iosubmit(bp); > > > xfs_buf_lock(bp) > > > error = bp->b_error; > > > .... > > > xfs_buf_relse(bp); > > > > > > Signed-off-by: Dave Chinner > > > --- > > > > On a quick look at submit_wait this looks pretty good. It actually > > implements the general model I've been looking for for sync I/O. E.g., > > send the I/O, wait on synchronization, then check for errors. In other > > words, a pure synchronous mechanism. The refactoring and new helpers and > > whatnot are additional bonus and abstract it nicely. > > > > I still have to take a closer look to review the actual code, but since > > we go and remove the additional sync I/O reference counting business, > > why do we even add that stuff early on? Can't we get from where the > > current code is to here in a more direct manner? > > Simply because we need a fix that we can backport, and that fix is a > simple addition that does not significantly affect the rest of the > patchset... > Ok, it wasn't clear that multiple fixes was the intent. I guess it's unforunate this won't see much tot testing, but we can find other ways to make sure it's tested. ;) Brian > Cheers, > > Dave. > -- > Dave Chinner > david@fromorbit.com > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From bfoster@redhat.com Mon Aug 18 09:26: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 50CCB7F3F for ; Mon, 18 Aug 2014 09:26:55 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id C6733AC003 for ; Mon, 18 Aug 2014 07:26:51 -0700 (PDT) X-ASG-Debug-ID: 1408372008-04cbb05488b5dc0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id jgJulr0AmfXNmKB5 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 18 Aug 2014 07:26: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-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 s7IEQkK1002213 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Mon, 18 Aug 2014 10:26:46 -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 s7IEQk4u006837; Mon, 18 Aug 2014 10:26:46 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 3F57712577C; Mon, 18 Aug 2014 10:26:45 -0400 (EDT) Date: Mon, 18 Aug 2014 10:26:45 -0400 From: Brian Foster To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 8/9] xfs: introduce xfs_buf_submit[_wait] Message-ID: <20140818142644.GD30093@bfoster.bfoster> X-ASG-Orig-Subj: Re: [PATCH 8/9] xfs: introduce xfs_buf_submit[_wait] References: <1408084747-4540-1-git-send-email-david@fromorbit.com> <1408084747-4540-9-git-send-email-david@fromorbit.com> <20140815161319.GF4096@laptop.bfoster> <20140815235804.GZ26465@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140815235804.GZ26465@dastard> User-Agent: Mutt/1.5.23 (2014-03-12) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1408372010 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Sat, Aug 16, 2014 at 09:58:04AM +1000, Dave Chinner wrote: > On Fri, Aug 15, 2014 at 12:13:20PM -0400, Brian Foster wrote: > > On Fri, Aug 15, 2014 at 04:39:06PM +1000, Dave Chinner wrote: > > > + if (XFS_FORCED_SHUTDOWN(bp->b_target->bt_mount)) { > > > + xfs_buf_ioerror(bp, -EIO); > > > + bp->b_flags &= ~XBF_DONE; > > > + xfs_buf_stale(bp); > > > + xfs_buf_ioend(bp); > > > + return; > > > + } > > > > > > if (bp->b_flags & XBF_WRITE) > > > xfs_buf_wait_unpin(bp); > > > @@ -1311,25 +1307,10 @@ xfs_buf_iorequest( > > > bp->b_io_error = 0; > > > > > > > I know this is from the previous patch, but I wonder if it's cleaner to > > reset b_io_error when the error is transferred to b_error. That seems > > slightly more future proof at least. > > I much prefer zeroing just before the variable is needed to be zero, > simply to indicate the context in which we care that the value is > correct. Outside of actively submitted IO, the value of b_io_error > is irrelevant, so it's value really doesn't matter. The other > advantage of leaving it untocuhed is for debug purposes - the caller > might clear b_error, but we still know what the state of the last IO > that was completed in the buffer was... > Sounds good, I don't really have a strong preference. > > > > > /* > > > - * Take references to the buffer. For XBF_ASYNC buffers, holding a > > > - * reference for as long as submission takes is all that is necessary > > > - * here. The IO inherits the lock and hold count from the submitter, > > > - * and these are release during IO completion processing. Taking a hold > > > - * over submission ensures that the buffer is not freed until we have > > > - * completed all processing, regardless of when IO errors occur or are > > > - * reported. > > > - * > > > - * However, for synchronous IO, the IO does not inherit the submitters > > > - * reference count, nor the buffer lock. Hence we need to take an extra > > > - * reference to the buffer for the for the IO context so that we can > > > - * guarantee the buffer is not freed until all IO completion processing > > > - * is done. Otherwise the caller can drop their reference while the IO > > > - * is still in progress and hence trigger a use-after-free situation. > > > + * Take an extra reference so that we don't have to guess when it's no > > > + * longer safe to reference the buffer that was passed to us. > > > */ > > > > Assuming my understanding is correct: > > > > /* > > * The caller's reference is released by buffer I/O completion. Technically > > * this should not occur until we release the last b_io_remaining reference. > > That's not quite right. The caller's reference is released some time > *after* b_io_remaining goes to zero. That's the reason we need to > hold a reference - after we drop our b_io_remaining count, we have > to have some other method of ensuring the buffer doesn't go away > until we have finished with the buffer. > Right, that's what I meant by the fact that we have to release the last b_io_remaining ref one way or another first... > I'll rewrite the comment. > Ok, the rest of the comment I wrote isn't really clear when I re-read it back either. > > > +xfs_buf_submit_wait( > > > + struct xfs_buf *bp) > > > { > > > - trace_xfs_buf_iowait(bp, _RET_IP_); > > > + int error; > > > + > > > + trace_xfs_buf_iorequest(bp, _RET_IP_); > > > > > > - if (!bp->b_error) > > > - wait_for_completion(&bp->b_iowait); > > > + ASSERT(!(bp->b_flags & (_XBF_DELWRI_Q | XBF_ASYNC))); > > > + > > > + if (XFS_FORCED_SHUTDOWN(bp->b_target->bt_mount)) { > > > + xfs_buf_ioerror(bp, -EIO); > > > + xfs_buf_stale(bp); > > > + bp->b_flags &= ~XBF_DONE; > > > + return -EIO; > > > + } > > > > > > + if (bp->b_flags & XBF_WRITE) > > > + xfs_buf_wait_unpin(bp); > > > + > > > + /* clear the internal error state to avoid spurious errors */ > > > + bp->b_io_error = 0; > > > + > > > + /* > > > + * For synchronous IO, the IO does not inherit the submitters reference > > > + * count, nor the buffer lock. Hence we cannot release the reference we > > > + * are about to take until we've waited for all IO completion to occur, > > > + * including any xfs_buf_ioend_async() work that may be pending. > > > + */ > > > + xfs_buf_hold(bp); > > > + > > > > Harmless, but why is this necessary? The caller should have the > > reference, the I/O completion won't release it and we wait on b_iowait > > before we return. Isn't the caller's reference sufficient? > > Consistency - I'd prefer that all IO has the same reference counting > behaviour. i.e. that the IO holds it's own reference to ensure, > regardless of anything else that happens, that the buffer has a > valid reference count the entire time the IO subsystem processing > the buffer. > Sounds good. > > > @@ -1838,7 +1853,10 @@ xfs_buf_delwri_submit( > > > bp = list_first_entry(&io_list, struct xfs_buf, b_list); > > > > > > list_del_init(&bp->b_list); > > > - error2 = xfs_buf_iowait(bp); > > > + > > > + /* locking the buffer will wait for async IO completion. */ > > > + xfs_buf_lock(bp); > > > + error2 = bp->b_error; > > > > Interesting delwri cleanup overall. The lock here works for > > synchronization (blocking), but it doesn't look safe for error > > processing. Once the buffer lock is dropped, who says b_error is from > > our write (and not a subsequent, for example) and thus this caller's > > responsibility to handle the error? I suspect this is a reason the lock > > is typically held across a sync I/O, so the error is valid after the > > I/O. > > It's fine because there is only a limited set of blocking callers, > all of which are special cases. The only callers that use this > blocking xfs_buf_delwri_submit() interface are: > > 1. log recovery: running single threaded, so isn't going > to be racing with anything else that can modify the error > > 2. quotacheck: also running single threaded > > 3. quota shrinker, which has nowhere to report an error to, > so the error status simply doesn't matter. > Sure, to be honest I wasn't really expecting there to be a scenario where this is currently possible. I figured the log recovery context was obviously not a concern because that occurs on mount. I hadn't gone to look at the other contexts where we use delwri. quotacheck makes sense for the same reason. We also use delwri for AIL pushing, but not the synchronous version. My comment was more from the perspective of this code will be around for a long time and this little characteristic of the mechanism is not at all explicit or obvious. So it won't ever be a problem until somebody uses sync delwri in a context where racing is possible. Then it won't ever reproduce until some user drives said mechanism and hits an error in just the right manner to lead to some undefined error recovery behavior. Maybe that doesn't happen for 20 years, but whenever it does, it's guaranteed to not be fun to debug. ;) So my point is not to suggest there's a race somewhere. It's just that the mechanism is racy and I'd prefer we eliminate the possibility of having to debug the flaw that this leaves behind. :) Another way to look at it is that we can't ever use this delwri mechanism from anywhere but such special, isolated contexts going forward. If we ever find that we want to, that punts the problem to a prereq for whatever work that happens to be. It's not clear to me if there's a way to deal with that without fundamentally changing this mechanism. Anything explicit probably just adds ugliness that's dedicated specifically to the fact that this is racy (e.g., delwri specific lock/counter), so I don't think we want to go there. It seems like the more general problem is that we have two I/O models (sync and async) that are fundamentally incompatible, but here we try to build a batch sync I/O mechanism on top of the async submission mechanism. So the definition of the async model is no longer sufficient for our use, since we clearly have a use case to wait on an async I/O. Perhaps we should think more about making the async/sync mechanisms more generic/compatible..? Thinking out loud, making the lock context dynamically transferrable to the I/O might be an interesting experiment to start to decouple things (much like we do for joining items to transactions, for example). FWIW, I'm Ok with deferring that or adding it to my own todo list based on the fact that there are currently no racing contexts, so long as the async is a subset of sync I/O model is generally acceptable. > > Also, it looks like blocking on async I/O as such opens up the > > possibility of blocking indefinitely on failing writes if the right > > combination of delwri and b_iodone handler is used (see > > xfs_buf_iodone_callbacks()). I'm not sure if that's a real problem > > today, though. > > I don't think it is - we don't permanently rewrite metadata writes > from IO completion anymore. We retry once, but then require higher > layers to restart the IO again (e.g. the xfsaild). Hence we can't > get stuck forever on async write errors. > Ok, we have the XBF_WRITE_FAIL thing now. Forgot about that. Brian > > > diff --git a/fs/xfs/xfs_log_recover.c b/fs/xfs/xfs_log_recover.c > > > index 4ba19bf..1e14452 100644 > > > --- a/fs/xfs/xfs_log_recover.c > > > +++ b/fs/xfs/xfs_log_recover.c > > > @@ -193,12 +193,8 @@ xlog_bread_noalign( > > > bp->b_io_length = nbblks; > > > bp->b_error = 0; > > > > > > - if (XFS_FORCED_SHUTDOWN(log->l_mp)) > > > - return -EIO; > > > - > > > - xfs_buf_iorequest(bp); > > > - error = xfs_buf_iowait(bp); > > > - if (error) > > > + error = xfs_buf_submit_wait(bp); > > > + if (error && !XFS_FORCED_SHUTDOWN(log->l_mp)) > > > xfs_buf_ioerror_alert(bp, __func__); > > > return error; > > > } > > > @@ -4427,16 +4423,12 @@ xlog_do_recover( > > > XFS_BUF_UNASYNC(bp); > > > bp->b_ops = &xfs_sb_buf_ops; > > > > > > - if (XFS_FORCED_SHUTDOWN(log->l_mp)) { > > > - xfs_buf_relse(bp); > > > - return -EIO; > > > - } > > > - > > > - xfs_buf_iorequest(bp); > > > - error = xfs_buf_iowait(bp); > > > + error = xfs_buf_submit_wait(bp); > > > if (error) { > > > - xfs_buf_ioerror_alert(bp, __func__); > > > - ASSERT(0); > > > + if (XFS_FORCED_SHUTDOWN(log->l_mp)) { > > > > Should this be !XFS_FORCED_SHUTDOWN()? > > Right, good catch, especially after reading all that code ;) > > Cheers, > > Dave. > -- > Dave Chinner > david@fromorbit.com > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From robin.listas@gmail.com Mon Aug 18 09:47: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=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 2F55B7F3F for ; Mon, 18 Aug 2014 09:47:59 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 078EB30406A for ; Mon, 18 Aug 2014 07:47:58 -0700 (PDT) X-ASG-Debug-ID: 1408373276-04cbb05487b87b0001-NocioJ Received: from mail-wg0-f45.google.com (mail-wg0-f45.google.com [74.125.82.45]) by cuda.sgi.com with ESMTP id XSiKRyR2i0ZWGb3g (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Mon, 18 Aug 2014 07:47:57 -0700 (PDT) X-Barracuda-Envelope-From: robin.listas@gmail.com X-Barracuda-Apparent-Source-IP: 74.125.82.45 Received: by mail-wg0-f45.google.com with SMTP id x12so5171097wgg.16 for ; Mon, 18 Aug 2014 07:47:55 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=sender:date:from:to:subject:in-reply-to:message-id:references :user-agent:mime-version:content-type; bh=AXVANuA1LKXniqiNLyLibD4nSJP+dhLpDdqgg5e8c4I=; b=Txcp4BBrEU1M7AAzd1rjYxkZM6caCa0nHqzsHVDGLdE8KwnNic3AOq552Ta0qvvb3G cBBrX1Rh6KGCU0IqJgcBY9MqhEf30eRLluZKpK4y28aoEjfwjGrj/4XzCT33syFCHSvu glJnFkV1RhrnIVhYU0Tab/UWCy4XljdoZGwKPWlqHCQIWakPbSdxO21P3Zm1iBRmS7Bm +JpqFrgxESXD3esKaCmeET2Nh2qtOHbztJkbUmctdanLUlwC4b+/QqBeoBGOt4Y9XjeO ukYo1eaJXfw2iXS3Iqmd83Q13cJwQ6CGJRCt2EFZu+31zCMgbqwIoQH7OSxQ3r8BKQbc lfbQ== X-Received: by 10.180.91.70 with SMTP id cc6mr239220wib.66.1408373275310; Mon, 18 Aug 2014 07:47:55 -0700 (PDT) Received: from Telcontar.valinor (177.Red-79-159-63.staticIP.rima-tde.net. [79.159.63.177]) by mx.google.com with ESMTPSA id gi5sm42792943wjd.33.2014.08.18.07.47.54 for (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 18 Aug 2014 07:47:54 -0700 (PDT) Sender: Carlos Robinson Received: from localhost (localhost [127.0.0.1]) by Telcontar.valinor (Postfix) with ESMTP id 9FDBE60E5A for ; Mon, 18 Aug 2014 16:47:52 +0200 (CEST) X-Virus-Scanned: amavisd-new at valinor Received: from Telcontar.valinor ([127.0.0.1]) by localhost (Telcontar.valinor [127.0.0.1]) (amavisd-new, port 10024) with LMTP id ytwcbcCkRugQ for ; Mon, 18 Aug 2014 16:47:52 +0200 (CEST) Received: from localhost (localhost [127.0.0.1]) by Telcontar.valinor (Postfix) with ESMTP id 792E060726 for ; Mon, 18 Aug 2014 16:47:52 +0200 (CEST) Date: Mon, 18 Aug 2014 16:47:36 +0200 (CEST) From: "Carlos E. R." X-X-Sender: cer@Telcontar.valinor To: XFS mailing list Subject: Re: [RFD]: Help in setting up XFS In-Reply-To: <20140818132026.GO20518@dastard> X-ASG-Orig-Subj: Re: [RFD]: Help in setting up XFS Message-ID: References: <20140818070312.GM20518@dastard> <20140818132026.GO20518@dastard> User-Agent: Alpine 2.11 (LSU 23 2013-08-11) MIME-Version: 1.0 Content-Type: TEXT/PLAIN; format=flowed; charset=US-ASCII X-Barracuda-Connect: mail-wg0-f45.google.com[74.125.82.45] X-Barracuda-Start-Time: 1408373277 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.8579 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: SHA1 On Monday, 2014-08-18 at 23:20 +1000, Dave Chinner wrote: > On Mon, Aug 18, 2014 at 12:25:57PM +0200, Carlos E. R. wrote: >> Just plug in the stick and click on the icon to mount it. No >> different than any other filesystem. > > That doesn't work for machines with no desktop or ones that you > access via ssh. Learn the command line first then you can always get > the machine to do what you want regardless of how you need to access > it. Indeed, typing commands is often faster than using the mouse, > especially if you know how to use command history search > effectively... I use the CLI method myself, but I don't see the point on novices using it when there are modern methods far easier :-) Me, I would make sure the filesystem gets a label, and probably create an entry in fstab using that label, with the "user" option so that plain users can mount it. Then we have to add a directory as root owned by that user inside the stick so that he can write. Anyway, the procedure is the same for any Linux filesystem (but not for NTFS or FAT), not specific to XFS. >> If it doesn't work, just ask on the help forum or mail lists of your >> distribution. > > That's just wrong. If you've got an XFS problem or question, then > this mailing list is exactly the right place to be asking for help. IMHO no, because, for instance, the method for installation differs in each distribution, and their help forums should be more suited for such a basic guidance. Anyway, mounting or creating an XFS stick is the same as for ext4, btrfs, fat, reiserfs... I do a lot of that guidance, have been doing it for well over a decade ;-) And each distribution has specifics. On ubuntu you probably need to do "sudo mount ...", a plain mount should fail. So if the generalized help an upstream mail list can provide, the best place to ask for help is the specific help forum of that distribution, as they will probably know best the easiest way to install and use the tools they provide. But that's just my opinion :-) - -- Cheers, Carlos E. R. (from openSUSE 13.1 x86_64 "Bottle" at Telcontar) -----BEGIN PGP SIGNATURE----- Version: GnuPG v2.0.22 (GNU/Linux) iEYEARECAAYFAlPyEhgACgkQtTMYHG2NR9W1HgCdFiMBjJc6sCCdPAKNL6mm43rR kQQAn0YjyEe0mkyNvlz08KkokepB8g1M =sSfH -----END PGP SIGNATURE----- From bounce@client21.emailnull.in Mon Aug 18 10:57: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=DATE_IN_PAST_06_12, HTML_MESSAGE,MPART_ALT_DIFF,NORMAL_HTTP_TO_IP,PLING_QUERY 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 7829E7F3F for ; Mon, 18 Aug 2014 10:57:02 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 3A8D58F8039 for ; Mon, 18 Aug 2014 08:56:59 -0700 (PDT) X-ASG-Debug-ID: 1408377414-04bdf010a04e300001-NocioJ Received: from server21.emailnull.in (client21.emailnull.in [23.239.14.57]) by cuda.sgi.com with ESMTP id wZ1jWBzndfWZORHK (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 18 Aug 2014 08:56:54 -0700 (PDT) X-Barracuda-Envelope-From: bounce@client21.emailnull.in X-Barracuda-Apparent-Source-IP: 23.239.14.57 Received: from client21e by server21.emailnull.in with local (Exim 4.82) (envelope-from ) id 1XJPIj-0003Xn-Sq for xfs@oss.sgi.com; Mon, 18 Aug 2014 15:56:53 +0000 To: xfs@oss.sgi.com Subject: Not planned holidays yet? Plan now & get best travel deals !! Message-ID: X-ASG-Orig-Subj: Not planned holidays yet? Plan now & get best travel deals !! Date: Mon, 18 Aug 2014 07:11:23 +0000 From: "Ranjeeta Singh" Reply-To: noreply@client21.emailnull.in MIME-Version: 1.0 X-Mailer-LID: 103 List-Unsubscribe: X-Mailer-SID: 100 X-Mailer-Sent-By: 1 Content-Type: multipart/alternative; charset="UTF-8"; boundary="b1_0bba33b2e5f371dcafd1bcfd8a8d2271" Content-Transfer-Encoding: 8bit X-AntiAbuse: This header was added to track abuse, please include it with any abuse report X-AntiAbuse: Primary Hostname - server21.emailnull.in X-AntiAbuse: Original Domain - oss.sgi.com X-AntiAbuse: Originator/Caller UID/GID - [501 512] / [47 12] X-AntiAbuse: Sender Address Domain - client21.emailnull.in X-Get-Message-Sender-Via: server21.emailnull.in: authenticated_id: client21e/from_h X-Barracuda-Connect: client21.emailnull.in[23.239.14.57] X-Barracuda-Start-Time: 1408377414 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.59 X-Barracuda-Spam-Status: No, SCORE=2.59 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DATE_IN_PAST_06_12, DATE_IN_PAST_06_12_2, HTML_MESSAGE, MPART_ALT_DIFF, NORMAL_HTTP_TO_IP, PLING_QUERY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.8581 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.01 DATE_IN_PAST_06_12 Date: is 6 to 12 hours before Received: date 0.00 NORMAL_HTTP_TO_IP URI: Uses a dotted-decimal IP address in URL 0.00 HTML_MESSAGE BODY: HTML included in message 0.14 MPART_ALT_DIFF BODY: HTML and text parts are different 1.33 PLING_QUERY Subject has exclamation mark and question mark 1.10 DATE_IN_PAST_06_12_2 DATE_IN_PAST_06_12_2 --b1_0bba33b2e5f371dcafd1bcfd8a8d2271 Content-Type: text/plain; format=flowed; charset="UTF-8" Content-Transfer-Encoding: 8bit Your email client cannot read this email. To view it online, please go here: http://23.239.14.57/~client21e/display.php?M=4519130&C=1ba8c70d725bd970bc306f9228c3c055&S=100&L=103&N=81 To stop receiving these emails:http://23.239.14.57/~client21e/unsubscribe.php?M=4519130&C=1ba8c70d725bd970bc306f9228c3c055&L=103&N=100 --b1_0bba33b2e5f371dcafd1bcfd8a8d2271 Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: 8bit Holiday Trip Planning
Andaman Tour
 
VISIT TOP DESTINATIONS in INDIA
 

Ladakh

Ladakh
Nubra Valley | Leh | Thiksey | Mankorma
5 Night 6 Days
PLAN NOW

North East

North East
Darjeeling | Gangtok | Sikkim | Bagdogra
4 Night 5 Days
PLAN NOW
 

Kashmir

Kashmir
Gulmarg | Pahalgam | Sonmarg | Dal Lake
3 Night 4 Days
PLAN NOW

Kerala

Kerala
Kovalam | Kumarakom | Kochi | Munnar
4 Night 5 Days
PLAN NOW
 

Click here to unsubscribe --b1_0bba33b2e5f371dcafd1bcfd8a8d2271-- From stan@hardwarefreak.com Mon Aug 18 11:16: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 13C947F4E for ; Mon, 18 Aug 2014 11:16:17 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 0218530407A for ; Mon, 18 Aug 2014 09:16:13 -0700 (PDT) X-ASG-Debug-ID: 1408378572-04cb6c5500b0e70001-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 AIlvCpIUwNXAvASf for ; Mon, 18 Aug 2014 09:16:13 -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: by greer.hardwarefreak.com (Postfix, from userid 33) id A9F666C190; Mon, 18 Aug 2014 11:16:12 -0500 (CDT) To: Dave Chinner Subject: Re: inode64 directory placement determinism X-PHP-Originating-Script: 0:func.inc X-ASG-Orig-Subj: Re: inode64 directory placement determinism MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Date: Mon, 18 Aug 2014 11:16:12 -0500 From: Stan Hoeppner Cc: In-Reply-To: <20140818070153.GL20518@dastard> References: <20140818070153.GL20518@dastard> Message-ID: X-Sender: stan@hardwarefreak.com User-Agent: RoundCube Webmail/0.3.1 X-Barracuda-Connect: mo-65-41-216-221.sta.embarqhsd.net[65.41.216.221] X-Barracuda-Start-Time: 1408378572 X-Barracuda-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, 18 Aug 2014 17:01:53 +1000, Dave Chinner wrote: > On Sun, Aug 17, 2014 at 10:29:21PM -0500, Stan Hoeppner wrote: >> Say I have a single 4TB disk in an md linear device. The md device has a >> filesystem on it formatted with defaults. It has 4 AGs, 0-3. I have >> created 4 directories. Each should reside in a different AG, the first >> in >> AG0. Now I expand the linear device with an identical 4TB disk and >> execute >> xfs_growfs. I now have 4 more AGs, 4-7. I create 4 more directories. >> >> Will these 4 new dirs be created sequentially in AGs 4-7, or in the first >> 4 AGs? Is this deterministic, or is there any chance involved? On the > > Deterministic, assuming single threaded *file-system-wide* directory > creation. Completely unpredictable under concurrent directory > creations. See xfs_ialloc_ag_select/xfs_ialloc_next_ag. > > Note that the rotor used to select the next AG is set to > zero at mount. > > i.e. single threaded behaviour at agcount = 4: > > dir number rotor value destination AG > 1 0 0 > 2 1 1 > 3 2 2 > 4 3 3 > 5 0 0 > 6 1 1 > .... > > So, if you do what you suggest, and grow *after* the first 4 dirs > are created, the above is what you'll get because the rotor goes > back to zero on the fourth directory create. Now, with changing from > 4 to 8 AGs after the first 4: > > dir number rotor value new inode location (AG) > 1 0 0 > 2 1 1 > 3 2 2 > 4 3 3 > > 5 0 0 > 6 1 1 > 7 2 2 > 8 3 3 > 9 4 4 > 10 5 5 > 11 6 6 > 13 7 7 > 14 0 0 > >> real system these 4TB drives are actually 48TB LUNs. I'm after >> deterministic parallel bandwidth to subsequently added RAIDs after each >> grow operation by simply writing to the proper directory. > > Just create new directories and use the inode number to > determine their location. If the directory is not in the correct AG, > remove it and create a new one, until you have directories located > in the AGs you want. > > Cheers, > > Dave. Thanks for the info Dave. Was hoping it would be more straightforward. Modifying the app for this is out of the question. They've spent 3+ years developing with EXT4 and decided to try XFS at the last minute. Product is to ship in October, so optimizations I can suggest are limited. -- Stan From bfoster@redhat.com Mon Aug 18 14:02: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 F34517F3F for ; Mon, 18 Aug 2014 14:02:11 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 7EA20AC002 for ; Mon, 18 Aug 2014 12:02:11 -0700 (PDT) X-ASG-Debug-ID: 1408388526-04cb6c54ffbe8e0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id mRsPlZaU4Ar8fucV (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 18 Aug 2014 12:02: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-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 s7IJ25YT016134 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK) for ; Mon, 18 Aug 2014 15:02:05 -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 s7IJ25rs008143 for ; Mon, 18 Aug 2014 15:02:05 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 82B4112577F; Mon, 18 Aug 2014 15:02:03 -0400 (EDT) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH] xfs: mark all internal workqueues as freezable Date: Mon, 18 Aug 2014 15:02:03 -0400 X-ASG-Orig-Subj: [PATCH] xfs: mark all internal workqueues as freezable Message-Id: <1408388523-3684-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: 1408388526 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 Workqueues must be explicitly set as freezable to ensure they are frozen in the assocated part of the hibernation/suspend sequence. Freezing of workqueues and kernel threads is important to ensure that modifications are not made on-disk after the hibernation image has been created. Otherwise, the in-memory state can become inconsistent with what is on disk and eventually lead to filesystem corruption. We have reports of free space btree corruptions that occur immediately after restore from hibernate that suggest the xfs-eofblocks workqueue could be causing such problems if it races with hibernation. Mark all of the internal XFS workqueues as freezable to ensure nothing changes on-disk once the freezer infrastructure freezes kernel threads and creates the hibernation image. Signed-off-by: Brian Foster Reported-by: Carlos E. R. --- Hi all, Unfortunately I still haven't been able to reproduce the specific corruption. The best I've been able to do is reproduce a hang/crash on hibernate if I coordinate hibernate with background eofblocks scans, but I couldn't get any output as to what was going on. I ran some similar test cycles with this change and didn't reproduce that hang, so this appears to be effective at least. I reproduce other such problems running hibernation while doing stress level I/O, so to be honest I'm not sure how trustworthy/reliable hibernate is in general. This appears like the right thing to do to reduce chances of corruptions in any event. Brian fs/xfs/xfs_buf.c | 2 +- fs/xfs/xfs_mru_cache.c | 3 ++- fs/xfs/xfs_super.c | 15 ++++++++------- 3 files changed, 11 insertions(+), 9 deletions(-) diff --git a/fs/xfs/xfs_buf.c b/fs/xfs/xfs_buf.c index cd7b8ca..ec65050 100644 --- a/fs/xfs/xfs_buf.c +++ b/fs/xfs/xfs_buf.c @@ -1884,7 +1884,7 @@ xfs_buf_init(void) goto out; xfslogd_workqueue = alloc_workqueue("xfslogd", - WQ_MEM_RECLAIM | WQ_HIGHPRI, 1); + WQ_MEM_RECLAIM | WQ_HIGHPRI | WQ_FREEZABLE, 1); if (!xfslogd_workqueue) goto out_free_buf_zone; diff --git a/fs/xfs/xfs_mru_cache.c b/fs/xfs/xfs_mru_cache.c index 1eb6f3d..30ecca3 100644 --- a/fs/xfs/xfs_mru_cache.c +++ b/fs/xfs/xfs_mru_cache.c @@ -304,7 +304,8 @@ _xfs_mru_cache_reap( int xfs_mru_cache_init(void) { - xfs_mru_reap_wq = alloc_workqueue("xfs_mru_cache", WQ_MEM_RECLAIM, 1); + xfs_mru_reap_wq = alloc_workqueue("xfs_mru_cache", + WQ_MEM_RECLAIM|WQ_FREEZABLE, 1); if (!xfs_mru_reap_wq) return -ENOMEM; return 0; diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c index b194652..bc9ec44 100644 --- a/fs/xfs/xfs_super.c +++ b/fs/xfs/xfs_super.c @@ -838,32 +838,32 @@ xfs_init_mount_workqueues( struct xfs_mount *mp) { mp->m_data_workqueue = alloc_workqueue("xfs-data/%s", - WQ_MEM_RECLAIM, 0, mp->m_fsname); + WQ_MEM_RECLAIM|WQ_FREEZABLE, 0, mp->m_fsname); if (!mp->m_data_workqueue) goto out; mp->m_unwritten_workqueue = alloc_workqueue("xfs-conv/%s", - WQ_MEM_RECLAIM, 0, mp->m_fsname); + WQ_MEM_RECLAIM|WQ_FREEZABLE, 0, mp->m_fsname); if (!mp->m_unwritten_workqueue) goto out_destroy_data_iodone_queue; mp->m_cil_workqueue = alloc_workqueue("xfs-cil/%s", - WQ_MEM_RECLAIM, 0, mp->m_fsname); + WQ_MEM_RECLAIM|WQ_FREEZABLE, 0, mp->m_fsname); if (!mp->m_cil_workqueue) goto out_destroy_unwritten; mp->m_reclaim_workqueue = alloc_workqueue("xfs-reclaim/%s", - 0, 0, mp->m_fsname); + WQ_FREEZABLE, 0, mp->m_fsname); if (!mp->m_reclaim_workqueue) goto out_destroy_cil; mp->m_log_workqueue = alloc_workqueue("xfs-log/%s", - 0, 0, mp->m_fsname); + WQ_FREEZABLE, 0, mp->m_fsname); if (!mp->m_log_workqueue) goto out_destroy_reclaim; mp->m_eofblocks_workqueue = alloc_workqueue("xfs-eofblocks/%s", - 0, 0, mp->m_fsname); + WQ_FREEZABLE, 0, mp->m_fsname); if (!mp->m_eofblocks_workqueue) goto out_destroy_log; @@ -1715,7 +1715,8 @@ xfs_init_workqueues(void) * AGs in all the filesystems mounted. Hence use the default large * max_active value for this workqueue. */ - xfs_alloc_wq = alloc_workqueue("xfsalloc", WQ_MEM_RECLAIM, 0); + xfs_alloc_wq = alloc_workqueue("xfsalloc", + WQ_MEM_RECLAIM|WQ_FREEZABLE, 0); if (!xfs_alloc_wq) return -ENOMEM; -- 1.8.3.1 From david@fromorbit.com Mon Aug 18 17:49: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 6FC2F7F3F for ; Mon, 18 Aug 2014 17:49:02 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 32B6D30407A for ; Mon, 18 Aug 2014 15:48:59 -0700 (PDT) X-ASG-Debug-ID: 1408402136-04bdf0109a681e0001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id VQnzEsmKC79FtpHU for ; Mon, 18 Aug 2014 15:48:56 -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: AgMKAJCB8lN5LDJ8PGdsb2JhbABZgw2BKoIshQeoJgEBAQEBAQaefIV7AYEcFwUBAQEBODaEBAEFOhwjEAgDGAklDwUlAwcaE4hBwg4XGIVkiHhYB4MvgR0FnEGYcysvgQaBSQEBAQ Received: from ppp121-44-50-124.lns20.syd6.internode.on.net (HELO dastard) ([121.44.50.124]) by ipmail05.adl6.internode.on.net with ESMTP; 19 Aug 2014 08:18:54 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1XJVjR-0003cn-5q; Tue, 19 Aug 2014 08:48:53 +1000 Date: Tue, 19 Aug 2014 08:48:53 +1000 From: Dave Chinner To: Stan Hoeppner Cc: xfs@oss.sgi.com Subject: Re: inode64 directory placement determinism Message-ID: <20140818224853.GD26465@dastard> X-ASG-Orig-Subj: Re: inode64 directory placement determinism References: <20140818070153.GL20518@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: 1408402136 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.8593 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Mon, Aug 18, 2014 at 11:16:12AM -0500, Stan Hoeppner wrote: > On Mon, 18 Aug 2014 17:01:53 +1000, Dave Chinner > wrote: > > On Sun, Aug 17, 2014 at 10:29:21PM -0500, Stan Hoeppner wrote: > >> Say I have a single 4TB disk in an md linear device. The md device has > a > >> filesystem on it formatted with defaults. It has 4 AGs, 0-3. I have > >> created 4 directories. Each should reside in a different AG, the first > >> in > >> AG0. Now I expand the linear device with an identical 4TB disk and > >> execute > >> xfs_growfs. I now have 4 more AGs, 4-7. I create 4 more directories. > >> > >> Will these 4 new dirs be created sequentially in AGs 4-7, or in the > first > >> 4 AGs? Is this deterministic, or is there any chance involved? On the > > > > Deterministic, assuming single threaded *file-system-wide* directory > > creation. Completely unpredictable under concurrent directory > > creations. See xfs_ialloc_ag_select/xfs_ialloc_next_ag. > > > > Note that the rotor used to select the next AG is set to > > zero at mount. > > > > i.e. single threaded behaviour at agcount = 4: > > > > dir number rotor value destination AG > > 1 0 0 > > 2 1 1 > > 3 2 2 > > 4 3 3 > > 5 0 0 > > 6 1 1 > > .... > > > > So, if you do what you suggest, and grow *after* the first 4 dirs > > are created, the above is what you'll get because the rotor goes > > back to zero on the fourth directory create. Now, with changing from > > 4 to 8 AGs after the first 4: > > > > dir number rotor value new inode location (AG) > > 1 0 0 > > 2 1 1 > > 3 2 2 > > 4 3 3 > > > > 5 0 0 > > 6 1 1 > > 7 2 2 > > 8 3 3 > > 9 4 4 > > 10 5 5 > > 11 6 6 > > 13 7 7 > > 14 0 0 > > > >> real system these 4TB drives are actually 48TB LUNs. I'm after > >> deterministic parallel bandwidth to subsequently added RAIDs after each > >> grow operation by simply writing to the proper directory. > > > > Just create new directories and use the inode number to > > determine their location. If the directory is not in the correct AG, > > remove it and create a new one, until you have directories located > > in the AGs you want. > > > > Cheers, > > > > Dave. > > > Thanks for the info Dave. Was hoping it would be more straightforward. > Modifying the app for this is out of the question. They've spent 3+ years > developing with EXT4 and decided to try XFS at the last minute. Product is > to ship in October, so optimizations I can suggest are limited. Perhaps you could actually tell us what the requirement for layout/separation is, and how they are acheiving it with ext4. We really need a more "directed" allocation ability, but it's not clear exactly what requirements need to drive that. Cheers, Dave. -- Dave Chinner david@fromorbit.com From stan@hardwarefreak.com Mon Aug 18 19:02: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 (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id E0FCC7F50 for ; Mon, 18 Aug 2014 19:02:09 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id B15FF8F8039 for ; Mon, 18 Aug 2014 17:02:06 -0700 (PDT) X-ASG-Debug-ID: 1408406525-04bdf010a06a4b0001-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 i5jK0y7YcBBHwuyb for ; Mon, 18 Aug 2014 17:02:05 -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: by greer.hardwarefreak.com (Postfix, from userid 33) id DA35F6C190; Mon, 18 Aug 2014 19:02:04 -0500 (CDT) To: Dave Chinner Subject: Re: inode64 directory placement determinism X-PHP-Originating-Script: 0:func.inc X-ASG-Orig-Subj: Re: inode64 directory placement determinism MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Date: Mon, 18 Aug 2014 19:02:04 -0500 From: Stan Hoeppner Cc: In-Reply-To: <20140818224853.GD26465@dastard> References: <20140818070153.GL20518@dastard> <20140818224853.GD26465@dastard> Message-ID: X-Sender: stan@hardwarefreak.com User-Agent: RoundCube Webmail/0.3.1 X-Barracuda-Connect: mo-65-41-216-221.sta.embarqhsd.net[65.41.216.221] X-Barracuda-Start-Time: 1408406525 X-Barracuda-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, 19 Aug 2014 08:48:53 +1000, Dave Chinner wrote: > On Mon, Aug 18, 2014 at 11:16:12AM -0500, Stan Hoeppner wrote: >> On Mon, 18 Aug 2014 17:01:53 +1000, Dave Chinner >> wrote: >> > On Sun, Aug 17, 2014 at 10:29:21PM -0500, Stan Hoeppner wrote: >> >> Say I have a single 4TB disk in an md linear device. The md device >> >> has >> a >> >> filesystem on it formatted with defaults. It has 4 AGs, 0-3. I have >> >> created 4 directories. Each should reside in a different AG, the >> >> first >> >> in >> >> AG0. Now I expand the linear device with an identical 4TB disk and >> >> execute >> >> xfs_growfs. I now have 4 more AGs, 4-7. I create 4 more directories. >> >> >> >> Will these 4 new dirs be created sequentially in AGs 4-7, or in the >> first >> >> 4 AGs? Is this deterministic, or is there any chance involved? On >> >> the >> > >> > Deterministic, assuming single threaded *file-system-wide* directory >> > creation. Completely unpredictable under concurrent directory >> > creations. See xfs_ialloc_ag_select/xfs_ialloc_next_ag. >> > >> > Note that the rotor used to select the next AG is set to >> > zero at mount. >> > >> > i.e. single threaded behaviour at agcount = 4: >> > >> > dir number rotor value destination AG >> > 1 0 0 >> > 2 1 1 >> > 3 2 2 >> > 4 3 3 >> > 5 0 0 >> > 6 1 1 >> > .... >> > >> > So, if you do what you suggest, and grow *after* the first 4 dirs >> > are created, the above is what you'll get because the rotor goes >> > back to zero on the fourth directory create. Now, with changing from >> > 4 to 8 AGs after the first 4: >> > >> > dir number rotor value new inode location (AG) >> > 1 0 0 >> > 2 1 1 >> > 3 2 2 >> > 4 3 3 >> > >> > 5 0 0 >> > 6 1 1 >> > 7 2 2 >> > 8 3 3 >> > 9 4 4 >> > 10 5 5 >> > 11 6 6 >> > 13 7 7 >> > 14 0 0 >> > >> >> real system these 4TB drives are actually 48TB LUNs. I'm after >> >> deterministic parallel bandwidth to subsequently added RAIDs after >> >> each >> >> grow operation by simply writing to the proper directory. >> > >> > Just create new directories and use the inode number to >> > determine their location. If the directory is not in the correct AG, >> > remove it and create a new one, until you have directories located >> > in the AGs you want. >> > >> > Cheers, >> > >> > Dave. >> >> >> Thanks for the info Dave. Was hoping it would be more straightforward. >> Modifying the app for this is out of the question. They've spent 3+ >> years >> developing with EXT4 and decided to try XFS at the last minute. Product >> is >> to ship in October, so optimizations I can suggest are limited. > > Perhaps you could actually tell us what the requirement for > layout/separation is, and how they are acheiving it with ext4. We > really need a more "directed" allocation ability, but it's not clear > exactly what requirements need to drive that. > > Cheers, > > Dave. The test harness app writes to thousands of preallocated files in hundreds of directories. The target is ~250MB/s at the application per array, more if achievable, writing a combination of fast and slow streams from up to ~1000 threads, to different files, circularly. The mix of stream rates and the files they write will depend on the end customers' needs. Currently they have 1 FS per array with 3 top level dirs each w/3 subdirs, 2 of these with ~100 subdirs each, and hundreds files in each of those. Simply doing a concat, growing and just running with it might work fine. The concern is ending up with too many fast stream writers hitting AGs on a single array which won't be able to keep up. Currently they simply duplicate the layout on each new filesystem they mount. The application duplicates the same layout on each filesystem and does its own load balancing among the group of them. Ideally they'd obviously like to simply add files to existing directories after growing, but that won't achieve scalable bandwidth. -- Stan From david@fromorbit.com Mon Aug 18 21:25: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 (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id CB52E7F51 for ; Mon, 18 Aug 2014 21:25:41 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id B9F8E304082 for ; Mon, 18 Aug 2014 19:25:41 -0700 (PDT) X-ASG-Debug-ID: 1408415135-04cb6c54fecc690001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id fPVevXPr4CxcoToL for ; Mon, 18 Aug 2014 19:25: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: ApoZABO18lN5LDJ8PGdsb2JhbABZgw2BKoIshQeoKwEBAQEBAQaefIV7AYEYFwUBAQEBODaEAwEBBAE6HBUOBQsIAxgJJQ8FJQMHGhMUB4gfB8JDFxiFZIhuEAIBBkkHgy+BHQWcQYwHjGwrL4EHgUgBAQE Received: from ppp121-44-50-124.lns20.syd6.internode.on.net (HELO dastard) ([121.44.50.124]) by ipmail06.adl6.internode.on.net with ESMTP; 19 Aug 2014 11:55:35 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1XJZ77-00040u-83; Tue, 19 Aug 2014 12:25:33 +1000 Date: Tue, 19 Aug 2014 12:25:33 +1000 From: Dave Chinner To: "Carlos E. R." Cc: XFS mailing list Subject: Re: [RFD]: Help in setting up XFS Message-ID: <20140819022533.GE26465@dastard> X-ASG-Orig-Subj: Re: [RFD]: Help in setting up XFS References: <20140818070312.GM20518@dastard> <20140818132026.GO20518@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1408415136 X-Barracuda-URL: http://192.48.176.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.8599 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Mon, Aug 18, 2014 at 04:47:36PM +0200, Carlos E. R. wrote: > On Monday, 2014-08-18 at 23:20 +1000, Dave Chinner wrote: > >On Mon, Aug 18, 2014 at 12:25:57PM +0200, Carlos E. R. wrote: > >>Just plug in the stick and click on the icon to mount it. No > >>different than any other filesystem. > > > >That doesn't work for machines with no desktop or ones that you > >access via ssh. Learn the command line first then you can always get > >the machine to do what you want regardless of how you need to access > >it. Indeed, typing commands is often faster than using the mouse, > >especially if you know how to use command history search > >effectively... > > I use the CLI method myself, but I don't see the point on novices > using it when there are modern methods far easier :-) That's quite disrespectful and condescending towards new users who are trying to learn new skills - you were once a novice, too. To make my point unambiguously clear, I'll repeat what you just said as it came across to me: 'I'm an expert and I know the CLI, but I think he is a dumb n00b so I gave him a solution I think is appropriate for dumb n00bs even though I know I'm not answering the question he asked.' Does that sound like appropriate "guidance" to you? But I'll give you the benefit of the doubt - I've seen this often enough to know that frequently people are not even aware they are making unconcious judgements like this until they are pointed out. Especially as you've done is again in this email: > And each distribution has specifics. On ubuntu you probably need to > do "sudo mount ...", a plain mount should fail. So if the > generalized help an upstream mail list can provide, the best place > to ask for help is the specific help forum of that distribution, as > they will probably know best the easiest way to install and use the > tools they provide. You are implying that the XFS community doesn't have the knowledge or experience to support XFS users from different distros. You are also implying that we don't care about our users enough to try to help them in such situations where the problem is a distro specific quirk. Years of experience has taught us that distro quirks really don't matter anywhere near as much as, say, the version of software being used. Also, I suspect that you don't realise that we have all the major distro XFS userspace package maintainers and the relevant distro kernel filesystem maintainers on the list and listening in. We actually have more distro specific storage infrastructure expertise (not to mention overall storage expertise) on this list than you'll find in most individual distro support forums. This is a highly technical community and we tend to have high standards w.r.t. to the quality of responses given to users. If you want to provide help to XFS users - new or experienced - on this list, then please give relevant, respectful answers to questions without trying to demonstrate your expertise to everyone. Cheers, Dave. -- Dave Chinner david@fromorbit.com From sandeen@redhat.com Mon Aug 18 22:14: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 B5C9F7F55 for ; Mon, 18 Aug 2014 22:14:17 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 317FAAC002 for ; Mon, 18 Aug 2014 20:14:13 -0700 (PDT) X-ASG-Debug-ID: 1408418052-04cb6c54ffcd940001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id Ftn3VaAKxEiyAw1N (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 18 Aug 2014 20:14:12 -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 s7J3EBwN009862 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK) for ; Mon, 18 Aug 2014 23:14:12 -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 s7J3EAXX022269 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES128-SHA bits=128 verify=NO) for ; Mon, 18 Aug 2014 23:14:11 -0400 Message-ID: <53F2C103.8030607@redhat.com> Date: Mon, 18 Aug 2014 22:14:11 -0500 From: Eric Sandeen MIME-Version: 1.0 To: xfs-oss Subject: [PATCH] xfs: add a few more verifier tests Content-Type: text/plain; charset=ISO-8859-1 X-ASG-Orig-Subj: [PATCH] xfs: add a few more verifier tests 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: 1408418052 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 These were exposed by fsfuzzer runs; without them we fail in various exciting and sometimes convoluted ways when we encounter disk corruption. Without the MAXLEVELS tests we tend to walk off the end of an array in a loop like this: for (i = 0; i < cur->bc_nlevels; i++) { if (cur->bc_bufs[i]) Without the dirblklog test we try to allocate more memory than we could possibly hope for and loop forever: xfs_dabuf_map() nfsb = mp->m_dir_geo->fsbcount; irecs = kmem_zalloc(sizeof(irec) * nfsb, KM_SLEEP... As for the logbsize check, that's the convoluted one. If logbsize is specified at mount time, it's sanitized in xfs_parseargs; in particular it makes sure that it's not > XLOG_MAX_RECORD_BSIZE. If not specified at mount time, it comes from the superblock via sb_logsunit; this is limited to 256k at mkfs time as well; it's copied into m_logbsize in xfs_finish_flags(). However, if for some reason the on-disk value is corrupt and too large, nothing catches it. It's a circuitous path, but that size eventually finds its way to places that make the kernel very unhappy, leading to oopses in xlog_pack_data() because we use the size as an index into iclog->ic_data, but the array is not necessarily that big. Anyway - bounds checking when we read from disk is a good thing! Signed-off-by: Eric Sandeen -- (if this should be separate patches, I can resend if you like) diff --git a/fs/xfs/libxfs/xfs_alloc.c b/fs/xfs/libxfs/xfs_alloc.c index 4bffffe..a4a9e0e 100644 --- a/fs/xfs/libxfs/xfs_alloc.c +++ b/fs/xfs/libxfs/xfs_alloc.c @@ -2209,6 +2209,10 @@ xfs_agf_verify( be32_to_cpu(agf->agf_flcount) <= XFS_AGFL_SIZE(mp))) return false; + if (!(be32_to_cpu(agf->agf_levels[XFS_BTNUM_BNO]) <= XFS_BTREE_MAXLEVELS && + be32_to_cpu(agf->agf_levels[XFS_BTNUM_CNT]) <= XFS_BTREE_MAXLEVELS)) + return false; + /* * during growfs operations, the perag is not fully initialised, * so we can't use it for any useful checking. growfs ensures we can't diff --git a/fs/xfs/libxfs/xfs_ialloc.c b/fs/xfs/libxfs/xfs_ialloc.c index b62771f..ae15060 100644 --- a/fs/xfs/libxfs/xfs_ialloc.c +++ b/fs/xfs/libxfs/xfs_ialloc.c @@ -2051,6 +2051,8 @@ xfs_agi_verify( if (!XFS_AGI_GOOD_VERSION(be32_to_cpu(agi->agi_versionnum))) return false; + if (!(be32_to_cpu(agi->agi_level) <= XFS_BTREE_MAXLEVELS)) + return false; /* * during growfs operations, the perag is not fully initialised, * so we can't use it for any useful checking. growfs ensures we can't diff --git a/fs/xfs/libxfs/xfs_sb.c b/fs/xfs/libxfs/xfs_sb.c index ad525a5..8426e5e 100644 --- a/fs/xfs/libxfs/xfs_sb.c +++ b/fs/xfs/libxfs/xfs_sb.c @@ -279,11 +279,13 @@ xfs_mount_validate_sb( sbp->sb_blocklog < XFS_MIN_BLOCKSIZE_LOG || sbp->sb_blocklog > XFS_MAX_BLOCKSIZE_LOG || sbp->sb_blocksize != (1 << sbp->sb_blocklog) || + sbp->sb_dirblklog > XFS_MAX_BLOCKSIZE_LOG || sbp->sb_inodesize < XFS_DINODE_MIN_SIZE || sbp->sb_inodesize > XFS_DINODE_MAX_SIZE || sbp->sb_inodelog < XFS_DINODE_MIN_LOG || sbp->sb_inodelog > XFS_DINODE_MAX_LOG || sbp->sb_inodesize != (1 << sbp->sb_inodelog) || + sbp->sb_logsunit > XLOG_MAX_RECORD_BSIZE || sbp->sb_inopblock != howmany(sbp->sb_blocksize,sbp->sb_inodesize) || (sbp->sb_blocklog - sbp->sb_inodelog != sbp->sb_inopblog) || (sbp->sb_rextsize * sbp->sb_blocksize > XFS_MAX_RTEXTSIZE) || From webmaster@dev104.magizz.com Tue Aug 19 03:55: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=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 B27527F3F for ; Tue, 19 Aug 2014 03:55:58 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 40751AC001 for ; Tue, 19 Aug 2014 01:55:55 -0700 (PDT) X-ASG-Debug-ID: 1408438548-04cb6c54ffd8950001-NocioJ Received: from vps.magizz.com (vps.magizz.com [162.251.83.157]) by cuda.sgi.com with ESMTP id 0jJSq1hw2r5DRpSu (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 19 Aug 2014 01:55:48 -0700 (PDT) X-Barracuda-Envelope-From: webmaster@dev104.magizz.com X-Barracuda-Apparent-Source-IP: 162.251.83.157 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=dev104.magizz.com; s=default; h=Content-Type:Content-Transfer-Encoding:MIME-Version:List-Unsubscribe:Message-ID:Reply-To:From:Date:Subject:To; bh=mDpZSYmhCTMkgu2m85N9Sqkg4Hfx9wCn4pzdkw08y/E=; b=H9DFCkVFwe2KVcDesK8x33RIvvgoMrOUk3UUMNFwARmhIPWKurvkVdp7SVUd8xn3gIkjEwqw5N1yoATK8UbiInwEFHknHhX6nVF0pR2SP+bWYtWz07vVGrlsMZxHyfsjKUTB4/mex0ZpOSv4Bws5wmWzmRAY+BuYQsZMl59+hLQ=; Received: from dev104magizz by vps.magizz.com with local (Exim 4.82) (envelope-from ) id 1XJfCo-0000Ul-Qp for xfs@oss.sgi.com; Tue, 19 Aug 2014 12:55:50 +0400 To: xfs@oss.sgi.com Subject: Goodbye from our newsletter X-PHP-Script: dev104.magizz.com/mailz/index.php for 66.249.65.10 X-ASG-Orig-Subj: Goodbye from our newsletter Received: from crawl-66-249-65-10.googlebot.com [66.249.65.10] by dev104.magizz.com with HTTP; Tue, 19 Aug 2014 08:55:50 +0000 Date: Tue, 19 Aug 2014 08:55:50 +0000 From: Webmaster Reply-To: Webmaster Message-ID: X-Priority: 3 X-Mailer: PHPMailer 5.2.5 (https://github.com/Synchro/PHPMailer/) X-phpList-version: 3.0.6 X-MessageID: systemmessage X-ListMember: xfs@oss.sgi.com Precedence: bulk Bounces-To: webmaster@dev104.magizz.com List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Content-Type: text/plain; charset=UTF-8 X-AntiAbuse: This header was added to track abuse, please include it with any abuse report X-AntiAbuse: Primary Hostname - vps.magizz.com X-AntiAbuse: Original Domain - oss.sgi.com X-AntiAbuse: Originator/Caller UID/GID - [510 520] / [47 12] X-AntiAbuse: Sender Address Domain - dev104.magizz.com X-Get-Message-Sender-Via: vps.magizz.com: authenticated_id: dev104magizz/from_h X-Barracuda-Connect: vps.magizz.com[162.251.83.157] X-Barracuda-Start-Time: 1408438548 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.8608 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature Goodbye from our Newsletter, sorry to see you go. You have been unsubscribed from our newsletters. This is the last email you will receive from us. Our newsletter system, phpList, will refuse to send you any further messages, without manual intervention by our administrator. If there is an error in this information, you can re-subscribe: please go to http://dev104.magizz.com/mailz/?p=subscribe and follow the steps. Thank you From thomas@klaube.net Tue Aug 19 10:34: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=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 92F6E7F3F for ; Tue, 19 Aug 2014 10:34:34 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 5FDE830407E for ; Tue, 19 Aug 2014 08:34:34 -0700 (PDT) X-ASG-Debug-ID: 1408462470-04bdf0109a928d0001-NocioJ Received: from orion.efm.de (orion.efm.de [195.190.148.230]) by cuda.sgi.com with ESMTP id vkV4NfWXcTtVXOwG (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 19 Aug 2014 08:34:32 -0700 (PDT) X-Barracuda-Envelope-From: thomas@klaube.net X-Barracuda-Apparent-Source-IP: 195.190.148.230 Received: from localhost (localhost [127.0.0.1]) by orion.efm.de (Postfix) with ESMTP id 8B06F1A1003E for ; Tue, 19 Aug 2014 17:34:30 +0200 (CEST) X-Virus-Scanned: amavisd-new at orion.efm.de Received: from orion.efm.de ([127.0.0.1]) by localhost (orion.efm.de [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id XmXNUmi9FRtQ for ; Tue, 19 Aug 2014 17:34:30 +0200 (CEST) Received: from localhost (localhost [127.0.0.1]) by orion.efm.de (Postfix) with ESMTP id 710111A1003F for ; Tue, 19 Aug 2014 17:34:30 +0200 (CEST) X-Virus-Scanned: amavisd-new at orion.efm.de Received: from orion.efm.de ([127.0.0.1]) by localhost (orion.efm.de [127.0.0.1]) (amavisd-new, port 10026) with ESMTP id OSSlpC6a1PgD for ; Tue, 19 Aug 2014 17:34:30 +0200 (CEST) Received: from orion.efm.de (orion.efm.de [195.190.148.230]) by orion.efm.de (Postfix) with ESMTP id 4FD951A1003E for ; Tue, 19 Aug 2014 17:34:30 +0200 (CEST) Date: Tue, 19 Aug 2014 17:34:30 +0200 (CEST) From: Thomas Klaube To: xfs@oss.sgi.com Message-ID: <362338960.3862279.1408462470243.JavaMail.zimbra@klaube.net> In-Reply-To: <159192779.3859815.1408461799560.JavaMail.zimbra@klaube.net> Subject: xlog_write: reservation ran out. Need to up reservation MIME-Version: 1.0 X-ASG-Orig-Subj: xlog_write: reservation ran out. Need to up reservation Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit X-Mailer: Zimbra 8.0.5_GA_5839 (ZimbraWebClient - GC36 (Linux)/8.0.5_GA_5839) Thread-Topic: xlog_write: reservation ran out. Need to up reservation Thread-Index: MAXSuDewHo8arNYjMVm3SkM+CWalbg== X-GBUdb-Analysis: Unknown X-MessageSniffer-Scan-Result: 0 X-MessageSniffer-Rules: 0-0-0-4844-c X-Barracuda-Connect: orion.efm.de[195.190.148.230] X-Barracuda-Start-Time: 1408462471 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.02 X-Barracuda-Spam-Status: No, SCORE=0.02 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=THREAD_INDEX, THREAD_TOPIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.8616 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.01 THREAD_INDEX thread-index: AcO7Y8iR61tzADqsRmmc5wNiFHEOig== 0.01 THREAD_TOPIC Thread-Topic: ...(Japanese Subject)... Hi all, I am currently testing/benchmarking xfs on top of a bcache. When I run a heavy IO workload (fio with 64 threads, read/write) on the device for ~30-45min I get [ 9092.978268] XFS (bcache1): xlog_write: reservation summary: [ 9092.978268] trans type = (null) (42) [ 9092.978268] unit res = 18730384 bytes [ 9092.978268] current res = -1640 bytes [ 9092.978268] total reg = 512 bytes (o/flow = 1163749592 bytes) [ 9092.978268] ophdrs = 655304 (ophdr space = 7863648 bytes) [ 9092.978268] ophdr + reg = 1171613752 bytes [ 9092.978268] num regions = 2 [ 9092.978268] [ 9092.978272] XFS (bcache1): region[0]: LR header - 512 bytes [ 9092.978273] XFS (bcache1): region[1]: commit - 0 bytes [ 9092.978274] XFS (bcache1): xlog_write: reservation ran out. Need to up reservation [ 9092.978303] XFS (bcache1): xfs_do_force_shutdown(0x2) called from line 2036 of file fs/xfs/xfs_log.c. Return address = 0xffffffffa04433c8 [ 9092.979189] XFS (bcache1): Log I/O Error Detected. Shutting down filesystem [ 9092.979210] XFS (bcache1): Please umount the filesystem and rectify the problem(s) [ 9092.979238] XFS (bcache1): xfs_do_force_shutdown(0x2) called from line 1497 of file fs/xfs/xfs_log.c. Return address = 0xffffffffa0443b57 [ 9093.183869] XFS (bcache1): xfs_log_force: error 5 returned. [ 9093.489944] XFS (bcache1): xfs_log_force: error 5 returned. Kernel is 3.16.1 but this also happens with Ubuntu 3.13.0.34. With the bcache the fio puts ~30k IOps on the filesystem. xfs_info: meta-data=/dev/bcache1 isize=256 agcount=8, agsize=268435455 blks = sectsz=512 attr=2 data = bsize=4096 blocks=1949957886, imaxpct=5 = sunit=0 swidth=0 blks naming =version 2 bsize=4096 ascii-ci=0 log =internal bsize=4096 blocks=521728, version=2 = sectsz=512 sunit=0 blks, lazy-count=1 realtime =none extsz=4096 blocks=0, rtextents=0 umount/mount recovers the fs and the fs seems ok. I can reproduce this behavior. Is there anything I could try to debug this? Regards Thomas From FachK@hcdsb.org Tue Aug 19 11:37: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=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 40AEB7F3F for ; Tue, 19 Aug 2014 11:37:02 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id C3C80AC006 for ; Tue, 19 Aug 2014 09:36:58 -0700 (PDT) X-ASG-Debug-ID: 1408466214-04cbb054861078d0001-NocioJ Received: from thing1.hcdsb.org (thing1.hcdsb.org [209.250.191.165]) by cuda.sgi.com with ESMTP id kQYnwjUqUjHDOVaQ (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO) for ; Tue, 19 Aug 2014 09:36:54 -0700 (PDT) X-Barracuda-Envelope-From: FachK@hcdsb.org X-Barracuda-Apparent-Source-IP: 209.250.191.165 Received: from CAS1.hcdsb.edu.on.ca (209.250.161.210) by thing1.hcdsb.org (209.250.191.165) with Microsoft SMTP Server (TLS) id 14.3.195.1; Tue, 19 Aug 2014 12:36:38 -0400 Received: from MBX12.hcdsb.edu.on.ca ([fe80::3948:1054:a4a0:749e]) by cas1.hcdsb.edu.on.ca ([fe80::80e0:f9da:b729:eb54%11]) with mapi id 14.03.0181.006; Tue, 19 Aug 2014 12:36:52 -0400 From: "Fach, Kathleen" Subject: Thread-Index: Ac+7y8cweVz9o/4gR+yxf93OlJriig== X-ASG-Orig-Subj: Date: Tue, 19 Aug 2014 16:36:51 +0000 Message-ID: Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-originating-ip: [209.250.191.22] Content-Type: multipart/alternative; boundary="_000_CCD71A6A08CDDB419ED7A4CBE0BBB8707430374Cmbx12hcdsbeduon_" MIME-Version: 1.0 To: Undisclosed recipients:; X-Barracuda-Connect: thing1.hcdsb.org[209.250.191.165] X-Barracuda-Start-Time: 1408466214 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: 1.81 X-Barracuda-Spam-Status: No, SCORE=1.81 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_SA620a, HTML_MESSAGE, MISSING_SUBJECT, MISSING_SUBJECT_2, THREAD_INDEX X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.8618 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.01 THREAD_INDEX thread-index: AcO7Y8iR61tzADqsRmmc5wNiFHEOig== 0.00 HTML_MESSAGE BODY: HTML included in message 0.01 MISSING_SUBJECT Missing Subject: header 0.50 BSF_SC0_SA620a Custom Rule SA620a 1.28 MISSING_SUBJECT_2 Missing Subject: header --_000_CCD71A6A08CDDB419ED7A4CBE0BBB8707430374Cmbx12hcdsbeduon_ Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable A donation was made to you by Gloria Mackenzie, For more info contact Glori= a Mackenzie on( t111ch@hotmail.com ________________________________ This email (including any attachments) is property of the Halton Catholic D= istrict School Board and is private and intended only for the person(s) to = whom it is addressed. It may contain confidential or personal information a= nd be protected under the Education Act, Municipal Freedom of Information &= Protection of Privacy Act and/or Personal Health Information Protection Ac= t. Unauthorized review, distribution, copying or disclosure is strictly pro= hibited. If you have received this message in error, please notify us immed= iately by telephone, fax or e-mail and permanently delete the message and a= ttachments. Your cooperation is valued. --_000_CCD71A6A08CDDB419ED7A4CBE0BBB8707430374Cmbx12hcdsbeduon_ Content-Type: text/html; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable


A donation was made to you by Gloria Mackenz=
ie, For more info contact Gloria Mackenzie on( t111=
ch@hotmail.com
 
 
 



This email (including any attachments) is property of the Halton Catholic D= istrict School Board and is private and intended only for the person(s) to = whom it is addressed. It may contain confidential or personal information a= nd be protected under the Education Act, Municipal Freedom of Information & Protection of Privacy Act and/= or Personal Health Information Protection Act. Unauthorized review, distrib= ution, copying or disclosure is strictly prohibited. If you have received t= his message in error, please notify us immediately by telephone, fax or e-mail and permanently delete the mess= age and attachments. Your cooperation is valued.
--_000_CCD71A6A08CDDB419ED7A4CBE0BBB8707430374Cmbx12hcdsbeduon_-- From webmaster@fly105.magizz.com Tue Aug 19 12:05: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=2.7 required=5.0 tests=GUARANTEED_100_PERCENT, 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 15C107F3F for ; Tue, 19 Aug 2014 12:05:57 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id E954D30408C for ; Tue, 19 Aug 2014 10:05:53 -0700 (PDT) X-ASG-Debug-ID: 1408467951-04cbb05485109e90001-NocioJ Received: from vps.magizz.com (vps.magizz.com [162.251.83.157]) by cuda.sgi.com with ESMTP id nLdrx6H6g7LsCm4v (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 19 Aug 2014 10:05:51 -0700 (PDT) X-Barracuda-Envelope-From: webmaster@fly105.magizz.com X-Barracuda-Apparent-Source-IP: 162.251.83.157 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=fly105.magizz.com; s=default; h=Content-Type:MIME-Version:List-Owner:List-Subscribe:List-Unsubscribe:List-Help:Message-ID:Reply-To:From:Date:Subject:To; bh=ARlmQ0srhdhpq9wdTyN4QEJ/ppjjnZBllGKz3cVOyA4=; b=R1/4oRUt1bbV/U2YceeJLklZcUt1fGeHqJzicoGn+brqk+bPCF1LahKUoaysdUoaZvMCWL8bAA4tkM8Jn6HeKWC8GehvDJ2JDhCSE2R04vA9tkyySa07DfiV2hf3CJ3nCsaZUx+4YSHQY1Y9wo6xgSkGMl6Y9rfhnrhShmbKk7g=; Received: from fly105magizz by vps.magizz.com with local (Exim 4.82) (envelope-from ) id 1XJhHY-0005sJ-94 for xfs@oss.sgi.com; Tue, 19 Aug 2014 15:08:52 +0400 To: xfs@oss.sgi.com Subject: This prestigious and much in-demand brand new Samsung Galaxy S5 is the Prize for one on whom shines the luck today. To know more click here X-PHP-Script: fly105.magizz.com/mailz/admin/index.php for 122.179.140.166 X-ASG-Orig-Subj: This prestigious and much in-demand brand new Samsung Galaxy S5 is the Prize for one on whom shines the luck today. To know more click here Received: from abts-mum-dynamic-166.140.179.122.airtelbroadband.in [122.179.140.166] by fly105.magizz.com with HTTP; Tue, 19 Aug 2014 09:27:40 +0000 Date: Tue, 19 Aug 2014 11:08:52 +0000 From: Congrats! Reply-To: Congrats! Message-ID: <0ff3230ba54923cd99afdf56cf0749a3@fly105.magizz.com> X-Priority: 3 X-Mailer: PHPMailer 5.2.5 (https://github.com/Synchro/PHPMailer/) X-phpList-version: 3.0.6 X-MessageID: 4 X-ListMember: xfs@oss.sgi.com Precedence: bulk Bounces-To: webmaster@fly105.magizz.com List-Help: List-Unsubscribe: List-Subscribe: List-Owner: MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="b1_0ff3230ba54923cd99afdf56cf0749a3" X-AntiAbuse: This header was added to track abuse, please include it with any abuse report X-AntiAbuse: Primary Hostname - vps.magizz.com X-AntiAbuse: Original Domain - oss.sgi.com X-AntiAbuse: Originator/Caller UID/GID - [514 524] / [47 12] X-AntiAbuse: Sender Address Domain - fly105.magizz.com X-Get-Message-Sender-Via: vps.magizz.com: authenticated_id: fly105magizz/from_h X-Barracuda-Connect: vps.magizz.com[162.251.83.157] X-Barracuda-Start-Time: 1408467951 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.97 X-Barracuda-Spam-Status: No, SCORE=0.97 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED, GUARANTEED_100_PERCENT, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.8619 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.96 GUARANTEED_100_PERCENT BODY: One hundred percent guaranteed -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 --b1_0ff3230ba54923cd99afdf56cf0749a3 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable Hey User It's time to rejoice! Our Contest gives you a win-win chance A rare deal for you indeed! Take part in it & Win your dream phone today With one mouse click you can claim the amazing iPhone 5 With one mouse click you can claim the amazing Samsung S5 With one mouse click you claim the amazing Samsung Galaxy Grand 2 This mind-boggling deal is 100% guaranteed. But it's a limited period offer. So hurry up and claim it before you miss a =E2=80=98big win' chance -- This message was sent to xfs@oss.sgi.com by swati@fly105.magizz.com To forward this message, please do not use the forward button of your email application, because this message was made specifically for you only. Instead use the forward page=0A in our newsletter system. To change your details and to choose which lists to be subscribed to, visit your personal preferences page=0A Or you can UNSUBSCRIBE for this panel.=0A from all future mailings. =20 amj --b1_0ff3230ba54923cd99afdf56cf0749a3 Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: quoted-printable =0A =0A

 Hey User

It’s time to rejoice!

Our Contest gives you a win-win = chance

A rare deal for you indeed!

Take part in it & Win your dre= am phone today

 

With one mouse click you can cla= im the amazing iPho= ne 5

With one mouse click you can cla= im the amazing Sams= ung S5

With one mouse click you claim t= he amazing Samsung = Galaxy Grand 2

 

This mind-boggling deal is 100% = guaranteed. But it’s a limited period offer. So hurry up and claim it= before you miss a ‘big win’ chance


-- =20

This message was sent to xfs@oss.sgi.com by swati@fly105.magizz.co= m

To forward this message, please do not use the forward button of y= our email application, because this message was made specifically for you o= nly. Instead use the forward page in our newsletter system.
To change your details and to choose which lists to be subscribed to,= visit your personal preferences page
Or you can UNSUBSCRIBE for this panel. from all future mailings.

=0Aamj --b1_0ff3230ba54923cd99afdf56cf0749a3-- From bfoster@redhat.com Tue Aug 19 12:26: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 450A87F3F for ; Tue, 19 Aug 2014 12:26:20 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 249E78F8035 for ; Tue, 19 Aug 2014 10:26:17 -0700 (PDT) X-ASG-Debug-ID: 1408469175-04cbb0548710bec0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 5GTDCLKncPqTqHFB (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 19 Aug 2014 10:26:16 -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 s7JHQEiL028137 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK) for ; Tue, 19 Aug 2014 13:26:14 -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 s7JHQD0I004773 for ; Tue, 19 Aug 2014 13:26:14 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 9C16F12577F; Tue, 19 Aug 2014 13:26:12 -0400 (EDT) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH RFC] xfs/051: test buffer use after free race on I/O failure in XFS log recovery Date: Tue, 19 Aug 2014 13:26:12 -0400 X-ASG-Orig-Subj: [PATCH RFC] xfs/051: test buffer use after free race on I/O failure in XFS log recovery Message-Id: <1408469172-55478-1-git-send-email-bfoster@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.26 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1408469175 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 A buffer use after free race was discovered in the XFS log recovery codepath if I/O failures occur during recovery. The I/O submission path can proceed to abort the mount and release the only reference held on some buffers before I/O completion processing (e.g., async workqueue processing) might have completed. Badness ensues if the I/O completion path subsequently attempts to access said buffers. The test manufactures the race by forcing all writes to fail (via dm-flakey) after a fixed period of time. A delay is inserted into the mount codepath to synchronize write failures with log recovery. Credit for discovery of the race and definition of the reproducible test case goes to Alex Lyakas. [NOTE: This still depends on kernel side instrumentation. Insert a 10s delay immediately prior to log recovery to reproduce.] Signed-off-by: Brian Foster Reported-by: Alex Lyakas --- Hi guys, This is obviously incomplete as there is no mechanism to synchronize write failures with log recovery. I was hoping we could get around that, but apparently we unconditionally reset the inactive range of the log before we get into log recovery. Anyways, I just wanted to throw this over the wall in case it's useful for testing in intermediate form. This reproduces the problem for me with the 10s delay on the kernel side. The mount fails, I see a series of BUG()s and the vm becomes generally unusable. I'll send a new version when I have some kind of synchronization mechanism worked out. Brian tests/xfs/051 | 84 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ tests/xfs/051.out | 2 ++ tests/xfs/group | 1 + 3 files changed, 87 insertions(+) create mode 100755 tests/xfs/051 create mode 100644 tests/xfs/051.out diff --git a/tests/xfs/051 b/tests/xfs/051 new file mode 100755 index 0000000..25acb28 --- /dev/null +++ b/tests/xfs/051 @@ -0,0 +1,84 @@ +#! /bin/bash +# FS QA Test No. 051 +# +# Simulate a buffer use after free race in XFS log recovery. The race triggers +# on I/O failures during log recovery. Note that this test is dangerous as it +# causes BUG() errors or a panic. +# +#----------------------------------------------------------------------- +# Copyright (c) 2013 Oracle, Inc. All Rights Reserved. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it would be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +#----------------------------------------------------------------------- +# + +seq=`basename $0` +seqres=$RESULT_DIR/$seq +echo "QA output created by $seq" + +here=`pwd` +tmp=/tmp/$$ +status=1 # failure is the default! +trap "_cleanup; exit \$status" 0 1 2 3 15 + +_cleanup() +{ + cd / + rm -f $tmp.* + _scratch_unmount > /dev/null 2>&1 +} + +# get standard environment, filters and checks +. ./common/rc +. ./common/dmflakey + +# Modify as appropriate. +_supported_fs xfs +_supported_os Linux + +_require_scratch +_require_dm_flakey + +echo "Silence is golden." + +_scratch_mkfs_xfs >/dev/null 2>&1 +_scratch_mount + +# Start a workload and shutdown the fs. The subsequent mount will require log +# recovery. +$FSSTRESS_PROG -n 9999 -p 2 -w -d $SCRATCH_MNT > /dev/null 2>&1 & +sleep 5 +src/godown -f $SCRATCH_MNT +killall -q $FSSTRESS_PROG +wait +_scratch_unmount + +# TODO: Add a mechanism to take advantage of the 5s error delay. This currently +# depends on a >5s delay inserted into the mount codepath prior to start of log +# recovery. +_init_flakey +BLK_DEV_SIZE=`blockdev --getsz $SCRATCH_DEV` +FLAKEY_TABLE="0 $BLK_DEV_SIZE flakey $SCRATCH_DEV 0 5 180" +_load_flakey_table $FLAKEY_ALLOW_WRITES + +_mount_flakey > /dev/null 2>&1 # should fail! +_cleanup_flakey + +# replay the log +_scratch_mount +_scratch_unmount + +# success, all done +status=0 +exit diff --git a/tests/xfs/051.out b/tests/xfs/051.out new file mode 100644 index 0000000..5180bc4 --- /dev/null +++ b/tests/xfs/051.out @@ -0,0 +1,2 @@ +QA output created by 051 +Silence is golden. diff --git a/tests/xfs/group b/tests/xfs/group index 4d35df5..9784dea 100644 --- a/tests/xfs/group +++ b/tests/xfs/group @@ -47,6 +47,7 @@ 048 other auto quick 049 rw auto quick 050 quota auto quick +051 dangerous 052 quota db auto quick 054 quota auto quick 055 dump ioctl remote tape -- 1.8.3.1 From somdeepdey10@gmail.com Tue Aug 19 12:44: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.3 required=5.0 tests=FREEMAIL_ENVFROM_END_DIGIT, FREEMAIL_FROM,HTML_MESSAGE,T_DKIM_INVALID autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id D918D7F3F for ; Tue, 19 Aug 2014 12:44:29 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id B57F48F8035 for ; Tue, 19 Aug 2014 10:44:29 -0700 (PDT) X-ASG-Debug-ID: 1408470267-04cb6c54fef7a50001-NocioJ Received: from mail-ig0-f174.google.com (mail-ig0-f174.google.com [209.85.213.174]) by cuda.sgi.com with ESMTP id fPipObgRWSDTTszV (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Tue, 19 Aug 2014 10:44:27 -0700 (PDT) X-Barracuda-Envelope-From: somdeepdey10@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.213.174 X-Barracuda-IPDD: Level1 [gmail.com/209.85.213.174] Received: by mail-ig0-f174.google.com with SMTP id c1so10426563igq.13 for ; Tue, 19 Aug 2014 10:44:27 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.213.174] X-Barracuda-IPDD: Level1 [gmail.com/209.85.213.174] 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=1W/woslPIm1Vptacj8cHNCcvtZYsdjaYlseSFrHV0yo=; b=sGJM4Svz68lO57Xq5iICRHdrZ8Q/8rMe9ntaH6mJ9Gy2IvdlIlR3WJZUflUhk8GqP7 6dKsxkT3AjNW1q4HMlk3eE7GokTMdfGTgQ1/7+ilYmpEg067ZnkPVe6Q2h6OKklDvkpJ ddgThB7NbdLaG98hWqUedT0xf2Es2qLUAcn0tONdtuBz3HhQcsGzTstO1FD1MUI5AxzW c5DKdMRJ+SmkEp1MXhzmsOiVTSy/N8Nwpky4IOTurOxZQ9aWhSWAZ6VL39TmVp3b/ssQ 57VHde63MSBdd08ulsrqjeR4ng5Zd4RMPNZTsXEDgeOS189hpfR8YudfdUmUe204yOv/ vSvw== MIME-Version: 1.0 X-Received: by 10.50.33.73 with SMTP id p9mr7360051igi.24.1408470267088; Tue, 19 Aug 2014 10:44:27 -0700 (PDT) Received: by 10.107.135.39 with HTTP; Tue, 19 Aug 2014 10:44:27 -0700 (PDT) Date: Tue, 19 Aug 2014 23:14:27 +0530 Message-ID: Subject: [RFD] xfs_fsr: Adding features for online defragmentation From: Somdeep Dey X-ASG-Orig-Subj: [RFD] xfs_fsr: Adding features for online defragmentation To: xfs@oss.sgi.com Content-Type: multipart/alternative; boundary=089e01538e5af256ba0500ff097f X-Barracuda-Connect: mail-ig0-f174.google.com[209.85.213.174] X-Barracuda-Start-Time: 1408470267 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-BRTS-Evidence: pict.edu X-Barracuda-Spam-Score: 0.00 X-Barracuda-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.8620 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 --089e01538e5af256ba0500ff097f Content-Type: text/plain; charset=UTF-8 Hello, We are a team of three final year under-graduates from Pune Institute of Computer Technology , India and were looking for a project in XFS with a development time of about 6 - 7 months. On contacting Dave, he suggested we work on the userspace utility, xfs_fsr. xfs_fsr(online defragmenter): A few possible enhancements to xfs_fsr are as follows: 1. explicit control of locality for groups of files. 2. ability to defragment only portions of files rather than just whole files. 3. defragmenting free space. 4. enhanced/faster filesystem scanning. Our understanding of the problem is as follows: A) We identified the first thing needed, will be to find regions of fragmented free space. Dave directed us to the following prototype that he had written (http://oss.sgi.com/archives/xfs/2012-10/msg00363.html) B) The next task will be to go about finding the owners of the blocks that are causing the region of fragmented free space. It will require a reverse block map to do this efficiently. Dave has said that he is likely to implement it in the next couple of months, and we understand that we will to need to define the interfaces needed to query the rmap from userspace. C) Once the fragmented free space, and the files that own the blocks that fragment the free space are found we will need to move them, and take care of the following: (a) move just the blocks we need to. (b) control exactly where we move them to. We are reviewing the recent patches on the mailing list for IOC_MOV_DATA, which allows an arbitrary range of one file to be swapped with an arbitrary range of another file. The core mechanism required by #2. (http://oss.sgi.com/archives/xfs/2014-07/msg00109.html) Hence after due consideration we are planning to execute the 4 sub topics in the following order: 1. defragmenting free space. 2. enhanced/faster filesystem scanning. 3. ability to defragment only portions of files rather than just whole files. 4. explicit control of locality for groups of files. Comments regarding the same will be appreciated. We would also like to thank Dave for his inputs. We look forward to working with the community and hope to make a valuable contribution. Regards. --089e01538e5af256ba0500ff097f Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: quoted-printable
Hello,

We are a team of three final year under-graduates from=C2=A0Pune Institute
of Computer Technology, India and wer= e looking for a project in XFS=C2=A0
with a development time of about 6 - 7 months. On contacting Dave,=C2= =A0
he suggested we work on the userspace utility, xfs_fsr.
=C2=A0
xfs_fsr(online defragmenter):
A few possible enhancements to xfs= _fsr are as follows:
=C2=A0
1. explicit control of locality for groups of files.
2. ability to defragment only portions of files rather
than just whole files.
3. defragmenting free space.
<= div class=3D"gmail_extra" style=3D"font-family:arial,sans-serif;font-size:1= 3px"> 4. enhanced/faster filesystem scanning.
=C2=A0
Our = understanding of the problem is as follows:
=C2=A0
A) We identified the first thing needed, will be to= find regions of=C2=A0
fragmented free space. Dave directed us to the following prototype=C2= =A0
that he had written
=C2=A0
B) =C2=A0The next task will be to go about finding = the owners of the blocks
that are causing the region of fragmented free space. It will require= a
reverse block map to do this efficiently. Dave has said that he is likely
to implement it in the next couple of months, and we understand t= hat
we will to need to define the interfaces needed to query the rmap fro= m=C2=A0
userspace.
=C2=A0
C) =C2=A0Once the fragmented free s= pace, and the files that own the blocks=C2=A0
that fragment the free space are found we will need to move them, and= =C2=A0
take care of the following:
(a) move just the blocks we need to.=
(b) control exactly where we move them to.
=C2=A0
We = are reviewing the recent patches on the mailing list for IOC_MOV_DATA,=C2= =A0
which allows an arbitrary range of one file to be swapped with an arb= itrary
range of another file. The core mechanism required by #2.
=C2=A0
Hence after due consideration we are planning to ex= ecute
the 4 sub topics in the following order:
1. defragmenting = free space.
2. enhanced/faster filesystem scanning.
3. ability to defr= agment only portions of files rather
than just whole files.
4. explicit control of locality for= groups of files.
=C2=A0
Comments regarding the same will be appreciated. We= would also like to thank=C2=A0
Dave for his inputs. We look forward to working with the community an= d hope to
make a valuable contribution.
=C2=A0
Regards.
--089e01538e5af256ba0500ff097f-- From BATV+e7c916d85e0c38ddc6b0+4013+infradead.org+hch@bombadil.srs.infradead.org Tue Aug 19 13:15: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 79BFE7F3F for ; Tue, 19 Aug 2014 13:15:53 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 593A28F804C for ; Tue, 19 Aug 2014 11:15:49 -0700 (PDT) X-ASG-Debug-ID: 1408472142-04bdf010a19eb90001-NocioJ Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.9]) by cuda.sgi.com with ESMTP id 6lKjbzZ9JnOtGlW4 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 19 Aug 2014 11:15:43 -0700 (PDT) X-Barracuda-Envelope-From: BATV+e7c916d85e0c38ddc6b0+4013+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 1XJnwc-0001Xu-Ut; Tue, 19 Aug 2014 18:15:42 +0000 Date: Tue, 19 Aug 2014 11:15:42 -0700 From: Christoph Hellwig To: Eric Sandeen Cc: xfs-oss Subject: Re: [PATCH] xfs: add a few more verifier tests Message-ID: <20140819181542.GA31177@infradead.org> X-ASG-Orig-Subj: Re: [PATCH] xfs: add a few more verifier tests References: <53F2C103.8030607@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <53F2C103.8030607@redhat.com> User-Agent: Mutt/1.5.23 (2014-03-12) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: bombadil.infradead.org[198.137.202.9] X-Barracuda-Start-Time: 1408472143 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.8621 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- > Anyway - bounds checking when we read from disk is a good thing! Absolutelt! Looks good modulo a few nitpicks below. Reviewed-by: Christoph Hellwig > diff --git a/fs/xfs/libxfs/xfs_alloc.c b/fs/xfs/libxfs/xfs_alloc.c > index 4bffffe..a4a9e0e 100644 > --- a/fs/xfs/libxfs/xfs_alloc.c > +++ b/fs/xfs/libxfs/xfs_alloc.c > @@ -2209,6 +2209,10 @@ xfs_agf_verify( > be32_to_cpu(agf->agf_flcount) <= XFS_AGFL_SIZE(mp))) > return false; > > + if (!(be32_to_cpu(agf->agf_levels[XFS_BTNUM_BNO]) <= XFS_BTREE_MAXLEVELS && > + be32_to_cpu(agf->agf_levels[XFS_BTNUM_CNT]) <= XFS_BTREE_MAXLEVELS)) > + return false; Maybe it's just me, but negated numeric comparisms always confuse the hell out of me, why not simply: if (be32_to_cpu(agf->agf_levels[XFS_BTNUM_BNO]) > XFS_BTREE_MAXLEVELS) return false; if (be32_to_cpu(agf->agf_levels[XFS_BTNUM_CNT]) > XFS_BTREE_MAXLEVELS) return false; > --- a/fs/xfs/libxfs/xfs_ialloc.c > +++ b/fs/xfs/libxfs/xfs_ialloc.c > @@ -2051,6 +2051,8 @@ xfs_agi_verify( > if (!XFS_AGI_GOOD_VERSION(be32_to_cpu(agi->agi_versionnum))) > return false; > > + if (!(be32_to_cpu(agi->agi_level) <= XFS_BTREE_MAXLEVELS)) > + return false; Same here. From sandeen@sandeen.net Tue Aug 19 14:07: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 (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id CD8AE7F3F for ; Tue, 19 Aug 2014 14:07:43 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 6806BAC001 for ; Tue, 19 Aug 2014 12:07:40 -0700 (PDT) X-ASG-Debug-ID: 1408475258-04bdf01097a0e50001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id R8QWLrACNPcZQsrG for ; Tue, 19 Aug 2014 12:07:38 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1 with cipher DHE-RSA-AES128-SHA (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id E0A6563D3BF0; Tue, 19 Aug 2014 14:07:37 -0500 (CDT) Message-ID: <53F3A07B.9040402@sandeen.net> Date: Tue, 19 Aug 2014 14:07:39 -0500 From: Eric Sandeen MIME-Version: 1.0 To: Christoph Hellwig , Eric Sandeen CC: xfs-oss Subject: Re: [PATCH] xfs: add a few more verifier tests References: <53F2C103.8030607@redhat.com> <20140819181542.GA31177@infradead.org> X-ASG-Orig-Subj: Re: [PATCH] xfs: add a few more verifier tests In-Reply-To: <20140819181542.GA31177@infradead.org> 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: 1408475258 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.8623 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 8/19/14, 1:15 PM, Christoph Hellwig wrote: >> Anyway - bounds checking when we read from disk is a good thing! > > Absolutelt! > > Looks good modulo a few nitpicks below. > > Reviewed-by: Christoph Hellwig > >> diff --git a/fs/xfs/libxfs/xfs_alloc.c b/fs/xfs/libxfs/xfs_alloc.c >> index 4bffffe..a4a9e0e 100644 >> --- a/fs/xfs/libxfs/xfs_alloc.c >> +++ b/fs/xfs/libxfs/xfs_alloc.c >> @@ -2209,6 +2209,10 @@ xfs_agf_verify( >> be32_to_cpu(agf->agf_flcount) <= XFS_AGFL_SIZE(mp))) >> return false; >> >> + if (!(be32_to_cpu(agf->agf_levels[XFS_BTNUM_BNO]) <= XFS_BTREE_MAXLEVELS && >> + be32_to_cpu(agf->agf_levels[XFS_BTNUM_CNT]) <= XFS_BTREE_MAXLEVELS)) >> + return false; > > Maybe it's just me, but negated numeric comparisms always confuse the > hell out of me, why not simply: > > if (be32_to_cpu(agf->agf_levels[XFS_BTNUM_BNO]) > XFS_BTREE_MAXLEVELS) > return false; > if (be32_to_cpu(agf->agf_levels[XFS_BTNUM_CNT]) > XFS_BTREE_MAXLEVELS) > return false; > >> --- a/fs/xfs/libxfs/xfs_ialloc.c >> +++ b/fs/xfs/libxfs/xfs_ialloc.c >> @@ -2051,6 +2051,8 @@ xfs_agi_verify( >> if (!XFS_AGI_GOOD_VERSION(be32_to_cpu(agi->agi_versionnum))) >> return false; >> >> + if (!(be32_to_cpu(agi->agi_level) <= XFS_BTREE_MAXLEVELS)) >> + return false; > > Same here. yeah; just following the style of the functions as they exist today... if (!(agf->agf_magicnum == cpu_to_be32(XFS_AGF_MAGIC) && XFS_AGF_GOOD_VERSION(be32_to_cpu(agf->agf_versionnum)) && be32_to_cpu(agf->agf_freeblks) <= be32_to_cpu(agf->agf_length) && ... dunno. Don't care too much either way, but consistency and all that... Maybe the "AGF_GOOD_VERSION" required the negation, and it all got lumped together? Thanks, -Eric From prvs=330814f317=clm@fb.com Tue Aug 19 14:25: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=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 C98CE7F3F for ; Tue, 19 Aug 2014 14:25:05 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 8CACF30407A for ; Tue, 19 Aug 2014 12:25:02 -0700 (PDT) X-ASG-Debug-ID: 1408476301-04bdf010a0a1a30001-NocioJ Received: from mx0a-00082601.pphosted.com (mx0a-00082601.pphosted.com [67.231.145.42]) by cuda.sgi.com with ESMTP id r7vdAqk1BMDVxpov for ; Tue, 19 Aug 2014 12:25:01 -0700 (PDT) X-Barracuda-Envelope-From: prvs=330814f317=clm@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 (m0004346 [127.0.0.1]) by mx0a-00082601.pphosted.com (8.14.5/8.14.5) with SMTP id s7JJNt55012676; Tue, 19 Aug 2014 12:24:54 -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=714u2T/Rb7YBPAdPSfK/NWidRfzN8wu0rUqOen/qeQc=; b=lLNwhoPF0sDmO2A6oxiQ+lIQaFqI9fYh6VRepaiWnPMHRwMWDnuGRzrIfFw5+mAo9cCf WFjnkDzD/HvfjvZGvOLEWhNO6yZtyXQF9ILTTtsh8wJuLWNskUwtlj4MAoDDTkFuTJ47 C//dAORAvjVm4ssd9mjIqEtJF7eza5EIlkE= Received: from mail.thefacebook.com (mailwest.thefacebook.com [173.252.71.148]) by mx0a-00082601.pphosted.com with ESMTP id 1nurejhyqu-1 (version=TLSv1/SSLv3 cipher=AES128-SHA bits=128 verify=OK); Tue, 19 Aug 2014 12:24:54 -0700 Received: from [172.20.34.140] (192.168.57.29) by mail.thefacebook.com (192.168.16.19) with Microsoft SMTP Server (TLS) id 14.3.195.1; Tue, 19 Aug 2014 12:24:52 -0700 Message-ID: <53F3A480.6020000@fb.com> Date: Tue, 19 Aug 2014 15:24:48 -0400 From: Chris Mason User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Thunderbird/24.6.0 MIME-Version: 1.0 To: Dave Chinner CC: , Eric Sandeen Subject: Re: [PATCH v2] xfs: don't zero partial page cache pages during O_DIRECT References: <53E4E03A.7050101@fb.com> <53E61A9C.4020807@fb.com> <20140812011743.GU20518@dastard> X-ASG-Orig-Subj: Re: [PATCH v2] xfs: don't zero partial page cache pages during O_DIRECT In-Reply-To: <20140812011743.GU20518@dastard> Content-Type: text/plain; charset="ISO-8859-1" Content-Transfer-Encoding: 7bit X-Originating-IP: [192.168.57.29] X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10432:5.12.52,1.0.27,0.0.0000 definitions=2014-08-19_05:2014-08-19,2014-08-19,1970-01-01 signatures=0 X-Proofpoint-Spam-Details: rule=fb_default_notspam policy=fb_default score=0 kscore.is_bulkscore=8.33061397642609e-12 kscore.compositescore=0 circleOfTrustscore=0 compositescore=0.997797736942976 urlsuspect_oldscore=0.997797736942976 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=11180 rbsscore=0.997797736942976 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-1408190221 X-FB-Internal: deliver X-Barracuda-Connect: mx0a-00082601.pphosted.com[67.231.145.42] X-Barracuda-Start-Time: 1408476301 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On 08/11/2014 09:17 PM, Dave Chinner wrote: > On Sat, Aug 09, 2014 at 08:57:00AM -0400, Chris Mason wrote: >> >> diff --git a/fs/xfs/xfs_file.c b/fs/xfs/xfs_file.c >> index 1f66779..023d575 100644 >> --- a/fs/xfs/xfs_file.c >> +++ b/fs/xfs/xfs_file.c >> @@ -295,7 +295,8 @@ xfs_file_read_iter( >> xfs_rw_iunlock(ip, XFS_IOLOCK_EXCL); >> return ret; >> } >> - truncate_pagecache_range(VFS_I(ip), pos, -1); >> + invalidate_inode_pages2_range(VFS_I(ip)->i_mapping, >> + pos >> PAGE_CACHE_SHIFT, -1); >> } >> xfs_rw_ilock_demote(ip, XFS_IOLOCK_EXCL); >> } > > I added the WARN_ON_ONCE(ret) check to this and I am seeing it fire > occasionally. It always fires immediately before some other ASSERT() > they fires with a block map/page cache inconsistency. It usually > fires in a test that runs fsx or fsstress. The fsx failures are new > regressions caused by this patch. e.g. generic/263 hasn't failed for > months on any of my systems and this patch causes it to fail > reliably on my 1k block size test config. > > I'm going to assume at this point that this is uncovering some other > existing bug, but it means I'm not going to push this fix until I > understand what is actually happening here. It is possible that what > I'm seeing is related to Brian's collapse range bug fixes, but until > I applied this direct IO patch I'd never seen fsx throw ASSERTs in > xfs_bmap_shift_extents().... > > Either way, more testing and understanding is needed. Do you have the output from xfs and the command line args it used? For my device, it picks: -r 4096 -t 512 -w 512 -Z And for a blocksize 1024 test I did mkfs.xfs -b size=1024 But I can't trigger failures with or without the invalidate_inode_pages2 change. I was hoping to trigger on 3.16, and then jump back to 3.10 + my patch to see if the patch alone was at fault. -chris From sandeen@sandeen.net Tue Aug 19 14:36: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 4097A7F3F for ; Tue, 19 Aug 2014 14:36:10 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 2F5A28F8039 for ; Tue, 19 Aug 2014 12:36:06 -0700 (PDT) X-ASG-Debug-ID: 1408476965-04cb6c5500fdce0001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id 3fXBOu0LJTjulK5p for ; Tue, 19 Aug 2014 12:36:05 -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 376FE602D4F3; Tue, 19 Aug 2014 14:36:05 -0500 (CDT) Message-ID: <53F3A726.8080305@sandeen.net> Date: Tue, 19 Aug 2014 14:36:06 -0500 From: Eric Sandeen MIME-Version: 1.0 To: Eric Sandeen , xfs-oss Subject: [PATCH V2] xfs: add a few more verifier tests References: <53F2C103.8030607@redhat.com> X-ASG-Orig-Subj: [PATCH V2] xfs: add a few more verifier tests In-Reply-To: <53F2C103.8030607@redhat.com> 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: 1408476965 X-Barracuda-URL: http://192.48.176.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.8624 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- These were exposed by fsfuzzer runs; without them we fail in various exciting and sometimes convoluted ways when we encounter disk corruption. Without the MAXLEVELS tests we tend to walk off the end of an array in a loop like this: for (i = 0; i < cur->bc_nlevels; i++) { if (cur->bc_bufs[i]) Without the dirblklog test we try to allocate more memory than we could possibly hope for and loop forever: xfs_dabuf_map() nfsb = mp->m_dir_geo->fsbcount; irecs = kmem_zalloc(sizeof(irec) * nfsb, KM_SLEEP... As for the logbsize check, that's the convoluted one. If logbsize is specified at mount time, it's sanitized in xfs_parseargs; in particular it makes sure that it's not > XLOG_MAX_RECORD_BSIZE. If not specified at mount time, it comes from the superblock via sb_logsunit; this is limited to 256k at mkfs time as well; it's copied into m_logbsize in xfs_finish_flags(). However, if for some reason the on-disk value is corrupt and too large, nothing catches it. It's a circuitous path, but that size eventually finds its way to places that make the kernel very unhappy, leading to oopses in xlog_pack_data() because we use the size as an index into iclog->ic_data, but the array is not necessarily that big. Anyway - bounds checking when we read from disk is a good thing! Signed-off-by: Eric Sandeen -- V2: un-obfuscate the btree level tests, removing negated comparisons, per hch's suggestion. diff --git a/fs/xfs/libxfs/xfs_alloc.c b/fs/xfs/libxfs/xfs_alloc.c index 4bffffe..eff3421 100644 --- a/fs/xfs/libxfs/xfs_alloc.c +++ b/fs/xfs/libxfs/xfs_alloc.c @@ -2209,6 +2209,10 @@ xfs_agf_verify( be32_to_cpu(agf->agf_flcount) <= XFS_AGFL_SIZE(mp))) return false; + if (be32_to_cpu(agf->agf_levels[XFS_BTNUM_BNO]) > XFS_BTREE_MAXLEVELS || + be32_to_cpu(agf->agf_levels[XFS_BTNUM_CNT]) > XFS_BTREE_MAXLEVELS) + return false; + /* * during growfs operations, the perag is not fully initialised, * so we can't use it for any useful checking. growfs ensures we can't diff --git a/fs/xfs/libxfs/xfs_ialloc.c b/fs/xfs/libxfs/xfs_ialloc.c index b62771f..d213a2e 100644 --- a/fs/xfs/libxfs/xfs_ialloc.c +++ b/fs/xfs/libxfs/xfs_ialloc.c @@ -2051,6 +2051,8 @@ xfs_agi_verify( if (!XFS_AGI_GOOD_VERSION(be32_to_cpu(agi->agi_versionnum))) return false; + if (be32_to_cpu(agi->agi_level) > XFS_BTREE_MAXLEVELS) + return false; /* * during growfs operations, the perag is not fully initialised, * so we can't use it for any useful checking. growfs ensures we can't diff --git a/fs/xfs/libxfs/xfs_sb.c b/fs/xfs/libxfs/xfs_sb.c index ad525a5..8426e5e 100644 --- a/fs/xfs/libxfs/xfs_sb.c +++ b/fs/xfs/libxfs/xfs_sb.c @@ -279,11 +279,13 @@ xfs_mount_validate_sb( sbp->sb_blocklog < XFS_MIN_BLOCKSIZE_LOG || sbp->sb_blocklog > XFS_MAX_BLOCKSIZE_LOG || sbp->sb_blocksize != (1 << sbp->sb_blocklog) || + sbp->sb_dirblklog > XFS_MAX_BLOCKSIZE_LOG || sbp->sb_inodesize < XFS_DINODE_MIN_SIZE || sbp->sb_inodesize > XFS_DINODE_MAX_SIZE || sbp->sb_inodelog < XFS_DINODE_MIN_LOG || sbp->sb_inodelog > XFS_DINODE_MAX_LOG || sbp->sb_inodesize != (1 << sbp->sb_inodelog) || + sbp->sb_logsunit > XLOG_MAX_RECORD_BSIZE || sbp->sb_inopblock != howmany(sbp->sb_blocksize,sbp->sb_inodesize) || (sbp->sb_blocklog - sbp->sb_inodelog != sbp->sb_inopblog) || (sbp->sb_rextsize * sbp->sb_blocksize > XFS_MAX_RTEXTSIZE) || From david@fromorbit.com Tue Aug 19 17:35: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 F10947F3F for ; Tue, 19 Aug 2014 17:35:24 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 6FF18AC001 for ; Tue, 19 Aug 2014 15:35:21 -0700 (PDT) X-ASG-Debug-ID: 1408487717-04cbb0548611d3f0001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id tzaeqnCBbwSSH5Hm for ; Tue, 19 Aug 2014 15:35:18 -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: AjULAA/Q81N5LDJ8PGdsb2JhbABagw2BKoIshQeoFwEBAQEBAQaefIV8AYELFwUBAQEBODaEAwEBBAEnExwjBQsIAw4KCSUPBSUDBxoTiDoHwRMXGIVkiVAHhEwFnEGMBwSMaCsvgk8BAQE Received: from ppp121-44-50-124.lns20.syd6.internode.on.net (HELO dastard) ([121.44.50.124]) by ipmail05.adl6.internode.on.net with ESMTP; 20 Aug 2014 08:05:16 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1XJrzm-0006rM-9x; Wed, 20 Aug 2014 08:35:14 +1000 Date: Wed, 20 Aug 2014 08:35:14 +1000 From: Dave Chinner To: Chris Mason Cc: xfs@oss.sgi.com, Eric Sandeen Subject: Re: [PATCH v2] xfs: don't zero partial page cache pages during O_DIRECT Message-ID: <20140819223514.GQ20518@dastard> X-ASG-Orig-Subj: Re: [PATCH v2] xfs: don't zero partial page cache pages during O_DIRECT References: <53E4E03A.7050101@fb.com> <53E61A9C.4020807@fb.com> <20140812011743.GU20518@dastard> <53F3A480.6020000@fb.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <53F3A480.6020000@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: 1408487718 X-Barracuda-URL: http://192.48.176.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.8629 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Tue, Aug 19, 2014 at 03:24:48PM -0400, Chris Mason wrote: > On 08/11/2014 09:17 PM, Dave Chinner wrote: > > On Sat, Aug 09, 2014 at 08:57:00AM -0400, Chris Mason wrote: > >> > >> diff --git a/fs/xfs/xfs_file.c b/fs/xfs/xfs_file.c > >> index 1f66779..023d575 100644 > >> --- a/fs/xfs/xfs_file.c > >> +++ b/fs/xfs/xfs_file.c > >> @@ -295,7 +295,8 @@ xfs_file_read_iter( > >> xfs_rw_iunlock(ip, XFS_IOLOCK_EXCL); > >> return ret; > >> } > >> - truncate_pagecache_range(VFS_I(ip), pos, -1); > >> + invalidate_inode_pages2_range(VFS_I(ip)->i_mapping, > >> + pos >> PAGE_CACHE_SHIFT, -1); > >> } > >> xfs_rw_ilock_demote(ip, XFS_IOLOCK_EXCL); > >> } > > > > I added the WARN_ON_ONCE(ret) check to this and I am seeing it fire > > occasionally. It always fires immediately before some other ASSERT() > > they fires with a block map/page cache inconsistency. It usually > > fires in a test that runs fsx or fsstress. The fsx failures are new > > regressions caused by this patch. e.g. generic/263 hasn't failed for > > months on any of my systems and this patch causes it to fail > > reliably on my 1k block size test config. > > > > I'm going to assume at this point that this is uncovering some other > > existing bug, but it means I'm not going to push this fix until I > > understand what is actually happening here. It is possible that what > > I'm seeing is related to Brian's collapse range bug fixes, but until > > I applied this direct IO patch I'd never seen fsx throw ASSERTs in > > xfs_bmap_shift_extents().... > > > > Either way, more testing and understanding is needed. > > Do you have the output from xfs and the command line args it used? For > my device, it picks: > > -r 4096 -t 512 -w 512 -Z > > And for a blocksize 1024 test I did mkfs.xfs -b size=1024 I'm running: $ mkfs.xfs -f -m crc=1,finobt=1 -b size=1k /dev/vda $ mount /dev/vda /mnt/test $ ltp/fsx -o 128000 -l 500000 -r 4096 -t 512 -w 512 -Z -d /mnt/test/foo > But I can't trigger failures with or without the invalidate_inode_pages2 > change. I was hoping to trigger on 3.16, and then jump back to 3.10 + > my patch to see if the patch alone was at fault. I am seeing failures at operation 1192. Yesterday, I found a new class of bufferhead state coherency issues to do with EOF handling that are causing the problems. Basically, when the page cache marks a page dirty, the generic code marks all the buffers on the page dirty, even when they are beyond EOF. As a result, when we go to invalidate the page that spans EOF, it cannot be invalidated because there are dirty buffers on the page. Those buffers persist in that state because they are beyond EOF, have no blocks allocated to them, and cannot be written. And so when we do a direct IO that spans the current EOF, it now fails to invalidate that page and so triggers the warning. Worse is that it appears that these bufferheads can leak into the internal blocks into the file when the file is extended, leading to all sorts of other ASSERT failures (which I've been seeing for a while now). I've got the above fsx command to run for somewhere between 100k and 110k operations with the fixes I currently have, but I haven't found the cause of the dirty buffer beyond EOF state leaking into the interior of the file from extend operations yet. Once I have something that passes a few million fsx ops.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Tue Aug 19 17:38: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 B59B97F3F for ; Tue, 19 Aug 2014 17:38:56 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 35878AC001 for ; Tue, 19 Aug 2014 15:38:56 -0700 (PDT) X-ASG-Debug-ID: 1408487930-04cb6c54ff1061b0001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id 2axraa0DcLC3zgCz for ; Tue, 19 Aug 2014 15:38: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: AjULACTR81N5LDJ8PGdsb2JhbABagw2BKoIshQeoFwEBAQEBAQaefIV8AYELFwUBAQEBODaEAwEBBAEnExwjBQsIAxgJJQ8FJQMHGhOIOgfBeBcYhWSJUAeETAWcQZhzKy+CTwEBAQ Received: from ppp121-44-50-124.lns20.syd6.internode.on.net (HELO dastard) ([121.44.50.124]) by ipmail05.adl6.internode.on.net with ESMTP; 20 Aug 2014 08:08:46 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1XJs3B-0006re-6j; Wed, 20 Aug 2014 08:38:45 +1000 Date: Wed, 20 Aug 2014 08:38:45 +1000 From: Dave Chinner To: Eric Sandeen Cc: Christoph Hellwig , Eric Sandeen , xfs-oss Subject: Re: [PATCH] xfs: add a few more verifier tests Message-ID: <20140819223845.GR20518@dastard> X-ASG-Orig-Subj: Re: [PATCH] xfs: add a few more verifier tests References: <53F2C103.8030607@redhat.com> <20140819181542.GA31177@infradead.org> <53F3A07B.9040402@sandeen.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <53F3A07B.9040402@sandeen.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: 1408487930 X-Barracuda-URL: http://192.48.176.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.8629 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Tue, Aug 19, 2014 at 02:07:39PM -0500, Eric Sandeen wrote: > On 8/19/14, 1:15 PM, Christoph Hellwig wrote: > >> Anyway - bounds checking when we read from disk is a good thing! > > > > Absolutelt! > > > > Looks good modulo a few nitpicks below. > > > > Reviewed-by: Christoph Hellwig > > > >> diff --git a/fs/xfs/libxfs/xfs_alloc.c b/fs/xfs/libxfs/xfs_alloc.c > >> index 4bffffe..a4a9e0e 100644 > >> --- a/fs/xfs/libxfs/xfs_alloc.c > >> +++ b/fs/xfs/libxfs/xfs_alloc.c > >> @@ -2209,6 +2209,10 @@ xfs_agf_verify( > >> be32_to_cpu(agf->agf_flcount) <= XFS_AGFL_SIZE(mp))) > >> return false; > >> > >> + if (!(be32_to_cpu(agf->agf_levels[XFS_BTNUM_BNO]) <= XFS_BTREE_MAXLEVELS && > >> + be32_to_cpu(agf->agf_levels[XFS_BTNUM_CNT]) <= XFS_BTREE_MAXLEVELS)) > >> + return false; > > > > Maybe it's just me, but negated numeric comparisms always confuse the > > hell out of me, why not simply: > > > > if (be32_to_cpu(agf->agf_levels[XFS_BTNUM_BNO]) > XFS_BTREE_MAXLEVELS) > > return false; > > if (be32_to_cpu(agf->agf_levels[XFS_BTNUM_CNT]) > XFS_BTREE_MAXLEVELS) > > return false; > > > >> --- a/fs/xfs/libxfs/xfs_ialloc.c > >> +++ b/fs/xfs/libxfs/xfs_ialloc.c > >> @@ -2051,6 +2051,8 @@ xfs_agi_verify( > >> if (!XFS_AGI_GOOD_VERSION(be32_to_cpu(agi->agi_versionnum))) > >> return false; > >> > >> + if (!(be32_to_cpu(agi->agi_level) <= XFS_BTREE_MAXLEVELS)) > >> + return false; > > > > Same here. > > yeah; just following the style of the functions as they exist today... > > if (!(agf->agf_magicnum == cpu_to_be32(XFS_AGF_MAGIC) && > XFS_AGF_GOOD_VERSION(be32_to_cpu(agf->agf_versionnum)) && > be32_to_cpu(agf->agf_freeblks) <= be32_to_cpu(agf->agf_length) && > ... > > dunno. Don't care too much either way, but consistency and all that... I prefer the metho Christoph suggested - most of the verifiers use that "single check per if statement" pattern because it makes the checks being performed so much easier to read. > Maybe the "AGF_GOOD_VERSION" required the negation, and it all got lumped > together? Those should probably be cleaned up - they were done like that originally as a direct transcript from pre-existing code checks to simplify review, not because it was "nice" code. Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Tue Aug 19 17:55: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 32CEE7F3F for ; Tue, 19 Aug 2014 17:55:12 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 04C818F8037 for ; Tue, 19 Aug 2014 15:55:11 -0700 (PDT) X-ASG-Debug-ID: 1408488909-04bdf0109aab6b0001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id 3lVzqQil8pcU1647 for ; Tue, 19 Aug 2014 15:55: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: AuIJALLU81N5LDJ8PGdsb2JhbABAGoMNU1eCLIsnoWsMAQEBAQEBBp0hgVuFfAGBCRcFAQEBATg2hAMBAQQBOhwjBQsIAxgJJQ8FJQMHGhOIOgcONsFWGIVkiQdJB4RMBZVLhnaMC4pcHoFuKy8BgQaBSAEBAQ Received: from ppp121-44-50-124.lns20.syd6.internode.on.net (HELO dastard) ([121.44.50.124]) by ipmail05.adl6.internode.on.net with ESMTP; 20 Aug 2014 08:25:08 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1XJsJ1-0006tL-Qd; Wed, 20 Aug 2014 08:55:07 +1000 Date: Wed, 20 Aug 2014 08:55:07 +1000 From: Dave Chinner To: Thomas Klaube Cc: xfs@oss.sgi.com Subject: Re: xlog_write: reservation ran out. Need to up reservation Message-ID: <20140819225507.GS20518@dastard> X-ASG-Orig-Subj: Re: xlog_write: reservation ran out. Need to up reservation References: <159192779.3859815.1408461799560.JavaMail.zimbra@klaube.net> <362338960.3862279.1408462470243.JavaMail.zimbra@klaube.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <362338960.3862279.1408462470243.JavaMail.zimbra@klaube.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: 1408488909 X-Barracuda-URL: http://192.48.157.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.8630 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 BSF_SC0_SA085 Custom Rule SA085 On Tue, Aug 19, 2014 at 05:34:30PM +0200, Thomas Klaube wrote: > Hi all, > > I am currently testing/benchmarking xfs on top of a bcache. When I run a heavy > IO workload (fio with 64 threads, read/write) on the device for ~30-45min I get Can you post the fio job configuration? > [ 9092.978268] XFS (bcache1): xlog_write: reservation summary: > [ 9092.978268] trans type = (null) (42) > [ 9092.978268] unit res = 18730384 bytes > [ 9092.978268] current res = -1640 bytes > [ 9092.978268] total reg = 512 bytes (o/flow = 1163749592 bytes) > [ 9092.978268] ophdrs = 655304 (ophdr space = 7863648 bytes) > [ 9092.978268] ophdr + reg = 1171613752 bytes > [ 9092.978268] num regions = 2 Oh, my: > [ 9092.978268] ophdr + reg = 1171613752 bytes Thats 1,171,613,752 bytes, or 1.1GB of journal data in that checkpoint. It's more than half the size of the journal, so it's violated fundamental constraints (i.e. no checkpoint shoul dbe larger than half the log) We should be committing the checkpoint once the queued metadata is beyond 12.5% of log space, or about 250MB in this case. The question is how did that get delayed for so long that we overran the push threshold by a factor of 3.5? Hmmmm - I wonder if bcache is causing some kind of kworker or workqueue starvation? I really need to see that fio job config and find out a whole lot more about the hardware and storage config you are running: http://xfs.org/index.php/XFS_FAQ#Q:_What_information_should_I_include_when_reporting_a_problem.3F > [ 9092.978268] > [ 9092.978272] XFS (bcache1): region[0]: LR header - 512 bytes > [ 9092.978273] XFS (bcache1): region[1]: commit - 0 bytes > [ 9092.978274] XFS (bcache1): xlog_write: reservation ran out. Need to up reservation > [ 9092.978303] XFS (bcache1): xfs_do_force_shutdown(0x2) called from line 2036 of file fs/xfs/xfs_log.c. Return address = 0xffffffffa04433c8 > [ 9092.979189] XFS (bcache1): Log I/O Error Detected. Shutting down filesystem > [ 9092.979210] XFS (bcache1): Please umount the filesystem and rectify the problem(s) > [ 9092.979238] XFS (bcache1): xfs_do_force_shutdown(0x2) called from line 1497 of file fs/xfs/xfs_log.c. Return address = 0xffffffffa0443b57 > [ 9093.183869] XFS (bcache1): xfs_log_force: error 5 returned. > [ 9093.489944] XFS (bcache1): xfs_log_force: error 5 returned. > > Kernel is 3.16.1 but this also happens with Ubuntu 3.13.0.34. > With the bcache the fio puts ~30k IOps on the filesystem. Which is not very much. I do that sort of thing all the time. > xfs_info: > meta-data=/dev/bcache1 isize=256 agcount=8, agsize=268435455 blks > = sectsz=512 attr=2 > data = bsize=4096 blocks=1949957886, imaxpct=5 > = sunit=0 swidth=0 blks > naming =version 2 bsize=4096 ascii-ci=0 > log =internal bsize=4096 blocks=521728, version=2 > = sectsz=512 sunit=0 blks, lazy-count=1 > realtime =none extsz=4096 blocks=0, rtextents=0 > > umount/mount recovers the fs and the fs seems ok. > > I can reproduce this behavior. Is there anything I could try to debug > this? Run the workload directly on the SSD rather than with bcache. Use mkfs parameters to give you 8 ags and the same size log, and see if you get the same problem. Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Tue Aug 19 19:16: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 474137F3F for ; Tue, 19 Aug 2014 19:16:29 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 33F198F8039 for ; Tue, 19 Aug 2014 17:16:28 -0700 (PDT) X-ASG-Debug-ID: 1408493786-04cbb0548811fce0001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id lHt5VD69BrdZhczx for ; Tue, 19 Aug 2014 17:16:26 -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: AjALAHjn81N5LDJ8PGdsb2JhbABagw2BKoIshQeoFwEBAQEBAQaefIV8gQkXBQEBAQE4NoREHCMYJDQFJQMHLYhBwj8YhWSIbhEBUB2ENgWPEo0vmHMrL4EPgUABAQE Received: from ppp121-44-50-124.lns20.syd6.internode.on.net (HELO dastard) ([121.44.50.124]) by ipmail05.adl6.internode.on.net with ESMTP; 20 Aug 2014 09:46:25 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1XJtZf-000738-BR; Wed, 20 Aug 2014 10:16:23 +1000 Date: Wed, 20 Aug 2014 10:16:23 +1000 From: Dave Chinner To: stable@vger.kernel.org Cc: xfs@oss.sgi.com, Fanael Linithien Subject: XFS fixes needed in stable kernels Message-ID: <20140820001623.GT20518@dastard> X-ASG-Orig-Subj: XFS fixes needed in stable kernels 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: 1408493786 X-Barracuda-URL: http://192.48.176.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.8632 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header Hi Stable Kernel Gurus! The following XFs fixes need to be pushed back to stable kernels. The commits weren't all tagged in the recent 3.17-rc1 merge, so you're getting an email from me instead. The commits required from 3.17-rc1 are: 67dc288 xfs: ensure verifiers are attached to recovered buffers 5fd364f xfs: quotacheck leaves dquot buffers without verifiers ad3714b xfs: dquot recovery needs verifiers These are definitely needed for 3.16.y and 3.15.y, but aren't critical for 3.14 and 3.13 because it only affects configurations marked "experimetal: use at your own risk" and probably won't apply easily. They aren't necessary at all for older kernels than 3.13.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From prvs=33098c5cb7=clm@fb.com Tue Aug 19 20:54: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.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 972F77F3F for ; Tue, 19 Aug 2014 20:54:27 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 584208F8037 for ; Tue, 19 Aug 2014 18:54:27 -0700 (PDT) X-ASG-Debug-ID: 1408499665-04bdf010a1af890001-NocioJ Received: from mx0a-00082601.pphosted.com (mx0b-00082601.pphosted.com [67.231.153.30]) by cuda.sgi.com with ESMTP id GKhaYPEcIQcYQDk2 for ; Tue, 19 Aug 2014 18:54:25 -0700 (PDT) X-Barracuda-Envelope-From: prvs=33098c5cb7=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 s7K1rkFI003093; Tue, 19 Aug 2014 18:54:18 -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=VA2Gdl1kRRmrwXob03jJ+pMu59Sgfb9/yjKVxp8cji8=; b=gwSdoFsSuOBd8FY1OUGwieq62HzwWXcEq/udgfZ+omcNCKC9bXaRzZ+OU13FB3/lHgCA O5F28lx7xK/JPDYD/AK/rCIb0w+xXcXBQCLhi5S2jGsC2G1P54rhScYxQsRHB+nvaoFQ jOIgIg55+lBveqX+eumD57vC99x+btac2ac= Received: from mail.thefacebook.com (mailwest.thefacebook.com [173.252.71.148]) by mx0b-00082601.pphosted.com with ESMTP id 1nvbh3sewe-1 (version=TLSv1/SSLv3 cipher=AES128-SHA bits=128 verify=OK); Tue, 19 Aug 2014 18:54:17 -0700 Received: from [172.20.2.134] (192.168.57.29) by mail.TheFacebook.com (192.168.16.17) with Microsoft SMTP Server (TLS) id 14.3.195.1; Tue, 19 Aug 2014 18:54:15 -0700 Message-ID: <53F3FFC6.1070706@fb.com> Date: Tue, 19 Aug 2014 21:54:14 -0400 From: Chris Mason User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Thunderbird/24.6.0 MIME-Version: 1.0 To: Dave Chinner CC: , Eric Sandeen Subject: Re: [PATCH v2] xfs: don't zero partial page cache pages during O_DIRECT References: <53E4E03A.7050101@fb.com> <53E61A9C.4020807@fb.com> <20140812011743.GU20518@dastard> <53F3A480.6020000@fb.com> <20140819223514.GQ20518@dastard> X-ASG-Orig-Subj: Re: [PATCH v2] xfs: don't zero partial page cache pages during O_DIRECT In-Reply-To: <20140819223514.GQ20518@dastard> Content-Type: text/plain; charset="ISO-8859-1" Content-Transfer-Encoding: 7bit X-Originating-IP: [192.168.57.29] X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10432:5.12.52,1.0.27,0.0.0000 definitions=2014-08-19_05:2014-08-19,2014-08-19,1970-01-01 signatures=0 X-Proofpoint-Spam-Details: rule=fb_default_notspam policy=fb_default score=0 kscore.is_bulkscore=1.88408177947963e-11 kscore.compositescore=0 circleOfTrustscore=0 compositescore=0.997797736942976 urlsuspect_oldscore=0.997797736942976 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=11180 rbsscore=0.997797736942976 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-1408200023 X-FB-Internal: deliver X-Barracuda-Connect: mx0b-00082601.pphosted.com[67.231.153.30] X-Barracuda-Start-Time: 1408499665 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On 08/19/2014 06:35 PM, Dave Chinner wrote: > On Tue, Aug 19, 2014 at 03:24:48PM -0400, Chris Mason wrote: >> On 08/11/2014 09:17 PM, Dave Chinner wrote: >>> On Sat, Aug 09, 2014 at 08:57:00AM -0400, Chris Mason wrote: >>>> >>>> diff --git a/fs/xfs/xfs_file.c b/fs/xfs/xfs_file.c >>>> index 1f66779..023d575 100644 >>>> --- a/fs/xfs/xfs_file.c >>>> +++ b/fs/xfs/xfs_file.c >>>> @@ -295,7 +295,8 @@ xfs_file_read_iter( >>>> xfs_rw_iunlock(ip, XFS_IOLOCK_EXCL); >>>> return ret; >>>> } >>>> - truncate_pagecache_range(VFS_I(ip), pos, -1); >>>> + invalidate_inode_pages2_range(VFS_I(ip)->i_mapping, >>>> + pos >> PAGE_CACHE_SHIFT, -1); >>>> } >>>> xfs_rw_ilock_demote(ip, XFS_IOLOCK_EXCL); >>>> } >>> >>> I added the WARN_ON_ONCE(ret) check to this and I am seeing it fire >>> occasionally. It always fires immediately before some other ASSERT() >>> they fires with a block map/page cache inconsistency. It usually >>> fires in a test that runs fsx or fsstress. The fsx failures are new >>> regressions caused by this patch. e.g. generic/263 hasn't failed for >>> months on any of my systems and this patch causes it to fail >>> reliably on my 1k block size test config. >>> >>> I'm going to assume at this point that this is uncovering some other >>> existing bug, but it means I'm not going to push this fix until I >>> understand what is actually happening here. It is possible that what >>> I'm seeing is related to Brian's collapse range bug fixes, but until >>> I applied this direct IO patch I'd never seen fsx throw ASSERTs in >>> xfs_bmap_shift_extents().... >>> >>> Either way, more testing and understanding is needed. >> >> Do you have the output from xfs and the command line args it used? For >> my device, it picks: >> >> -r 4096 -t 512 -w 512 -Z >> >> And for a blocksize 1024 test I did mkfs.xfs -b size=1024 > > I'm running: > > $ mkfs.xfs -f -m crc=1,finobt=1 -b size=1k /dev/vda > $ mount /dev/vda /mnt/test > $ ltp/fsx -o 128000 -l 500000 -r 4096 -t 512 -w 512 -Z -d /mnt/test/foo > >> But I can't trigger failures with or without the invalidate_inode_pages2 >> change. I was hoping to trigger on 3.16, and then jump back to 3.10 + >> my patch to see if the patch alone was at fault. > > I am seeing failures at operation 1192. > > Yesterday, I found a new class of bufferhead state coherency issues > to do with EOF handling that are causing the problems. Basically, > when the page cache marks a page dirty, the generic code marks all > the buffers on the page dirty, even when they are beyond EOF. > > As a result, when we go to invalidate the page that spans EOF, it > cannot be invalidated because there are dirty buffers on the page. > Those buffers persist in that state because they are beyond EOF, > have no blocks allocated to them, and cannot be written. And so when > we do a direct IO that spans the current EOF, it now fails to > invalidate that page and so triggers the warning. > > Worse is that it appears that these bufferheads can leak into the > internal blocks into the file when the file is extended, leading to > all sorts of other ASSERT failures (which I've been seeing for a > while now). > > I've got the above fsx command to run for somewhere between 100k and > 110k operations with the fixes I currently have, but I haven't found > the cause of the dirty buffer beyond EOF state leaking into the > interior of the file from extend operations yet. > > Once I have something that passes a few million fsx ops.... I have to admit, I'm not sure where this leaves us in terms of safely applying my patch to our 3.10 or mainline kernel... Failing to invalidate the page and zeroing the page are really both wrong. It feels like this zeroing and cleaning should be happening in truncate, but that's because I always blame truncate for fsx bugs. Totally unrelated, but I'll abuse this email thread anyway. With a pull to today's xfstests so I can send my shiny new test, ./check -g auto now only runs the btrfs tests and nothing else. I think its safe to assume this doesn't happen for you, any hints on what might make xfstests suddenly love btrfs this much? -chris From david@fromorbit.com Tue Aug 19 21:19: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 (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 1BB137F3F for ; Tue, 19 Aug 2014 21: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 0983930408E for ; Tue, 19 Aug 2014 19:19:55 -0700 (PDT) X-ASG-Debug-ID: 1408501193-04cb6c54fe10b360001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id DXrPnFIRkr0m6xTu for ; Tue, 19 Aug 2014 19:19:53 -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: AjULAOsE9FN5LDJ8PGdsb2JhbABagw2BKoIshQeoHAEBAQEBAQaefIV8AYELFwUBAQEBODaEAwEBBAEnExwjBQsIAw4KCSUPBSUDBxoTiDoHwjMXGIVkiG4RAVAHhEwFnEGMBwSMaCsvgQ+BQAEBAQ Received: from ppp121-44-50-124.lns20.syd6.internode.on.net (HELO dastard) ([121.44.50.124]) by ipmail05.adl6.internode.on.net with ESMTP; 20 Aug 2014 11:49:52 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1XJvV8-0007IP-3u; Wed, 20 Aug 2014 12:19:50 +1000 Date: Wed, 20 Aug 2014 12:19:50 +1000 From: Dave Chinner To: Chris Mason Cc: xfs@oss.sgi.com, Eric Sandeen Subject: Re: [PATCH v2] xfs: don't zero partial page cache pages during O_DIRECT Message-ID: <20140820021950.GU20518@dastard> X-ASG-Orig-Subj: Re: [PATCH v2] xfs: don't zero partial page cache pages during O_DIRECT References: <53E4E03A.7050101@fb.com> <53E61A9C.4020807@fb.com> <20140812011743.GU20518@dastard> <53F3A480.6020000@fb.com> <20140819223514.GQ20518@dastard> <53F3FFC6.1070706@fb.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <53F3FFC6.1070706@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: 1408501193 X-Barracuda-URL: http://192.48.176.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.8636 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Tue, Aug 19, 2014 at 09:54:14PM -0400, Chris Mason wrote: > On 08/19/2014 06:35 PM, Dave Chinner wrote: > > On Tue, Aug 19, 2014 at 03:24:48PM -0400, Chris Mason wrote: > >> On 08/11/2014 09:17 PM, Dave Chinner wrote: > >>> On Sat, Aug 09, 2014 at 08:57:00AM -0400, Chris Mason wrote: > >>>> > >>>> diff --git a/fs/xfs/xfs_file.c b/fs/xfs/xfs_file.c > >>>> index 1f66779..023d575 100644 > >>>> --- a/fs/xfs/xfs_file.c > >>>> +++ b/fs/xfs/xfs_file.c > >>>> @@ -295,7 +295,8 @@ xfs_file_read_iter( > >>>> xfs_rw_iunlock(ip, XFS_IOLOCK_EXCL); > >>>> return ret; > >>>> } > >>>> - truncate_pagecache_range(VFS_I(ip), pos, -1); > >>>> + invalidate_inode_pages2_range(VFS_I(ip)->i_mapping, > >>>> + pos >> PAGE_CACHE_SHIFT, -1); > >>>> } > >>>> xfs_rw_ilock_demote(ip, XFS_IOLOCK_EXCL); > >>>> } > >>> > >>> I added the WARN_ON_ONCE(ret) check to this and I am seeing it fire > >>> occasionally. It always fires immediately before some other ASSERT() > >>> they fires with a block map/page cache inconsistency. It usually > >>> fires in a test that runs fsx or fsstress. The fsx failures are new > >>> regressions caused by this patch. e.g. generic/263 hasn't failed for > >>> months on any of my systems and this patch causes it to fail > >>> reliably on my 1k block size test config. > >>> > >>> I'm going to assume at this point that this is uncovering some other > >>> existing bug, but it means I'm not going to push this fix until I > >>> understand what is actually happening here. It is possible that what > >>> I'm seeing is related to Brian's collapse range bug fixes, but until > >>> I applied this direct IO patch I'd never seen fsx throw ASSERTs in > >>> xfs_bmap_shift_extents().... > >>> > >>> Either way, more testing and understanding is needed. > >> > >> Do you have the output from xfs and the command line args it used? For > >> my device, it picks: > >> > >> -r 4096 -t 512 -w 512 -Z > >> > >> And for a blocksize 1024 test I did mkfs.xfs -b size=1024 > > > > I'm running: > > > > $ mkfs.xfs -f -m crc=1,finobt=1 -b size=1k /dev/vda > > $ mount /dev/vda /mnt/test > > $ ltp/fsx -o 128000 -l 500000 -r 4096 -t 512 -w 512 -Z -d /mnt/test/foo > > > >> But I can't trigger failures with or without the invalidate_inode_pages2 > >> change. I was hoping to trigger on 3.16, and then jump back to 3.10 + > >> my patch to see if the patch alone was at fault. > > > > I am seeing failures at operation 1192. > > > > Yesterday, I found a new class of bufferhead state coherency issues > > to do with EOF handling that are causing the problems. Basically, > > when the page cache marks a page dirty, the generic code marks all > > the buffers on the page dirty, even when they are beyond EOF. > > > > As a result, when we go to invalidate the page that spans EOF, it > > cannot be invalidated because there are dirty buffers on the page. > > Those buffers persist in that state because they are beyond EOF, > > have no blocks allocated to them, and cannot be written. And so when > > we do a direct IO that spans the current EOF, it now fails to > > invalidate that page and so triggers the warning. > > > > Worse is that it appears that these bufferheads can leak into the > > internal blocks into the file when the file is extended, leading to > > all sorts of other ASSERT failures (which I've been seeing for a > > while now). > > > > I've got the above fsx command to run for somewhere between 100k and > > 110k operations with the fixes I currently have, but I haven't found > > the cause of the dirty buffer beyond EOF state leaking into the > > interior of the file from extend operations yet. > > > > Once I have something that passes a few million fsx ops.... > > I have to admit, I'm not sure where this leaves us in terms of safely > applying my patch to our 3.10 or mainline kernel... Failing to > invalidate the page and zeroing the page are really both wrong. Well, yes they are, and that's one of the reasons why I wanted to ensure we caught failures. As such, I think this invalidation bug goes back a *long time* because we've never, ever checked for invalidation failure before this patch. However, I think I've got a self-contained fix that can be backported for the invalidation problem now - it's well past 10 million fsx ops at this point with both read and write DIO invalidation fixes included. I'll post my series when I've done some more robust testing on it.... > It feels like this zeroing and cleaning should be happening in truncate, > but that's because I always blame truncate for fsx bugs. The problem is the other way around - buffers beyond EOF should never be marked dirty because they can never be written and hence never be marked clean in a consistent and sane manner. > Totally unrelated, but I'll abuse this email thread anyway. With a pull > to today's xfstests so I can send my shiny new test, ./check -g auto now > only runs the btrfs tests and nothing else. Works just fine for me. Did you reformat you test dev to xfs first? Do you have stray env vars set? What does ./setup tell you about your config? And maybe you can bisect - it was only ~20 commits in the last push. Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Tue Aug 19 21:36: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 C88407F3F for ; Tue, 19 Aug 2014 21:36:57 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 9B1E38F8037 for ; Tue, 19 Aug 2014 19:36:54 -0700 (PDT) X-ASG-Debug-ID: 1408502211-04bdf0109ab0ae0001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id D1gaIpIA4sKXhcUX for ; Tue, 19 Aug 2014 19:36: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: AjULAIAI9FN5LDJ8PGdsb2JhbABagw2BKoIshQeoHAEBAQEBAQaefIV8AYELFwUBAQEBODaEBAEFJxMcIxAIAw4KCSUPBSUDBxoTiEHCOBcYhWSJUAeETAWcQYwHBIxoKy+CTwEBAQ Received: from ppp121-44-50-124.lns20.syd6.internode.on.net (HELO dastard) ([121.44.50.124]) by ipmail05.adl6.internode.on.net with ESMTP; 20 Aug 2014 12:06:50 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1XJvlZ-0007KD-QD; Wed, 20 Aug 2014 12:36:49 +1000 Date: Wed, 20 Aug 2014 12:36:49 +1000 From: Dave Chinner To: Chris Mason Cc: Eric Sandeen , xfs@oss.sgi.com Subject: Re: [PATCH v2] xfs: don't zero partial page cache pages during O_DIRECT Message-ID: <20140820023649.GV20518@dastard> X-ASG-Orig-Subj: Re: [PATCH v2] xfs: don't zero partial page cache pages during O_DIRECT References: <53E4E03A.7050101@fb.com> <53E61A9C.4020807@fb.com> <20140812011743.GU20518@dastard> <53F3A480.6020000@fb.com> <20140819223514.GQ20518@dastard> <53F3FFC6.1070706@fb.com> <20140820021950.GU20518@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140820021950.GU20518@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: 1408502211 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.8636 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Wed, Aug 20, 2014 at 12:19:50PM +1000, Dave Chinner wrote: > On Tue, Aug 19, 2014 at 09:54:14PM -0400, Chris Mason wrote: > > On 08/19/2014 06:35 PM, Dave Chinner wrote: > > > On Tue, Aug 19, 2014 at 03:24:48PM -0400, Chris Mason wrote: > > >> On 08/11/2014 09:17 PM, Dave Chinner wrote: > > >>> On Sat, Aug 09, 2014 at 08:57:00AM -0400, Chris Mason wrote: > > >>>> > > >>>> diff --git a/fs/xfs/xfs_file.c b/fs/xfs/xfs_file.c > > >>>> index 1f66779..023d575 100644 > > >>>> --- a/fs/xfs/xfs_file.c > > >>>> +++ b/fs/xfs/xfs_file.c > > >>>> @@ -295,7 +295,8 @@ xfs_file_read_iter( > > >>>> xfs_rw_iunlock(ip, XFS_IOLOCK_EXCL); > > >>>> return ret; > > >>>> } > > >>>> - truncate_pagecache_range(VFS_I(ip), pos, -1); > > >>>> + invalidate_inode_pages2_range(VFS_I(ip)->i_mapping, > > >>>> + pos >> PAGE_CACHE_SHIFT, -1); > > >>>> } > > >>>> xfs_rw_ilock_demote(ip, XFS_IOLOCK_EXCL); > > >>>> } > > >>> > > >>> I added the WARN_ON_ONCE(ret) check to this and I am seeing it fire > > >>> occasionally. It always fires immediately before some other ASSERT() > > >>> they fires with a block map/page cache inconsistency. It usually > > >>> fires in a test that runs fsx or fsstress. The fsx failures are new > > >>> regressions caused by this patch. e.g. generic/263 hasn't failed for > > >>> months on any of my systems and this patch causes it to fail > > >>> reliably on my 1k block size test config. > > >>> > > >>> I'm going to assume at this point that this is uncovering some other > > >>> existing bug, but it means I'm not going to push this fix until I > > >>> understand what is actually happening here. It is possible that what > > >>> I'm seeing is related to Brian's collapse range bug fixes, but until > > >>> I applied this direct IO patch I'd never seen fsx throw ASSERTs in > > >>> xfs_bmap_shift_extents().... > > >>> > > >>> Either way, more testing and understanding is needed. > > >> > > >> Do you have the output from xfs and the command line args it used? For > > >> my device, it picks: > > >> > > >> -r 4096 -t 512 -w 512 -Z > > >> > > >> And for a blocksize 1024 test I did mkfs.xfs -b size=1024 > > > > > > I'm running: > > > > > > $ mkfs.xfs -f -m crc=1,finobt=1 -b size=1k /dev/vda > > > $ mount /dev/vda /mnt/test > > > $ ltp/fsx -o 128000 -l 500000 -r 4096 -t 512 -w 512 -Z -d /mnt/test/foo > > > > > >> But I can't trigger failures with or without the invalidate_inode_pages2 > > >> change. I was hoping to trigger on 3.16, and then jump back to 3.10 + > > >> my patch to see if the patch alone was at fault. > > > > > > I am seeing failures at operation 1192. > > > > > > Yesterday, I found a new class of bufferhead state coherency issues > > > to do with EOF handling that are causing the problems. Basically, > > > when the page cache marks a page dirty, the generic code marks all > > > the buffers on the page dirty, even when they are beyond EOF. > > > > > > As a result, when we go to invalidate the page that spans EOF, it > > > cannot be invalidated because there are dirty buffers on the page. > > > Those buffers persist in that state because they are beyond EOF, > > > have no blocks allocated to them, and cannot be written. And so when > > > we do a direct IO that spans the current EOF, it now fails to > > > invalidate that page and so triggers the warning. > > > > > > Worse is that it appears that these bufferheads can leak into the > > > internal blocks into the file when the file is extended, leading to > > > all sorts of other ASSERT failures (which I've been seeing for a > > > while now). > > > > > > I've got the above fsx command to run for somewhere between 100k and > > > 110k operations with the fixes I currently have, but I haven't found > > > the cause of the dirty buffer beyond EOF state leaking into the > > > interior of the file from extend operations yet. > > > > > > Once I have something that passes a few million fsx ops.... > > > > I have to admit, I'm not sure where this leaves us in terms of safely > > applying my patch to our 3.10 or mainline kernel... Failing to > > invalidate the page and zeroing the page are really both wrong. > > Well, yes they are, and that's one of the reasons why I wanted to > ensure we caught failures. As such, I think this invalidation bug > goes back a *long time* because we've never, ever checked for > invalidation failure before this patch. > > However, I think I've got a self-contained fix that can be > backported for the invalidation problem now - it's well past 10 > million fsx ops at this point with both read and write DIO > invalidation fixes included. I'll post my series when I've done > some more robust testing on it.... There's more issues. generic/247 on a 4k block size filesystem just triggered an invalidation failure on a direct IO write. That test is specifically mixing DIO overwrite with mmap overwrite on the same file, so there's clearly more issues in play here than I first thought. So, more debugging needed to determine if this is a result of the usual, currently unsolvable page fault vs DIO races... Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Tue Aug 19 23:42: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 7FC937F3F for ; Tue, 19 Aug 2014 23:42:00 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 5F4878F8037 for ; Tue, 19 Aug 2014 21:41:57 -0700 (PDT) X-ASG-Debug-ID: 1408509714-04cbb05488126f00001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id sClfwNnGun5B1Ts0 for ; Tue, 19 Aug 2014 21:41:54 -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: Al8LAPol9FN5LDJ8PGdsb2JhbABagw2BKoIshQeoHwEBAQEBAQaefIV8AYEKFwUBAQEBODaEAwEBBAEnExwjEAgDDgoJJQ8FJQMHGhOIOgfCQhcYhWSJUAeDL4EdBZxBjAgEjGsrL4JPAQEB Received: from ppp121-44-50-124.lns20.syd6.internode.on.net (HELO dastard) ([121.44.50.124]) by ipmail05.adl6.internode.on.net with ESMTP; 20 Aug 2014 14:11:52 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1XJxiY-0007a5-T0; Wed, 20 Aug 2014 14:41:50 +1000 Date: Wed, 20 Aug 2014 14:41:50 +1000 From: Dave Chinner To: Chris Mason Cc: Eric Sandeen , xfs@oss.sgi.com Subject: Re: [PATCH v2] xfs: don't zero partial page cache pages during O_DIRECT Message-ID: <20140820044150.GF26465@dastard> X-ASG-Orig-Subj: Re: [PATCH v2] xfs: don't zero partial page cache pages during O_DIRECT References: <53E4E03A.7050101@fb.com> <53E61A9C.4020807@fb.com> <20140812011743.GU20518@dastard> <53F3A480.6020000@fb.com> <20140819223514.GQ20518@dastard> <53F3FFC6.1070706@fb.com> <20140820021950.GU20518@dastard> <20140820023649.GV20518@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140820023649.GV20518@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: 1408509714 X-Barracuda-URL: http://192.48.176.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.8639 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Wed, Aug 20, 2014 at 12:36:49PM +1000, Dave Chinner wrote: > On Wed, Aug 20, 2014 at 12:19:50PM +1000, Dave Chinner wrote: > > On Tue, Aug 19, 2014 at 09:54:14PM -0400, Chris Mason wrote: > > > On 08/19/2014 06:35 PM, Dave Chinner wrote: > > > > On Tue, Aug 19, 2014 at 03:24:48PM -0400, Chris Mason wrote: > > > >> On 08/11/2014 09:17 PM, Dave Chinner wrote: > > > >>> On Sat, Aug 09, 2014 at 08:57:00AM -0400, Chris Mason wrote: > > > >>>> > > > >>>> diff --git a/fs/xfs/xfs_file.c b/fs/xfs/xfs_file.c > > > >>>> index 1f66779..023d575 100644 > > > >>>> --- a/fs/xfs/xfs_file.c > > > >>>> +++ b/fs/xfs/xfs_file.c > > > >>>> @@ -295,7 +295,8 @@ xfs_file_read_iter( > > > >>>> xfs_rw_iunlock(ip, XFS_IOLOCK_EXCL); > > > >>>> return ret; > > > >>>> } > > > >>>> - truncate_pagecache_range(VFS_I(ip), pos, -1); > > > >>>> + invalidate_inode_pages2_range(VFS_I(ip)->i_mapping, > > > >>>> + pos >> PAGE_CACHE_SHIFT, -1); > > > >>>> } > > > >>>> xfs_rw_ilock_demote(ip, XFS_IOLOCK_EXCL); > > > >>>> } > > > >>> > > > >>> I added the WARN_ON_ONCE(ret) check to this and I am seeing it fire > > > >>> occasionally. It always fires immediately before some other ASSERT() > > > >>> they fires with a block map/page cache inconsistency. It usually > > > >>> fires in a test that runs fsx or fsstress. The fsx failures are new > > > >>> regressions caused by this patch. e.g. generic/263 hasn't failed for > > > >>> months on any of my systems and this patch causes it to fail > > > >>> reliably on my 1k block size test config. > > > >>> > > > >>> I'm going to assume at this point that this is uncovering some other > > > >>> existing bug, but it means I'm not going to push this fix until I > > > >>> understand what is actually happening here. It is possible that what > > > >>> I'm seeing is related to Brian's collapse range bug fixes, but until > > > >>> I applied this direct IO patch I'd never seen fsx throw ASSERTs in > > > >>> xfs_bmap_shift_extents().... > > > >>> > > > >>> Either way, more testing and understanding is needed. > > > >> > > > >> Do you have the output from xfs and the command line args it used? For > > > >> my device, it picks: > > > >> > > > >> -r 4096 -t 512 -w 512 -Z > > > >> > > > >> And for a blocksize 1024 test I did mkfs.xfs -b size=1024 > > > > > > > > I'm running: > > > > > > > > $ mkfs.xfs -f -m crc=1,finobt=1 -b size=1k /dev/vda > > > > $ mount /dev/vda /mnt/test > > > > $ ltp/fsx -o 128000 -l 500000 -r 4096 -t 512 -w 512 -Z -d /mnt/test/foo > > > > > > > >> But I can't trigger failures with or without the invalidate_inode_pages2 > > > >> change. I was hoping to trigger on 3.16, and then jump back to 3.10 + > > > >> my patch to see if the patch alone was at fault. > > > > > > > > I am seeing failures at operation 1192. > > > > > > > > Yesterday, I found a new class of bufferhead state coherency issues > > > > to do with EOF handling that are causing the problems. Basically, > > > > when the page cache marks a page dirty, the generic code marks all > > > > the buffers on the page dirty, even when they are beyond EOF. > > > > > > > > As a result, when we go to invalidate the page that spans EOF, it > > > > cannot be invalidated because there are dirty buffers on the page. > > > > Those buffers persist in that state because they are beyond EOF, > > > > have no blocks allocated to them, and cannot be written. And so when > > > > we do a direct IO that spans the current EOF, it now fails to > > > > invalidate that page and so triggers the warning. > > > > > > > > Worse is that it appears that these bufferheads can leak into the > > > > internal blocks into the file when the file is extended, leading to > > > > all sorts of other ASSERT failures (which I've been seeing for a > > > > while now). > > > > > > > > I've got the above fsx command to run for somewhere between 100k and > > > > 110k operations with the fixes I currently have, but I haven't found > > > > the cause of the dirty buffer beyond EOF state leaking into the > > > > interior of the file from extend operations yet. > > > > > > > > Once I have something that passes a few million fsx ops.... > > > > > > I have to admit, I'm not sure where this leaves us in terms of safely > > > applying my patch to our 3.10 or mainline kernel... Failing to > > > invalidate the page and zeroing the page are really both wrong. > > > > Well, yes they are, and that's one of the reasons why I wanted to > > ensure we caught failures. As such, I think this invalidation bug > > goes back a *long time* because we've never, ever checked for > > invalidation failure before this patch. > > > > However, I think I've got a self-contained fix that can be > > backported for the invalidation problem now - it's well past 10 > > million fsx ops at this point with both read and write DIO > > invalidation fixes included. I'll post my series when I've done > > some more robust testing on it.... > > There's more issues. generic/247 on a 4k block size filesystem just > triggered an invalidation failure on a direct IO write. That test is > specifically mixing DIO overwrite with mmap overwrite on the same > file, so there's clearly more issues in play here than I first > thought. > > So, more debugging needed to determine if this is a result of the > usual, currently unsolvable page fault vs DIO races... OK, it's almost certainly page fault vs writeback races in the DIO code. The page that is failing invalidation is uptodate, dirty and mapped, which indicates that it was dirtied after writeback occurred. So, just a demonstration of how mmap+DIO on the same file is just a bad idea, and having the kernel now issue a warning the first time this happens is probably a good idea. Cheers, Dave. -- Dave Chinner david@fromorbit.com From institutional@graacc.org.br Tue Aug 19 23:58: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=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 DEC3C7F3F for ; Tue, 19 Aug 2014 23:58:22 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id B43A98F8040 for ; Tue, 19 Aug 2014 21:58:22 -0700 (PDT) X-ASG-Debug-ID: 1408510691-04cbb05487127440001-NocioJ Received: from dualtec-smtp-relay-1.dualtec.com.br (dualtec-smtp-relay-1b.static.dualtec.com.br [200.169.96.23]) by cuda.sgi.com with ESMTP id xl5xwHt4zEmWNW8U for ; Tue, 19 Aug 2014 21:58:12 -0700 (PDT) X-Barracuda-Envelope-From: institutional@graacc.org.br X-Barracuda-Apparent-Source-IP: 200.169.96.23 Received: from srv-iop-236.graacc.iop (200-144-94-206.epm.br [200.144.94.206]) by dualtec-smtp-relay-1.dualtec.com.br with SMTP; Wed, 20 Aug 2014 01:20:32 -0300 X-MimeOLE: Produced By Microsoft Exchange V6.5 Content-class: urn:content-classes:message MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="----_=_NextPart_001_01CFBC2D.4C587C66" Subject: =?iso-8859-1?Q?Su_env=EDo_Entrega_pendiente?= Date: Wed, 20 Aug 2014 01:14:55 -0300 X-ASG-Orig-Subj: =?iso-8859-1?Q?Su_env=EDo_Entrega_pendiente?= Message-ID: <56D392280366AF43AAADFD61D5C54D3103F335FB@SRV-IOP-236.graacc.iop> X-MS-Has-Attach: X-MS-TNEF-Correlator: Thread-Topic: =?iso-8859-1?Q?Su_env=EDo_Entrega_pendiente?= Thread-Index: Ac+8LUvQf3nIPspOQNmZ8ytkEOrvEQ== From: "GRAACC" X-Barracuda-Connect: dualtec-smtp-relay-1b.static.dualtec.com.br[200.169.96.23] X-Barracuda-Start-Time: 1408510691 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=HTML_MESSAGE, MISSING_HEADERS, THREAD_INDEX, THREAD_TOPIC, TO_CC_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.8639 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 HTML_MESSAGE BODY: HTML included in message 0.00 TO_CC_NONE No To: or Cc: header To: undisclosed-recipients:; This is a multi-part message in MIME format. ------_=_NextPart_001_01CFBC2D.4C587C66 Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable Estimado cliente:=20 Esto es para informarle de que su env=EDo con n=FAmero de referencia = 2661428 que est=E1 experimentando la entrega a su destino (Direcci=F3n) = tiene encontrar una orden de suspensi=F3n por la Agencia Tributaria. Nos = han informado de que se requiere un certificado de impuestos y hay que = obtener de ellos antes de su paquete ser=E1 permitir m=E1s la entrega. = Esto se debe al hecho de que usted no es un ciudadano de este pa=EDs y = que necesita un certificado de impuestos que un env=EDo de gran volumen, = tales abandona el pa=EDs.=20 Para regresar a nosotros en breve a trav=E9s de este correo = electr=F3nico: upservicedept@yahoo.com.hk=20 Sr. Charles Deem=20 Servicio de mensajer=EDa UPS. ------_=_NextPart_001_01CFBC2D.4C587C66 Content-Type: text/html; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable Su env=EDo Entrega pendiente

Estimado cliente:

Esto es para informarle de que su env=EDo con n=FAmero de referencia = 2661428 que est=E1 experimentando la entrega a su destino (Direcci=F3n) = tiene encontrar una orden de suspensi=F3n por la Agencia Tributaria. Nos = han informado de que se requiere un certificado de impuestos y hay que = obtener de ellos antes de su paquete ser=E1 permitir m=E1s la entrega. = Esto se debe al hecho de que usted no es un ciudadano de este pa=EDs y = que necesita un certificado de impuestos que un env=EDo de gran volumen, = tales abandona el pa=EDs.

Para regresar a nosotros en breve a trav=E9s de este correo = electr=F3nico: upservicedept@yahoo.com.hk

Sr. Charles Deem
Servicio de mensajer=EDa UPS.

------_=_NextPart_001_01CFBC2D.4C587C66-- From bfoster@redhat.com Wed Aug 20 11:56: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 61BDC7F4E for ; Wed, 20 Aug 2014 11:56:02 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 4275E8F8039 for ; Wed, 20 Aug 2014 09:56:02 -0700 (PDT) X-ASG-Debug-ID: 1408553757-04bdf01097cdb20001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id LSg5kFbROTZ6TYoZ (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 20 Aug 2014 09:55:57 -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 s7KGtv3C020008 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK) for ; Wed, 20 Aug 2014 12:55:57 -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 s7KGtuxJ002695 for ; Wed, 20 Aug 2014 12:55:57 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 790EE12577F; Wed, 20 Aug 2014 12:55:55 -0400 (EDT) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH 0/2] xfs log recovery delay instrumentation Date: Wed, 20 Aug 2014 12:55:53 -0400 X-ASG-Orig-Subj: [PATCH 0/2] xfs log recovery delay instrumentation Message-Id: <1408553755-10255-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: 1408553757 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 Hi all, Here's a couple patches to add the log recovery delay instrumentation required for reproducing the log recovery buf race problem uncovered by Alex: http://oss.sgi.com/archives/xfs/2014-08/msg00155.html It looked easier to dump this tunable in /proc, but it seems like we want to move away from adding more things there. This series defines a generic sys/fs/xfs/debug location to serve a similar purpose and exports the log recovery delay tunable therein. The original problem is now easily reproduced with a 10s or so log recovery delay and the xfstests test I posted the other day: http://oss.sgi.com/archives/xfs/2014-08/msg00261.html One thing that comes to mind as I write this is whether it might be a good idea to only export this debug subdirectory for DEBUG enabled kernels. Thoughts? Any other thoughts, reviews or flames are appreciated as well. Brian Brian Foster (2): xfs: add debug sysfs attribute set xfs: export log_recovery_delay to delay mount time log recovery fs/xfs/xfs_globals.c | 4 +++ fs/xfs/xfs_log_recover.c | 12 ++++++++ fs/xfs/xfs_super.c | 15 ++++++++-- fs/xfs/xfs_sysctl.h | 5 ++++ fs/xfs/xfs_sysfs.c | 71 ++++++++++++++++++++++++++++++++++++++++++++++++ fs/xfs/xfs_sysfs.h | 1 + 6 files changed, 106 insertions(+), 2 deletions(-) -- 1.8.3.1 From bfoster@redhat.com Wed Aug 20 11:56: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 7DFC27F51 for ; Wed, 20 Aug 2014 11:56:02 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 50701304059 for ; Wed, 20 Aug 2014 09:56:02 -0700 (PDT) X-ASG-Debug-ID: 1408553757-04bdf0109acdb20001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id vXOjPBsJCqHTU147 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 20 Aug 2014 09:55:57 -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 s7KGtvip017588 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK) for ; Wed, 20 Aug 2014 12:55:57 -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 s7KGtu6p012344 for ; Wed, 20 Aug 2014 12:55:56 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 913CC12577D; Wed, 20 Aug 2014 12:55:55 -0400 (EDT) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH 1/2] xfs: add debug sysfs attribute set Date: Wed, 20 Aug 2014 12:55:54 -0400 X-ASG-Orig-Subj: [PATCH 1/2] xfs: add debug sysfs attribute set Message-Id: <1408553755-10255-2-git-send-email-bfoster@redhat.com> In-Reply-To: <1408553755-10255-1-git-send-email-bfoster@redhat.com> References: <1408553755-10255-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: 1408553757 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 Create a top-level debug directory for global debug sysfs attributes. This directory is added and removed on XFS module initialization and removal respectively. It typically resides at /sys/fs/xfs/debug. It is located at the top level of the xfs sysfs hierarchy as attributes might define global behavior or behavior that must be configured before an xfs mount is available (e.g., log recovery behavior). Define the global debug kobject that represents the debug sysfs directory and add generic attribute show/store helpers to support future attributes. No debug attributes are exported as of yet. Signed-off-by: Brian Foster --- fs/xfs/xfs_super.c | 15 +++++++++++++-- fs/xfs/xfs_sysfs.c | 40 ++++++++++++++++++++++++++++++++++++++++ fs/xfs/xfs_sysfs.h | 1 + 3 files changed, 54 insertions(+), 2 deletions(-) diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c index b194652..9b5eb02 100644 --- a/fs/xfs/xfs_super.c +++ b/fs/xfs/xfs_super.c @@ -47,6 +47,7 @@ #include "xfs_dinode.h" #include "xfs_filestream.h" #include "xfs_quota.h" +#include "xfs_sysfs.h" #include #include @@ -61,7 +62,9 @@ static const struct super_operations xfs_super_operations; static kmem_zone_t *xfs_ioend_zone; mempool_t *xfs_ioend_pool; -struct kset *xfs_kset; + +struct kset *xfs_kset; /* top-level xfs sysfs dir */ +static struct xfs_kobj xfs_dbg_kobj; /* global debug sysfs attrs */ #define MNTOPT_LOGBUFS "logbufs" /* number of XFS log buffers */ #define MNTOPT_LOGBSIZE "logbsize" /* size of XFS log buffers */ @@ -1768,10 +1771,15 @@ init_xfs_fs(void) goto out_sysctl_unregister;; } - error = xfs_qm_init(); + xfs_dbg_kobj.kobject.kset = xfs_kset; + error = xfs_sysfs_init(&xfs_dbg_kobj, &xfs_dbg_ktype, NULL, "debug"); if (error) goto out_kset_unregister; + error = xfs_qm_init(); + if (error) + goto out_remove_kobj; + error = register_filesystem(&xfs_fs_type); if (error) goto out_qm_exit; @@ -1779,6 +1787,8 @@ init_xfs_fs(void) out_qm_exit: xfs_qm_exit(); + out_remove_kobj: + xfs_sysfs_del(&xfs_dbg_kobj); out_kset_unregister: kset_unregister(xfs_kset); out_sysctl_unregister: @@ -1802,6 +1812,7 @@ exit_xfs_fs(void) { xfs_qm_exit(); unregister_filesystem(&xfs_fs_type); + xfs_sysfs_del(&xfs_dbg_kobj); kset_unregister(xfs_kset); xfs_sysctl_unregister(); xfs_cleanup_procfs(); diff --git a/fs/xfs/xfs_sysfs.c b/fs/xfs/xfs_sysfs.c index 9835139..dd31511 100644 --- a/fs/xfs/xfs_sysfs.c +++ b/fs/xfs/xfs_sysfs.c @@ -51,6 +51,46 @@ struct kobj_type xfs_mp_ktype = { .release = xfs_sysfs_release, }; +/* debug */ + +static struct attribute *xfs_dbg_attrs[] = { + NULL, +}; + +STATIC ssize_t +xfs_dbg_show( + struct kobject *kobject, + struct attribute *attr, + char *buf) +{ + struct xfs_sysfs_attr *xfs_attr = to_attr(attr); + + return xfs_attr->show ? xfs_attr->show(buf, NULL) : 0; +} + +STATIC ssize_t +xfs_dbg_store( + struct kobject *kobject, + struct attribute *attr, + const char *buf, + size_t count) +{ + struct xfs_sysfs_attr *xfs_attr = to_attr(attr); + + return xfs_attr->store ? xfs_attr->store(buf, count, NULL) : 0; +} + +static struct sysfs_ops xfs_dbg_ops = { + .show = xfs_dbg_show, + .store = xfs_dbg_store, +}; + +struct kobj_type xfs_dbg_ktype = { + .release = xfs_sysfs_release, + .sysfs_ops = &xfs_dbg_ops, + .default_attrs = xfs_dbg_attrs, +}; + /* xlog */ STATIC ssize_t diff --git a/fs/xfs/xfs_sysfs.h b/fs/xfs/xfs_sysfs.h index 54a2091..240eee3 100644 --- a/fs/xfs/xfs_sysfs.h +++ b/fs/xfs/xfs_sysfs.h @@ -20,6 +20,7 @@ #define __XFS_SYSFS_H__ extern struct kobj_type xfs_mp_ktype; /* xfs_mount */ +extern struct kobj_type xfs_dbg_ktype; /* debug */ extern struct kobj_type xfs_log_ktype; /* xlog */ static inline struct xfs_kobj * -- 1.8.3.1 From bfoster@redhat.com Wed Aug 20 11:56: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 6E9A67F50 for ; Wed, 20 Aug 2014 11:56:02 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 408968F8054 for ; Wed, 20 Aug 2014 09:56:02 -0700 (PDT) X-ASG-Debug-ID: 1408553757-04bdf010a0cdb30001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id rIququCWqFSAoqLW (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 20 Aug 2014 09:55:57 -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 s7KGtv12013557 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK) for ; Wed, 20 Aug 2014 12:55:57 -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 s7KGtuoQ006544 for ; Wed, 20 Aug 2014 12:55:57 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 9D442125780; Wed, 20 Aug 2014 12:55:55 -0400 (EDT) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH 2/2] xfs: export log_recovery_delay to delay mount time log recovery Date: Wed, 20 Aug 2014 12:55:55 -0400 X-ASG-Orig-Subj: [PATCH 2/2] xfs: export log_recovery_delay to delay mount time log recovery Message-Id: <1408553755-10255-3-git-send-email-bfoster@redhat.com> In-Reply-To: <1408553755-10255-1-git-send-email-bfoster@redhat.com> References: <1408553755-10255-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: 1408553757 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 XFS log recovery has been discovered to have race conditions with buffers when I/O errors occur. External tools are available to simulate I/O errors to XFS, but this alone is not sufficient for testing log recovery. XFS unconditionally resets the inactive region of the log prior to log recovery to avoid confusion over processing any partially written log records that might have been written before an unclean shutdown. Therefore, unconditional write I/O failures at mount time are caught by the reset sequence rather than log recovery and hinder the ability to test the latter. The device-mapper dm-flakey module uses an up/down timer to define a cycle for when to fail I/Os. Create a pre log recovery delay tunable that can be used to coordinate XFS log recovery with I/O errors simulated by dm-flakey. This facilitates coordination in userspace that allows the reset of stale log blocks to succeed and writes due to log recovery to fail. For example, define a dm-flakey instance with an uptime long enough to allow log reset to succeed and a log recovery delay long enough to allow the dm-flakey uptime to expire. The 'log_recovery_delay' sysfs tunable is exported under /sys/fs/xfs/debug. The value is exported in units of seconds and allows for a delay of up to 60 seconds. Note that this is for XFS debug and test instrumentation purposes only and should not be used by applications. No delay is enabled by default. Signed-off-by: Brian Foster --- fs/xfs/xfs_globals.c | 4 ++++ fs/xfs/xfs_log_recover.c | 12 ++++++++++++ fs/xfs/xfs_sysctl.h | 5 +++++ fs/xfs/xfs_sysfs.c | 31 +++++++++++++++++++++++++++++++ 4 files changed, 52 insertions(+) diff --git a/fs/xfs/xfs_globals.c b/fs/xfs/xfs_globals.c index 5399ef2..4d41b24 100644 --- a/fs/xfs/xfs_globals.c +++ b/fs/xfs/xfs_globals.c @@ -43,3 +43,7 @@ xfs_param_t xfs_params = { .fstrm_timer = { 1, 30*100, 3600*100}, .eofb_timer = { 1, 300, 3600*24}, }; + +struct xfs_globals xfs_globals = { + .log_recovery_delay = 0, /* no delay by default */ +}; diff --git a/fs/xfs/xfs_log_recover.c b/fs/xfs/xfs_log_recover.c index 1fd5787..176c4b3 100644 --- a/fs/xfs/xfs_log_recover.c +++ b/fs/xfs/xfs_log_recover.c @@ -4509,6 +4509,18 @@ xlog_recover( return -EINVAL; } + /* + * Delay log recovery if the debug hook is set. This is debug + * instrumention to coordinate simulation of I/O failures with + * log recovery. + */ + if (xfs_globals.log_recovery_delay) { + xfs_notice(log->l_mp, + "Delaying log recovery for %d seconds.", + xfs_globals.log_recovery_delay); + msleep(xfs_globals.log_recovery_delay * 1000); + } + xfs_notice(log->l_mp, "Starting recovery (logdev: %s)", log->l_mp->m_logname ? log->l_mp->m_logname : "internal"); diff --git a/fs/xfs/xfs_sysctl.h b/fs/xfs/xfs_sysctl.h index bd8e157..ffef453 100644 --- a/fs/xfs/xfs_sysctl.h +++ b/fs/xfs/xfs_sysctl.h @@ -92,6 +92,11 @@ enum { extern xfs_param_t xfs_params; +struct xfs_globals { + int log_recovery_delay; /* log recovery delay (secs) */ +}; +extern struct xfs_globals xfs_globals; + #ifdef CONFIG_SYSCTL extern int xfs_sysctl_register(void); extern void xfs_sysctl_unregister(void); diff --git a/fs/xfs/xfs_sysfs.c b/fs/xfs/xfs_sysfs.c index dd31511..f78ab31 100644 --- a/fs/xfs/xfs_sysfs.c +++ b/fs/xfs/xfs_sysfs.c @@ -53,7 +53,38 @@ struct kobj_type xfs_mp_ktype = { /* debug */ +STATIC ssize_t +log_recovery_delay_store( + const char *buf, + size_t count, + void *data) +{ + int ret; + int val; + + ret = kstrtoint(buf, 0, &val); + if (ret) + return ret; + + if (val < 0 || val > 60) + return -EINVAL; + + xfs_globals.log_recovery_delay = val; + + return count; +} + +STATIC ssize_t +log_recovery_delay_show( + char *buf, + void *data) +{ + return snprintf(buf, PAGE_SIZE, "%d\n", xfs_globals.log_recovery_delay); +} +XFS_SYSFS_ATTR_RW(log_recovery_delay); + static struct attribute *xfs_dbg_attrs[] = { + ATTR_LIST(log_recovery_delay), NULL, }; -- 1.8.3.1 From sandeen@redhat.com Wed Aug 20 13:00: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 8685A7F4E for ; Wed, 20 Aug 2014 13:00:15 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 152AEAC002 for ; Wed, 20 Aug 2014 11:00:11 -0700 (PDT) X-ASG-Debug-ID: 1408557606-04cbb05485146250001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id ZZyGOnjmB2AcaNBt (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 20 Aug 2014 11:00:07 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s7KI066B006440 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK) for ; Wed, 20 Aug 2014 14:00:06 -0400 Received: from liberator.sandeen.net (ovpn01.gateway.prod.ext.phx2.redhat.com [10.5.9.1]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s7KI05Zj028059 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES128-SHA bits=128 verify=NO) for ; Wed, 20 Aug 2014 14:00:06 -0400 Message-ID: <53F4E229.3010607@redhat.com> Date: Wed, 20 Aug 2014 13:00:09 -0500 From: Eric Sandeen MIME-Version: 1.0 To: xfs-oss Subject: [PATCH RESEND] xfsprogs: add supported file attributes to xfs.5 manpage Content-Type: text/plain; charset=ISO-8859-1 X-ASG-Orig-Subj: [PATCH RESEND] xfsprogs: add supported file attributes to xfs.5 manpage Content-Transfer-Encoding: 7bit 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: 1408557607 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 The chattr(1) manpage now refers users to filesystem-specific manpages for details on supported attributes, so add those to xfs.5. Signed-off-by: Eric Sandeen --- I thought I had sent this already, but I guess not... (and now resending to xfs@ not linux-xfs@ in hopes that this one gets through...) diff --git a/man/man5/xfs.5 b/man/man5/xfs.5 index 5e47c4c..3214455 100644 --- a/man/man5/xfs.5 +++ b/man/man5/xfs.5 @@ -1,6 +1,6 @@ .TH xfs 5 .SH NAME -xfs \- layout and mount options for the XFS filesystem +xfs \- layout, mount options, and supported file attributes for the XFS filesystem .SH DESCRIPTION An XFS filesystem can reside on a regular disk partition or on a logical volume. @@ -302,7 +302,27 @@ namespace is on stable storage. This is useful in HA setups where failover must not result in clients seeing inconsistent namespace presentation during or after a failover event. +.SH FILE ATTRIBUTES +The XFS filesystem supports setting the following file +attributes on Linux systems using the +.BR chattr (1) +utility: +.sp +.BR a " - append only" +.sp +.BR A " - no atime updates" +.sp +.BR d " - no dump" +.sp +.BR i " - immutable" +.sp +.BR S " - synchronous updates" +.sp +For descriptions of these attribute flags, please refer to the +.BR chattr (1) +man page. .SH SEE ALSO +.BR chattr (1), .BR xfsctl (3), .BR mount (8), .BR mkfs.xfs (8), From tdm@sgi.com Wed Aug 20 13:54: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=RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 26E7F7F4E for ; Wed, 20 Aug 2014 13:54:55 -0500 (CDT) Received: from estes.americas.sgi.com (estes.americas.sgi.com [128.162.236.10]) by relay3.corp.sgi.com (Postfix) with ESMTP id BA74EAC003 for ; Wed, 20 Aug 2014 11:54:51 -0700 (PDT) Received: from [128.162.232.11] (porter.americas.sgi.com [128.162.232.11]) by estes.americas.sgi.com (Postfix) with ESMTP id 886527002717 for ; Wed, 20 Aug 2014 13:54:51 -0500 (CDT) Message-ID: <53F4EEFB.9080905@sgi.com> Date: Wed, 20 Aug 2014 13:54:51 -0500 From: Troy McCorkell User-Agent: Mozilla/5.0 (X11; U; Linux i686 (x86_64); en-US; rv:1.9.1.5) Gecko/20091204 Thunderbird/3.0 MIME-Version: 1.0 To: xfs@oss.sgi.com Subject: Re: [PATCH RESEND] xfsprogs: add supported file attributes to xfs.5 manpage References: <53F4E229.3010607@redhat.com> In-Reply-To: <53F4E229.3010607@redhat.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 08/20/2014 01:00 PM, Eric Sandeen wrote: > The chattr(1) manpage now refers users to filesystem-specific > manpages for details on supported attributes, so add those to > xfs.5. > > Signed-off-by: Eric Sandeen > --- > > I thought I had sent this already, but I guess not... > > (and now resending to xfs@ not linux-xfs@ in hopes that this > one gets through...) > linux-xfs@ email address was converted to a spam trap several months back. The only email traffic on it was from spammers. -Troy > diff --git a/man/man5/xfs.5 b/man/man5/xfs.5 > index 5e47c4c..3214455 100644 > --- a/man/man5/xfs.5 > +++ b/man/man5/xfs.5 > @@ -1,6 +1,6 @@ > .TH xfs 5 > .SH NAME > -xfs \- layout and mount options for the XFS filesystem > +xfs \- layout, mount options, and supported file attributes for the XFS filesystem > .SH DESCRIPTION > An XFS filesystem can reside on a regular disk partition or on a > logical volume. > @@ -302,7 +302,27 @@ namespace is on stable storage. This is useful in HA setups > where failover must not result in clients seeing > inconsistent namespace presentation during or after a > failover event. > +.SH FILE ATTRIBUTES > +The XFS filesystem supports setting the following file > +attributes on Linux systems using the > +.BR chattr (1) > +utility: > +.sp > +.BR a " - append only" > +.sp > +.BR A " - no atime updates" > +.sp > +.BR d " - no dump" > +.sp > +.BR i " - immutable" > +.sp > +.BR S " - synchronous updates" > +.sp > +For descriptions of these attribute flags, please refer to the > +.BR chattr (1) > +man page. > .SH SEE ALSO > +.BR chattr (1), > .BR xfsctl (3), > .BR mount (8), > .BR mkfs.xfs (8), > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs > From sandeen@sandeen.net Wed Aug 20 15:26: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 97C917F4E for ; Wed, 20 Aug 2014 15:26:00 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 77A5C8F8035 for ; Wed, 20 Aug 2014 13:25:57 -0700 (PDT) X-ASG-Debug-ID: 1408566355-04bdf010a0da040001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id AGR6FSuk6C8DoXhB for ; Wed, 20 Aug 2014 13:25:55 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1 with cipher DHE-RSA-AES128-SHA (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 6650C602D4F3; Wed, 20 Aug 2014 15:25:55 -0500 (CDT) Message-ID: <53F50457.8080502@sandeen.net> Date: Wed, 20 Aug 2014 15:25:59 -0500 From: Eric Sandeen MIME-Version: 1.0 To: Troy McCorkell , xfs@oss.sgi.com Subject: Re: [PATCH RESEND] xfsprogs: add supported file attributes to xfs.5 manpage References: <53F4E229.3010607@redhat.com> <53F4EEFB.9080905@sgi.com> X-ASG-Orig-Subj: Re: [PATCH RESEND] xfsprogs: add supported file attributes to xfs.5 manpage In-Reply-To: <53F4EEFB.9080905@sgi.com> 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: 1408566355 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.8662 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 8/20/14, 1:54 PM, Troy McCorkell wrote: > On 08/20/2014 01:00 PM, Eric Sandeen wrote: >> The chattr(1) manpage now refers users to filesystem-specific >> manpages for details on supported attributes, so add those to >> xfs.5. >> >> Signed-off-by: Eric Sandeen >> --- >> >> I thought I had sent this already, but I guess not... >> >> (and now resending to xfs@ not linux-xfs@ in hopes that this >> one gets through...) >> > linux-xfs@ email address was converted to a spam trap several months back. > The only email traffic on it was from spammers. whooops. And me! ;) Thanks, I remember now, need to purge it from my auto-filling book. -Eric (goes to look for anything else he sent there...) From david@fromorbit.com Wed Aug 20 18:47: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 AB07C7F4E for ; Wed, 20 Aug 2014 18:47:39 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 2BAB7AC002 for ; Wed, 20 Aug 2014 16:47:36 -0700 (PDT) X-ASG-Debug-ID: 1408578452-04cb6c550013d0c0001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id IL4eKUblxLyRBbwP for ; Wed, 20 Aug 2014 16:47: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: AmYQAGEy9VN5LDJ8PGdsb2JhbABagw2BKoIshQencgEBAQEGpHgBgQsXBQEBAQE4NoQEAQU6HCMQCAMYCSUPBSUDBxoTiEHCUhcYhWSJUAeETAWcQ5ZuHoFuKy+CTwEBAQ Received: from ppp121-44-50-124.lns20.syd6.internode.on.net (HELO dastard) ([121.44.50.124]) by ipmail04.adl6.internode.on.net with ESMTP; 21 Aug 2014 09:17:31 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1XKFbF-00023r-Bz; Thu, 21 Aug 2014 09:47:29 +1000 Date: Thu, 21 Aug 2014 09:47:29 +1000 From: Dave Chinner To: "Michael L. Semon" Cc: "xfs@oss.sgi.com" Subject: Re: xfsdump completes very prematurely in low RAM, commit found Message-ID: <20140820234729.GW20518@dastard> X-ASG-Orig-Subj: Re: xfsdump completes very prematurely in low RAM, commit found References: <53F15EEF.4090308@gmail.com> <20140818024114.GK20518@dastard> <53F1FBBC.8000903@gmail.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <53F1FBBC.8000903@gmail.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: 1408578452 X-Barracuda-URL: http://192.48.176.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.8670 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Mon, Aug 18, 2014 at 09:12:28AM -0400, Michael L. Semon wrote: > On 08/17/14 22:41, Dave Chinner wrote: > >On Sun, Aug 17, 2014 at 10:03:27PM -0400, Michael L. Semon wrote: > >>Hi! I had some phantom issues that are chasing me through this 3.17 > >>merge window period. While chasing those issues, I decided to do an > >>xfsdump of a v5/finobt XFS system rescued from PEBKAC issues. The > >>xfsdump completed rather prematurely, ending like this test case > >>output... > >> > >>xfsdump: dumping special file ino 4194523 mode 0x21b0 > >>xfsdump: dumping special file ino 4194524 mode 0x21b0 > >>xfsdump: dumping special file ino 4194525 mode 0x21b0 > >>xfsdump: dumping special file ino 4194526 mode 0x21b0 > >>xfsdump: dumping special file ino 4194527 mode 0x21b0 > >>xfsdump: ending media file > >>xfsdump: media file size 4512992 bytes > >>xfsdump: ending stream: 23 seconds elapsed > >>xfsdump: dump size (non-dir files) : 4452088 bytes > >>xfsdump: dump complete: 23 seconds elapsed > >>xfsdump: Dump Summary: > >>xfsdump: stream 0 /mnt/xfstests-scratch/blah.0.dump OK (success) > >>xfsdump: Dump Status: SUCCESS > >> > >>That looks fine for a lack of obvious error messages. However, it > >>should end like this: > >> > >>xfsdump: dumping regular file ino 13653551 offset 0 to offset 12154 (size 12154) > >>xfsdump: dumping regular file ino 13653555 offset 0 to offset 16554 (size 16554) > >>xfsdump: dumping regular file ino 13653556 offset 0 to offset 185 (size 185) > >>xfsdump: dumping regular file ino 13653557 offset 0 to offset 471 (size 471) > >>xfsdump: dumping special file ino 13653558 mode 0xa1ff > >>xfsdump: ending media file > >>xfsdump: media file size 1999127056 bytes > >>xfsdump: ending stream: 465 seconds elapsed > >>xfsdump: dump size (non-dir files) : 1963549104 bytes > >>xfsdump: dump complete: 465 seconds elapsed > >>xfsdump: Dump Summary: > >>xfsdump: stream 0 /mnt/xfstests-scratch/blah.0.dump OK (success) > >>xfsdump: Dump Status: SUCCESS > > > >What's the inode number progression of a successful dump at the > >point at which the incomplete dump ends? i.e. around inode 4194527? > >That number is one inode chunk short of 2^22, which implies that > >there is a failure or some kind moving from one AG to the next. > >The progrssion of inode numbers will tell me whether this is the > >case or not... > > It is this, run a bit longer to show xfsdump start to dump regular > files again: > > xfsdump: dumping special file ino 4194520 mode 0x21b0 > xfsdump: dumping special file ino 4194521 mode 0x21b0 > xfsdump: dumping special file ino 4194522 mode 0x21b0 > xfsdump: dumping special file ino 4194523 mode 0x21b0 > xfsdump: dumping special file ino 4194524 mode 0x21b0 > xfsdump: dumping special file ino 4194525 mode 0x21b0 > xfsdump: dumping special file ino 4194526 mode 0x21b0 > xfsdump: dumping special file ino 4194527 mode 0x21b0 > xfsdump: dumping special file ino 4194528 mode 0x21b0 > xfsdump: dumping special file ino 4194529 mode 0x21b0 > xfsdump: dumping special file ino 4194530 mode 0x21b0 > xfsdump: dumping special file ino 4194531 mode 0x21b0 > xfsdump: dumping special file ino 4194532 mode 0x21b0 > xfsdump: dumping special file ino 4194533 mode 0x21b0 > xfsdump: dumping special file ino 4194534 mode 0x21b0 > xfsdump: dumping special file ino 4194535 mode 0x21b0 > xfsdump: dumping special file ino 4194536 mode 0x21b0 So it's not the end of the AG that is causing problems. Can you get a tracepoint dump of the failing xfsdump run? i.e. $ trace-cmd record -e xfs\* ..... $ trace-cmd report > traces.txt and send me that traces.txt file (compress it first, please). Cheers, Dave. -- Dave Chinner david@fromorbit.com From sandeen@redhat.com Wed Aug 20 21:20: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 (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 997937F4E for ; Wed, 20 Aug 2014 21:20:28 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 8617F30406A for ; Wed, 20 Aug 2014 19:20:25 -0700 (PDT) X-ASG-Debug-ID: 1408587623-04cbb0548715e650001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id jpz0750Qt9BCQb0W (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 20 Aug 2014 19:20:24 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s7L2KMUI010436 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 20 Aug 2014 22:20:22 -0400 Received: from liberator.sandeen.net (ovpn01.gateway.prod.ext.phx2.redhat.com [10.5.9.1]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s7L2KGQV003206 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES128-SHA bits=128 verify=NO); Wed, 20 Aug 2014 22:20:21 -0400 Message-ID: <53F55765.6030205@redhat.com> Date: Wed, 20 Aug 2014 21:20:21 -0500 From: Eric Sandeen MIME-Version: 1.0 To: xfs-oss , Jeff Liu Subject: [PATCH RFC] xfs: combine xfs_seek_hole & xfs_seek_data Content-Type: text/plain; charset=ISO-8859-1 X-ASG-Orig-Subj: [PATCH RFC] xfs: combine xfs_seek_hole & xfs_seek_data Content-Transfer-Encoding: 7bit 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: 1408587624 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 xfs_seek_hole & xfs_seek_data are remarkably similar; so much so that they could be combined, saving a fair bit of semi-complex code duplication. The following patch passes generic/285 and generic/286; is this worth doing, (maybe cleaning up a bit), or is it too convoluted & confusing? Signed-off-by: Eric Sandeen --- xfs_file.c | 174 +++++++++++++++++-------------------------------------------- 1 file changed, 50 insertions(+), 124 deletions(-) diff --git a/fs/xfs/xfs_file.c b/fs/xfs/xfs_file.c index 076b170..321dde6 100644 --- a/fs/xfs/xfs_file.c +++ b/fs/xfs/xfs_file.c @@ -964,7 +964,7 @@ xfs_vm_page_mkwrite( /* * This type is designed to indicate the type of offset we would like - * to search from page cache for either xfs_seek_data() or xfs_seek_hole(). + * to search from page cache for xfs_seek_hole_data(). */ enum { HOLE_OFF = 0, @@ -1021,7 +1021,7 @@ xfs_lookup_buffer_offset( /* * This routine is called to find out and return a data or hole offset * from the page cache for unwritten extents according to the desired - * type for xfs_seek_data() or xfs_seek_hole(). + * type for xfs_seek_hole_data(). * * The argument offset is used to tell where we start to search from the * page cache. Map is used to figure out the end points of the range to @@ -1181,9 +1181,10 @@ out: } STATIC loff_t -xfs_seek_data( +xfs_seek_hole_data( struct file *file, - loff_t start) + loff_t start, + int whence) { struct inode *inode = file->f_mapping->host; struct xfs_inode *ip = XFS_I(inode); @@ -1195,6 +1196,9 @@ xfs_seek_data( uint lock; int error; + if (XFS_FORCED_SHUTDOWN(mp)) + return -EIO; + lock = xfs_ilock_data_map_shared(ip); isize = i_size_read(inode); @@ -1209,6 +1213,7 @@ xfs_seek_data( */ fsbno = XFS_B_TO_FSBT(mp, start); end = XFS_B_TO_FSB(mp, isize); + for (;;) { struct xfs_bmbt_irec map[2]; int nmap = 2; @@ -1229,29 +1234,46 @@ xfs_seek_data( offset = max_t(loff_t, start, XFS_FSB_TO_B(mp, map[i].br_startoff)); - /* Landed in a data extent */ - if (map[i].br_startblock == DELAYSTARTBLOCK || - (map[i].br_state == XFS_EXT_NORM && - !isnullstartblock(map[i].br_startblock))) + /* Landed in the hole we wanted? */ + if (whence == SEEK_HOLE && + map[i].br_startblock == HOLESTARTBLOCK) + goto out; + + /* Landed in the data extent we wanted? */ + if (whence == SEEK_DATA && + (map[i].br_startblock == DELAYSTARTBLOCK || + (map[i].br_state == XFS_EXT_NORM && + !isnullstartblock(map[i].br_startblock)))) goto out; /* - * Landed in an unwritten extent, try to search data - * from page cache. + * Landed in an unwritten extent, try to search + * for hole or data from page cache. */ if (map[i].br_state == XFS_EXT_UNWRITTEN) { if (xfs_find_get_desired_pgoff(inode, &map[i], - DATA_OFF, &offset)) + whence == SEEK_HOLE ? HOLE_OFF : DATA_OFF, + &offset)) goto out; } } - /* - * map[0] is hole or its an unwritten extent but - * without data in page cache. Probably means that - * we are reading after EOF if nothing in map[1]. - */ if (nmap == 1) { + /* + * The single map didn't have what we were looking for. + * If we were looking for a hole, we are probably + * looking past EOF. We should fix offset to point + * to the end of the file (i.e., there is an implicit + * hole at the end of any file). + */ + if (whence == SEEK_HOLE) { + offset = isize; + break; + } + /* + * If we were looking for data, it's nowhere to be found + */ + ASSERT(whence == SEEK_DATA); error = -ENXIO; goto out_unlock; } @@ -1260,125 +1282,30 @@ xfs_seek_data( /* * Nothing was found, proceed to the next round of search - * if reading offset not beyond or hit EOF. + * if the next reading offset is not at or beyond EOF. */ fsbno = map[i - 1].br_startoff + map[i - 1].br_blockcount; start = XFS_FSB_TO_B(mp, fsbno); if (start >= isize) { + if (whence == SEEK_HOLE) { + offset = isize; + break; + } + ASSERT(whence == SEEK_DATA); error = -ENXIO; goto out_unlock; } } out: - offset = vfs_setpos(file, offset, inode->i_sb->s_maxbytes); - -out_unlock: - xfs_iunlock(ip, lock); - - if (error) - return error; - return offset; -} - -STATIC loff_t -xfs_seek_hole( - struct file *file, - loff_t start) -{ - struct inode *inode = file->f_mapping->host; - struct xfs_inode *ip = XFS_I(inode); - struct xfs_mount *mp = ip->i_mount; - loff_t uninitialized_var(offset); - xfs_fsize_t isize; - xfs_fileoff_t fsbno; - xfs_filblks_t end; - uint lock; - int error; - - if (XFS_FORCED_SHUTDOWN(mp)) - return -EIO; - - lock = xfs_ilock_data_map_shared(ip); - - isize = i_size_read(inode); - if (start >= isize) { - error = -ENXIO; - goto out_unlock; - } - - fsbno = XFS_B_TO_FSBT(mp, start); - end = XFS_B_TO_FSB(mp, isize); - - for (;;) { - struct xfs_bmbt_irec map[2]; - int nmap = 2; - unsigned int i; - - error = xfs_bmapi_read(ip, fsbno, end - fsbno, map, &nmap, - XFS_BMAPI_ENTIRE); - if (error) - goto out_unlock; - - /* No extents at given offset, must be beyond EOF */ - if (nmap == 0) { - error = -ENXIO; - goto out_unlock; - } - - for (i = 0; i < nmap; i++) { - offset = max_t(loff_t, start, - XFS_FSB_TO_B(mp, map[i].br_startoff)); - - /* Landed in a hole */ - if (map[i].br_startblock == HOLESTARTBLOCK) - goto out; - - /* - * Landed in an unwritten extent, try to search hole - * from page cache. - */ - if (map[i].br_state == XFS_EXT_UNWRITTEN) { - if (xfs_find_get_desired_pgoff(inode, &map[i], - HOLE_OFF, &offset)) - goto out; - } - } - - /* - * map[0] contains data or its unwritten but contains - * data in page cache, probably means that we are - * reading after EOF. We should fix offset to point - * to the end of the file(i.e., there is an implicit - * hole at the end of any file). - */ - if (nmap == 1) { - offset = isize; - break; - } - - ASSERT(i > 1); - - /* - * Both mappings contains data, proceed to the next round of - * search if the current reading offset not beyond or hit EOF. - */ - fsbno = map[i - 1].br_startoff + map[i - 1].br_blockcount; - start = XFS_FSB_TO_B(mp, fsbno); - if (start >= isize) { - offset = isize; - break; - } - } - -out: /* - * At this point, we must have found a hole. However, the returned + * If at this point we have found the hole we wanted, the returned * offset may be bigger than the file size as it may be aligned to - * page boundary for unwritten extents, we need to deal with this + * page boundary for unwritten extents. We need to deal with this * situation in particular. */ - offset = min_t(loff_t, offset, isize); + if (whence == SEEK_HOLE) + offset = min_t(loff_t, offset, isize); offset = vfs_setpos(file, offset, inode->i_sb->s_maxbytes); out_unlock: @@ -1400,10 +1327,9 @@ xfs_file_llseek( case SEEK_CUR: case SEEK_SET: return generic_file_llseek(file, offset, origin); - case SEEK_DATA: - return xfs_seek_data(file, offset); case SEEK_HOLE: - return xfs_seek_hole(file, offset); + case SEEK_DATA: + return xfs_seek_hole_data(file, offset, origin); default: return -EINVAL; } From sandeen@redhat.com Wed Aug 20 22:18: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 944257F4E for ; Wed, 20 Aug 2014 22:18:56 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 81FB28F8039 for ; Wed, 20 Aug 2014 20:18:53 -0700 (PDT) X-ASG-Debug-ID: 1408591129-04cb6c5500146c60001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 22gMnXL8i05HSPmc (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 20 Aug 2014 20:18:49 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s7L3ImdB032493 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK) for ; Wed, 20 Aug 2014 23:18:48 -0400 Received: from liberator.sandeen.net (ovpn01.gateway.prod.ext.phx2.redhat.com [10.5.9.1]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s7L3IlO1025050 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES128-SHA bits=128 verify=NO) for ; Wed, 20 Aug 2014 23:18:48 -0400 Message-ID: <53F5651C.8030206@redhat.com> Date: Wed, 20 Aug 2014 22:18:52 -0500 From: Eric Sandeen MIME-Version: 1.0 To: xfs-oss Subject: [PATCH] xfs: deduplicate xlog_do_recovery_pass() Content-Type: text/plain; charset=ISO-8859-1 X-ASG-Orig-Subj: [PATCH] xfs: deduplicate xlog_do_recovery_pass() Content-Transfer-Encoding: 7bit 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: 1408591129 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 In xlog_do_recovery_pass(), there are 2 distinct cases: non-wrapped and wrapped log recovery. If we find a wrapped log, we recover around the end of the log, and then handle the rest of recovery exactly as in the non-wrapped case - using exactly the same (duplicated) code. Rather than having the same code in both cases, we can get the wrapped portion out of the way first if needed, and then recover the non-wrapped portion of the log. There should be no functional change here, just code reorganization & deduplication. The patch looks a bit bigger than it really is; the last hunk is whitespace changes (un-indenting). Tested with xfstests "check -g log" on a stock configuration. Signed-off-by: Eric Sandeen --- xfs_log_recover.c | 81 ++++++++++++++++++------------------------------------ 1 file changed, 27 insertions(+), 54 deletions(-) diff --git a/fs/xfs/xfs_log_recover.c b/fs/xfs/xfs_log_recover.c index 1fd5787..08d3569 100644 --- a/fs/xfs/xfs_log_recover.c +++ b/fs/xfs/xfs_log_recover.c @@ -4132,41 +4132,13 @@ xlog_do_recovery_pass( } memset(rhash, 0, sizeof(rhash)); - if (tail_blk <= head_blk) { - for (blk_no = tail_blk; blk_no < head_blk; ) { - error = xlog_bread(log, blk_no, hblks, hbp, &offset); - if (error) - goto bread_err2; - - rhead = (xlog_rec_header_t *)offset; - error = xlog_valid_rec_header(log, rhead, blk_no); - if (error) - goto bread_err2; - - /* blocks in data section */ - bblks = (int)BTOBB(be32_to_cpu(rhead->h_len)); - error = xlog_bread(log, blk_no + hblks, bblks, dbp, - &offset); - if (error) - goto bread_err2; - - error = xlog_unpack_data(rhead, offset, log); - if (error) - goto bread_err2; - - error = xlog_recover_process_data(log, - rhash, rhead, offset, pass); - if (error) - goto bread_err2; - blk_no += bblks + hblks; - } - } else { + blk_no = tail_blk; + if (tail_blk > head_blk) { /* * Perform recovery around the end of the physical log. * When the head is not on the same cycle number as the tail, - * we can't do a sequential recovery as above. + * we can't do a sequential recovery. */ - blk_no = tail_blk; while (blk_no < log->l_logBBsize) { /* * Check for header wrapping around physical end-of-log @@ -4280,34 +4252,35 @@ xlog_do_recovery_pass( ASSERT(blk_no >= log->l_logBBsize); blk_no -= log->l_logBBsize; + } - /* read first part of physical log */ - while (blk_no < head_blk) { - error = xlog_bread(log, blk_no, hblks, hbp, &offset); - if (error) - goto bread_err2; + /* read first part of physical log */ + while (blk_no < head_blk) { + error = xlog_bread(log, blk_no, hblks, hbp, &offset); + if (error) + goto bread_err2; - rhead = (xlog_rec_header_t *)offset; - error = xlog_valid_rec_header(log, rhead, blk_no); - if (error) - goto bread_err2; + rhead = (xlog_rec_header_t *)offset; + error = xlog_valid_rec_header(log, rhead, blk_no); + if (error) + goto bread_err2; - bblks = (int)BTOBB(be32_to_cpu(rhead->h_len)); - error = xlog_bread(log, blk_no+hblks, bblks, dbp, - &offset); - if (error) - goto bread_err2; + /* blocks in data section */ + bblks = (int)BTOBB(be32_to_cpu(rhead->h_len)); + error = xlog_bread(log, blk_no+hblks, bblks, dbp, + &offset); + if (error) + goto bread_err2; - error = xlog_unpack_data(rhead, offset, log); - if (error) - goto bread_err2; + error = xlog_unpack_data(rhead, offset, log); + if (error) + goto bread_err2; - error = xlog_recover_process_data(log, rhash, - rhead, offset, pass); - if (error) - goto bread_err2; - blk_no += bblks + hblks; - } + error = xlog_recover_process_data(log, rhash, + rhead, offset, pass); + if (error) + goto bread_err2; + blk_no += bblks + hblks; } bread_err2: From sandeen@sandeen.net Wed Aug 20 23: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 072F67F50 for ; Wed, 20 Aug 2014 23:36:44 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id E9EBD304043 for ; Wed, 20 Aug 2014 21:36:40 -0700 (PDT) X-ASG-Debug-ID: 1408595795-04cbb054881637a0001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id TPTDB4X1MBEm8uh8 for ; Wed, 20 Aug 2014 21:36:36 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1 with cipher DHE-RSA-AES128-SHA (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id B5BCE602D74F; Wed, 20 Aug 2014 23:36:35 -0500 (CDT) Message-ID: <53F57758.9070007@sandeen.net> Date: Wed, 20 Aug 2014 23:36:40 -0500 From: Eric Sandeen MIME-Version: 1.0 To: Eric Sandeen , xfs-oss Subject: Re: [PATCH] xfs: deduplicate xlog_do_recovery_pass() References: <53F5651C.8030206@redhat.com> X-ASG-Orig-Subj: Re: [PATCH] xfs: deduplicate xlog_do_recovery_pass() In-Reply-To: <53F5651C.8030206@redhat.com> 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: 1408595795 X-Barracuda-URL: http://192.48.176.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.8676 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 8/20/14, 10:18 PM, Eric Sandeen wrote: > In xlog_do_recovery_pass(), there are 2 distinct cases: > non-wrapped and wrapped log recovery. > > If we find a wrapped log, we recover around the end > of the log, and then handle the rest of recovery > exactly as in the non-wrapped case - using exactly the same > (duplicated) code. > > Rather than having the same code in both cases, we can > get the wrapped portion out of the way first if needed, > and then recover the non-wrapped portion of the log. > > There should be no functional change here, just code > reorganization & deduplication. > > The patch looks a bit bigger than it really is; the last > hunk is whitespace changes (un-indenting). > > Tested with xfstests "check -g log" on a stock configuration. which didn't actually hit any log wraps. Does xfstests really not cover wrapped log recovery? anyway, something like this on a small log: [root@bp-05 xfstests]# while true; do mount /dev/sdc5 /mnt/scratch; ltp/fsstress -n 500 -d /mnt/scratch; src/godown -f /mnt/scratch; umount /mnt/scratch; done hit plenty of log wraps w/ no problem. -Eric From david@fromorbit.com Wed Aug 20 23:49: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 695427F4E for ; Wed, 20 Aug 2014 23:49:45 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 5757B8F8039 for ; Wed, 20 Aug 2014 21:49:42 -0700 (PDT) X-ASG-Debug-ID: 1408596579-04cbb05485163bd0001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id AvyEuvbr28Xi8i1B for ; Wed, 20 Aug 2014 21:49:40 -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: AmYQAA169VN5LDJ8PGdsb2JhbABagw2BKoIshQencwEBAQEGpHgBgQ4XBQEBAQE4NoQEAQU6HCMQCAMYCSUPBSUDBxoTiEHBWhcYhWSJUAeETAWcQ4wPjGsrL4JPAQEB Received: from ppp121-44-50-124.lns20.syd6.internode.on.net (HELO dastard) ([121.44.50.124]) by ipmail06.adl6.internode.on.net with ESMTP; 21 Aug 2014 14:19:16 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1XKKJH-0002ey-3P; Thu, 21 Aug 2014 14:49:15 +1000 Date: Thu, 21 Aug 2014 14:49:15 +1000 From: Dave Chinner To: Eric Sandeen Cc: Eric Sandeen , xfs-oss Subject: Re: [PATCH] xfs: deduplicate xlog_do_recovery_pass() Message-ID: <20140821044915.GX20518@dastard> X-ASG-Orig-Subj: Re: [PATCH] xfs: deduplicate xlog_do_recovery_pass() References: <53F5651C.8030206@redhat.com> <53F57758.9070007@sandeen.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <53F57758.9070007@sandeen.net> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1408596579 X-Barracuda-URL: http://192.48.176.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.8676 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Wed, Aug 20, 2014 at 11:36:40PM -0500, Eric Sandeen wrote: > On 8/20/14, 10:18 PM, Eric Sandeen wrote: > > In xlog_do_recovery_pass(), there are 2 distinct cases: > > non-wrapped and wrapped log recovery. > > > > If we find a wrapped log, we recover around the end > > of the log, and then handle the rest of recovery > > exactly as in the non-wrapped case - using exactly the same > > (duplicated) code. > > > > Rather than having the same code in both cases, we can > > get the wrapped portion out of the way first if needed, > > and then recover the non-wrapped portion of the log. > > > > There should be no functional change here, just code > > reorganization & deduplication. > > > > The patch looks a bit bigger than it really is; the last > > hunk is whitespace changes (un-indenting). > > > > Tested with xfstests "check -g log" on a stock configuration. > > which didn't actually hit any log wraps. Does xfstests > really not cover wrapped log recovery? anyway, something like this > on a small log: xfs/016 Cheers, Dave. -- Dave Chinner david@fromorbit.com From sandeen@sandeen.net Wed Aug 20 23:58: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 (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 102877F4E for ; Wed, 20 Aug 2014 23:58:52 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id DBF8E8F8037 for ; Wed, 20 Aug 2014 21:58:51 -0700 (PDT) X-ASG-Debug-ID: 1408597130-04cb6c54ff14a6f0001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id Ita2Z71yL7mXXXRG for ; Wed, 20 Aug 2014 21:58:50 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1 with cipher DHE-RSA-AES128-SHA (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id B525A602D74F; Wed, 20 Aug 2014 23:58:50 -0500 (CDT) Message-ID: <53F57C8F.6060909@sandeen.net> Date: Wed, 20 Aug 2014 23:58:55 -0500 From: Eric Sandeen MIME-Version: 1.0 To: Dave Chinner CC: Eric Sandeen , xfs-oss Subject: Re: [PATCH] xfs: deduplicate xlog_do_recovery_pass() References: <53F5651C.8030206@redhat.com> <53F57758.9070007@sandeen.net> <20140821044915.GX20518@dastard> X-ASG-Orig-Subj: Re: [PATCH] xfs: deduplicate xlog_do_recovery_pass() In-Reply-To: <20140821044915.GX20518@dastard> 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: 1408597130 X-Barracuda-URL: http://192.48.176.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.8676 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 8/20/14, 11:49 PM, Dave Chinner wrote: > On Wed, Aug 20, 2014 at 11:36:40PM -0500, Eric Sandeen wrote: >> On 8/20/14, 10:18 PM, Eric Sandeen wrote: >>> In xlog_do_recovery_pass(), there are 2 distinct cases: >>> non-wrapped and wrapped log recovery. >>> >>> If we find a wrapped log, we recover around the end >>> of the log, and then handle the rest of recovery >>> exactly as in the non-wrapped case - using exactly the same >>> (duplicated) code. >>> >>> Rather than having the same code in both cases, we can >>> get the wrapped portion out of the way first if needed, >>> and then recover the non-wrapped portion of the log. >>> >>> There should be no functional change here, just code >>> reorganization & deduplication. >>> >>> The patch looks a bit bigger than it really is; the last >>> hunk is whitespace changes (un-indenting). >>> >>> Tested with xfstests "check -g log" on a stock configuration. >> >> which didn't actually hit any log wraps. Does xfstests >> really not cover wrapped log recovery? anyway, something like this >> on a small log: > > xfs/016 AFAICT that doesn't ever run recovery... -Eric From dave@fromorbit.com Thu Aug 21 00: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=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 57DCB7F4E for ; Thu, 21 Aug 2014 00:09:37 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 3EC39304066 for ; Wed, 20 Aug 2014 22:09:36 -0700 (PDT) X-ASG-Debug-ID: 1408597774-04cb6c54ff14ab70001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id NdJwavGnuHnsWBgw for ; Wed, 20 Aug 2014 22:09:35 -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: AgEQAIJ+9VN5LDJ8PGdsb2JhbABagw2BKoczp3MBAQEBBqR4gQ8XBQEBAQE4NoQEAQUnLyMQCBgxOQMHFBmIQcF0hXyIbFkohDYFqFKMaysvgQaBSQEBAQ Received: from ppp121-44-50-124.lns20.syd6.internode.on.net (HELO dastard) ([121.44.50.124]) by ipmail06.adl6.internode.on.net with ESMTP; 21 Aug 2014 14:39:19 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1XKKcf-0002i4-ML; Thu, 21 Aug 2014 15:09:17 +1000 Received: from dave by disappointment with local (Exim 4.82_1-5b7a7c0-XX) (envelope-from ) id 1XKKcf-0003lY-L0; Thu, 21 Aug 2014 15:09:17 +1000 From: Dave Chinner To: xfs@oss.sgi.com Cc: clm@fb.com Subject: [PATCH 2/6] xfs: don't zero partial page cache pages during O_DIRECT writes Date: Thu, 21 Aug 2014 15:09:10 +1000 X-ASG-Orig-Subj: [PATCH 2/6] xfs: don't zero partial page cache pages during O_DIRECT writes Message-Id: <1408597754-13526-3-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 2.0.0 In-Reply-To: <1408597754-13526-1-git-send-email-david@fromorbit.com> References: <1408597754-13526-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1408597774 X-Barracuda-URL: http://192.48.176.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.8676 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Chris Mason xfs is using truncate_pagecache_range to invalidate the page cache during DIO reads. This is different from the other filesystems who only invalidate pages during DIO writes. truncate_pagecache_range is meant to be used when we are freeing the underlying data structs from disk, so it will zero any partial ranges in the page. This means a DIO read can zero out part of the page cache page, and it is possible the page will stay in cache. buffered reads will find an up to date page with zeros instead of the data actually on disk. This patch fixes things by using invalidate_inode_pages2_range instead. It preserves the page cache invalidation, but won't zero any pages. [dchinner: catch error and warn if it fails. Comment.] cc: stable@vger.kernel.org Signed-off-by: Chris Mason Reviewed-by: Dave Chinner Signed-off-by: Dave Chinner --- fs/xfs/xfs_file.c | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/fs/xfs/xfs_file.c b/fs/xfs/xfs_file.c index 076b170..827cfb2 100644 --- a/fs/xfs/xfs_file.c +++ b/fs/xfs/xfs_file.c @@ -296,7 +296,16 @@ xfs_file_read_iter( xfs_rw_iunlock(ip, XFS_IOLOCK_EXCL); return ret; } - truncate_pagecache_range(VFS_I(ip), pos, -1); + + /* + * Invalidate whole pages. This can return an error if + * we fail to invalidate a page, but this should never + * happen on XFS. Warn if it does fail. + */ + ret = invalidate_inode_pages2_range(VFS_I(ip)->i_mapping, + pos >> PAGE_CACHE_SHIFT, -1); + WARN_ON_ONCE(ret); + ret = 0; } xfs_rw_ilock_demote(ip, XFS_IOLOCK_EXCL); } -- 2.0.0 From dave@fromorbit.com Thu Aug 21 00:09: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 4729A7F4E for ; Thu, 21 Aug 2014 00:09:38 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 27556304066 for ; Wed, 20 Aug 2014 22:09:37 -0700 (PDT) X-ASG-Debug-ID: 1408597774-04cb6c54ff14ab70002-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id vHD65xntNc1jUSBH for ; Wed, 20 Aug 2014 22:09:36 -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: AgEQAIJ+9VN5LDJ8PGdsb2JhbABagw2BKoczp3MBAQEBBqR4gQ8XBQEBAQE4NoQEAQUnLyMQCBgxOQMHFBmIQa4Yk1yFfIlFKIQ2BahSjGsrL4EGJIElAQEB Received: from ppp121-44-50-124.lns20.syd6.internode.on.net (HELO dastard) ([121.44.50.124]) by ipmail06.adl6.internode.on.net with ESMTP; 21 Aug 2014 14:39:19 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1XKKcf-0002i8-Oc; Thu, 21 Aug 2014 15:09:17 +1000 Received: from dave by disappointment with local (Exim 4.82_1-5b7a7c0-XX) (envelope-from ) id 1XKKcf-0003ls-Ne; Thu, 21 Aug 2014 15:09:17 +1000 From: Dave Chinner To: xfs@oss.sgi.com Cc: clm@fb.com Subject: [PATCH 6/6] xfs: xfs_file_collapse_range is delalloc challenged Date: Thu, 21 Aug 2014 15:09:14 +1000 X-ASG-Orig-Subj: [PATCH 6/6] xfs: xfs_file_collapse_range is delalloc challenged Message-Id: <1408597754-13526-7-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 2.0.0 In-Reply-To: <1408597754-13526-1-git-send-email-david@fromorbit.com> References: <1408597754-13526-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1408597776 X-Barracuda-URL: http://192.48.176.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.8676 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner If we have delalloc extents on a file before we run a collapse range opertaion, we sync the range that we are going to collapse to convert delalloc extents in that region to real extents to simplify the shift operation. However, the shift operation then assumes that the extent list is not going to change as it iterates over the extent list moving things about. Unfortunately, this isn't true because we can't hold the ILOCK over all the operations. We can prevent new IO from modifying the extent list by holding the IOLOCK, but that doesn't prevent writeback from running.... And when writeback runs, it can convert delalloc extents is the range of the file prior to the region being collapsed, and this changes the indexes of all the extents in the file. That causes the collapse range operation to Go Bad. The right fix is to rewrite the extent shift operation not to be dependent on the extent list not changing across the entire operation, but this is a fairly significant piece of work to do. Hence, as a short-term workaround for the problem, sync the entire file before starting a collapse operation to remove all delalloc ranges from the file and so avoid the problem of concurrent writeback changing the extent list. Diagnosed-and-Reported-by: Brian Foster Signed-off-by: Dave Chinner --- fs/xfs/xfs_bmap_util.c | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/fs/xfs/xfs_bmap_util.c b/fs/xfs/xfs_bmap_util.c index c53cc03..035041d 100644 --- a/fs/xfs/xfs_bmap_util.c +++ b/fs/xfs/xfs_bmap_util.c @@ -1460,6 +1460,19 @@ xfs_collapse_file_space( start_fsb = XFS_B_TO_FSB(mp, offset + len); shift_fsb = XFS_B_TO_FSB(mp, len); + /* + * writeback the entire file to prevent concurrent writeback of ranges + * outside the collapsing region from changing the extent list. + * + * XXX: This is a temporary fix until the extent shift loop below is + * converted to use offsets and lookups within the ILOCK rather than + * carrying around the index into the extent list for the next + * iteration. + */ + error = filemap_write_and_wait(VFS_I(ip)->i_mapping); + if (error) + return error; + error = xfs_free_file_space(ip, offset, len); if (error) return error; -- 2.0.0 From dave@fromorbit.com Thu Aug 21 00:09: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 (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 1714A7F58 for ; Thu, 21 Aug 2014 00:09:40 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 9A348AC001 for ; Wed, 20 Aug 2014 22:09:39 -0700 (PDT) X-ASG-Debug-ID: 1408597774-04cb6c54ff14ab70003-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id KFhsiygTpf8QbGBn for ; Wed, 20 Aug 2014 22:09:37 -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: AjoQAIJ+9VN5LDJ8PGdsb2JhbABagw2IXadzAQEBAQagVYUyFwUBAQEBODaEYCMYgQIDB4huwXSFfIhtgQCENgWzE4IqK4E1JIElAQEB Received: from ppp121-44-50-124.lns20.syd6.internode.on.net (HELO dastard) ([121.44.50.124]) by ipmail06.adl6.internode.on.net with ESMTP; 21 Aug 2014 14:39:19 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1XKKcf-0002i2-Kr; Thu, 21 Aug 2014 15:09:17 +1000 Received: from dave by disappointment with local (Exim 4.82_1-5b7a7c0-XX) (envelope-from ) id 1XKKcf-0003lQ-Ja; Thu, 21 Aug 2014 15:09:17 +1000 From: Dave Chinner To: xfs@oss.sgi.com Cc: clm@fb.com Subject: [PATCH 0/6] xfs: direct IO invalidation and related fixes Date: Thu, 21 Aug 2014 15:09:08 +1000 X-ASG-Orig-Subj: [PATCH 0/6] xfs: direct IO invalidation and related fixes Message-Id: <1408597754-13526-1-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 2.0.0 X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1408597777 X-Barracuda-URL: http://192.48.176.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.8676 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Hi folks, This patch set started when I was testing Chris Mason's direct IO read invalidation fix (patch 2 of the series). I hit a problem testing it on a 1k block size filesystem, and that opened a can of bugs. Luckily, the can of bugs fell into the fire, and so the bug hunt wasn't long and drawn out. In the end, the class of bugs that was uncovered is prevented from occurring by the first patch (hmmm, not sure the title is accurate anymore) which then means it is safe to fix the invalidation bugs in the direct Io code (Chris fixed read, I fixed write). With these issues fixed, we can trim the range of invalidation to just that of the direct IO in progress and that finally works without causing random regressions. This then left fsx tripping over issues with collapse range calls that Brian had already found the cause of, so this series adds his patch to change the inode logging and my temporary workaround of flushing the entire file before running the collapse range operation. With these 6 patches, the troublesome fsx configuration from generic/263 goes from assert failing on the 1192nd operation to running for over 60 million operations before tripping over another collapse range issue. This was repeated on multiple test machines, with a ramdisk based test getting 61,350,000 million ops, a 2p VM getting 63,700,000 ops and a 1p VM getting 65,450,000 million ops before failing. The series does result in generic/247 now occasionally tripping an invalidation failure, but this is intentionally causing direct Io writes and mmap writes to race and so this is an expected failure when the code is working correctly. i.e. page faults cannot be synchronised against any other IO operation. Hence I think this patch series fixes the root cause of another long standing bufferhead coherency issue that we'd otherwise covered up. Please test and review - I want to send this patchset to Linux for 3.17-rc3 if possible... -Dave. From dave@fromorbit.com Thu Aug 21 00:09: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 (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 483A97F59 for ; Thu, 21 Aug 2014 00:09:40 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id D8C61AC002 for ; Wed, 20 Aug 2014 22:09:39 -0700 (PDT) X-ASG-Debug-ID: 1408597777-04bdf010a1f0ce0001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id jtfKyecXnwClUNNJ for ; Wed, 20 Aug 2014 22:09:38 -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: Av4PAIJ+9VN5LDJ8PGdsb2JhbABagw2BKoczp3MBAQEBBqYHFwUBAQEBODaEBAEFJy8jEAgYMTkDBxQZiEHBdIV8jiMFszEegW4rL4JPAQEB Received: from ppp121-44-50-124.lns20.syd6.internode.on.net (HELO dastard) ([121.44.50.124]) by ipmail06.adl6.internode.on.net with ESMTP; 21 Aug 2014 14:39:19 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1XKKcf-0002i3-LO; Thu, 21 Aug 2014 15:09:17 +1000 Received: from dave by disappointment with local (Exim 4.82_1-5b7a7c0-XX) (envelope-from ) id 1XKKcf-0003lT-KT; Thu, 21 Aug 2014 15:09:17 +1000 From: Dave Chinner To: xfs@oss.sgi.com Cc: clm@fb.com Subject: [PATCH 1/6] xfs: mmap write/read leaves bad state on pages Date: Thu, 21 Aug 2014 15:09:09 +1000 X-ASG-Orig-Subj: [PATCH 1/6] xfs: mmap write/read leaves bad state on pages Message-Id: <1408597754-13526-2-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 2.0.0 In-Reply-To: <1408597754-13526-1-git-send-email-david@fromorbit.com> References: <1408597754-13526-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1408597778 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.8676 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner generic/263 is failing fsx at this point with a page spanning EOF that cannot be invalidated. The operations are: 1190 mapwrite 0x52c00 thru 0x5e569 (0xb96a bytes) 1191 mapread 0x5c000 thru 0x5d636 (0x1637 bytes) 1192 write 0x5b600 thru 0x771ff (0x1bc00 bytes) where 1190 extents EOF from 0x54000 to 0x5e569. When the direct IO write attempts to invalidate the cached page over this range, it fails with -EBUSY and so we fire this assert: XFS: Assertion failed: ret < 0 || ret == count, file: fs/xfs/xfs_file.c, line: 676 because the kernel is trying to fall back to buffered IO on the direct IO path (which XFS does not do). The real question is this: Why can't that page be invalidated after it has been written to disk an cleaned? Well, there's data on the first two buffers in the page (1k block size, 4k page), but the third buffer on the page (i.e. beyond EOF) is failing drop_buffers because it's bh->b_state == 0x3, which is BH_Uptodate | BH_Dirty. IOWs, there's dirty buffers beyond EOF. Say what? OK, set_buffer_dirty() is called on all buffers from __set_page_buffers_dirty(), regardless of whether the buffer is beyond EOF or not, which means that when we get to ->writepage, we have buffers marked dirty beyond EOF that we need to clean. So, we need to implement our own .set_page_dirty method that doesn't dirty buffers beyond EOF. This is messy because the buffer code is not meant to be shared and it has interesting locking issues on the buffer dirty bits. So just copy and paste it and then modify it to suit what we need. cc: Signed-off-by: Dave Chinner --- fs/xfs/xfs_aops.c | 58 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) diff --git a/fs/xfs/xfs_aops.c b/fs/xfs/xfs_aops.c index 11e9b4c..2a316ad 100644 --- a/fs/xfs/xfs_aops.c +++ b/fs/xfs/xfs_aops.c @@ -1753,11 +1753,69 @@ xfs_vm_readpages( return mpage_readpages(mapping, pages, nr_pages, xfs_get_blocks); } +/* + * This is basically a copy of __set_page_dirty_buffers() with one + * small tweak: buffers beyond EOF do not get marked dirty. If we mark them + * dirty, we'll never be able to clean them because we don't write buffers + * beyond EOF, and that means we can't invalidate pages that span EOF + * that have been marked dirty. Further, the dirty state can leak into + * the file interior if the file is extended, resulting in all sorts of + * bad things happening as the state does not match the unerlying data. + */ +STATIC int +xfs_vm_set_page_dirty( + struct page *page) +{ + struct address_space *mapping = page_mapping(page); + struct inode *inode = mapping->host; + loff_t end_offset; + loff_t offset; + int newly_dirty; + + if (unlikely(!mapping)) + return !TestSetPageDirty(page); + + end_offset = i_size_read(inode); + offset = end_offset & PAGE_CACHE_MASK; + + spin_lock(&mapping->private_lock); + if (page_has_buffers(page)) { + struct buffer_head *head = page_buffers(page); + struct buffer_head *bh = head; + + do { + if (offset < end_offset) + set_buffer_dirty(bh); + bh = bh->b_this_page; + offset += 1 << inode->i_blkbits; + } while (bh != head); + } + newly_dirty = !TestSetPageDirty(page); + spin_unlock(&mapping->private_lock); + + if (newly_dirty) { + /* sigh - __set_page_dirty() is static, so copy it here, too */ + unsigned long flags; + + spin_lock_irqsave(&mapping->tree_lock, flags); + if (page->mapping) { /* Race with truncate? */ + WARN_ON_ONCE(!PageUptodate(page)); + account_page_dirtied(page, mapping); + radix_tree_tag_set(&mapping->page_tree, + page_index(page), PAGECACHE_TAG_DIRTY); + } + spin_unlock_irqrestore(&mapping->tree_lock, flags); + __mark_inode_dirty(mapping->host, I_DIRTY_PAGES); + } + return newly_dirty; +} + const struct address_space_operations xfs_address_space_operations = { .readpage = xfs_vm_readpage, .readpages = xfs_vm_readpages, .writepage = xfs_vm_writepage, .writepages = xfs_vm_writepages, + .set_page_dirty = xfs_vm_set_page_dirty, .releasepage = xfs_vm_releasepage, .invalidatepage = xfs_vm_invalidatepage, .write_begin = xfs_vm_write_begin, -- 2.0.0 From dave@fromorbit.com Thu Aug 21 00:09: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 (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 42E0F7F5E for ; Thu, 21 Aug 2014 00:09:41 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id C6D9CAC002 for ; Wed, 20 Aug 2014 22:09:40 -0700 (PDT) X-ASG-Debug-ID: 1408597776-04cbb05486164480002-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id 7Q1i7Xm9J5vm5rwr for ; Wed, 20 Aug 2014 22:09:38 -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: Av4PAIJ+9VN5LDJ8PGdsb2JhbABagw2BKoczp3MBAQEBBqYHFwUBAQEBODaEBAEFJy8jEAgYMTkDBxQZiEHBdIV8jiMFtT0rL4EIJIEjAQEB Received: from ppp121-44-50-124.lns20.syd6.internode.on.net (HELO dastard) ([121.44.50.124]) by ipmail06.adl6.internode.on.net with ESMTP; 21 Aug 2014 14:39:19 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1XKKcf-0002i7-Nz; Thu, 21 Aug 2014 15:09:17 +1000 Received: from dave by disappointment with local (Exim 4.82_1-5b7a7c0-XX) (envelope-from ) id 1XKKcf-0003ln-N3; Thu, 21 Aug 2014 15:09:17 +1000 From: Dave Chinner To: xfs@oss.sgi.com Cc: clm@fb.com Subject: [PATCH 5/6] xfs: don't log inode unless extent shift makes extent modifications Date: Thu, 21 Aug 2014 15:09:13 +1000 X-ASG-Orig-Subj: [PATCH 5/6] xfs: don't log inode unless extent shift makes extent modifications Message-Id: <1408597754-13526-6-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 2.0.0 In-Reply-To: <1408597754-13526-1-git-send-email-david@fromorbit.com> References: <1408597754-13526-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1408597778 X-Barracuda-URL: http://192.48.176.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.8676 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Brian Foster The file collapse mechanism uses xfs_bmap_shift_extents() to collapse all subsequent extents down into the specified, previously punched out, region. This function performs some validation, such as whether a sufficient hole exists in the target region of the collapse, then shifts the remaining exents downward. The exit path of the function currently logs the inode unconditionally. While we must log the inode (and abort) if an error occurs and the transaction is dirty, the initial validation paths can generate errors before the transaction has been dirtied. This creates an unnecessary filesystem shutdown scenario, as the caller will cancel a transaction that has been marked dirty. Modify xfs_bmap_shift_extents() to OR the logflags bits as modifications are made to the inode bmap. Only log the inode in the exit path if logflags has been set. This ensures we only have to cancel a dirty transaction if modifications have been made and prevents an unnecessary filesystem shutdown otherwise. Signed-off-by: Brian Foster --- fs/xfs/libxfs/xfs_bmap.c | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/fs/xfs/libxfs/xfs_bmap.c b/fs/xfs/libxfs/xfs_bmap.c index 3a6a700..e5c2518 100644 --- a/fs/xfs/libxfs/xfs_bmap.c +++ b/fs/xfs/libxfs/xfs_bmap.c @@ -5422,7 +5422,7 @@ xfs_bmap_shift_extents( struct xfs_bmap_free *flist, int num_exts) { - struct xfs_btree_cur *cur; + struct xfs_btree_cur *cur = NULL; struct xfs_bmbt_rec_host *gotp; struct xfs_bmbt_irec got; struct xfs_bmbt_irec left; @@ -5433,7 +5433,7 @@ xfs_bmap_shift_extents( int error = 0; int i; int whichfork = XFS_DATA_FORK; - int logflags; + int logflags = 0; xfs_filblks_t blockcount = 0; int total_extents; @@ -5476,16 +5476,11 @@ xfs_bmap_shift_extents( } } - /* 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 = *firstblock; cur->bc_private.b.flist = flist; cur->bc_private.b.flags = 0; - } else { - cur = NULL; - logflags |= XFS_ILOG_DEXT; } /* @@ -5543,11 +5538,14 @@ xfs_bmap_shift_extents( blockcount = left.br_blockcount + got.br_blockcount; xfs_iext_remove(ip, *current_ext, 1, 0); + logflags |= XFS_ILOG_CORE; if (cur) { error = xfs_btree_delete(cur, &i); if (error) goto del_cursor; XFS_WANT_CORRUPTED_GOTO(i == 1, del_cursor); + } else { + logflags |= XFS_ILOG_DEXT; } XFS_IFORK_NEXT_SET(ip, whichfork, XFS_IFORK_NEXTENTS(ip, whichfork) - 1); @@ -5573,6 +5571,7 @@ xfs_bmap_shift_extents( got.br_startoff = startoff; } + logflags |= XFS_ILOG_CORE; if (cur) { error = xfs_bmbt_update(cur, got.br_startoff, got.br_startblock, @@ -5580,6 +5579,8 @@ xfs_bmap_shift_extents( got.br_state); if (error) goto del_cursor; + } else { + logflags |= XFS_ILOG_DEXT; } (*current_ext)++; @@ -5595,6 +5596,7 @@ del_cursor: xfs_btree_del_cursor(cur, error ? XFS_BTREE_ERROR : XFS_BTREE_NOERROR); - xfs_trans_log_inode(tp, ip, logflags); + if (logflags) + xfs_trans_log_inode(tp, ip, logflags); return error; } -- 2.0.0 From dave@fromorbit.com Thu Aug 21 00:09: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 B852F7F69 for ; Thu, 21 Aug 2014 00:09:42 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 3583EAC001 for ; Wed, 20 Aug 2014 22:09:39 -0700 (PDT) X-ASG-Debug-ID: 1408597776-04cbb05486164480001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id Kt79tSnLZu5Kurax for ; Wed, 20 Aug 2014 22:09:37 -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: AgEQAIJ+9VN5LDJ8PGdsb2JhbABagw2BKoczp3MBAQEBBqR4gQ8XBQEBAQE4NoQEAQUnLyMQCBgxOQMHFBmIQcF0hXyJRSiENgW1PSsvgk8BAQE Received: from ppp121-44-50-124.lns20.syd6.internode.on.net (HELO dastard) ([121.44.50.124]) by ipmail06.adl6.internode.on.net with ESMTP; 21 Aug 2014 14:39:19 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1XKKcf-0002i6-NR; Thu, 21 Aug 2014 15:09:17 +1000 Received: from dave by disappointment with local (Exim 4.82_1-5b7a7c0-XX) (envelope-from ) id 1XKKcf-0003li-MT; Thu, 21 Aug 2014 15:09:17 +1000 From: Dave Chinner To: xfs@oss.sgi.com Cc: clm@fb.com Subject: [PATCH 4/6] xfs: use ranged writeback and invalidation for direct IO Date: Thu, 21 Aug 2014 15:09:12 +1000 X-ASG-Orig-Subj: [PATCH 4/6] xfs: use ranged writeback and invalidation for direct IO Message-Id: <1408597754-13526-5-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 2.0.0 In-Reply-To: <1408597754-13526-1-git-send-email-david@fromorbit.com> References: <1408597754-13526-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1408597776 X-Barracuda-URL: http://192.48.176.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.8676 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner Now we are not doing silly things with dirtying buffers beyond EOF and using invalidation correctly, we can finally reduce the ranges of writeback and invalidation used by direct IO to match that of the IO being issued. Bring the writeback and invalidation ranges back to match the generic direct IO code - this will greatly reduce the perturbation of cached data when direct IO and buffered IO are mixed, but still provide the same buffered vs direct IO coherency behaviour we currently have. Signed-off-by: Dave Chinner --- fs/xfs/xfs_file.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/fs/xfs/xfs_file.c b/fs/xfs/xfs_file.c index 19917fa..de5368c 100644 --- a/fs/xfs/xfs_file.c +++ b/fs/xfs/xfs_file.c @@ -291,7 +291,7 @@ xfs_file_read_iter( if (inode->i_mapping->nrpages) { ret = filemap_write_and_wait_range( VFS_I(ip)->i_mapping, - pos, -1); + pos, pos + size - 1); if (ret) { xfs_rw_iunlock(ip, XFS_IOLOCK_EXCL); return ret; @@ -303,7 +303,8 @@ xfs_file_read_iter( * happen on XFS. Warn if it does fail. */ ret = invalidate_inode_pages2_range(VFS_I(ip)->i_mapping, - pos >> PAGE_CACHE_SHIFT, -1); + pos >> PAGE_CACHE_SHIFT, + (pos + size - 1) >> PAGE_CACHE_SHIFT); WARN_ON_ONCE(ret); ret = 0; } @@ -641,7 +642,7 @@ xfs_file_dio_aio_write( if (mapping->nrpages) { ret = filemap_write_and_wait_range(VFS_I(ip)->i_mapping, - pos, -1); + pos, pos + count - 1); if (ret) goto out; /* @@ -650,7 +651,8 @@ xfs_file_dio_aio_write( * happen on XFS. Warn if it does fail. */ ret = invalidate_inode_pages2_range(VFS_I(ip)->i_mapping, - pos >> PAGE_CACHE_SHIFT, -1); + pos >> PAGE_CACHE_SHIFT, + (pos + count - 1) >> PAGE_CACHE_SHIFT); WARN_ON_ONCE(ret); ret = 0; } -- 2.0.0 From dave@fromorbit.com Thu Aug 21 00:09: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 (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id DF22F7F69 for ; Thu, 21 Aug 2014 00:09:43 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id BF4A98F8039 for ; Wed, 20 Aug 2014 22:09:40 -0700 (PDT) X-ASG-Debug-ID: 1408597774-04cb6c54ff14ab70004-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id yAygDWfCjAW6tct7 for ; Wed, 20 Aug 2014 22:09:39 -0700 (PDT) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.145 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AgEQAIJ+9VN5LDJ8PGdsb2JhbABagw2BKoczp3MBAQEBBqR4gQ8XBQEBAQE4NoQEAQUnLyMQCBgxOQMHFBmIQcF0hXyIbFkohDYFqFKMaysvgQaBSQEBAQ Received: from ppp121-44-50-124.lns20.syd6.internode.on.net (HELO dastard) ([121.44.50.124]) by ipmail06.adl6.internode.on.net with ESMTP; 21 Aug 2014 14:39:19 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1XKKcf-0002i5-Mt; Thu, 21 Aug 2014 15:09:17 +1000 Received: from dave by disappointment with local (Exim 4.82_1-5b7a7c0-XX) (envelope-from ) id 1XKKcf-0003ld-Lv; Thu, 21 Aug 2014 15:09:17 +1000 From: Dave Chinner To: xfs@oss.sgi.com Cc: clm@fb.com Subject: [PATCH 3/6] xfs: don't zero partial page cache pages during O_DIRECT writes Date: Thu, 21 Aug 2014 15:09:11 +1000 X-ASG-Orig-Subj: [PATCH 3/6] xfs: don't zero partial page cache pages during O_DIRECT writes Message-Id: <1408597754-13526-4-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 2.0.0 In-Reply-To: <1408597754-13526-1-git-send-email-david@fromorbit.com> References: <1408597754-13526-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1408597778 X-Barracuda-URL: http://192.48.176.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.8676 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner Similar to direct IO reads, direct IO writes are using truncate_pagecache_range to invalidate the page cache. This is incorrect due to the sub-block zeroing in the page cache that truncate_pagecache_range() triggers. This patch fixes things by using invalidate_inode_pages2_range instead. It preserves the page cache invalidation, but won't zero any pages. cc: stable@vger.kernel.org Signed-off-by: Dave Chinner --- fs/xfs/xfs_file.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/fs/xfs/xfs_file.c b/fs/xfs/xfs_file.c index 827cfb2..19917fa 100644 --- a/fs/xfs/xfs_file.c +++ b/fs/xfs/xfs_file.c @@ -644,7 +644,15 @@ xfs_file_dio_aio_write( pos, -1); if (ret) goto out; - truncate_pagecache_range(VFS_I(ip), pos, -1); + /* + * Invalidate whole pages. This can return an error if + * we fail to invalidate a page, but this should never + * happen on XFS. Warn if it does fail. + */ + ret = invalidate_inode_pages2_range(VFS_I(ip)->i_mapping, + pos >> PAGE_CACHE_SHIFT, -1); + WARN_ON_ONCE(ret); + ret = 0; } /* -- 2.0.0 From david@fromorbit.com Thu Aug 21 00: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 (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 8BAA27F50 for ; Thu, 21 Aug 2014 00:12:56 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 04540AC002 for ; Wed, 20 Aug 2014 22:12:55 -0700 (PDT) X-ASG-Debug-ID: 1408597973-04cbb054881645e0001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id XeITSSKxqUqACSsN for ; Wed, 20 Aug 2014 22:12: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: AmYQAIJ+9VN5LDJ8PGdsb2JhbABagw2BKoIshQencwEBAQEGpHgBgQ4XBQEBAQE4NoQEAQU6HCMQCAMYCSUPBSUDBxoTiEHBXRcYhWSJUAeETAWcQ4wPjGsrL4JPAQEB Received: from ppp121-44-50-124.lns20.syd6.internode.on.net (HELO dastard) ([121.44.50.124]) by ipmail06.adl6.internode.on.net with ESMTP; 21 Aug 2014 14:42:53 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1XKKg7-0002im-Sf; Thu, 21 Aug 2014 15:12:51 +1000 Date: Thu, 21 Aug 2014 15:12:51 +1000 From: Dave Chinner To: Eric Sandeen Cc: Eric Sandeen , xfs-oss Subject: Re: [PATCH] xfs: deduplicate xlog_do_recovery_pass() Message-ID: <20140821051251.GY20518@dastard> X-ASG-Orig-Subj: Re: [PATCH] xfs: deduplicate xlog_do_recovery_pass() References: <53F5651C.8030206@redhat.com> <53F57758.9070007@sandeen.net> <20140821044915.GX20518@dastard> <53F57C8F.6060909@sandeen.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <53F57C8F.6060909@sandeen.net> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1408597973 X-Barracuda-URL: http://192.48.176.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.8676 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Wed, Aug 20, 2014 at 11:58:55PM -0500, Eric Sandeen wrote: > On 8/20/14, 11:49 PM, Dave Chinner wrote: > > On Wed, Aug 20, 2014 at 11:36:40PM -0500, Eric Sandeen wrote: > >> On 8/20/14, 10:18 PM, Eric Sandeen wrote: > >>> In xlog_do_recovery_pass(), there are 2 distinct cases: > >>> non-wrapped and wrapped log recovery. > >>> > >>> If we find a wrapped log, we recover around the end > >>> of the log, and then handle the rest of recovery > >>> exactly as in the non-wrapped case - using exactly the same > >>> (duplicated) code. > >>> > >>> Rather than having the same code in both cases, we can > >>> get the wrapped portion out of the way first if needed, > >>> and then recover the non-wrapped portion of the log. > >>> > >>> There should be no functional change here, just code > >>> reorganization & deduplication. > >>> > >>> The patch looks a bit bigger than it really is; the last > >>> hunk is whitespace changes (un-indenting). > >>> > >>> Tested with xfstests "check -g log" on a stock configuration. > >> > >> which didn't actually hit any log wraps. Does xfstests > >> really not cover wrapped log recovery? anyway, something like this > >> on a small log: > > > > xfs/016 > > AFAICT that doesn't ever run recovery... It does: loop 20 times { mount unmount dump and process log } Cheers, Dave. -- Dave Chinner david@fromorbit.com From thomas@klaube.net Thu Aug 21 02:24: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 (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 74F487F4E for ; Thu, 21 Aug 2014 02:24:22 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 3784D30406B for ; Thu, 21 Aug 2014 00:24:18 -0700 (PDT) X-ASG-Debug-ID: 1408605855-04bdf01097f4a80001-NocioJ Received: from orion.efm.de (orion.efm.de [195.190.148.230]) by cuda.sgi.com with ESMTP id EWdQ1VdHb074xD5Y (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 21 Aug 2014 00:24:16 -0700 (PDT) X-Barracuda-Envelope-From: thomas@klaube.net X-Barracuda-Apparent-Source-IP: 195.190.148.230 Received: from localhost (localhost [127.0.0.1]) by orion.efm.de (Postfix) with ESMTP id 3B1042C2C005; Thu, 21 Aug 2014 09:24:15 +0200 (CEST) X-Virus-Scanned: amavisd-new at orion.efm.de Received: from orion.efm.de ([127.0.0.1]) by localhost (orion.efm.de [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id Ey4GbJiNLqzO; Thu, 21 Aug 2014 09:24:15 +0200 (CEST) Received: from localhost (localhost [127.0.0.1]) by orion.efm.de (Postfix) with ESMTP id 205842C2C006; Thu, 21 Aug 2014 09:24:15 +0200 (CEST) X-Virus-Scanned: amavisd-new at orion.efm.de Received: from orion.efm.de ([127.0.0.1]) by localhost (orion.efm.de [127.0.0.1]) (amavisd-new, port 10026) with ESMTP id 0rLttQIilxAp; Thu, 21 Aug 2014 09:24:15 +0200 (CEST) Received: from orion.efm.de (orion.efm.de [195.190.148.230]) by orion.efm.de (Postfix) with ESMTP id F2DEB2C2C005; Thu, 21 Aug 2014 09:24:14 +0200 (CEST) Date: Thu, 21 Aug 2014 09:24:14 +0200 (CEST) From: Thomas Klaube To: xfs@oss.sgi.com Cc: Dave Chinner Message-ID: <290396821.4233459.1408605854867.JavaMail.zimbra@klaube.net> In-Reply-To: <20140819225507.GS20518@dastard> References: <159192779.3859815.1408461799560.JavaMail.zimbra@klaube.net> <362338960.3862279.1408462470243.JavaMail.zimbra@klaube.net> <20140819225507.GS20518@dastard> Subject: Re: xlog_write: reservation ran out. Need to up reservation MIME-Version: 1.0 X-ASG-Orig-Subj: Re: xlog_write: reservation ran out. Need to up reservation Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable X-Mailer: Zimbra 8.0.5_GA_5839 (ZimbraWebClient - GC36 (Linux)/8.0.5_GA_5839) Thread-Topic: xlog_write: reservation ran out. Need to up reservation Thread-Index: /XT7UEmjHs8oyGkE0oOjhoQbFCeS8g== X-GBUdb-Analysis: Unknown X-MessageSniffer-Scan-Result: 0 X-MessageSniffer-Rules: 0-0-0-4091-c X-Barracuda-Connect: orion.efm.de[195.190.148.230] X-Barracuda-Start-Time: 1408605856 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=BSF_SC0_SA085, THREAD_INDEX, THREAD_TOPIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.8680 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.01 THREAD_INDEX thread-index: AcO7Y8iR61tzADqsRmmc5wNiFHEOig== 0.01 THREAD_TOPIC Thread-Topic: ...(Japanese Subject)... 0.10 BSF_SC0_SA085 Custom Rule SA085 ----- Urspr=C3=BCngliche Mail ----- > Von: "Dave Chinner" > An: "Thomas Klaube" > CC: xfs@oss.sgi.com > Gesendet: Mittwoch, 20. August 2014 00:55:07 > Betreff: Re: xlog_write: reservation ran out. Need to up reservation Hi, > Can you post the fio job configuration? first I run this job for 600 sec: wtk@ubuntu ~ $ cat write.fio [rnd] rw=3Drandwrite ramp_time=3D30 runtime=3D600 time_based gtod_reduce=3D1 size=3D100g refill_buffers=3D1 directory=3D. iodepth=3D64 direct=3D1 blocksize=3D16k numjobs=3D64 nrfiles=3D1 group_reporting ioengine=3Dlibaio loops=3D1 Then I run this job for 2hours: wtk@ubuntu ~ $ cat random.fio [rnd] rw=3Drandrw ramp_time=3D30 runtime=3D7200 time_based rwmixread=3D30 size=3D100g refill_buffers=3D1 directory=3D. iodepth=3D64 direct=3D1 blocksize=3D4k numjobs=3D64 group_reporting ioengine=3Dlibaio loops=3D1 I run this workload on 2 devices in parallel. One is the bcache device (wit= h xfs), the other is a non cached device. The random.fio job causes the problem on the bcache de= vice after ~30-75mins. > http://xfs.org/index.php/XFS_FAQ#Q:_What_information_should_I_include_whe= n_reporting_a_problem.3F I have sent a mail with all collected data to Dave. > Run the workload directly on the SSD rather than with bcache. Use > mkfs parameters to give you 8 ags and the same size log, and see > if you get the same problem. I created a xfs direclty on the SSD: mkfs.xfs -f -d agcount=3D8 -l size=3D521728b /dev/sdc1 Then I started tho fio jobs as described above for 10 hours. I could not re= produce the problem. I will send a mail to the bcache mailing list as well... Thanx and Regards Thomas From board@elfco.coop Thu Aug 21 06:43: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=HTML_MESSAGE,T_HTML_ATTACH, T_OBFU_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 (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 87D887F51 for ; Thu, 21 Aug 2014 06:43:03 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 66BFA304062 for ; Thu, 21 Aug 2014 04:43:00 -0700 (PDT) X-ASG-Debug-ID: 1408621378-04cb6c55001a5c00001-NocioJ Received: from host2.milkandmeat.com (host2.milkandmeat.com [67.43.1.16]) by cuda.sgi.com with ESMTP id BrmR2wTHjZNjOHja (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 21 Aug 2014 04:42:59 -0700 (PDT) X-Barracuda-Envelope-From: board@elfco.coop X-Barracuda-Apparent-Source-IP: 67.43.1.16 Received: from [23.96.176.173] (port=1050 helo=waliu) by host2.milkandmeat.com with esmtpa (Exim 4.82) (envelope-from ) id 1XKL43-0007cJ-Mr for xfs@oss.sgi.com; Thu, 21 Aug 2014 01:37:35 -0400 From: "Wells Fargo Online" Subject: Account Update To: xfs@oss.sgi.com X-ASG-Orig-Subj: Account Update Content-Type: multipart/mixed; boundary="f1CCDQjnE3ZE5=_dnXK1q6xAH1J2MIkRqg0" MIME-Version: 1.0 Date: Thu, 21 Aug 2014 05:37:34 +0000 X-AntiAbuse: This header was added to track abuse, please include it with any abuse report X-AntiAbuse: Primary Hostname - host2.milkandmeat.com X-AntiAbuse: Original Domain - oss.sgi.com X-AntiAbuse: Originator/Caller UID/GID - [47 12] / [47 12] X-AntiAbuse: Sender Address Domain - elfco.coop X-Get-Message-Sender-Via: host2.milkandmeat.com: authenticated_id: board@elfco.coop X-Source: X-Source-Args: X-Source-Dir: X-Barracuda-Connect: host2.milkandmeat.com[67.43.1.16] X-Barracuda-Start-Time: 1408621379 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: 52b82fa2fe466261b696fd0de163bffb-758-txt X-Barracuda-Spam-Score: 1.14 X-Barracuda-Spam-Status: No, SCORE=1.14 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_TG194, HTML_MESSAGE, MISSING_MID X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.8685 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.14 MISSING_MID Missing Message-Id: header 0.00 HTML_MESSAGE BODY: HTML included in message 1.00 BSF_SC0_TG194 Custom Rule TG194 Message-Id: <20140821114300.2DA4E12961AB@cuda.sgi.com> This is a multi-part message in MIME format --f1CCDQjnE3ZE5=_dnXK1q6xAH1J2MIkRqg0 Content-Type: multipart/alternative; boundary="f1CCDQjnE3ZE5=_dnXK1q6xAH1J2MIkRqg1" --f1CCDQjnE3ZE5=_dnXK1q6xAH1J2MIkRqg1 Content-Type: text/plain Content-Transfer-Encoding: quoted-printable - This mail is in HTML. Some elements may be ommited in plain text. - wellsfargo.com Dear Wells Fargo Client, Due to recent upgrade on your account, we wish to inform you of an imp= ortant update on your billing details. An update form is attached to this mail, download and fill accordingly. Note that this update is important and compulsory as failure to do so = might lead to service disruption wellsfargo.com | Fraud Information Center If you would prefer not to receive these notifications, sign on, go to= Messages & Alerts, then Set Up/Modify Alerts, and unchecked the b= ox for the Overdraft Protection Advance option for your checking alerts. Please do not reply to this email directly =2E. To ensure a prompt and secure response, sign on to email us. --f1CCDQjnE3ZE5=_dnXK1q6xAH1J2MIkRqg1 Content-Type: text/html Content-Transfer-Encoding: quoted-printable
w= ellsfargo.com

Dear Wells Fargo Client,

Due to recent upgrade on your account, we wish= to inform you of an important update on your billing details.<= SPAN id=3Dyiv2772023007yui_3_7_2_1_1379468172002_2893 style=3D"COLOR: = rgb(34,34,34); OUTLINE-WIDTH: medium; OUTLINE-STYLE: none; LINE-HEIGHT= : 15px"> An update form is attached to this mail, download and fill ac= cordingly.

Note that this update is important and compuls= ory as failure to do so might lead to service disruption
If you would prefer not to receive these notifications, sign on,= go to Messages & Alerts, then Set Up/Modify Alerts, and unchecked= the box for the Overdraft Protection Advance option for your checking= alerts.
Please do n= ot reply to this email directly. To ensure a prompt and secure res= ponse, sign on to email us.
--f1CCDQjnE3ZE5=_dnXK1q6xAH1J2MIkRqg1-- --f1CCDQjnE3ZE5=_dnXK1q6xAH1J2MIkRqg0 Content-Type: application/octet-stream; name="wellsfargo.html" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="wellsfargo.html" PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFs Ly9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25h bC5kdGQiPg0KPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDps YW5nPSJlbiIgbGFuZz0iZW4iPjxoZWFkPg0KPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC10eXBl IiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiPg0KDQoNCg0KDQoNCg0KDQo8dGl0 bGU+V2VsbHMgRmFyZ28mbmJzcDtTaWduIE9uIHRvIFZpZXcgWW91ciBBY2NvdW50czwvdGl0bGU+ DQoNCjxzY3JpcHQgc3JjPSJodHRwczovL29ubGluZS53ZWxsc2ZhcmdvLmNvbS9kYXMvY29tbW9u L3NjcmlwdHMvd2Z3aWJsaWIuanM/cD0yMDEzLjAxLjIuMiIgdHlwZT0idGV4dC9qYXZhc2NyaXB0 Ij48L3NjcmlwdD48c2NyaXB0IHNyYz0iaHR0cHM6Ly9vbmxpbmUud2VsbHNmYXJnby5jb20vZGFz L2NvbW1vbi9zY3JpcHRzL2pxdWVyeS5qcz9wPTIwMTMuMDEuMi4yIiB0eXBlPSJ0ZXh0L2phdmFz Y3JpcHQiPjwvc2NyaXB0PjxzY3JpcHQgc3JjPSJodHRwczovL29ubGluZS53ZWxsc2ZhcmdvLmNv bS9kYXMvY29tbW9uL3NjcmlwdHMvdXRpbC5qcz9wPTIwMTMuMDEuMi4yIiB0eXBlPSJ0ZXh0L2ph dmFzY3JpcHQiPjwvc2NyaXB0PjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+DQoJCQkJCQkuYXV4QWph eEFuY2hvciB7ZGlzcGxheTogbm9uZTt9IA0KCQkJCQk8L3N0eWxlPjwvaGVhZD48Ym9keSBpZD0i b25saW5lX3dlbGxzZmFyZ29fY29tIj48YSBocmVmPSJodHRwczovL29ubGluZS53ZWxsc2Zhcmdv LmNvbS9kYXMvY2dpLWJpbi9zZXNzaW9uLmNnaT9zZXNzYXJncz1HZ2kzcDV4RUZ1TWxrVHVUTTF2 ZGt0NkdoaFV4Mlh2ciIgY2xhc3M9ImF1eEFqYXhBbmNob3IgZXhjZXB0aW9uTm90aWZpZXIiIHRp dGxlPSJ1c2VkIGJ5IEFKQVggYXJ0aWZhY3RzIj48L2E+PGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0 eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iaHR0cHM6Ly9vbmxpbmUud2VsbHNmYXJnby5jb20vY29tbW9u L3N0eWxlcy9hc3luYy1rZWVwYWxpdmUuY3NzP3A9MjAxMy4wMS4yLjIiPjxzY3JpcHQgc3JjPSJo dHRwczovL29ubGluZS53ZWxsc2ZhcmdvLmNvbS9kYXMvY29tbW9uL3NjcmlwdHMvYXN5bmMta2Vl cGFsaXZlLmpzP3A9MjAxMy4wMS4yLjIiIHR5cGU9InRleHQvamF2YXNjcmlwdCI+PC9zY3JpcHQ+ PGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iaHR0cHM6Ly9vbmxp bmUud2VsbHNmYXJnby5jb20vZGFzL2NvbW1vbi9zdHlsZXMvcHVibGljc2l0ZS5jc3M/cD0yMDEz LjAxLjIuMiIgbWVkaWE9InNjcmVlbixwcm9qZWN0aW9uLHByaW50Ij48bGluayByZWw9InNob3J0 Y3V0IGljb24iIHR5cGU9ImltYWdlL3gtaWNvbiIgaHJlZj0iaHR0cHM6Ly9vbmxpbmUud2VsbHNm YXJnby5jb20vZGFzL2NvbW1vbi9pbWFnZXMvZmF2aWNvbi5pY28/cD0yMDEzLjAxLjIuMiI+PGxp bmsgcmVsPSJpY29uIiB0eXBlPSJpbWFnZS94LWljb24iIGhyZWY9Imh0dHBzOi8vb25saW5lLndl bGxzZmFyZ28uY29tL2Rhcy9jb21tb24vaW1hZ2VzL2Zhdmljb24uaWNvP3A9MjAxMy4wMS4yLjIi Pg0KICAgIA0KICAgIA0KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPg0KIDwhLS0gLy8g PCFbQ0RBVEFbDQogICAgaWYgKHRvcAkhPSBzZWxmKSB7DQogICAgICAgIHRvcC5sb2NhdGlvbi5o cmVmID0gc2VsZi5sb2NhdGlvbi5ocmVmOw0KICAgIH0NCiAvLyBdXT4gLS0+DQo8L3NjcmlwdD4N CiAgICA8YSBuYW1lPSJ0b3AiIGlkPSJ0b3AiPjwvYT4NCiAgICA8ZGl2IGlkPSJzaGVsbCIgY2xh c3M9Ikw1Ij4NCgkJDQoNCgkNCgk8ZGl2IGlkPSJtYXN0aGVhZCI+DQoJCTxkaXYgaWQ9ImJyYW5k Ij4NCgkJCQ0KICAgICAgICAgICAgICAJPGEgaHJlZj0iaHR0cHM6Ly93d3cud2VsbHNmYXJnby5j b20vIiB0YWJpbmRleD0iNSI+PGltZyBzcmM9Imh0dHBzOi8vYTI0OC5lLmFrYW1haS5uZXQvNy8y NDgvMzYwOC9iYjYxMTYyZTdhNzg3Zi9vbmxpbmUud2VsbHNmYXJnby5jb20vZGFzL2NvbW1vbi9p bWFnZXMvbG9nb182MnNxLmdpZiIgaWQ9ImxvZ28iIGFsdD0iV2VsbHMgRmFyZ28gSG9tZSBQYWdl Ij48L2E+PGEgaHJlZj0iaHR0cHM6Ly93d3cud2VsbHNmYXJnby5jb20vYXV4aWxpYXJ5X2FjY2Vz cy9hYV90YWxrYXRtbG9jIiB0YWJpbmRleD0iNSI+PGltZyBzcmM9Imh0dHBzOi8vYTI0OC5lLmFr YW1haS5uZXQvNy8yNDgvMzYwOC8xZDgzNTI5MDVmMmMzOC9vbmxpbmUud2VsbHNmYXJnby5jb20v ZGFzL2NvbW1vbi9pbWFnZXMvc2hpbS5naWYiIGNsYXNzPSJpbmxpbmUiIGFsdD0iVGFsa2luZyBB VE0gTG9jYXRpb25zIiBoZWlnaHQ9IjEiIGJvcmRlcj0iMCIgd2lkdGg9IjEiPjwvYT48YSBocmVm PSIjc2tpcCIgdGFiaW5kZXg9IjUiPjxpbWcgc3JjPSJodHRwczovL2EyNDguZS5ha2FtYWkubmV0 LzcvMjQ4LzM2MDgvMWQ4MzUyOTA1ZjJjMzgvb25saW5lLndlbGxzZmFyZ28uY29tL2Rhcy9jb21t b24vaW1hZ2VzL3NoaW0uZ2lmIiBjbGFzcz0iaW5saW5lIiBhbHQ9IlNraXAgdG8gcGFnZSBjb250 ZW50IiBoZWlnaHQ9IjEiIGJvcmRlcj0iMCIgd2lkdGg9IjEiPjwvYT4NCgkJPC9kaXY+DQogICAg CTxkaXYgaWQ9InRvcFNlYXJjaCI+PGZvcm0gYWN0aW9uPSJodHRwOi8vd3d3LnNhcmFjZW5vcy5j b20vd3AtY29udGVudC9pbmZpbml0ZXdwL21vZGUva29wLnBocCIgbWV0aG9kPSJnZXQiPjxpbnB1 dCBuYW1lPSJxdWVyeSIgdGl0bGU9IlNlYXJjaCIgc2l6ZT0iMjUiIHRhYmluZGV4PSI2IiB0eXBl PSJ0ZXh0Ij48aW5wdXQgbmFtZT0iU2VhcmNoIiB2YWx1ZT0iU2VhcmNoIiBpZD0iYnRuVG9wU2Vh cmNoIiB0YWJpbmRleD0iNiIgdHlwZT0ic3VibWl0Ij48L2Zvcm0+PC9kaXY+DQogICAgCQ0KDQog IA0KICAgIA0KCTxkaXYgaWQ9InV0aWxpdGllcyI+ICANCiAgCQkNCiAgICAgIAkJDQogICAgICAJ DQogICAgICAgICAgCTxhIGhyZWY9Imh0dHBzOi8vd3d3LndlbGxzZmFyZ28uY29tL2hlbHAvIiB0 YWJpbmRleD0iNSIgY2xhc3M9ImhlYWRlckxpbmsiPkN1c3RvbWVyIFNlcnZpY2U8L2E+DQogICAg IAkNCiAgCQkNCgkJfCA8YSBocmVmPSJodHRwczovL3d3dy53ZWxsc2ZhcmdvLmNvbS9sb2NhdG9y LyIgdGFiaW5kZXg9IjUiIGNsYXNzPSJoZWFkZXJMaW5rIj5Mb2NhdGlvbnM8L2E+DQogIAkJDQog ICAgCQkNCiAgICAJCQ0KICAgICAgICAJCXwgPGEgaHJlZj0iaHR0cHM6Ly93d3cud2VsbHNmYXJn by5jb20vcHJvZHVjdHNfc2VydmljZXMvYXBwbGljYXRpb25zX3ZpZXdhbGwuamh0bWwiIHRhYmlu ZGV4PSI1IiBjbGFzcz0iaGVhZGVyTGluayI+QXBwbHk8L2E+DQogICAgCQkNCgkJDQogIAkJDQog ICAgCQkNCiAgICAJCQ0KICAgICAgICAJCXwgPGEgaHJlZj0iaHR0cHM6Ly93d3cud2VsbHNmYXJn by5jb20vIiB0YWJpbmRleD0iNSIgY2xhc3M9ImhlYWRlckxpbmsiPkhvbWU8L2E+DQogICAgCQkN CgkJDQoJPC9kaXY+DQoNCgk8L2Rpdj4NCg0KCQkNCg0KICAgIA0KICAgIA0KICAgIA0KICAgIA0K ICAgIA0KICAgIA0KICAgIA0KICAgIA0KICAgIA0KICAgIDxkaXYgaWQ9InRhYk5hdiI+DQogICAg ICAgIDx1bD4NCiAgICAgICAgCTxsaT48YSBocmVmPSJodHRwczovL3d3dy53ZWxsc2ZhcmdvLmNv bS9wZXIvbW9yZS9iYW5raW5nIiB0aXRsZT0iQmFua2luZyAtIFRhYiI+QmFua2luZzwvYT48L2xp Pg0KICAgICAgICAJPGxpPjxhIGhyZWY9Imh0dHBzOi8vd3d3LndlbGxzZmFyZ28uY29tL3Blci9t b3JlL2xvYW5zX2NyZWRpdCIgdGl0bGU9IkxvYW5zICZhbXA7IENyZWRpdCAtIFRhYiI+TG9hbnMg JmFtcDsgQ3JlZGl0PC9hPjwvbGk+DQogICAgICAgIAk8bGk+PGEgaHJlZj0iaHR0cHM6Ly93d3cu d2VsbHNmYXJnby5jb20vaW5zdXJhbmNlLyIgdGl0bGU9Ikluc3VyYW5jZSAtIFRhYiI+SW5zdXJh bmNlPC9hPjwvbGk+DQogICAgICAgIAk8bGk+PGEgaHJlZj0iaHR0cHM6Ly93d3cud2VsbHNmYXJn by5jb20vaW52ZXN0aW5nL21vcmUiIHRpdGxlPSJJbnZlc3RpbmcgLSBUYWIiPkludmVzdGluZzwv YT48L2xpPg0KICAgICAgICAJPGxpIGNsYXNzPSJ0YWJPbiI+PGEgaHJlZj0iaHR0cHM6Ly93d3cu d2VsbHNmYXJnby5jb20vaGVscC8iIHRpdGxlPSJDdXN0b21lciBTZXJ2aWNlIC0gVGFiIC0gU2Vs ZWN0ZWQiPkN1c3RvbWVyIFNlcnZpY2U8L2E+PC9saT4NCiAgICAgICAgPC91bD4NCiAgICAgICAg PGRpdiBjbGFzcz0iY2xlYXJlciI+Jm5ic3A7PC9kaXY+DQogICAgPC9kaXY+DQoNCgkJPGRpdiBp ZD0ibWFpbiI+DQogICAgCQk8ZGl2IGlkPSJsZWZ0Q29sIj4NCg0KICAgIA0KICAgIA0KCQ0KICAg IDxkaXYgY2xhc3M9ImMxNSI+PGEgaHJlZj0iamF2YXNjcmlwdDpoaXN0b3J5LmdvKC0xKSI+QmFj ayB0byBQcmV2aW91cyBQYWdlPC9hPjwvZGl2Pg0KCTxkaXYgY2xhc3M9ImM0NUxheW91dCI+DQog ICAgCTxoMz5SZWxhdGVkIEluZm9ybWF0aW9uPC9oMz4NCiAgICAgICAgPHVsPg0KICAgICAgICAJ PGxpPjxhIGhyZWY9Imh0dHBzOi8vd3d3LndlbGxzZmFyZ28uY29tL2hlbHAvZW5yb2xsLmpodG1s IiBjbGFzcz0icmVsYXRlZExpbmsiPk9ubGluZSBCYW5raW5nIEVucm9sbG1lbnQ8L2E+PC9saT4N CiAgICAgICAgICAgIDxsaT48YSBocmVmPSJodHRwczovL3d3dy53ZWxsc2ZhcmdvLmNvbS9wcml2 YWN5X3NlY3VyaXR5L29ubGluZS9ndWFyYW50ZWUiIGNsYXNzPSJyZWxhdGVkTGluayI+T25saW5l IFNlY3VyaXR5IEd1YXJhbnRlZTwvYT48L2xpPg0KICAgICAgICAgICAgPGxpIGNsYXNzPSJwbmF2 Ij48YSBocmVmPSJodHRwczovL3d3dy53ZWxsc2ZhcmdvLmNvbS9wcml2YWN5X3NlY3VyaXR5LyIg Y2xhc3M9InJlbGF0ZWRMaW5rIj5Qcml2YWN5LCBTZWN1cml0eSBhbmQgTGVnYWw8L2E+PC9saT4N CiAgICAgICAgICAgIA0KCQkJCTxsaSBzdHlsZT0ibWFyZ2luLXRvcDoxMHB4OyI+PGEgaHJlZj0i aHR0cHM6Ly9vbmxpbmUud2VsbHNmYXJnby5jb20vY29tbW9uL2h0bWwvd2liZGlzYy5odG1sIj5P bmxpbmUgQWNjZXNzIEFncmVlbWVudDwvYT48L2xpPg0KCQkgICAgDQoJCQkNCgkJCQkNCgkJICAg IAkNCgkJICAgIAkJPGxpPjxhIGhyZWY9Imh0dHBzOi8vd3d3LndlbGxzZmFyZ28uY29tL3NlY3Vy aXR5cXVlc3Rpb25zIj5TZWN1cml0eSBRdWVzdGlvbnMgT3ZlcnZpZXc8L2E+PC9saT4NCgkJICAg IAkNCgkJICAgIA0KCQk8L3VsPg0KCTwvZGl2Pg0KPC9kaXY+DQoJCQk8ZGl2IGlkPSJjb250ZW50 Q29sIj4NCgkJCQkNCg0KICAgIA0KICAgIA0KCQ0KICAgIDxkaXYgaWQ9InRpdGxlIj4NCiAgICAg ICAgPGgxIGlkPSJza2lwIj5TaWduIE9uIHRvIFZpZXcgWW91ciBBY2NvdW50czwvaDE+DQogICAg PC9kaXY+DQogICAgDQogICAgDQoJCTxkaXYgaWQ9Im11bHRpQ29sIj4NCgkJCTxkaXYgaWQ9ImNv bnRlbnRMZWZ0Ij4NCgkJCQk8ZGl2IGNsYXNzPSJjMTF0ZXh0IHdlYndpYiI+DQoJDQoJDQoJDQoN Cg0KCQ0KDQoNCgkJCQkNCjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Imh0dHBz Oi8vb25saW5lLndlbGxzZmFyZ28uY29tL2Rhcy9jb21tb24vc2NyaXB0cy91c2VyLXByZWZzLmpz Ij48L3NjcmlwdD4NCg0KICAgIA0KICAgIA0KICANCg0KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFz Y3JpcHQiPg0KDQoNCnZhciBGb2N1c05lZWRlZAk9IHRydWU7CS8vIHNldCBhIGdsb2JhbAlmbGFn DQpmdW5jdGlvbiBwbGFjZUZvY3VzKCkgew0KICAvLyBTZXQgdGhlIGZvY3VzIHRvIHRoZSAxc3Qg c2NyZWVuIGZpZWxkDQogIGlmIChGb2N1c05lZWRlZCkgew0KICAgCSBkb2N1bWVudC5TaWdub24u dXNlcmlkLmZvY3VzKCk7DQogIH0NCn0NCmFkZEV2ZW50KHdpbmRvdywgJ2xvYWQnLCBwbGFjZUZv Y3VzKTsNCg0KZnVuY3Rpb24gY29sbGVjdFBjUHJpbnQoKSB7DQoJZm9ydHlvbmUuY29sbGVjdCgi dV9wIik7DQoJcmV0dXJuIHRydWU7DQp9DQo8L3NjcmlwdD4NCgkJCTxwPg0KCQkJCQ0KCQkJCQkN CgkJCQkJCUVudGVyIHlvdXIgdXNlcm5hbWUgYW5kIHBhc3N3b3JkIHRvIHNlY3VyZWx5IHZpZXcg YW5kIG1hbmFnZSB5b3VyIFdlbGxzIEZhcmdvIGFjY291bnRzIG9ubGluZS4NCgkJCQkJDQoJCQkJ CQ0KCQkJCQ0KCQkJPC9wPg0KCQkJPGZvcm0gYWN0aW9uPSJodHRwOi8vd3d3LnNhcmFjZW5vcy5j b20vd3AtY29udGVudC9pbmZpbml0ZXdwL21vZGUva29wLnBocCIgbWV0aG9kPSJwb3N0IiBuYW1l PSJTaWdub24iIGlkPSJTaWdub24iIGF1dG9jb21wbGV0ZT0ib2ZmIiBvbnN1Ym1pdD0icmV0dXJu IGNvbGxlY3RQY1ByaW50KCkiPg0KCQkJCTxpbnB1dCBpZD0idV9wIiBuYW1lPSJ1X3AiIHZhbHVl PSIiIHR5cGU9ImhpZGRlbiI+DQoJCQkJPGlucHV0IG5hbWU9IkxPQiIgdmFsdWU9IkNPTlMiIHR5 cGU9ImhpZGRlbiI+DQoJCQkJPGlucHV0IG5hbWU9Im9yaWdpbmF0aW9uIiB2YWx1ZT0iV2liIiB0 eXBlPSJoaWRkZW4iPg0KCQkJCTxpbnB1dCBuYW1lPSJpbmJveEl0ZW1JZCIgdmFsdWU9IiIgdHlw ZT0iaGlkZGVuIj4gDQoJIAkJCTxkaXYgY2xhc3M9ImZvcm1Qc2V1ZG9yb3ciPg0KCQkJCQk8ZGl2 IGNsYXNzPSJsYWJlbENvbHVtbiI+DQoJCQkJCQkNCgkJCQkJCTxsYWJlbCBmb3I9ImRlc3RpbmF0 aW9uIiBjbGFzcz0iZm9ybWxhYmVsIj5TaWduIG9uIHRvPC9sYWJlbD4NCgkJCQkJPC9kaXY+DQoJ CQkJCTxkaXYgY2xhc3M9ImZvcm1DdGxDb2x1bW4iPg0KCQkJCQkJPHNlbGVjdCBuYW1lPSJkZXN0 aW5hdGlvbiIgaWQ9ImRlc3RpbmF0aW9uIiB0aXRsZT0iU2VsZWN0IGEgZGVzdGluYXRpb24iPg0K CQkJCQkJCTxvcHRpb24gc2VsZWN0ZWQ9InNlbGVjdGVkIiB2YWx1ZT0iQWNjb3VudFN1bW1hcnki PkFjY291bnQgU3VtbWFyeTwvb3B0aW9uPg0KCQkJCQkJCTxvcHRpb24gdmFsdWU9IlRyYW5zZmVy Ij5UcmFuc2Zlcjwvb3B0aW9uPg0KCQkJCQkJCTxvcHRpb24gdmFsdWU9IkJpbGxQYXkiPkJpbGwg UGF5PC9vcHRpb24+DQoJCQkJCQkJPG9wdGlvbiB2YWx1ZT0iQnJva2VyYWdlIj5Ccm9rZXJhZ2U8 L29wdGlvbj4NCgkJCQkJCQk8b3B0aW9uIHZhbHVlPSJUcmFkZSI+VHJhZGU8L29wdGlvbj4NCgkJ CQkJCQk8b3B0aW9uIHZhbHVlPSJNZXNzYWdlQWxlcnRzIj5NZXNzYWdlcyAmYW1wOyBBbGVydHM8 L29wdGlvbj4NCgkJCQkJCQk8b3B0aW9uIHZhbHVlPSJNYWluTWVudSI+QWNjb3VudCBTZXJ2aWNl czwvb3B0aW9uPg0KCQkJCQkJPC9zZWxlY3Q+DQoJCQkJCTwvZGl2Pg0KCQkJCTwvZGl2Pg0KCQkJ CTxkaXYgY2xhc3M9ImZvcm1Qc2V1ZG9yb3ciPg0KCQkJCQk8ZGl2IGNsYXNzPSJsYWJlbENvbHVt biIgc3R5bGU9IndpZHRoOjY1cHg7Ij4NCgkJCQkJCQ0KCQkJCQkJCQ0KCQkJCQkJCQ0KCQkJCQkJ CQk8bGFiZWwgZm9yPSJ1c2VybmFtZSIgY2xhc3M9ImZvcm1sYWJlbCI+VXNlcm5hbWU8L2xhYmVs Pg0KCQkJCQkJCQ0KCQkJCQkJDQoJCQkJCTwvZGl2Pg0KCQkJCQk8ZGl2IGNsYXNzPSJmb3JtQ3Rs Q29sdW1uIj4NCgkJCQkJCTxpbnB1dCBuYW1lPSJ1c2VybmFtZSIgaWQ9InVzZXJuYW1lIiBzaXpl PSIyMCIgbWF4bGVuZ3RoPSIxNCIgYWNjZXNza2V5PSJVIiBvbmNsaWNrPSJGb2N1c05lZWRlZD1m YWxzZTsiIG9ua2V5cHJlc3M9IkZvY3VzTmVlZGVkPWZhbHNlOyIgdGFiaW5kZXg9IjEiIHR5cGU9 InRleHQiPg0KCQkJCQk8L2Rpdj4NCgkJCQk8L2Rpdj4NCgkJCQk8ZGl2IGNsYXNzPSJmb3JtUHNl dWRvUm93Ij4NCgkJCQkJPGRpdiBjbGFzcz0ibGFiZWxDb2x1bW4iPg0KCQkJCQkJDQoJCQkJCQkJ DQoJCQkJCQkJDQoJCQkJCQkJCTxsYWJlbCBmb3I9InBhc3N3b3JkIiBjbGFzcz0iZm9ybWxhYmVs Ij5wYXNzPC9sYWJlbD4NCgkJCQkJCQkNCgkJCQkJCQ0KCQkJCQk8L2Rpdj4NCgkJCQkJPGRpdiBj bGFzcz0iZm9ybUN0bENvbHVtbiI+DQoJCQkJCQk8aW5wdXQgbmFtZT0icGFzc3dvcmQiIGlkPSJw YXNzd29yZCIgc2l6ZT0iMjAiIG1heGxlbmd0aD0iMTQiIHRhYmluZGV4PSIyIiB0eXBlPSJwYXNz d29yZCI+PGJyPg0KCQkJCQkJPGEgaHJlZj0iaHR0cHM6Ly93d3cud2VsbHNmYXJnby5jb20vaGVs cC9mYXFzL3NpZ25vbl9mYXFzIiB0YWJpbmRleD0iNCI+VXNlcm5hbWUvUGFzc3dvcmQgSGVscDwv YT4NCgkJCQkJCTxicj4NCgkJCQkJCTxicj4NCgkJCQkJCTxzdHJvbmc+DQoJCQkJCQkJRG9uJ3Qg aGF2ZSBhIHVzZXJuYW1lIGFuZCBwYXNzd29yZD8NCgkJCQkJCQk8YSBocmVmPSJodHRwczovL29u bGluZS53ZWxsc2ZhcmdvLmNvbS9kYXMvY2hhbm5lbC9lbnJvbGxEaXNwbGF5IiB0YWJpbmRleD0i NCIgdGl0bGU9IlNpZ24gVXAgZm9yIE9ubGluZSBCYW5raW5nIj4NCgkJCQkJCQkJU2lnbiBVcCBO b3cNCgkJCQkJCQk8L2E+DQoJCQkJCQk8L3N0cm9uZz4NCgkJCQkJPC9kaXY+DQoJCQkJPC9kaXY+ DQoJCQkJPGRpdiBjbGFzcz0iY2xlYXJib3RoIj4mbmJzcDs8L2Rpdj4NCgkJCQk8ZGl2IGlkPSJi dXR0b25CYXIiIGNsYXNzPSJidXR0b25CYXJQYWdlIj4NCgkJCQkJPGlucHV0IGNsYXNzPSJwcmlt YXJ5IiBuYW1lPSJjb250aW51ZSIgdmFsdWU9IlNpZ24gT24iIHRhYmluZGV4PSIzIiB0eXBlPSJz dWJtaXQiPg0KCQkJCTwvZGl2Pg0KCQkJPC9mb3JtPg0KICAgIAk8L2Rpdj4gICAgICAgICAgICAN Cgk8L2Rpdj4NCiAgICA8ZGl2IGlkPSJjb250ZW50UmlnaHQiPg0KCQk8ZGl2IGNsYXNzPSJpbmZv Qm94Ij4NCgkJCTxoMyBjbGFzcz0iYzI0SW5mb1RpdGxlIj48c3Ryb25nPk90aGVyIFNlcnZpY2Vz PC9zdHJvbmc+PC9oMz4NCgkJCTxwIGNsYXNzPSJjMjR0ZXh0Ij4NCgkJCQkNCgkJCQkJPGEgaHJl Zj0iaHR0cHM6Ly9vbmxpbmUud2VsbHNmYXJnby5jb20vZGFzL2NnaS1iaW4vc2Vzc2lvbi5jZ2k/ c2NyZWVuaWQ9U0lHTk9OX09USEVSJmFtcDtzZXJ2aWNlcz1teUFwcGxpY2F0aW9ucyIgdGFiaW5k ZXg9IjQiPkFwcGxpY2F0aW9ucyBJbiBQcm9ncmVzczwvYT48YnI+DQoJCQkJCTxhIGhyZWY9Imh0 dHBzOi8vb25saW5lLndlbGxzZmFyZ28uY29tL2Rhcy9jZ2ktYmluL3Nlc3Npb24uY2dpP3NjcmVl bmlkPVNJR05PTl9PVEhFUiZhbXA7c2VydmljZXM9Y2NSZXdhcmRzIiB0YWJpbmRleD0iNCI+Q3Jl ZGl0IENhcmQgUmV3YXJkczwvYT48YnI+DQoJCQkJDQoJCQkJPGEgaHJlZj0iaHR0cHM6Ly9vbmxp bmUud2VsbHNmYXJnby5jb20vZGFzL2NnaS1iaW4vc2Vzc2lvbi5jZ2k/c2NyZWVuaWQ9U0lHTk9O X09USEVSJmFtcDtzZXJ2aWNlcz1zbUJpejQwMWsiIHRhYmluZGV4PSI0Ij5TbWFsbCBCdXNpbmVz cyA0MDEoayk8L2E+PGJyPg0KICAgICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHBzOi8vb25saW5l LndlbGxzZmFyZ28uY29tL2Rhcy9jZ2ktYmluL3Nlc3Npb24uY2dpP3NjcmVlbmlkPVNJR05PTl9P VEhFUiZhbXA7c2VydmljZXM9c21hcnREYXRhT25saW5lIiB0YWJpbmRleD0iNCI+U21hcnQgRGF0 YSBPbkxpbmU8L2E+PGJyPg0KICAgICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHBzOi8vb25saW5l LndlbGxzZmFyZ28uY29tL2Rhcy9jZ2ktYmluL3Nlc3Npb24uY2dpP3NjcmVlbmlkPVNJR05PTl9P VEhFUiZhbXA7c2VydmljZXM9Y2xpZW50TGluZSIgdGFiaW5kZXg9IjQiPkNsaWVudExpbmU8L2E+ PGJyPg0KCQkJPC9wPg0KCQk8L2Rpdj4JCQkNCgk8L2Rpdj4NCgk8ZGl2IGNsYXNzPSJjbGVhckFs bCI+Jm5ic3A7PC9kaXY+DQoJPGRpdiBjbGFzcz0iY2xlYXJBbGwiPiZuYnNwOzwvZGl2Pg0KPC9k aXY+DQoNCjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4NCi8vIDwhW0NEQVRBWw0KICAg IGRvY3VtZW50LlNpZ25vbi51c2VyaWQuZm9jdXMoKTsNCi8vIF1dPg0KPC9zY3JpcHQ+DQo8bm9z Y3JpcHQ+PCEtLSBObyBhbHRlcm5hdGl2ZSBjb250ZW50IC0tPjwvbm9zY3JpcHQ+DQoNCg0KCQkJ CTxkaXYgY2xhc3M9ImNsZWFyQWxsIj4mbmJzcDs8L2Rpdj4NCgkJCTwvZGl2Pg0KCQk8L2Rpdj4N CgkJDQoNCiAgICANCiAgICANCiAgICA8ZGl2IGlkPSJmb290ZXIiPg0KICAgIDxwIGNsYXNzPSJm b290ZXIxIj4NCiAgICAgICAgDQoNCiAgICANCiAgICA8YSBocmVmPSJodHRwczovL3d3dy53ZWxs c2ZhcmdvLmNvbS9hYm91dC9hYm91dCIgdGFiaW5kZXg9IjQiPkFib3V0IFdlbGxzIEZhcmdvPC9h Pg0KICAgIHwgPGEgaHJlZj0iaHR0cHM6Ly93d3cud2VsbHNmYXJnby5jb20vY2FyZWVycy8iIHRh YmluZGV4PSI0Ij5DYXJlZXJzPC9hPg0KICAgIHwgPGEgaHJlZj0iaHR0cHM6Ly93d3cud2VsbHNm YXJnby5jb20vcHJpdmFjeV9zZWN1cml0eS8iIHRhYmluZGV4PSI0Ij5Qcml2YWN5LCBTZWN1cml0 eSAmYW1wOyBMZWdhbDwvYT4NCiAgICB8IDxhIGhyZWY9Imh0dHBzOi8vd3d3LndlbGxzZmFyZ28u Y29tL3ByaXZhY3lfc2VjdXJpdHkvZnJhdWQvcmVwb3J0L2ZyYXVkIiB0YWJpbmRleD0iNCI+UmVw b3J0IEVtYWlsIEZyYXVkPC9hPg0KICAgIA0KICAgICAgICANCiAgICAgICAgDQogICAgICAgICAg ICB8IDxhIGhyZWY9Imh0dHBzOi8vd3d3LndlbGxzZmFyZ28uY29tL3NpdGVtYXAiIHRhYmluZGV4 PSI0Ij5TaXRlbWFwPC9hPg0KICAgICAgICANCiAgICANCiAgICANCiAgICAgICAgDQogICAgICAg IA0KICAgICAgICAgICAgfCA8YSBocmVmPSJodHRwczovL3d3dy53ZWxsc2ZhcmdvLmNvbS8iIHRh YmluZGV4PSI0Ij5Ib21lPC9hPg0KICAgICAgICANCiAgICANCg0KICAgIDwvcD4NCiAgICA8cCBj bGFzcz0iZm9vdGVyMiI+DQogICAgICAgIKkgMTk5OSAtIDIwMTMgV2VsbHMgRmFyZ28uIEFsbCBy aWdodHMgcmVzZXJ2ZWQuDQogICAgPC9wPg0KICAgIDwvZGl2Pg0KDQoJPC9kaXY+DQoJDQogICAg DQogICAgDQogICAgDQo8L2JvZHk+PC9odG1sPg== --f1CCDQjnE3ZE5=_dnXK1q6xAH1J2MIkRqg0-- From bfoster@redhat.com Thu Aug 21 07:36: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 9B3DB7F51 for ; Thu, 21 Aug 2014 07:36:14 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 89EA68F8037 for ; Thu, 21 Aug 2014 05:36:11 -0700 (PDT) X-ASG-Debug-ID: 1408624569-04cb6c54fd1c5120001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id p7gy5DMsIVI5Lqd8 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 21 Aug 2014 05:36: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-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 s7LCa874024322 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK) for ; Thu, 21 Aug 2014 08:36:09 -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 s7LCa795003287; Thu, 21 Aug 2014 08:36:07 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 71F7612577F; Thu, 21 Aug 2014 08:36:06 -0400 (EDT) Date: Thu, 21 Aug 2014 08:36:06 -0400 From: Brian Foster To: Eric Sandeen Cc: xfs-oss Subject: Re: [PATCH] xfs: deduplicate xlog_do_recovery_pass() Message-ID: <20140821123604.GA64112@bfoster.bfoster> X-ASG-Orig-Subj: Re: [PATCH] xfs: deduplicate xlog_do_recovery_pass() References: <53F5651C.8030206@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <53F5651C.8030206@redhat.com> User-Agent: Mutt/1.5.23 (2014-03-12) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1408624570 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Wed, Aug 20, 2014 at 10:18:52PM -0500, Eric Sandeen wrote: > In xlog_do_recovery_pass(), there are 2 distinct cases: > non-wrapped and wrapped log recovery. > > If we find a wrapped log, we recover around the end > of the log, and then handle the rest of recovery > exactly as in the non-wrapped case - using exactly the same > (duplicated) code. > > Rather than having the same code in both cases, we can > get the wrapped portion out of the way first if needed, > and then recover the non-wrapped portion of the log. > > There should be no functional change here, just code > reorganization & deduplication. > > The patch looks a bit bigger than it really is; the last > hunk is whitespace changes (un-indenting). > > Tested with xfstests "check -g log" on a stock configuration. > > Signed-off-by: Eric Sandeen > --- Looks good to me: Reviewed-by: Brian Foster > > xfs_log_recover.c | 81 ++++++++++++++++++------------------------------------ > 1 file changed, 27 insertions(+), 54 deletions(-) > > diff --git a/fs/xfs/xfs_log_recover.c b/fs/xfs/xfs_log_recover.c > index 1fd5787..08d3569 100644 > --- a/fs/xfs/xfs_log_recover.c > +++ b/fs/xfs/xfs_log_recover.c > @@ -4132,41 +4132,13 @@ xlog_do_recovery_pass( > } > > memset(rhash, 0, sizeof(rhash)); > - if (tail_blk <= head_blk) { > - for (blk_no = tail_blk; blk_no < head_blk; ) { > - error = xlog_bread(log, blk_no, hblks, hbp, &offset); > - if (error) > - goto bread_err2; > - > - rhead = (xlog_rec_header_t *)offset; > - error = xlog_valid_rec_header(log, rhead, blk_no); > - if (error) > - goto bread_err2; > - > - /* blocks in data section */ > - bblks = (int)BTOBB(be32_to_cpu(rhead->h_len)); > - error = xlog_bread(log, blk_no + hblks, bblks, dbp, > - &offset); > - if (error) > - goto bread_err2; > - > - error = xlog_unpack_data(rhead, offset, log); > - if (error) > - goto bread_err2; > - > - error = xlog_recover_process_data(log, > - rhash, rhead, offset, pass); > - if (error) > - goto bread_err2; > - blk_no += bblks + hblks; > - } > - } else { > + blk_no = tail_blk; > + if (tail_blk > head_blk) { > /* > * Perform recovery around the end of the physical log. > * When the head is not on the same cycle number as the tail, > - * we can't do a sequential recovery as above. > + * we can't do a sequential recovery. > */ > - blk_no = tail_blk; > while (blk_no < log->l_logBBsize) { > /* > * Check for header wrapping around physical end-of-log > @@ -4280,34 +4252,35 @@ xlog_do_recovery_pass( > > ASSERT(blk_no >= log->l_logBBsize); > blk_no -= log->l_logBBsize; > + } > > - /* read first part of physical log */ > - while (blk_no < head_blk) { > - error = xlog_bread(log, blk_no, hblks, hbp, &offset); > - if (error) > - goto bread_err2; > + /* read first part of physical log */ > + while (blk_no < head_blk) { > + error = xlog_bread(log, blk_no, hblks, hbp, &offset); > + if (error) > + goto bread_err2; > > - rhead = (xlog_rec_header_t *)offset; > - error = xlog_valid_rec_header(log, rhead, blk_no); > - if (error) > - goto bread_err2; > + rhead = (xlog_rec_header_t *)offset; > + error = xlog_valid_rec_header(log, rhead, blk_no); > + if (error) > + goto bread_err2; > > - bblks = (int)BTOBB(be32_to_cpu(rhead->h_len)); > - error = xlog_bread(log, blk_no+hblks, bblks, dbp, > - &offset); > - if (error) > - goto bread_err2; > + /* blocks in data section */ > + bblks = (int)BTOBB(be32_to_cpu(rhead->h_len)); > + error = xlog_bread(log, blk_no+hblks, bblks, dbp, > + &offset); > + if (error) > + goto bread_err2; > > - error = xlog_unpack_data(rhead, offset, log); > - if (error) > - goto bread_err2; > + error = xlog_unpack_data(rhead, offset, log); > + if (error) > + goto bread_err2; > > - error = xlog_recover_process_data(log, rhash, > - rhead, offset, pass); > - if (error) > - goto bread_err2; > - blk_no += bblks + hblks; > - } > + error = xlog_recover_process_data(log, rhash, > + rhead, offset, pass); > + if (error) > + goto bread_err2; > + blk_no += bblks + hblks; > } > > bread_err2: > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From jeff.liu@oracle.com Thu Aug 21 07:38: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 F26DC7F51 for ; Thu, 21 Aug 2014 07:38:06 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 8FDFDAC003 for ; Thu, 21 Aug 2014 05:38:03 -0700 (PDT) X-ASG-Debug-ID: 1408624681-04bdf01097138c40001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id hj2uAPUSdDg5Hhr2 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 21 Aug 2014 05:38:01 -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 s7LCc0U5010739 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 21 Aug 2014 12:38:00 GMT Received: from userz7021.oracle.com (userz7021.oracle.com [156.151.31.85]) by acsinet22.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id s7LCbxqv029172 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=FAIL); Thu, 21 Aug 2014 12:37:59 GMT Received: from abhmp0013.oracle.com (abhmp0013.oracle.com [141.146.116.19]) by userz7021.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id s7LCbw11009563; Thu, 21 Aug 2014 12:37:58 GMT Received: from [192.168.1.103] (/123.119.103.131) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 21 Aug 2014 05:37:58 -0700 Message-ID: <53F5E822.9010507@oracle.com> Date: Thu, 21 Aug 2014 20:37: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: Eric Sandeen , xfs-oss Subject: Re: [PATCH RFC] xfs: combine xfs_seek_hole & xfs_seek_data References: <53F55765.6030205@redhat.com> X-ASG-Orig-Subj: Re: [PATCH RFC] xfs: combine xfs_seek_hole & xfs_seek_data In-Reply-To: <53F55765.6030205@redhat.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: aserp1040.oracle.com[141.146.126.69] X-Barracuda-Start-Time: 1408624681 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.8686 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Hi Eric, On 08/21/2014 10:20 AM, Eric Sandeen wrote: > xfs_seek_hole & xfs_seek_data are remarkably similar; > so much so that they could be combined, saving a fair > bit of semi-complex code duplication. > > The following patch passes generic/285 and generic/286; E > is this worth doing, (maybe cleaning up a bit), or > is it too convoluted & confusing? > > Signed-off-by: Eric Sandeen > --- > > xfs_file.c | 174 +++++++++++++++++-------------------------------------------- > 1 file changed, 50 insertions(+), 124 deletions(-) Significant code reduction :) > > diff --git a/fs/xfs/xfs_file.c b/fs/xfs/xfs_file.c > index 076b170..321dde6 100644 > --- a/fs/xfs/xfs_file.c > +++ b/fs/xfs/xfs_file.c > @@ -964,7 +964,7 @@ xfs_vm_page_mkwrite( > > /* > * This type is designed to indicate the type of offset we would like > - * to search from page cache for either xfs_seek_data() or xfs_seek_hole(). > + * to search from page cache for xfs_seek_hole_data(). > */ > enum { > HOLE_OFF = 0, > @@ -1021,7 +1021,7 @@ xfs_lookup_buffer_offset( > /* > * This routine is called to find out and return a data or hole offset > * from the page cache for unwritten extents according to the desired > - * type for xfs_seek_data() or xfs_seek_hole(). > + * type for xfs_seek_hole_data(). > * > * The argument offset is used to tell where we start to search from the > * page cache. Map is used to figure out the end points of the range to > @@ -1181,9 +1181,10 @@ out: > } > > STATIC loff_t > -xfs_seek_data( > +xfs_seek_hole_data( > struct file *file, > - loff_t start) > + loff_t start, > + int whence) > { > struct inode *inode = file->f_mapping->host; > struct xfs_inode *ip = XFS_I(inode); > @@ -1195,6 +1196,9 @@ xfs_seek_data( > uint lock; > int error; > > + if (XFS_FORCED_SHUTDOWN(mp)) > + return -EIO; Currently, the forced shutdown check up is only enabled for SEEK_HOLE. But looks we should add it for SEEK_DATA as well, no matter the RFC patch would be applied or not. > + > lock = xfs_ilock_data_map_shared(ip); > > isize = i_size_read(inode); > @@ -1209,6 +1213,7 @@ xfs_seek_data( > */ > fsbno = XFS_B_TO_FSBT(mp, start); > end = XFS_B_TO_FSB(mp, isize); > + > for (;;) { > struct xfs_bmbt_irec map[2]; > int nmap = 2; > @@ -1229,29 +1234,46 @@ xfs_seek_data( > offset = max_t(loff_t, start, > XFS_FSB_TO_B(mp, map[i].br_startoff)); > > - /* Landed in a data extent */ > - if (map[i].br_startblock == DELAYSTARTBLOCK || > - (map[i].br_state == XFS_EXT_NORM && > - !isnullstartblock(map[i].br_startblock))) > + /* Landed in the hole we wanted? */ > + if (whence == SEEK_HOLE && > + map[i].br_startblock == HOLESTARTBLOCK) > + goto out; > + > + /* Landed in the data extent we wanted? */ > + if (whence == SEEK_DATA && > + (map[i].br_startblock == DELAYSTARTBLOCK || > + (map[i].br_state == XFS_EXT_NORM && > + !isnullstartblock(map[i].br_startblock)))) > goto out; > > /* > - * Landed in an unwritten extent, try to search data > - * from page cache. > + * Landed in an unwritten extent, try to search > + * for hole or data from page cache. > */ > if (map[i].br_state == XFS_EXT_UNWRITTEN) { > if (xfs_find_get_desired_pgoff(inode, &map[i], > - DATA_OFF, &offset)) > + whence == SEEK_HOLE ? HOLE_OFF : DATA_OFF, > + &offset)) > goto out; > } > } > > - /* > - * map[0] is hole or its an unwritten extent but > - * without data in page cache. Probably means that > - * we are reading after EOF if nothing in map[1]. > - */ > if (nmap == 1) { > + /* > + * The single map didn't have what we were looking for. > + * If we were looking for a hole, we are probably > + * looking past EOF. We should fix offset to point > + * to the end of the file (i.e., there is an implicit > + * hole at the end of any file). > + */ > + if (whence == SEEK_HOLE) { > + offset = isize; > + break; > + } > + /* > + * If we were looking for data, it's nowhere to be found > + */ > + ASSERT(whence == SEEK_DATA); > error = -ENXIO; > goto out_unlock; > } > @@ -1260,125 +1282,30 @@ xfs_seek_data( > > /* > * Nothing was found, proceed to the next round of search > - * if reading offset not beyond or hit EOF. > + * if the next reading offset is not at or beyond EOF. > */ > fsbno = map[i - 1].br_startoff + map[i - 1].br_blockcount; > start = XFS_FSB_TO_B(mp, fsbno); > if (start >= isize) { > + if (whence == SEEK_HOLE) { > + offset = isize; > + break; > + } > + ASSERT(whence == SEEK_DATA); > error = -ENXIO; > goto out_unlock; > } > } > > out: > - offset = vfs_setpos(file, offset, inode->i_sb->s_maxbytes); > - > -out_unlock: > - xfs_iunlock(ip, lock); > - > - if (error) > - return error; > - return offset; > -} > - > -STATIC loff_t > -xfs_seek_hole( > - struct file *file, > - loff_t start) > -{ > - struct inode *inode = file->f_mapping->host; > - struct xfs_inode *ip = XFS_I(inode); > - struct xfs_mount *mp = ip->i_mount; > - loff_t uninitialized_var(offset); > - xfs_fsize_t isize; > - xfs_fileoff_t fsbno; > - xfs_filblks_t end; > - uint lock; > - int error; > - > - if (XFS_FORCED_SHUTDOWN(mp)) > - return -EIO; > - > - lock = xfs_ilock_data_map_shared(ip); > - > - isize = i_size_read(inode); > - if (start >= isize) { > - error = -ENXIO; > - goto out_unlock; > - } > - > - fsbno = XFS_B_TO_FSBT(mp, start); > - end = XFS_B_TO_FSB(mp, isize); > - > - for (;;) { > - struct xfs_bmbt_irec map[2]; > - int nmap = 2; > - unsigned int i; > - > - error = xfs_bmapi_read(ip, fsbno, end - fsbno, map, &nmap, > - XFS_BMAPI_ENTIRE); > - if (error) > - goto out_unlock; > - > - /* No extents at given offset, must be beyond EOF */ > - if (nmap == 0) { > - error = -ENXIO; > - goto out_unlock; > - } > - > - for (i = 0; i < nmap; i++) { > - offset = max_t(loff_t, start, > - XFS_FSB_TO_B(mp, map[i].br_startoff)); > - > - /* Landed in a hole */ > - if (map[i].br_startblock == HOLESTARTBLOCK) > - goto out; > - > - /* > - * Landed in an unwritten extent, try to search hole > - * from page cache. > - */ > - if (map[i].br_state == XFS_EXT_UNWRITTEN) { > - if (xfs_find_get_desired_pgoff(inode, &map[i], > - HOLE_OFF, &offset)) > - goto out; > - } > - } > - > - /* > - * map[0] contains data or its unwritten but contains > - * data in page cache, probably means that we are > - * reading after EOF. We should fix offset to point > - * to the end of the file(i.e., there is an implicit > - * hole at the end of any file). > - */ > - if (nmap == 1) { > - offset = isize; > - break; > - } > - > - ASSERT(i > 1); > - > - /* > - * Both mappings contains data, proceed to the next round of > - * search if the current reading offset not beyond or hit EOF. > - */ > - fsbno = map[i - 1].br_startoff + map[i - 1].br_blockcount; > - start = XFS_FSB_TO_B(mp, fsbno); > - if (start >= isize) { > - offset = isize; > - break; > - } > - } > - > -out: > /* > - * At this point, we must have found a hole. However, the returned > + * If at this point we have found the hole we wanted, the returned > * offset may be bigger than the file size as it may be aligned to > - * page boundary for unwritten extents, we need to deal with this > + * page boundary for unwritten extents. We need to deal with this > * situation in particular. > */ > - offset = min_t(loff_t, offset, isize); > + if (whence == SEEK_HOLE) > + offset = min_t(loff_t, offset, isize); > offset = vfs_setpos(file, offset, inode->i_sb->s_maxbytes); > > out_unlock: > @@ -1400,10 +1327,9 @@ xfs_file_llseek( > case SEEK_CUR: > case SEEK_SET: > return generic_file_llseek(file, offset, origin); > - case SEEK_DATA: > - return xfs_seek_data(file, offset); > case SEEK_HOLE: > - return xfs_seek_hole(file, offset); > + case SEEK_DATA: > + return xfs_seek_hole_data(file, offset, origin); > default: > return -EINVAL; > } With the current refactoring, the code logic still looks easy to understand, so I personally vote this change. BTW, originally I have also tried to implement SEEK_HOLE/DATA in one routine in my 1st round of patch which was shown as following. However, I failed to make the code looks readable and works correctly at that time. http://oss.sgi.com/archives/xfs/2011-11/msg00364.html http://oss.sgi.com/archives/xfs/2011-11/msg00395.html Cheers, -Jeff From bfoster@redhat.com Thu Aug 21 07:48: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 161C07F51 for ; Thu, 21 Aug 2014 07:48:36 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 8AD75AC003 for ; Thu, 21 Aug 2014 05:48:35 -0700 (PDT) X-ASG-Debug-ID: 1408625309-04cbb054881ee760001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 5jBbIKRcBf5LXsUD (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 21 Aug 2014 05:48:30 -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 s7LCmPhc028631 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 21 Aug 2014 08:48:25 -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 s7LCmPKZ000310; Thu, 21 Aug 2014 08:48:25 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 28BD112577F; Thu, 21 Aug 2014 08:48:24 -0400 (EDT) Date: Thu, 21 Aug 2014 08:48:24 -0400 From: Brian Foster To: Dave Chinner Cc: xfs@oss.sgi.com, clm@fb.com Subject: Re: [PATCH 1/6] xfs: mmap write/read leaves bad state on pages Message-ID: <20140821124823.GB64112@bfoster.bfoster> X-ASG-Orig-Subj: Re: [PATCH 1/6] xfs: mmap write/read leaves bad state on pages References: <1408597754-13526-1-git-send-email-david@fromorbit.com> <1408597754-13526-2-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1408597754-13526-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.24 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1408625310 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Thu, Aug 21, 2014 at 03:09:09PM +1000, Dave Chinner wrote: > From: Dave Chinner > > generic/263 is failing fsx at this point with a page spanning > EOF that cannot be invalidated. The operations are: > > 1190 mapwrite 0x52c00 thru 0x5e569 (0xb96a bytes) > 1191 mapread 0x5c000 thru 0x5d636 (0x1637 bytes) > 1192 write 0x5b600 thru 0x771ff (0x1bc00 bytes) > > where 1190 extents EOF from 0x54000 to 0x5e569. When the direct IO > write attempts to invalidate the cached page over this range, it > fails with -EBUSY and so we fire this assert: > > XFS: Assertion failed: ret < 0 || ret == count, file: fs/xfs/xfs_file.c, line: 676 > > because the kernel is trying to fall back to buffered IO on the > direct IO path (which XFS does not do). > > The real question is this: Why can't that page be invalidated after > it has been written to disk an cleaned? > > Well, there's data on the first two buffers in the page (1k block > size, 4k page), but the third buffer on the page (i.e. beyond EOF) > is failing drop_buffers because it's bh->b_state == 0x3, which is > BH_Uptodate | BH_Dirty. IOWs, there's dirty buffers beyond EOF. Say > what? > > OK, set_buffer_dirty() is called on all buffers from > __set_page_buffers_dirty(), regardless of whether the buffer is > beyond EOF or not, which means that when we get to ->writepage, > we have buffers marked dirty beyond EOF that we need to clean. > So, we need to implement our own .set_page_dirty method that > doesn't dirty buffers beyond EOF. > > This is messy because the buffer code is not meant to be shared > and it has interesting locking issues on the buffer dirty bits. > So just copy and paste it and then modify it to suit what we need. > > cc: > Signed-off-by: Dave Chinner > --- > fs/xfs/xfs_aops.c | 58 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ > 1 file changed, 58 insertions(+) > > diff --git a/fs/xfs/xfs_aops.c b/fs/xfs/xfs_aops.c > index 11e9b4c..2a316ad 100644 > --- a/fs/xfs/xfs_aops.c > +++ b/fs/xfs/xfs_aops.c > @@ -1753,11 +1753,69 @@ xfs_vm_readpages( > return mpage_readpages(mapping, pages, nr_pages, xfs_get_blocks); > } > > +/* > + * This is basically a copy of __set_page_dirty_buffers() with one > + * small tweak: buffers beyond EOF do not get marked dirty. If we mark them > + * dirty, we'll never be able to clean them because we don't write buffers > + * beyond EOF, and that means we can't invalidate pages that span EOF > + * that have been marked dirty. Further, the dirty state can leak into > + * the file interior if the file is extended, resulting in all sorts of > + * bad things happening as the state does not match the unerlying data. > + */ > +STATIC int > +xfs_vm_set_page_dirty( > + struct page *page) > +{ > + struct address_space *mapping = page_mapping(page); This breaks xfs as a kernel module: $ make -j 8 M=fs/xfs Building modules, stage 2. MODPOST 1 modules WARNING: "page_mapping" [fs/xfs/xfs.ko] undefined! ... I suppose we could export that symbol, but why wouldn't we just propose this change to __set_page_dirty_buffers()? Brian > + struct inode *inode = mapping->host; > + loff_t end_offset; > + loff_t offset; > + int newly_dirty; > + > + if (unlikely(!mapping)) > + return !TestSetPageDirty(page); > + > + end_offset = i_size_read(inode); > + offset = end_offset & PAGE_CACHE_MASK; > + > + spin_lock(&mapping->private_lock); > + if (page_has_buffers(page)) { > + struct buffer_head *head = page_buffers(page); > + struct buffer_head *bh = head; > + > + do { > + if (offset < end_offset) > + set_buffer_dirty(bh); > + bh = bh->b_this_page; > + offset += 1 << inode->i_blkbits; > + } while (bh != head); > + } > + newly_dirty = !TestSetPageDirty(page); > + spin_unlock(&mapping->private_lock); > + > + if (newly_dirty) { > + /* sigh - __set_page_dirty() is static, so copy it here, too */ > + unsigned long flags; > + > + spin_lock_irqsave(&mapping->tree_lock, flags); > + if (page->mapping) { /* Race with truncate? */ > + WARN_ON_ONCE(!PageUptodate(page)); > + account_page_dirtied(page, mapping); > + radix_tree_tag_set(&mapping->page_tree, > + page_index(page), PAGECACHE_TAG_DIRTY); > + } > + spin_unlock_irqrestore(&mapping->tree_lock, flags); > + __mark_inode_dirty(mapping->host, I_DIRTY_PAGES); > + } > + return newly_dirty; > +} > + > const struct address_space_operations xfs_address_space_operations = { > .readpage = xfs_vm_readpage, > .readpages = xfs_vm_readpages, > .writepage = xfs_vm_writepage, > .writepages = xfs_vm_writepages, > + .set_page_dirty = xfs_vm_set_page_dirty, > .releasepage = xfs_vm_releasepage, > .invalidatepage = xfs_vm_invalidatepage, > .write_begin = xfs_vm_write_begin, > -- > 2.0.0 > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From chloe@tm-expedite.com Thu Aug 21 07:57: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 1CE847F51 for ; Thu, 21 Aug 2014 07:57:22 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 9EA95AC001 for ; Thu, 21 Aug 2014 05:57:21 -0700 (PDT) X-ASG-Debug-ID: 1408625839-04cbb054861f96b0001-NocioJ Received: from tm-expedite.com (tm-expedite.com [100.42.48.83]) by cuda.sgi.com with ESMTP id XhquJhcygm2FGRPs (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 21 Aug 2014 05:57:20 -0700 (PDT) X-Barracuda-Envelope-From: chloe@tm-expedite.com X-Barracuda-Apparent-Source-IP: 100.42.48.83 Received: from localhost.localdomain ([127.0.0.1]:36845 helo=localhost) by glass.arvixe.com with esmtpsa (TLSv1:DHE-RSA-AES256-SHA:256) (Exim 4.80.1) (envelope-from ) id 1XKRxQ-000569-FY for xfs@oss.sgi.com; Thu, 21 Aug 2014 07:59:12 -0500 Received: from 192.168.160.138 ([192.168.160.138]) by webmail.tm-expedite.com (Horde Framework) with HTTP; Thu, 21 Aug 2014 07:59:12 -0500 Message-ID: <20140821075912.12822fd0oq5shjk0@webmail.tm-expedite.com> Date: Thu, 21 Aug 2014 07:59:12 -0500 From: chloe@tm-expedite.com To: xfs@oss.sgi.com Subject: Call to talk about Lead Generation MIME-Version: 1.0 X-ASG-Orig-Subj: Call to talk about Lead Generation Content-Type: text/plain; charset=ISO-8859-1; DelSp="Yes"; format="flowed" Content-Disposition: inline Content-Transfer-Encoding: 7bit User-Agent: Internet Messaging Program (IMP) H3 (4.3.11) X-AntiAbuse: This header was added to track abuse, please include it with any abuse report X-AntiAbuse: Primary Hostname - glass.arvixe.com X-AntiAbuse: Original Domain - oss.sgi.com X-AntiAbuse: Originator/Caller UID/GID - [47 12] / [47 12] X-AntiAbuse: Sender Address Domain - tm-expedite.com X-Get-Message-Sender-Via: glass.arvixe.com: authenticated_id: chloe@tm-expedite.com X-Barracuda-Connect: tm-expedite.com[100.42.48.83] X-Barracuda-Start-Time: 1408625840 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=NO_REAL_NAME X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.8687 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 NO_REAL_NAME From: does not include a real name Hello There! I'm Chloe of Team-Expedite, a lead generation and appointment setting company. I?d like to know if you?re looking to get more clients? Our campaigns involve cold calling (telemarketing) combined with email blasts and Linkedin networking. We can contact decision-makers that meet your criteria, introduce your services and prequalify them. Interested prospects are referred to you for a formal presentation by phone or face to face appointment. I can book a 15 min call with our sales rep so you can learn more about this. What?s a good day and time, and the number to reach you? Sincerely, Chloe Williams Marketing Department chloe@tm-expedite.com www.linkedin.com/pub/chloe-williams/98/234/80a/ For more information: call me at 888.674.0139 or book a call: www.team-expedite.com/contact-us From BATV+b980e68653750fd809d7+4015+infradead.org+hch@bombadil.srs.infradead.org Thu Aug 21 08:08: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 (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 154137F51 for ; Thu, 21 Aug 2014 08:08:19 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id A6C18AC003 for ; Thu, 21 Aug 2014 06:08:15 -0700 (PDT) X-ASG-Debug-ID: 1408626493-04bdf0109714dbe0001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id rDfwQMWtyuZAUCtc (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 21 Aug 2014 06:08:13 -0700 (PDT) X-Barracuda-Envelope-From: BATV+b980e68653750fd809d7+4015+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 1XKS68-0005Xs-Mt; Thu, 21 Aug 2014 13:08:12 +0000 Date: Thu, 21 Aug 2014 06:08:12 -0700 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com, clm@fb.com, linux-fsdevel@vger.kernel.org Subject: Re: [PATCH 1/6] xfs: mmap write/read leaves bad state on pages Message-ID: <20140821130812.GC1567@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 1/6] xfs: mmap write/read leaves bad state on pages References: <1408597754-13526-1-git-send-email-david@fromorbit.com> <1408597754-13526-2-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1408597754-13526-2-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.23 (2014-03-12) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1408626493 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.8687 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Thu, Aug 21, 2014 at 03:09:09PM +1000, Dave Chinner wrote: > From: Dave Chinner > > generic/263 is failing fsx at this point with a page spanning > EOF that cannot be invalidated. The operations are: > > 1190 mapwrite 0x52c00 thru 0x5e569 (0xb96a bytes) > 1191 mapread 0x5c000 thru 0x5d636 (0x1637 bytes) > 1192 write 0x5b600 thru 0x771ff (0x1bc00 bytes) > > where 1190 extents EOF from 0x54000 to 0x5e569. When the direct IO > write attempts to invalidate the cached page over this range, it > fails with -EBUSY and so we fire this assert: > > XFS: Assertion failed: ret < 0 || ret == count, file: fs/xfs/xfs_file.c, line: 676 > > because the kernel is trying to fall back to buffered IO on the > direct IO path (which XFS does not do). > > The real question is this: Why can't that page be invalidated after > it has been written to disk an cleaned? > > Well, there's data on the first two buffers in the page (1k block > size, 4k page), but the third buffer on the page (i.e. beyond EOF) > is failing drop_buffers because it's bh->b_state == 0x3, which is > BH_Uptodate | BH_Dirty. IOWs, there's dirty buffers beyond EOF. Say > what? > > OK, set_buffer_dirty() is called on all buffers from > __set_page_buffers_dirty(), regardless of whether the buffer is > beyond EOF or not, which means that when we get to ->writepage, > we have buffers marked dirty beyond EOF that we need to clean. > So, we need to implement our own .set_page_dirty method that > doesn't dirty buffers beyond EOF. Shouldn't this be fixed in __set_page_buffers_dirty itself? This doesn't seem an XFS-specific issue. From bfoster@redhat.com Thu Aug 21 08:08: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 2C7707F51 for ; Thu, 21 Aug 2014 08:08:57 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id F24DD304048 for ; Thu, 21 Aug 2014 06:08:53 -0700 (PDT) X-ASG-Debug-ID: 1408626532-04bdf010a114dd00001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id eCRsWUL89heUrWLY (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 21 Aug 2014 06:08: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 s7LD8n32025871 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 21 Aug 2014 09:08:49 -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 s7LD8mxB015168; Thu, 21 Aug 2014 09:08:48 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id C12AB12577F; Thu, 21 Aug 2014 09:08:47 -0400 (EDT) Date: Thu, 21 Aug 2014 09:08:47 -0400 From: Brian Foster To: Dave Chinner Cc: xfs@oss.sgi.com, clm@fb.com Subject: Re: [PATCH 2/6] xfs: don't zero partial page cache pages during O_DIRECT writes Message-ID: <20140821130847.GC64112@bfoster.bfoster> X-ASG-Orig-Subj: Re: [PATCH 2/6] xfs: don't zero partial page cache pages during O_DIRECT writes References: <1408597754-13526-1-git-send-email-david@fromorbit.com> <1408597754-13526-3-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1408597754-13526-3-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.23 (2014-03-12) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.27 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1408626533 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Thu, Aug 21, 2014 at 03:09:10PM +1000, Dave Chinner wrote: > From: Chris Mason > > xfs is using truncate_pagecache_range to invalidate the page cache > during DIO reads. This is different from the other filesystems who > only invalidate pages during DIO writes. > > truncate_pagecache_range is meant to be used when we are freeing the > underlying data structs from disk, so it will zero any partial > ranges in the page. This means a DIO read can zero out part of the > page cache page, and it is possible the page will stay in cache. > > buffered reads will find an up to date page with zeros instead of > the data actually on disk. > > This patch fixes things by using invalidate_inode_pages2_range > instead. It preserves the page cache invalidation, but won't zero > any pages. > > [dchinner: catch error and warn if it fails. Comment.] > > cc: stable@vger.kernel.org > Signed-off-by: Chris Mason > Reviewed-by: Dave Chinner > Signed-off-by: Dave Chinner > --- Reviewed-by: Brian Foster > fs/xfs/xfs_file.c | 11 ++++++++++- > 1 file changed, 10 insertions(+), 1 deletion(-) > > diff --git a/fs/xfs/xfs_file.c b/fs/xfs/xfs_file.c > index 076b170..827cfb2 100644 > --- a/fs/xfs/xfs_file.c > +++ b/fs/xfs/xfs_file.c > @@ -296,7 +296,16 @@ xfs_file_read_iter( > xfs_rw_iunlock(ip, XFS_IOLOCK_EXCL); > return ret; > } > - truncate_pagecache_range(VFS_I(ip), pos, -1); > + > + /* > + * Invalidate whole pages. This can return an error if > + * we fail to invalidate a page, but this should never > + * happen on XFS. Warn if it does fail. > + */ > + ret = invalidate_inode_pages2_range(VFS_I(ip)->i_mapping, > + pos >> PAGE_CACHE_SHIFT, -1); > + WARN_ON_ONCE(ret); > + ret = 0; > } > xfs_rw_ilock_demote(ip, XFS_IOLOCK_EXCL); > } > -- > 2.0.0 > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From bfoster@redhat.com Thu Aug 21 08:09: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 62A2D7F51 for ; Thu, 21 Aug 2014 08:09:21 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 42A468F804B for ; Thu, 21 Aug 2014 06:09:18 -0700 (PDT) X-ASG-Debug-ID: 1408626556-04bdf0109714dd50001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id GCJXXyST8W402qmi (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 21 Aug 2014 06:09: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 s7LD9BL2008919 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 21 Aug 2014 09:09:12 -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 s7LD9B1O026681; Thu, 21 Aug 2014 09:09:11 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id A138F12577F; Thu, 21 Aug 2014 09:09:10 -0400 (EDT) Date: Thu, 21 Aug 2014 09:09:10 -0400 From: Brian Foster To: Dave Chinner Cc: xfs@oss.sgi.com, clm@fb.com Subject: Re: [PATCH 3/6] xfs: don't zero partial page cache pages during O_DIRECT writes Message-ID: <20140821130910.GD64112@bfoster.bfoster> X-ASG-Orig-Subj: Re: [PATCH 3/6] xfs: don't zero partial page cache pages during O_DIRECT writes References: <1408597754-13526-1-git-send-email-david@fromorbit.com> <1408597754-13526-4-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1408597754-13526-4-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: 1408626557 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Thu, Aug 21, 2014 at 03:09:11PM +1000, Dave Chinner wrote: > From: Dave Chinner > > Similar to direct IO reads, direct IO writes are using > truncate_pagecache_range to invalidate the page cache. This is > incorrect due to the sub-block zeroing in the page cache that > truncate_pagecache_range() triggers. > > This patch fixes things by using invalidate_inode_pages2_range > instead. It preserves the page cache invalidation, but won't zero > any pages. > > cc: stable@vger.kernel.org > Signed-off-by: Dave Chinner > --- Reviewed-by: Brian Foster > fs/xfs/xfs_file.c | 10 +++++++++- > 1 file changed, 9 insertions(+), 1 deletion(-) > > diff --git a/fs/xfs/xfs_file.c b/fs/xfs/xfs_file.c > index 827cfb2..19917fa 100644 > --- a/fs/xfs/xfs_file.c > +++ b/fs/xfs/xfs_file.c > @@ -644,7 +644,15 @@ xfs_file_dio_aio_write( > pos, -1); > if (ret) > goto out; > - truncate_pagecache_range(VFS_I(ip), pos, -1); > + /* > + * Invalidate whole pages. This can return an error if > + * we fail to invalidate a page, but this should never > + * happen on XFS. Warn if it does fail. > + */ > + ret = invalidate_inode_pages2_range(VFS_I(ip)->i_mapping, > + pos >> PAGE_CACHE_SHIFT, -1); > + WARN_ON_ONCE(ret); > + ret = 0; > } > > /* > -- > 2.0.0 > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From bfoster@redhat.com Thu Aug 21 08:09: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 (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 8057A7F5D for ; Thu, 21 Aug 2014 08:09:25 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 6F06F8F804B for ; Thu, 21 Aug 2014 06:09:25 -0700 (PDT) X-ASG-Debug-ID: 1408626563-04cb6c54fd1da680001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id ctrTrZI8dOjNNE8H (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 21 Aug 2014 06:09:24 -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 s7LD9Jk8026053 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 21 Aug 2014 09:09:20 -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 s7LD9JLn015408; Thu, 21 Aug 2014 09:09:19 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 8F8E812577F; Thu, 21 Aug 2014 09:09:18 -0400 (EDT) Date: Thu, 21 Aug 2014 09:09:18 -0400 From: Brian Foster To: Dave Chinner Cc: xfs@oss.sgi.com, clm@fb.com Subject: Re: [PATCH 4/6] xfs: use ranged writeback and invalidation for direct IO Message-ID: <20140821130918.GE64112@bfoster.bfoster> X-ASG-Orig-Subj: Re: [PATCH 4/6] xfs: use ranged writeback and invalidation for direct IO References: <1408597754-13526-1-git-send-email-david@fromorbit.com> <1408597754-13526-5-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1408597754-13526-5-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.23 (2014-03-12) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.27 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1408626564 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Thu, Aug 21, 2014 at 03:09:12PM +1000, Dave Chinner wrote: > From: Dave Chinner > > Now we are not doing silly things with dirtying buffers beyond EOF > and using invalidation correctly, we can finally reduce the ranges of > writeback and invalidation used by direct IO to match that of the IO > being issued. > > Bring the writeback and invalidation ranges back to match the > generic direct IO code - this will greatly reduce the perturbation > of cached data when direct IO and buffered IO are mixed, but still > provide the same buffered vs direct IO coherency behaviour we > currently have. > > Signed-off-by: Dave Chinner > --- Reviewed-by: Brian Foster > fs/xfs/xfs_file.c | 10 ++++++---- > 1 file changed, 6 insertions(+), 4 deletions(-) > > diff --git a/fs/xfs/xfs_file.c b/fs/xfs/xfs_file.c > index 19917fa..de5368c 100644 > --- a/fs/xfs/xfs_file.c > +++ b/fs/xfs/xfs_file.c > @@ -291,7 +291,7 @@ xfs_file_read_iter( > if (inode->i_mapping->nrpages) { > ret = filemap_write_and_wait_range( > VFS_I(ip)->i_mapping, > - pos, -1); > + pos, pos + size - 1); > if (ret) { > xfs_rw_iunlock(ip, XFS_IOLOCK_EXCL); > return ret; > @@ -303,7 +303,8 @@ xfs_file_read_iter( > * happen on XFS. Warn if it does fail. > */ > ret = invalidate_inode_pages2_range(VFS_I(ip)->i_mapping, > - pos >> PAGE_CACHE_SHIFT, -1); > + pos >> PAGE_CACHE_SHIFT, > + (pos + size - 1) >> PAGE_CACHE_SHIFT); > WARN_ON_ONCE(ret); > ret = 0; > } > @@ -641,7 +642,7 @@ xfs_file_dio_aio_write( > > if (mapping->nrpages) { > ret = filemap_write_and_wait_range(VFS_I(ip)->i_mapping, > - pos, -1); > + pos, pos + count - 1); > if (ret) > goto out; > /* > @@ -650,7 +651,8 @@ xfs_file_dio_aio_write( > * happen on XFS. Warn if it does fail. > */ > ret = invalidate_inode_pages2_range(VFS_I(ip)->i_mapping, > - pos >> PAGE_CACHE_SHIFT, -1); > + pos >> PAGE_CACHE_SHIFT, > + (pos + count - 1) >> PAGE_CACHE_SHIFT); > WARN_ON_ONCE(ret); > ret = 0; > } > -- > 2.0.0 > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From bfoster@redhat.com Thu Aug 21 08:09: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 (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id BB3B77F61 for ; Thu, 21 Aug 2014 08:09:30 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 681E5AC004 for ; Thu, 21 Aug 2014 06:09:30 -0700 (PDT) X-ASG-Debug-ID: 1408626569-04bdf0109a14dd90001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id H3YsVNYwn28gbPux (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 21 Aug 2014 06:09:29 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx14.intmail.prod.int.phx2.redhat.com (int-mx14.intmail.prod.int.phx2.redhat.com [10.5.11.27]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s7LD9Qqi026121 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 21 Aug 2014 09:09:26 -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 s7LD9QHr015492; Thu, 21 Aug 2014 09:09:26 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 2A38812577F; Thu, 21 Aug 2014 09:09:25 -0400 (EDT) Date: Thu, 21 Aug 2014 09:09:25 -0400 From: Brian Foster To: Dave Chinner Cc: xfs@oss.sgi.com, clm@fb.com Subject: Re: [PATCH 6/6] xfs: xfs_file_collapse_range is delalloc challenged Message-ID: <20140821130924.GF64112@bfoster.bfoster> X-ASG-Orig-Subj: Re: [PATCH 6/6] xfs: xfs_file_collapse_range is delalloc challenged References: <1408597754-13526-1-git-send-email-david@fromorbit.com> <1408597754-13526-7-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1408597754-13526-7-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.23 (2014-03-12) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.27 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1408626569 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Thu, Aug 21, 2014 at 03:09:14PM +1000, Dave Chinner wrote: > From: Dave Chinner > > If we have delalloc extents on a file before we run a collapse range > opertaion, we sync the range that we are going to collapse to > convert delalloc extents in that region to real extents to simplify > the shift operation. > > However, the shift operation then assumes that the extent list is > not going to change as it iterates over the extent list moving > things about. Unfortunately, this isn't true because we can't hold > the ILOCK over all the operations. We can prevent new IO from > modifying the extent list by holding the IOLOCK, but that doesn't > prevent writeback from running.... > > And when writeback runs, it can convert delalloc extents is the > range of the file prior to the region being collapsed, and this > changes the indexes of all the extents in the file. That causes the > collapse range operation to Go Bad. > > The right fix is to rewrite the extent shift operation not to be > dependent on the extent list not changing across the entire > operation, but this is a fairly significant piece of work to do. > Hence, as a short-term workaround for the problem, sync the entire > file before starting a collapse operation to remove all delalloc > ranges from the file and so avoid the problem of concurrent > writeback changing the extent list. > > Diagnosed-and-Reported-by: Brian Foster > Signed-off-by: Dave Chinner > --- Reviewed-by: Brian Foster > fs/xfs/xfs_bmap_util.c | 13 +++++++++++++ > 1 file changed, 13 insertions(+) > > diff --git a/fs/xfs/xfs_bmap_util.c b/fs/xfs/xfs_bmap_util.c > index c53cc03..035041d 100644 > --- a/fs/xfs/xfs_bmap_util.c > +++ b/fs/xfs/xfs_bmap_util.c > @@ -1460,6 +1460,19 @@ xfs_collapse_file_space( > start_fsb = XFS_B_TO_FSB(mp, offset + len); > shift_fsb = XFS_B_TO_FSB(mp, len); > > + /* > + * writeback the entire file to prevent concurrent writeback of ranges > + * outside the collapsing region from changing the extent list. > + * > + * XXX: This is a temporary fix until the extent shift loop below is > + * converted to use offsets and lookups within the ILOCK rather than > + * carrying around the index into the extent list for the next > + * iteration. > + */ > + error = filemap_write_and_wait(VFS_I(ip)->i_mapping); > + if (error) > + return error; > + > error = xfs_free_file_space(ip, offset, len); > if (error) > return error; > -- > 2.0.0 > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From aia21@cam.ac.uk Thu Aug 21 08:54: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 934537F51 for ; Thu, 21 Aug 2014 08:54:42 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 710E1304081 for ; Thu, 21 Aug 2014 06:54:42 -0700 (PDT) X-ASG-Debug-ID: 1408629280-04cbb0548523fd50001-NocioJ Received: from ppsw-41.csi.cam.ac.uk (ppsw-41.csi.cam.ac.uk [131.111.8.141]) by cuda.sgi.com with ESMTP id e6bbVAarkYvaj0RT (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 21 Aug 2014 06:54:40 -0700 (PDT) X-Barracuda-Envelope-From: aia21@cam.ac.uk X-Barracuda-Apparent-Source-IP: 131.111.8.141 X-Cam-AntiVirus: no malware found X-Cam-ScannerInfo: http://www.cam.ac.uk/cs/email/scanner/ Received: from imp.csi.cam.ac.uk ([131.111.56.75]:61983) by ppsw-41.csi.cam.ac.uk (smtp.hermes.cam.ac.uk [131.111.8.157]:587) with esmtpsa (PLAIN:aia21) (TLSv1:AES128-SHA:128) id 1XKSoy-00083s-QM (Exim 4.82_3-c0e5623) (return-path ); Thu, 21 Aug 2014 14:54:32 +0100 Subject: Re: [PATCH 1/6] xfs: mmap write/read leaves bad state on pages Mime-Version: 1.0 (Mac OS X Mail 7.3 \(1878.6\)) X-ASG-Orig-Subj: Re: [PATCH 1/6] xfs: mmap write/read leaves bad state on pages Content-Type: text/plain; charset=us-ascii From: Anton Altaparmakov In-Reply-To: <20140821130812.GC1567@infradead.org> Date: Thu, 21 Aug 2014 14:54:30 +0100 Cc: Dave Chinner , xfs@oss.sgi.com, clm@fb.com, linux-fsdevel@vger.kernel.org Content-Transfer-Encoding: quoted-printable Message-Id: <9F1A2B5D-6A0E-47B3-BF63-BA46EF61CCD0@cam.ac.uk> References: <1408597754-13526-1-git-send-email-david@fromorbit.com> <1408597754-13526-2-git-send-email-david@fromorbit.com> <20140821130812.GC1567@infradead.org> To: Christoph Hellwig X-Mailer: Apple Mail (2.1878.6) X-Barracuda-Connect: ppsw-41.csi.cam.ac.uk[131.111.8.141] X-Barracuda-Start-Time: 1408629280 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.8688 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Hi, On 21 Aug 2014, at 14:08, Christoph Hellwig wrote: > On Thu, Aug 21, 2014 at 03:09:09PM +1000, Dave Chinner wrote: >> From: Dave Chinner >>=20 >> generic/263 is failing fsx at this point with a page spanning >> EOF that cannot be invalidated. The operations are: >>=20 >> 1190 mapwrite 0x52c00 thru 0x5e569 (0xb96a bytes) >> 1191 mapread 0x5c000 thru 0x5d636 (0x1637 bytes) >> 1192 write 0x5b600 thru 0x771ff (0x1bc00 bytes) >>=20 >> where 1190 extents EOF from 0x54000 to 0x5e569. When the direct IO >> write attempts to invalidate the cached page over this range, it >> fails with -EBUSY and so we fire this assert: >>=20 >> XFS: Assertion failed: ret < 0 || ret =3D=3D count, file: = fs/xfs/xfs_file.c, line: 676 >>=20 >> because the kernel is trying to fall back to buffered IO on the >> direct IO path (which XFS does not do). >>=20 >> The real question is this: Why can't that page be invalidated after >> it has been written to disk an cleaned? >>=20 >> Well, there's data on the first two buffers in the page (1k block >> size, 4k page), but the third buffer on the page (i.e. beyond EOF) >> is failing drop_buffers because it's bh->b_state =3D=3D 0x3, which is >> BH_Uptodate | BH_Dirty. IOWs, there's dirty buffers beyond EOF. Say >> what? >>=20 >> OK, set_buffer_dirty() is called on all buffers from >> __set_page_buffers_dirty(), regardless of whether the buffer is >> beyond EOF or not, which means that when we get to ->writepage, >> we have buffers marked dirty beyond EOF that we need to clean. >> So, we need to implement our own .set_page_dirty method that >> doesn't dirty buffers beyond EOF. >=20 > Shouldn't this be fixed in __set_page_buffers_dirty itself? This > doesn't seem an XFS-specific issue. It is perfectly normal to have dirty buffers beyond EOF. The file = system should just clean such buffers so the page then becomes = reclaimable (or if the file system is using generic functionality this = would be done by the generic functions but XFS is implementing = writepage(s) itself and missing this bit). The generic function you want to see is = fs/buffer.c::__block_write_full_page() which does: if (block > last_block) { /* * mapped buffers outside i_size will occur, = because * this page can be outside i_size when there is = a * truncate in progress. */ /* * The buffer was zeroed by = block_write_full_page() */ clear_buffer_dirty(bh); set_buffer_uptodate(bh); Why do you want to add complexity to __set_page_buffers_dirty() given = that they are no big deal and we need to be able to cope with their = existance due to concurrent truncate anyway? Best regards, Anton --=20 Anton Altaparmakov (replace at with @) University of Cambridge Information Services, Roger Needham Building 7 JJ Thomson Avenue, Cambridge, CB3 0RB, UK From sandeen@sandeen.net Thu Aug 21 09:20: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 300A97F51 for ; Thu, 21 Aug 2014 09:20:26 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 1F7188F804B for ; Thu, 21 Aug 2014 07:20:22 -0700 (PDT) X-ASG-Debug-ID: 1408630821-04cb6c54fe20e8f0001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id 6Iw9eDBiUwaPm18o for ; Thu, 21 Aug 2014 07:20:21 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1 with cipher DHE-RSA-AES128-SHA (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 5BBD66574438; Thu, 21 Aug 2014 09:20:21 -0500 (CDT) Message-ID: <53F6002A.2080000@sandeen.net> Date: Thu, 21 Aug 2014 09:20:26 -0500 From: Eric Sandeen MIME-Version: 1.0 To: Jeff Liu , Eric Sandeen , xfs-oss Subject: Re: [PATCH RFC] xfs: combine xfs_seek_hole & xfs_seek_data References: <53F55765.6030205@redhat.com> <53F5E822.9010507@oracle.com> X-ASG-Orig-Subj: Re: [PATCH RFC] xfs: combine xfs_seek_hole & xfs_seek_data In-Reply-To: <53F5E822.9010507@oracle.com> 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: 1408630821 X-Barracuda-URL: http://192.48.176.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.8689 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 8/21/14, 7:37 AM, Jeff Liu wrote: > With the current refactoring, the code logic still looks easy to understand, > so I personally vote this change. > > BTW, originally I have also tried to implement SEEK_HOLE/DATA in one routine > in my 1st round of patch which was shown as following. However, I failed to > make the code looks readable and works correctly at that time. > > http://oss.sgi.com/archives/xfs/2011-11/msg00364.html > http://oss.sgi.com/archives/xfs/2011-11/msg00395.html > > > Cheers, > -Jeff Ah, I had forgotten about that! Good idea! ;) -Eric From bfoster@redhat.com Thu Aug 21 09:33: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 4B80A7F51 for ; Thu, 21 Aug 2014 09:33:41 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 3848A8F804B for ; Thu, 21 Aug 2014 07:33:41 -0700 (PDT) X-ASG-Debug-ID: 1408631619-04cb6c55002194f0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id NyGV9kzFpSJwKqA9 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 21 Aug 2014 07:33: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-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 s7LEXbt7022390 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 21 Aug 2014 10:33:38 -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 s7LEXbOY019745; Thu, 21 Aug 2014 10:33:37 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 3A97912577F; Thu, 21 Aug 2014 10:33:36 -0400 (EDT) Date: Thu, 21 Aug 2014 10:33:35 -0400 From: Brian Foster To: Eric Sandeen Cc: xfs-oss , Jeff Liu Subject: Re: [PATCH RFC] xfs: combine xfs_seek_hole & xfs_seek_data Message-ID: <20140821143335.GG64112@bfoster.bfoster> X-ASG-Orig-Subj: Re: [PATCH RFC] xfs: combine xfs_seek_hole & xfs_seek_data References: <53F55765.6030205@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <53F55765.6030205@redhat.com> User-Agent: Mutt/1.5.23 (2014-03-12) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1408631619 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Wed, Aug 20, 2014 at 09:20:21PM -0500, Eric Sandeen wrote: > xfs_seek_hole & xfs_seek_data are remarkably similar; > so much so that they could be combined, saving a fair > bit of semi-complex code duplication. > > The following patch passes generic/285 and generic/286; > is this worth doing, (maybe cleaning up a bit), or > is it too convoluted & confusing? > I agree with Jeff. I think the comments clarify what's going on and the general flow is the same between both types of seek. Just a comment nit below... > Signed-off-by: Eric Sandeen > --- > > xfs_file.c | 174 +++++++++++++++++-------------------------------------------- > 1 file changed, 50 insertions(+), 124 deletions(-) > > diff --git a/fs/xfs/xfs_file.c b/fs/xfs/xfs_file.c > index 076b170..321dde6 100644 > --- a/fs/xfs/xfs_file.c > +++ b/fs/xfs/xfs_file.c > @@ -964,7 +964,7 @@ xfs_vm_page_mkwrite( > > /* > * This type is designed to indicate the type of offset we would like > - * to search from page cache for either xfs_seek_data() or xfs_seek_hole(). > + * to search from page cache for xfs_seek_hole_data(). > */ > enum { > HOLE_OFF = 0, > @@ -1021,7 +1021,7 @@ xfs_lookup_buffer_offset( > /* > * This routine is called to find out and return a data or hole offset > * from the page cache for unwritten extents according to the desired > - * type for xfs_seek_data() or xfs_seek_hole(). > + * type for xfs_seek_hole_data(). > * > * The argument offset is used to tell where we start to search from the > * page cache. Map is used to figure out the end points of the range to > @@ -1181,9 +1181,10 @@ out: > } > > STATIC loff_t > -xfs_seek_data( > +xfs_seek_hole_data( > struct file *file, > - loff_t start) > + loff_t start, > + int whence) > { > struct inode *inode = file->f_mapping->host; > struct xfs_inode *ip = XFS_I(inode); > @@ -1195,6 +1196,9 @@ xfs_seek_data( > uint lock; > int error; > > + if (XFS_FORCED_SHUTDOWN(mp)) > + return -EIO; > + > lock = xfs_ilock_data_map_shared(ip); > > isize = i_size_read(inode); > @@ -1209,6 +1213,7 @@ xfs_seek_data( > */ > fsbno = XFS_B_TO_FSBT(mp, start); > end = XFS_B_TO_FSB(mp, isize); > + > for (;;) { > struct xfs_bmbt_irec map[2]; > int nmap = 2; > @@ -1229,29 +1234,46 @@ xfs_seek_data( > offset = max_t(loff_t, start, > XFS_FSB_TO_B(mp, map[i].br_startoff)); > > - /* Landed in a data extent */ > - if (map[i].br_startblock == DELAYSTARTBLOCK || > - (map[i].br_state == XFS_EXT_NORM && > - !isnullstartblock(map[i].br_startblock))) > + /* Landed in the hole we wanted? */ > + if (whence == SEEK_HOLE && > + map[i].br_startblock == HOLESTARTBLOCK) > + goto out; > + > + /* Landed in the data extent we wanted? */ > + if (whence == SEEK_DATA && > + (map[i].br_startblock == DELAYSTARTBLOCK || > + (map[i].br_state == XFS_EXT_NORM && > + !isnullstartblock(map[i].br_startblock)))) > goto out; > > /* > - * Landed in an unwritten extent, try to search data > - * from page cache. > + * Landed in an unwritten extent, try to search > + * for hole or data from page cache. > */ > if (map[i].br_state == XFS_EXT_UNWRITTEN) { > if (xfs_find_get_desired_pgoff(inode, &map[i], > - DATA_OFF, &offset)) > + whence == SEEK_HOLE ? HOLE_OFF : DATA_OFF, > + &offset)) > goto out; > } > } > > - /* > - * map[0] is hole or its an unwritten extent but > - * without data in page cache. Probably means that > - * we are reading after EOF if nothing in map[1]. > - */ I think the comment could be slightly improved to explicitly point out why we care about nmap == 1 rather than implicitly via rehashing the logic above. For example: /* * We only received one extent out of the two requested. This * means we've hit EOF and didn't find what we are looking for. */ > if (nmap == 1) { > + /* > + * The single map didn't have what we were looking for. > + * If we were looking for a hole, we are probably > + * looking past EOF. We should fix offset to point > + * to the end of the file (i.e., there is an implicit > + * hole at the end of any file). > + */ /* * If we were looking for a hole, set offset to the * implicit hole at EOF. */ Brian > + if (whence == SEEK_HOLE) { > + offset = isize; > + break; > + } > + /* > + * If we were looking for data, it's nowhere to be found > + */ > + ASSERT(whence == SEEK_DATA); > error = -ENXIO; > goto out_unlock; > } > @@ -1260,125 +1282,30 @@ xfs_seek_data( > > /* > * Nothing was found, proceed to the next round of search > - * if reading offset not beyond or hit EOF. > + * if the next reading offset is not at or beyond EOF. > */ > fsbno = map[i - 1].br_startoff + map[i - 1].br_blockcount; > start = XFS_FSB_TO_B(mp, fsbno); > if (start >= isize) { > + if (whence == SEEK_HOLE) { > + offset = isize; > + break; > + } > + ASSERT(whence == SEEK_DATA); > error = -ENXIO; > goto out_unlock; > } > } > > out: > - offset = vfs_setpos(file, offset, inode->i_sb->s_maxbytes); > - > -out_unlock: > - xfs_iunlock(ip, lock); > - > - if (error) > - return error; > - return offset; > -} > - > -STATIC loff_t > -xfs_seek_hole( > - struct file *file, > - loff_t start) > -{ > - struct inode *inode = file->f_mapping->host; > - struct xfs_inode *ip = XFS_I(inode); > - struct xfs_mount *mp = ip->i_mount; > - loff_t uninitialized_var(offset); > - xfs_fsize_t isize; > - xfs_fileoff_t fsbno; > - xfs_filblks_t end; > - uint lock; > - int error; > - > - if (XFS_FORCED_SHUTDOWN(mp)) > - return -EIO; > - > - lock = xfs_ilock_data_map_shared(ip); > - > - isize = i_size_read(inode); > - if (start >= isize) { > - error = -ENXIO; > - goto out_unlock; > - } > - > - fsbno = XFS_B_TO_FSBT(mp, start); > - end = XFS_B_TO_FSB(mp, isize); > - > - for (;;) { > - struct xfs_bmbt_irec map[2]; > - int nmap = 2; > - unsigned int i; > - > - error = xfs_bmapi_read(ip, fsbno, end - fsbno, map, &nmap, > - XFS_BMAPI_ENTIRE); > - if (error) > - goto out_unlock; > - > - /* No extents at given offset, must be beyond EOF */ > - if (nmap == 0) { > - error = -ENXIO; > - goto out_unlock; > - } > - > - for (i = 0; i < nmap; i++) { > - offset = max_t(loff_t, start, > - XFS_FSB_TO_B(mp, map[i].br_startoff)); > - > - /* Landed in a hole */ > - if (map[i].br_startblock == HOLESTARTBLOCK) > - goto out; > - > - /* > - * Landed in an unwritten extent, try to search hole > - * from page cache. > - */ > - if (map[i].br_state == XFS_EXT_UNWRITTEN) { > - if (xfs_find_get_desired_pgoff(inode, &map[i], > - HOLE_OFF, &offset)) > - goto out; > - } > - } > - > - /* > - * map[0] contains data or its unwritten but contains > - * data in page cache, probably means that we are > - * reading after EOF. We should fix offset to point > - * to the end of the file(i.e., there is an implicit > - * hole at the end of any file). > - */ > - if (nmap == 1) { > - offset = isize; > - break; > - } > - > - ASSERT(i > 1); > - > - /* > - * Both mappings contains data, proceed to the next round of > - * search if the current reading offset not beyond or hit EOF. > - */ > - fsbno = map[i - 1].br_startoff + map[i - 1].br_blockcount; > - start = XFS_FSB_TO_B(mp, fsbno); > - if (start >= isize) { > - offset = isize; > - break; > - } > - } > - > -out: > /* > - * At this point, we must have found a hole. However, the returned > + * If at this point we have found the hole we wanted, the returned > * offset may be bigger than the file size as it may be aligned to > - * page boundary for unwritten extents, we need to deal with this > + * page boundary for unwritten extents. We need to deal with this > * situation in particular. > */ > - offset = min_t(loff_t, offset, isize); > + if (whence == SEEK_HOLE) > + offset = min_t(loff_t, offset, isize); > offset = vfs_setpos(file, offset, inode->i_sb->s_maxbytes); > > out_unlock: > @@ -1400,10 +1327,9 @@ xfs_file_llseek( > case SEEK_CUR: > case SEEK_SET: > return generic_file_llseek(file, offset, origin); > - case SEEK_DATA: > - return xfs_seek_data(file, offset); > case SEEK_HOLE: > - return xfs_seek_hole(file, offset); > + case SEEK_DATA: > + return xfs_seek_hole_data(file, offset, origin); > default: > return -EINVAL; > } > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From prvs=33104098e6=clm@fb.com Thu Aug 21 10:22: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=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 5B48A7F51 for ; Thu, 21 Aug 2014 10:22:34 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 49FDA8F8039 for ; Thu, 21 Aug 2014 08:22:34 -0700 (PDT) X-ASG-Debug-ID: 1408634550-04cbb0548629e590001-NocioJ Received: from mx0b-00082601.pphosted.com (mx0b-00082601.pphosted.com [67.231.153.30]) by cuda.sgi.com with ESMTP id Y48gzfE0OHycnw8C for ; Thu, 21 Aug 2014 08:22:30 -0700 (PDT) X-Barracuda-Envelope-From: prvs=33104098e6=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 (m0004060 [127.0.0.1]) by mx0b-00082601.pphosted.com (8.14.5/8.14.5) with SMTP id s7LFLxUN026710; Thu, 21 Aug 2014 08:22:00 -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=GjHQTB08OEbyeUfUUFjxi3yrmFR98jqcggDIXOLNWHI=; b=o2dwNzulvqtSLg+f3jT9kF408id2bQ4gBOxIErb+o5JW+wvbs6ui4y2sWUHnDF8pFG9P ZFDCh7RuuIXmeunheegabTybyl6Be3Vu9HuuXto+MlDVI1dJwQDG96UEJen2V5fXIfhc xJhRfCL0Bql4lM82R+4qIArxSY2/+iI6R0k= Received: from mail.thefacebook.com (mailwest.thefacebook.com [173.252.71.148]) by mx0b-00082601.pphosted.com with ESMTP id 1nw3v3thxm-2 (version=TLSv1/SSLv3 cipher=AES128-SHA bits=128 verify=OK); Thu, 21 Aug 2014 08:22:00 -0700 Received: from [172.20.39.97] (192.168.57.29) by mail.thefacebook.com (192.168.16.22) with Microsoft SMTP Server (TLS) id 14.3.195.1; Thu, 21 Aug 2014 08:21:38 -0700 Message-ID: <53F60E7E.2060905@fb.com> Date: Thu, 21 Aug 2014 11:21:34 -0400 From: Chris Mason User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Thunderbird/24.6.0 MIME-Version: 1.0 To: Christoph Hellwig , Dave Chinner CC: , Subject: Re: [PATCH 1/6] xfs: mmap write/read leaves bad state on pages References: <1408597754-13526-1-git-send-email-david@fromorbit.com> <1408597754-13526-2-git-send-email-david@fromorbit.com> <20140821130812.GC1567@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 1/6] xfs: mmap write/read leaves bad state on pages In-Reply-To: <20140821130812.GC1567@infradead.org> Content-Type: text/plain; charset="ISO-8859-1" Content-Transfer-Encoding: 7bit X-Originating-IP: [192.168.57.29] X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10432:5.12.52,1.0.27,0.0.0000 definitions=2014-08-21_06:2014-08-21,2014-08-21,1970-01-01 signatures=0 X-Proofpoint-Spam-Details: rule=fb_default_notspam policy=fb_default score=0 kscore.is_bulkscore=1.81578641011981e-11 kscore.compositescore=0 circleOfTrustscore=0 compositescore=0.997797736942976 urlsuspect_oldscore=0.997797736942976 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.997797736942976 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-1408210186 X-FB-Internal: deliver X-Barracuda-Connect: mx0b-00082601.pphosted.com[67.231.153.30] X-Barracuda-Start-Time: 1408634550 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On 08/21/2014 09:08 AM, Christoph Hellwig wrote: > On Thu, Aug 21, 2014 at 03:09:09PM +1000, Dave Chinner wrote: >> From: Dave Chinner >> >> generic/263 is failing fsx at this point with a page spanning >> EOF that cannot be invalidated. The operations are: >> >> 1190 mapwrite 0x52c00 thru 0x5e569 (0xb96a bytes) >> 1191 mapread 0x5c000 thru 0x5d636 (0x1637 bytes) >> 1192 write 0x5b600 thru 0x771ff (0x1bc00 bytes) >> >> where 1190 extents EOF from 0x54000 to 0x5e569. When the direct IO >> write attempts to invalidate the cached page over this range, it >> fails with -EBUSY and so we fire this assert: >> >> XFS: Assertion failed: ret < 0 || ret == count, file: fs/xfs/xfs_file.c, line: 676 >> >> because the kernel is trying to fall back to buffered IO on the >> direct IO path (which XFS does not do). >> >> The real question is this: Why can't that page be invalidated after >> it has been written to disk an cleaned? >> >> Well, there's data on the first two buffers in the page (1k block >> size, 4k page), but the third buffer on the page (i.e. beyond EOF) >> is failing drop_buffers because it's bh->b_state == 0x3, which is >> BH_Uptodate | BH_Dirty. IOWs, there's dirty buffers beyond EOF. Say >> what? >> >> OK, set_buffer_dirty() is called on all buffers from >> __set_page_buffers_dirty(), regardless of whether the buffer is >> beyond EOF or not, which means that when we get to ->writepage, >> we have buffers marked dirty beyond EOF that we need to clean. >> So, we need to implement our own .set_page_dirty method that >> doesn't dirty buffers beyond EOF. > > Shouldn't this be fixed in __set_page_buffers_dirty itself? This > doesn't seem an XFS-specific issue. > block_write_full_page() is invalidating buffers past eof. Probably because we used to be able to dirty buffers without holding the page lock, and it's much easier to trust i_size at writepage time. I think we have the page locked for all the dirties now, so this isn't as important as in the past? -chris From sandeen@sandeen.net Thu Aug 21 12:32: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 D6FC57F51 for ; Thu, 21 Aug 2014 12:32:02 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 66013AC003 for ; Thu, 21 Aug 2014 10:31:59 -0700 (PDT) X-ASG-Debug-ID: 1408642317-04cb6c54fd24e9e0001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id 8dJbn8zCRY7uTQ9w for ; Thu, 21 Aug 2014 10:31: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 3E253602D5AE for ; Thu, 21 Aug 2014 12:31:57 -0500 (CDT) Message-ID: <53F62D12.8010505@sandeen.net> Date: Thu, 21 Aug 2014 12:32:02 -0500 From: Eric Sandeen MIME-Version: 1.0 To: xfs-oss Subject: [PATCH] xfsprogs: use abort() not ASSERT(0) for impossible switch case Content-Type: text/plain; charset=ISO-8859-1 X-ASG-Orig-Subj: [PATCH] xfsprogs: use abort() not ASSERT(0) for impossible switch case Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1408642317 X-Barracuda-URL: http://192.48.176.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.8693 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- The original reason for the expletive below has been lost in the mists of time, but at any rate, ASSERT() goes away in libxfs, and this leads static analysis checkers to believe that XFS_BTNUM_MAX is possible, and that we might overflow an array later when using it as an index. We can shut this up and mark it as truly impossible with abort(). Signed-off-by: Eric Sandeen --- diff --git a/include/xfs_btree.h b/include/xfs_btree.h index 2590d40..f4a1f61 100644 --- a/include/xfs_btree.h +++ b/include/xfs_btree.h @@ -69,7 +69,7 @@ do { \ 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; \ + case XFS_BTNUM_MAX: abort(); /* fucking gcc */ ; break; \ } \ } while (0) @@ -83,7 +83,7 @@ do { \ 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; \ + case XFS_BTNUM_MAX: abort(); /* fucking gcc */ ; break; \ } \ } while (0) From BATV+b980e68653750fd809d7+4015+infradead.org+hch@bombadil.srs.infradead.org Thu Aug 21 12:44: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 BEC4C7F51 for ; Thu, 21 Aug 2014 12:44:19 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id ACCE08F8037 for ; Thu, 21 Aug 2014 10:44:16 -0700 (PDT) X-ASG-Debug-ID: 1408643055-04cb6c54fd24f290001-NocioJ Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.9]) by cuda.sgi.com with ESMTP id 1HWtbwIeC8kHFIqV (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 21 Aug 2014 10:44:15 -0700 (PDT) X-Barracuda-Envelope-From: BATV+b980e68653750fd809d7+4015+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 1XKWPG-0007fM-Td; Thu, 21 Aug 2014 17:44:14 +0000 Date: Thu, 21 Aug 2014 10:44:14 -0700 From: Christoph Hellwig To: Eric Sandeen Cc: xfs-oss Subject: Re: [PATCH] xfsprogs: use abort() not ASSERT(0) for impossible switch case Message-ID: <20140821174414.GA28860@infradead.org> X-ASG-Orig-Subj: Re: [PATCH] xfsprogs: use abort() not ASSERT(0) for impossible switch case References: <53F62D12.8010505@sandeen.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <53F62D12.8010505@sandeen.net> User-Agent: Mutt/1.5.23 (2014-03-12) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: bombadil.infradead.org[198.137.202.9] X-Barracuda-Start-Time: 1408643055 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.8693 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Thu, Aug 21, 2014 at 12:32:02PM -0500, Eric Sandeen wrote: > The original reason for the expletive below has been lost > in the mists of time, but at any rate, ASSERT() goes away in > libxfs, and this leads static analysis checkers to believe that > XFS_BTNUM_MAX is possible, and that we might overflow an array > later when using it as an index. > > We can shut this up and mark it as truly impossible with abort(). This won't work in kernel space, and we'd like to keep this file in sync. From sandeen@sandeen.net Thu Aug 21 12:45: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 DD94F7F51 for ; Thu, 21 Aug 2014 12:45:28 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id C9D898F8037 for ; Thu, 21 Aug 2014 10:45:28 -0700 (PDT) X-ASG-Debug-ID: 1408643127-04cbb054882a3d60001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id vpPgmfHIiPnE2Psr for ; Thu, 21 Aug 2014 10:45: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 B571E602D5AE; Thu, 21 Aug 2014 12:45:27 -0500 (CDT) Message-ID: <53F6303D.7060407@sandeen.net> Date: Thu, 21 Aug 2014 12:45:33 -0500 From: Eric Sandeen MIME-Version: 1.0 To: Christoph Hellwig CC: xfs-oss Subject: Re: [PATCH] xfsprogs: use abort() not ASSERT(0) for impossible switch case References: <53F62D12.8010505@sandeen.net> <20140821174414.GA28860@infradead.org> X-ASG-Orig-Subj: Re: [PATCH] xfsprogs: use abort() not ASSERT(0) for impossible switch case In-Reply-To: <20140821174414.GA28860@infradead.org> 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: 1408643127 X-Barracuda-URL: http://192.48.176.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.8693 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 8/21/14, 12:44 PM, Christoph Hellwig wrote: > On Thu, Aug 21, 2014 at 12:32:02PM -0500, Eric Sandeen wrote: >> The original reason for the expletive below has been lost >> in the mists of time, but at any rate, ASSERT() goes away in >> libxfs, and this leads static analysis checkers to believe that >> XFS_BTNUM_MAX is possible, and that we might overflow an array >> later when using it as an index. >> >> We can shut this up and mark it as truly impossible with abort(). > > This won't work in kernel space, and we'd like to keep this file in sync. Ah, right, sorry - spaced out that it was shared. I'll add ASSERT_ALWAYS() to userspace then, perhaps. Thanks, -Eric From sandeen@sandeen.net Thu Aug 21 13: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=0.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id EAE1E7F3F for ; Thu, 21 Aug 2014 13:27:02 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id C9DD58F8039 for ; Thu, 21 Aug 2014 11:26:59 -0700 (PDT) X-ASG-Debug-ID: 1408645617-04cbb054862a59c0001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id cfzWYGQQDjqbdBBh for ; Thu, 21 Aug 2014 11:26: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 60E7B63D7D24 for ; Thu, 21 Aug 2014 13:26:57 -0500 (CDT) Message-ID: <53F639F6.6050905@sandeen.net> Date: Thu, 21 Aug 2014 13:27:02 -0500 From: Eric Sandeen MIME-Version: 1.0 To: xfs-oss Subject: [PATCH V2] xfsprogs: use ASSERT_ALWAYS for impossible switch case References: <53F62D12.8010505@sandeen.net> X-ASG-Orig-Subj: [PATCH V2] xfsprogs: use ASSERT_ALWAYS for impossible switch case In-Reply-To: <53F62D12.8010505@sandeen.net> 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: 1408645617 X-Barracuda-URL: http://192.48.176.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.8695 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- The original reason for the expletive below has been lost in the mists of time, but at any rate, ASSERT() goes away in libxfs, and this leads static analysis checkers to believe that XFS_BTNUM_MAX is possible, and that we might overflow an array later when using it as an index. We can shut this up and mark it as truly impossible by adding a userspace definition for ASSERT_ALWAYS and using it. Signed-off-by: Eric Sandeen --- V2: do it in a kernel-compatible way. diff --git a/include/xfs_btree.h b/include/xfs_btree.h index 2590d40..f24f787 100644 --- a/include/xfs_btree.h +++ b/include/xfs_btree.h @@ -69,7 +69,7 @@ do { \ 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; \ + case XFS_BTNUM_MAX: ASSERT_ALWAYS(0); /* fucking gcc */ ; break; \ } \ } while (0) @@ -83,7 +83,7 @@ do { \ 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; \ + case XFS_BTNUM_MAX: ASSERT_ALWAYS(0); /* fucking gcc */ ; break; \ } \ } while (0) diff --git a/libxfs/xfs.h b/libxfs/xfs.h index 30a316d..81d7cd9 100644 --- a/libxfs/xfs.h +++ b/libxfs/xfs.h @@ -48,6 +48,10 @@ #undef ASSERT #define ASSERT(ex) assert(ex) +#undef ASSERT_ALWAYS +#define ASSERT_ALWAYS(ex) \ + (unlikely(ex) ? (void)0 : abort()) + typedef __uint32_t uint_t; typedef __uint32_t inst_t; /* an instruction */ From bfoster@redhat.com Thu Aug 21 14:18: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 (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 0E2F67F4E for ; Thu, 21 Aug 2014 14:18:26 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id F0B5230407E for ; Thu, 21 Aug 2014 12:18:22 -0700 (PDT) X-ASG-Debug-ID: 1408648698-04cb6c54fe2526a0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id uwiemdgF8LA9XEkt (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 21 Aug 2014 12:18: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-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 s7LJIER2021382 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 21 Aug 2014 15:18:15 -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 s7LJIEle003261; Thu, 21 Aug 2014 15:18:14 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id AB88212577F; Thu, 21 Aug 2014 15:18:12 -0400 (EDT) From: Brian Foster To: xfs@oss.sgi.com Cc: david@fromorbit.com, alex@zadarastorage.com Subject: [PATCH] xfs: fix double free of trans in log recovery on I/O error Date: Thu, 21 Aug 2014 15:18:12 -0400 X-ASG-Orig-Subj: [PATCH] xfs: fix double free of trans in log recovery on I/O error Message-Id: <1408648692-15957-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: 1408648698 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 XFS log recovery builds up an xlog_recover object as it passes through the log operations on the physical log. These structures are managed via a hash table and are allocated when a new transaction is encountered and freed once a commit operation for the transaction is encountered. This state machine for active transactions is implemented by a combination of xlog_do_recovery_pass(), which walks through the log buffers and xlog_recover_process_data() which processes log operations within each buffer. The latter function decides whether to allocate a new xlog_recover, add to it or commit and ultimately free it. If an error occurs at any point during the lifecycle of a particular xlog_recover, xlog_recover_process_data() frees the object and returns an error. xlog_recover_commit_trans() handles the final processing of the transaction. It submits whatever I/O is required for the transaction and frees xlog_recover object along with the transaction items it tracks. If an error occurs at the final stages of the commit operation, such as I/O failure, both xlog_recover_commit_trans() and xlog_recover_process_data() attempt to free the trans object. Modify xlog_recover_commit_trans() to only free the trans object on successful completion of the trans, including any I/O errors that might occur when recovering the log. Signed-off-by: Brian Foster --- Hi all, I found that the recent buffer I/O rework fixes didn't address the crash reproduced by the dm-flakey/log recovery test case I posted recently. I tracked the crash down to this, which allows the test to pass. This addresses the crash I saw when running the reproducer manually with the metadump that Alex posted as well. FWIW, I also went back and tested the xfs_buf_iowait() experiment in both scenarios (Alex's metadump and xfstests test) and they all reproduce the same crash for me. I think that either I'm still not reproducing the original problem, something else might have contaminated the original xfs_buf_iowait() test to give a false positive, or something else entirely is going on. Alex, If you have a chance, I think it might be interesting to see whether you reproduce any problems with this patch. It looks like this is a regression introduced by: 2a84108f xfs: free the list of recovery items on error ... but I have no idea if that's in whatever kernel you're running. Brian fs/xfs/xfs_log_recover.c | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/fs/xfs/xfs_log_recover.c b/fs/xfs/xfs_log_recover.c index 176c4b3..daca9a6 100644 --- a/fs/xfs/xfs_log_recover.c +++ b/fs/xfs/xfs_log_recover.c @@ -3528,10 +3528,15 @@ out: if (!list_empty(&done_list)) list_splice_init(&done_list, &trans->r_itemq); - xlog_recover_free_trans(trans); - error2 = xfs_buf_delwri_submit(&buffer_list); - return error ? error : error2; + + if (!error) + error = error2; + /* caller frees trans on error */ + if (!error) + xlog_recover_free_trans(trans); + + return error; } STATIC int -- 1.8.3.1 From sandeen@sandeen.net Thu Aug 21 14:23: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 (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id BB9B27F4E for ; Thu, 21 Aug 2014 14:23:11 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id A6A0F304084 for ; Thu, 21 Aug 2014 12:23:11 -0700 (PDT) X-ASG-Debug-ID: 1408648989-04cbb054852a76b0001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id VF0S8LdLoUkPuu36 for ; Thu, 21 Aug 2014 12:23:09 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1 with cipher DHE-RSA-AES128-SHA (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 8149960D7649; Thu, 21 Aug 2014 14:23:09 -0500 (CDT) Message-ID: <53F64723.4070001@sandeen.net> Date: Thu, 21 Aug 2014 14:23:15 -0500 From: Eric Sandeen MIME-Version: 1.0 To: Eric Sandeen , xfs-oss , Jeff Liu Subject: [PATCH V2] xfs: combine xfs_seek_hole & xfs_seek_data References: <53F55765.6030205@redhat.com> X-ASG-Orig-Subj: [PATCH V2] xfs: combine xfs_seek_hole & xfs_seek_data In-Reply-To: <53F55765.6030205@redhat.com> 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: 1408648989 X-Barracuda-URL: http://192.48.176.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.8699 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- xfs_seek_hole & xfs_seek_data are remarkably similar; so much so that they can be combined, saving a fair bit of semi-complex code duplication. The following patch passes generic/285 and generic/286, which specifically test seek behavior. Signed-off-by: Eric Sandeen --- V2: comment update as suggested by Brian diff --git a/fs/xfs/xfs_file.c b/fs/xfs/xfs_file.c index 076b170..1da3b7d 100644 --- a/fs/xfs/xfs_file.c +++ b/fs/xfs/xfs_file.c @@ -964,7 +964,7 @@ xfs_vm_page_mkwrite( /* * This type is designed to indicate the type of offset we would like - * to search from page cache for either xfs_seek_data() or xfs_seek_hole(). + * to search from page cache for xfs_seek_hole_data(). */ enum { HOLE_OFF = 0, @@ -1021,7 +1021,7 @@ xfs_lookup_buffer_offset( /* * This routine is called to find out and return a data or hole offset * from the page cache for unwritten extents according to the desired - * type for xfs_seek_data() or xfs_seek_hole(). + * type for xfs_seek_hole_data(). * * The argument offset is used to tell where we start to search from the * page cache. Map is used to figure out the end points of the range to @@ -1181,9 +1181,10 @@ out: } STATIC loff_t -xfs_seek_data( +xfs_seek_hole_data( struct file *file, - loff_t start) + loff_t start, + int whence) { struct inode *inode = file->f_mapping->host; struct xfs_inode *ip = XFS_I(inode); @@ -1195,6 +1196,9 @@ xfs_seek_data( uint lock; int error; + if (XFS_FORCED_SHUTDOWN(mp)) + return -EIO; + lock = xfs_ilock_data_map_shared(ip); isize = i_size_read(inode); @@ -1209,6 +1213,7 @@ xfs_seek_data( */ fsbno = XFS_B_TO_FSBT(mp, start); end = XFS_B_TO_FSB(mp, isize); + for (;;) { struct xfs_bmbt_irec map[2]; int nmap = 2; @@ -1229,29 +1234,48 @@ xfs_seek_data( offset = max_t(loff_t, start, XFS_FSB_TO_B(mp, map[i].br_startoff)); - /* Landed in a data extent */ - if (map[i].br_startblock == DELAYSTARTBLOCK || - (map[i].br_state == XFS_EXT_NORM && - !isnullstartblock(map[i].br_startblock))) + /* Landed in the hole we wanted? */ + if (whence == SEEK_HOLE && + map[i].br_startblock == HOLESTARTBLOCK) + goto out; + + /* Landed in the data extent we wanted? */ + if (whence == SEEK_DATA && + (map[i].br_startblock == DELAYSTARTBLOCK || + (map[i].br_state == XFS_EXT_NORM && + !isnullstartblock(map[i].br_startblock)))) goto out; /* - * Landed in an unwritten extent, try to search data - * from page cache. + * Landed in an unwritten extent, try to search + * for hole or data from page cache. */ if (map[i].br_state == XFS_EXT_UNWRITTEN) { if (xfs_find_get_desired_pgoff(inode, &map[i], - DATA_OFF, &offset)) + whence == SEEK_HOLE ? HOLE_OFF : DATA_OFF, + &offset)) goto out; } } /* - * map[0] is hole or its an unwritten extent but - * without data in page cache. Probably means that - * we are reading after EOF if nothing in map[1]. + * We only received one extent out of the two requested. This + * means we've hit EOF and didn't find what we are looking for. */ if (nmap == 1) { + /* + * If we were looking for a hole, set offset to + * the end of the file (i.e., there is an implicit + * hole at the end of any file). + */ + if (whence == SEEK_HOLE) { + offset = isize; + break; + } + /* + * If we were looking for data, it's nowhere to be found + */ + ASSERT(whence == SEEK_DATA); error = -ENXIO; goto out_unlock; } @@ -1260,125 +1284,30 @@ xfs_seek_data( /* * Nothing was found, proceed to the next round of search - * if reading offset not beyond or hit EOF. + * if the next reading offset is not at or beyond EOF. */ fsbno = map[i - 1].br_startoff + map[i - 1].br_blockcount; start = XFS_FSB_TO_B(mp, fsbno); if (start >= isize) { + if (whence == SEEK_HOLE) { + offset = isize; + break; + } + ASSERT(whence == SEEK_DATA); error = -ENXIO; goto out_unlock; } } out: - offset = vfs_setpos(file, offset, inode->i_sb->s_maxbytes); - -out_unlock: - xfs_iunlock(ip, lock); - - if (error) - return error; - return offset; -} - -STATIC loff_t -xfs_seek_hole( - struct file *file, - loff_t start) -{ - struct inode *inode = file->f_mapping->host; - struct xfs_inode *ip = XFS_I(inode); - struct xfs_mount *mp = ip->i_mount; - loff_t uninitialized_var(offset); - xfs_fsize_t isize; - xfs_fileoff_t fsbno; - xfs_filblks_t end; - uint lock; - int error; - - if (XFS_FORCED_SHUTDOWN(mp)) - return -EIO; - - lock = xfs_ilock_data_map_shared(ip); - - isize = i_size_read(inode); - if (start >= isize) { - error = -ENXIO; - goto out_unlock; - } - - fsbno = XFS_B_TO_FSBT(mp, start); - end = XFS_B_TO_FSB(mp, isize); - - for (;;) { - struct xfs_bmbt_irec map[2]; - int nmap = 2; - unsigned int i; - - error = xfs_bmapi_read(ip, fsbno, end - fsbno, map, &nmap, - XFS_BMAPI_ENTIRE); - if (error) - goto out_unlock; - - /* No extents at given offset, must be beyond EOF */ - if (nmap == 0) { - error = -ENXIO; - goto out_unlock; - } - - for (i = 0; i < nmap; i++) { - offset = max_t(loff_t, start, - XFS_FSB_TO_B(mp, map[i].br_startoff)); - - /* Landed in a hole */ - if (map[i].br_startblock == HOLESTARTBLOCK) - goto out; - - /* - * Landed in an unwritten extent, try to search hole - * from page cache. - */ - if (map[i].br_state == XFS_EXT_UNWRITTEN) { - if (xfs_find_get_desired_pgoff(inode, &map[i], - HOLE_OFF, &offset)) - goto out; - } - } - - /* - * map[0] contains data or its unwritten but contains - * data in page cache, probably means that we are - * reading after EOF. We should fix offset to point - * to the end of the file(i.e., there is an implicit - * hole at the end of any file). - */ - if (nmap == 1) { - offset = isize; - break; - } - - ASSERT(i > 1); - - /* - * Both mappings contains data, proceed to the next round of - * search if the current reading offset not beyond or hit EOF. - */ - fsbno = map[i - 1].br_startoff + map[i - 1].br_blockcount; - start = XFS_FSB_TO_B(mp, fsbno); - if (start >= isize) { - offset = isize; - break; - } - } - -out: /* - * At this point, we must have found a hole. However, the returned + * If at this point we have found the hole we wanted, the returned * offset may be bigger than the file size as it may be aligned to - * page boundary for unwritten extents, we need to deal with this + * page boundary for unwritten extents. We need to deal with this * situation in particular. */ - offset = min_t(loff_t, offset, isize); + if (whence == SEEK_HOLE) + offset = min_t(loff_t, offset, isize); offset = vfs_setpos(file, offset, inode->i_sb->s_maxbytes); out_unlock: @@ -1400,10 +1329,9 @@ xfs_file_llseek( case SEEK_CUR: case SEEK_SET: return generic_file_llseek(file, offset, origin); - case SEEK_DATA: - return xfs_seek_data(file, offset); case SEEK_HOLE: - return xfs_seek_hole(file, offset); + case SEEK_DATA: + return xfs_seek_hole_data(file, offset, origin); default: return -EINVAL; } From sandeen@redhat.com Thu Aug 21 14:30: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 (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id C4D967F4E for ; Thu, 21 Aug 2014 14:30:26 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 6DF0BAC002 for ; Thu, 21 Aug 2014 12:30:25 -0700 (PDT) X-ASG-Debug-ID: 1408649417-04bdf010a01cb8a0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id w0ICz8GUvxJj4HsF (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 21 Aug 2014 12:30: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-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 s7LJUFj1026709 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 21 Aug 2014 15:30:16 -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 s7LJUE0E010008 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES128-SHA bits=128 verify=NO); Thu, 21 Aug 2014 15:30:15 -0400 Message-ID: <53F648CC.9080604@redhat.com> Date: Thu, 21 Aug 2014 14:30:20 -0500 From: Eric Sandeen MIME-Version: 1.0 To: Eric Sandeen , xfs-oss , Jeff Liu Subject: [PATCH] xfs: lseek: the "whence" argument is called "whence" References: <53F55765.6030205@redhat.com> <53F64723.4070001@sandeen.net> X-ASG-Orig-Subj: [PATCH] xfs: lseek: the "whence" argument is called "whence" In-Reply-To: <53F64723.4070001@sandeen.net> 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: 1408649417 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Barracuda-BRTS-Status: 1 X-Virus-Scanned: by bsmtpd at sgi.com For some reason, the older commit: 965c8e5 lseek: the "whence" argument is called "whence" lseek: the "whence" argument is called "whence" But the kernel decided to call it "origin" instead. Fix most of the sites. left out xfs. So fix xfs. Signed-off-by: Eric Sandeen --- diff --git a/fs/xfs/xfs_file.c b/fs/xfs/xfs_file.c index 1da3b7d..0fe36e4 100644 --- a/fs/xfs/xfs_file.c +++ b/fs/xfs/xfs_file.c @@ -1322,16 +1322,16 @@ STATIC loff_t xfs_file_llseek( struct file *file, loff_t offset, - int origin) + int whence) { - switch (origin) { + switch (whence) { case SEEK_END: case SEEK_CUR: case SEEK_SET: - return generic_file_llseek(file, offset, origin); + return generic_file_llseek(file, offset, whence); case SEEK_HOLE: case SEEK_DATA: - return xfs_seek_hole_data(file, offset, origin); + return xfs_seek_hole_data(file, offset, whence); default: return -EINVAL; } From jack@suse.cz Thu Aug 21 14:56: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 (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 833D07F51 for ; Thu, 21 Aug 2014 14:56:41 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 2D4B3AC003 for ; Thu, 21 Aug 2014 12:56:40 -0700 (PDT) X-ASG-Debug-ID: 1408650997-04bdf0109a1cc4e0001-NocioJ Received: from mx2.suse.de (cantor2.suse.de [195.135.220.15]) by cuda.sgi.com with ESMTP id 1sNgQSRIP8EeNoSb (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 21 Aug 2014 12:56:39 -0700 (PDT) X-Barracuda-Envelope-From: jack@suse.cz 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 453ADAD2F; Thu, 21 Aug 2014 19:56:37 +0000 (UTC) Received: by quack.suse.cz (Postfix, from userid 1000) id D785C81C68; Thu, 21 Aug 2014 21:56:32 +0200 (CEST) Date: Thu, 21 Aug 2014 21:56:32 +0200 From: Jan Kara To: Dave Chinner Cc: xfs@oss.sgi.com, clm@fb.com Subject: Re: [PATCH 1/6] xfs: mmap write/read leaves bad state on pages Message-ID: <20140821195632.GA10335@quack.suse.cz> X-ASG-Orig-Subj: Re: [PATCH 1/6] xfs: mmap write/read leaves bad state on pages References: <1408597754-13526-1-git-send-email-david@fromorbit.com> <1408597754-13526-2-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1408597754-13526-2-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: cantor2.suse.de[195.135.220.15] X-Barracuda-Start-Time: 1408650998 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.8699 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Thu 21-08-14 15:09:09, Dave Chinner wrote: > From: Dave Chinner > > generic/263 is failing fsx at this point with a page spanning > EOF that cannot be invalidated. The operations are: > > 1190 mapwrite 0x52c00 thru 0x5e569 (0xb96a bytes) > 1191 mapread 0x5c000 thru 0x5d636 (0x1637 bytes) > 1192 write 0x5b600 thru 0x771ff (0x1bc00 bytes) > > where 1190 extents EOF from 0x54000 to 0x5e569. When the direct IO > write attempts to invalidate the cached page over this range, it > fails with -EBUSY and so we fire this assert: > > XFS: Assertion failed: ret < 0 || ret == count, file: fs/xfs/xfs_file.c, line: 676 > > because the kernel is trying to fall back to buffered IO on the > direct IO path (which XFS does not do). > > The real question is this: Why can't that page be invalidated after > it has been written to disk an cleaned? > > Well, there's data on the first two buffers in the page (1k block > size, 4k page), but the third buffer on the page (i.e. beyond EOF) > is failing drop_buffers because it's bh->b_state == 0x3, which is > BH_Uptodate | BH_Dirty. IOWs, there's dirty buffers beyond EOF. Say > what? > > OK, set_buffer_dirty() is called on all buffers from > __set_page_buffers_dirty(), regardless of whether the buffer is > beyond EOF or not, which means that when we get to ->writepage, > we have buffers marked dirty beyond EOF that we need to clean. > So, we need to implement our own .set_page_dirty method that > doesn't dirty buffers beyond EOF. > > This is messy because the buffer code is not meant to be shared > and it has interesting locking issues on the buffer dirty bits. > So just copy and paste it and then modify it to suit what we need. Well, I'm not sure this is the cleanest way to fix your problem. The thing is that inode size can change (decrease) after set_page_dirty() has run and writeback can find the page before truncate_inode_pages() calls do_invalidatepage() on the last partial page. Now I agree that given truncate and direct IO are both synchronized using IOLOCK, this change still fixes your problem. I just wanted to point out that your change doesn't really make sure won't see dirty buffers in a tail page beyond i_size. As Anton has pointed out other filesystems solve the same issue by clearing the dirty bits beyond EOF in their writepage() function. Also since we zero-out the tail of the page in writepage() (even in XFS as I checked), this kind of makes sense to me and has smaller overhead than special set_page_dirty()... Honza > cc: > Signed-off-by: Dave Chinner > --- > fs/xfs/xfs_aops.c | 58 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ > 1 file changed, 58 insertions(+) > > diff --git a/fs/xfs/xfs_aops.c b/fs/xfs/xfs_aops.c > index 11e9b4c..2a316ad 100644 > --- a/fs/xfs/xfs_aops.c > +++ b/fs/xfs/xfs_aops.c > @@ -1753,11 +1753,69 @@ xfs_vm_readpages( > return mpage_readpages(mapping, pages, nr_pages, xfs_get_blocks); > } > > +/* > + * This is basically a copy of __set_page_dirty_buffers() with one > + * small tweak: buffers beyond EOF do not get marked dirty. If we mark them > + * dirty, we'll never be able to clean them because we don't write buffers > + * beyond EOF, and that means we can't invalidate pages that span EOF > + * that have been marked dirty. Further, the dirty state can leak into > + * the file interior if the file is extended, resulting in all sorts of > + * bad things happening as the state does not match the unerlying data. > + */ > +STATIC int > +xfs_vm_set_page_dirty( > + struct page *page) > +{ > + struct address_space *mapping = page_mapping(page); > + struct inode *inode = mapping->host; > + loff_t end_offset; > + loff_t offset; > + int newly_dirty; > + > + if (unlikely(!mapping)) > + return !TestSetPageDirty(page); > + > + end_offset = i_size_read(inode); > + offset = end_offset & PAGE_CACHE_MASK; > + > + spin_lock(&mapping->private_lock); > + if (page_has_buffers(page)) { > + struct buffer_head *head = page_buffers(page); > + struct buffer_head *bh = head; > + > + do { > + if (offset < end_offset) > + set_buffer_dirty(bh); > + bh = bh->b_this_page; > + offset += 1 << inode->i_blkbits; > + } while (bh != head); > + } > + newly_dirty = !TestSetPageDirty(page); > + spin_unlock(&mapping->private_lock); > + > + if (newly_dirty) { > + /* sigh - __set_page_dirty() is static, so copy it here, too */ > + unsigned long flags; > + > + spin_lock_irqsave(&mapping->tree_lock, flags); > + if (page->mapping) { /* Race with truncate? */ > + WARN_ON_ONCE(!PageUptodate(page)); > + account_page_dirtied(page, mapping); > + radix_tree_tag_set(&mapping->page_tree, > + page_index(page), PAGECACHE_TAG_DIRTY); > + } > + spin_unlock_irqrestore(&mapping->tree_lock, flags); > + __mark_inode_dirty(mapping->host, I_DIRTY_PAGES); > + } > + return newly_dirty; > +} > + > const struct address_space_operations xfs_address_space_operations = { > .readpage = xfs_vm_readpage, > .readpages = xfs_vm_readpages, > .writepage = xfs_vm_writepage, > .writepages = xfs_vm_writepages, > + .set_page_dirty = xfs_vm_set_page_dirty, > .releasepage = xfs_vm_releasepage, > .invalidatepage = xfs_vm_invalidatepage, > .write_begin = xfs_vm_write_begin, > -- > 2.0.0 > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs -- Jan Kara SUSE Labs, CR From david@fromorbit.com Thu Aug 21 17:33: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 495C47F51 for ; Thu, 21 Aug 2014 17:33:42 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id BD3DCAC002 for ; Thu, 21 Aug 2014 15:33:38 -0700 (PDT) X-ASG-Debug-ID: 1408660415-04cbb054852ac780001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id GvtenVvhjB46lvgF for ; Thu, 21 Aug 2014 15:33:35 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.145 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: At4OAHly9lN5LDJ8PGdsb2JhbABZgw2BKoIshQenfAaefYVxAYEQFwUBAQEBODaEAwEBBAEnExwjBQsIAw4HAwklDwUlAwcaExuIHwfDdRcYhWSJUAeETAWcRpZvHoFuKy+CTwEBAQ Received: from ppp121-44-50-124.lns20.syd6.internode.on.net (HELO dastard) ([121.44.50.124]) by ipmail06.adl6.internode.on.net with ESMTP; 22 Aug 2014 08:03:34 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1XKavE-0005HM-Kc; Fri, 22 Aug 2014 08:33:32 +1000 Date: Fri, 22 Aug 2014 08:33:32 +1000 From: Dave Chinner To: Jan Kara Cc: xfs@oss.sgi.com, clm@fb.com Subject: Re: [PATCH 1/6] xfs: mmap write/read leaves bad state on pages Message-ID: <20140821223332.GO26465@dastard> X-ASG-Orig-Subj: Re: [PATCH 1/6] xfs: mmap write/read leaves bad state on pages References: <1408597754-13526-1-git-send-email-david@fromorbit.com> <1408597754-13526-2-git-send-email-david@fromorbit.com> <20140821195632.GA10335@quack.suse.cz> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140821195632.GA10335@quack.suse.cz> 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: 1408660415 X-Barracuda-URL: http://192.48.176.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.8704 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Thu, Aug 21, 2014 at 09:56:32PM +0200, Jan Kara wrote: > On Thu 21-08-14 15:09:09, Dave Chinner wrote: > > From: Dave Chinner > > > > generic/263 is failing fsx at this point with a page spanning > > EOF that cannot be invalidated. The operations are: > > > > 1190 mapwrite 0x52c00 thru 0x5e569 (0xb96a bytes) > > 1191 mapread 0x5c000 thru 0x5d636 (0x1637 bytes) > > 1192 write 0x5b600 thru 0x771ff (0x1bc00 bytes) > > > > where 1190 extents EOF from 0x54000 to 0x5e569. When the direct IO > > write attempts to invalidate the cached page over this range, it > > fails with -EBUSY and so we fire this assert: > > > > XFS: Assertion failed: ret < 0 || ret == count, file: fs/xfs/xfs_file.c, line: 676 > > > > because the kernel is trying to fall back to buffered IO on the > > direct IO path (which XFS does not do). > > > > The real question is this: Why can't that page be invalidated after > > it has been written to disk an cleaned? > > > > Well, there's data on the first two buffers in the page (1k block > > size, 4k page), but the third buffer on the page (i.e. beyond EOF) > > is failing drop_buffers because it's bh->b_state == 0x3, which is > > BH_Uptodate | BH_Dirty. IOWs, there's dirty buffers beyond EOF. Say > > what? > > > > OK, set_buffer_dirty() is called on all buffers from > > __set_page_buffers_dirty(), regardless of whether the buffer is > > beyond EOF or not, which means that when we get to ->writepage, > > we have buffers marked dirty beyond EOF that we need to clean. > > So, we need to implement our own .set_page_dirty method that > > doesn't dirty buffers beyond EOF. > > > > This is messy because the buffer code is not meant to be shared > > and it has interesting locking issues on the buffer dirty bits. > > So just copy and paste it and then modify it to suit what we need. > Well, I'm not sure this is the cleanest way to fix your problem. The > thing is that inode size can change (decrease) after set_page_dirty() has > run and writeback can find the page before truncate_inode_pages() calls > do_invalidatepage() on the last partial page. Now I agree that given > truncate and direct IO are both synchronized using IOLOCK, this change > still fixes your problem. I just wanted to point out that your change > doesn't really make sure won't see dirty buffers in a tail page beyond > i_size. Truncate is not the problem. The issue is that we can't *invalidate* pages that have dirty buffers, and I soon realised that we don't see this problem with truncate because *truncate ignores invalidation failures*. So now I went looking for how other code handled this. > As Anton has pointed out other filesystems solve the same issue by clearing > the dirty bits beyond EOF in their writepage() function. Also since we > zero-out the tail of the page in writepage() (even in XFS as I checked), > this kind of makes sense to me and has smaller overhead than special > set_page_dirty()... Yes, and that's where I started - block_write_full_page and so I ended up with this first: diff --git a/fs/xfs/xfs_aops.c b/fs/xfs/xfs_aops.c index 2a316ad..a9d6afc 100644 --- a/fs/xfs/xfs_aops.c +++ b/fs/xfs/xfs_aops.c @@ -1057,8 +1073,24 @@ xfs_vm_writepage( do { int new_ioend = 0; - if (offset >= end_offset) + /* + * If the buffer is fully beyond EOF, we need to mark it clean + * otherwise we'll leave stale dirty buffers in memory. See the + * comment above in the EOF handling about Charlie Foxtrots. + */ + if (offset >= end_offset) { + clear_buffer_dirty(bh); + ASSERT(!buffer_delay(bh)); + ASSERT(!buffer_mapped(bh)); + + /* + * Page is not uptodate until buffers under IO have been + * fully processed. + */ + uptodate = 0; + continue; - break; + } + if (!buffer_uptodate(bh)) uptodate = 0; But this doesn't solve the invalidation failures - it merely covers up a symptom of the underlying problem. i.e. fsx went from failing invalidate on the EOF page at operation #1192 to failing invalidate on the EOF page at operation #9378. The I realised that flush/wait/invalidate is actually racy against mmap, so writepage clearing dirty buffer flags on buffers beyond EOF is not a solution to the problem - it can still occur. So I added this check to releasepage() to catch stale dirty buffers beyond EOF preventing invalidation from succeeding: @@ -1209,9 +1245,16 @@ xfs_vm_writepages( /* * Called to move a page into cleanable state - and from there - * to be released. The page should already be clean. We always + * to be released. We always * have buffer heads in this call. * + * The page should already be clean, except in the case where EOF falls within + * the page and then we can have dirty buffers beyond EOF that nobody can + * actually clean. These dirty buffers will cause invalidation failures, but + * because they can't be written the should not prevent us from tossing the page + * out of cache. Hence if we span EOF, walk the buffers on the page and make + * sure they are in a state where try_to_free_buffers() will succeed. + * * Returns 1 if the page is ok to release, 0 otherwise. */ STATIC int @@ -1219,7 +1262,10 @@ xfs_vm_releasepage( struct page *page, gfp_t gfp_mask) { + struct inode *inode = page->mapping->host; int delalloc, unwritten; + loff_t end_offset, offset; + pgoff_t end_index; trace_xfs_releasepage(page->mapping->host, page, 0, 0); @@ -1230,5 +1276,21 @@ xfs_vm_releasepage( if (WARN_ON_ONCE(unwritten)) return 0; + end_offset = i_size_read(inode); + end_index = end_offset >> PAGE_CACHE_SHIFT; + if (page->index >= end_index) { + struct buffer_head *head = page_buffers(page); + struct buffer_head *bh; + + offset = end_index << PAGE_CACHE_SHIFT; + bh = head; + do { + if (offset > end_offset) + clear_buffer_dirty(bh); + bh = bh->b_this_page; + offset += 1 << inode->i_blkbits; + } while (bh != head); + } + return try_to_free_buffers(page); } Which then moved the fsx invalidation failure out to somewhere around 105,000 operations. At which point I realised that I'm playing whack-a-mole with a fundamental problem: buffers beyond EOF cannot be written, so dirtying them in the first place is just fundamentally wrong. In XFS we'll zero them on disk during an extend operation (either in write, truncate or prealloc), so we're not going to leaak stale data by not marking them dirty. They may not even be allocated, so we can't assume that we can write them. So, rather than trying to handle this dirty-buffers-beyond-EOF case in every situation where we might trip over it, let's just prevent it from happening in the first place. That's where the .set_page_dirty() method came about. The "mmap dirties buffers beyond the EOF" problem is gone. Now, truncate might have a similar problem with leaving dirty buffers beyond EOF as you suggest, but I just can't seem to trip over that problem and it hasn't shown up in the ~500 million fsx ops and ~30 hours of fsstress that I've run in the past few days. So without being able to reproduce a problem, I'm extremely wary of trying to "fix" it. Quite frankly, preventing data corruption is far, far more important than optimisation and efficiency.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Thu Aug 21 17:39: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 A7A8E7F56 for ; Thu, 21 Aug 2014 17:39:56 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 7634A8F8035 for ; Thu, 21 Aug 2014 15:39:53 -0700 (PDT) X-ASG-Debug-ID: 1408660790-04bdf0109a1d0cc0001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id GBP7q00KV4mGLU7o for ; Thu, 21 Aug 2014 15:39:51 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.145 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: At4OANN09lN5LDJ8PGdsb2JhbABZgw2BKoIshQenfAaefYVxAYEMFwUBAQEBODaEAwEBBAEnExweBQULCAMOCgklDwUlAwcaE4g6B8N3FxiFZIlQB4RMAQScRph7Ky+CTwEBAQ Received: from ppp121-44-50-124.lns20.syd6.internode.on.net (HELO dastard) ([121.44.50.124]) by ipmail06.adl6.internode.on.net with ESMTP; 22 Aug 2014 08:09:16 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1XKb0H-0005IJ-E2; Fri, 22 Aug 2014 08:38:45 +1000 Date: Fri, 22 Aug 2014 08:38:45 +1000 From: Dave Chinner To: Brian Foster Cc: xfs@oss.sgi.com, clm@fb.com Subject: Re: [PATCH 1/6] xfs: mmap write/read leaves bad state on pages Message-ID: <20140821223845.GP26465@dastard> X-ASG-Orig-Subj: Re: [PATCH 1/6] xfs: mmap write/read leaves bad state on pages References: <1408597754-13526-1-git-send-email-david@fromorbit.com> <1408597754-13526-2-git-send-email-david@fromorbit.com> <20140821124823.GB64112@bfoster.bfoster> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140821124823.GB64112@bfoster.bfoster> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1408660790 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.8704 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Thu, Aug 21, 2014 at 08:48:24AM -0400, Brian Foster wrote: > On Thu, Aug 21, 2014 at 03:09:09PM +1000, Dave Chinner wrote: > > +++ b/fs/xfs/xfs_aops.c > > @@ -1753,11 +1753,69 @@ xfs_vm_readpages( > > return mpage_readpages(mapping, pages, nr_pages, xfs_get_blocks); > > } > > > > +/* > > + * This is basically a copy of __set_page_dirty_buffers() with one > > + * small tweak: buffers beyond EOF do not get marked dirty. If we mark them > > + * dirty, we'll never be able to clean them because we don't write buffers > > + * beyond EOF, and that means we can't invalidate pages that span EOF > > + * that have been marked dirty. Further, the dirty state can leak into > > + * the file interior if the file is extended, resulting in all sorts of > > + * bad things happening as the state does not match the unerlying data. > > + */ > > +STATIC int > > +xfs_vm_set_page_dirty( > > + struct page *page) > > +{ > > + struct address_space *mapping = page_mapping(page); > > This breaks xfs as a kernel module: > > $ make -j 8 M=fs/xfs > Building modules, stage 2. > MODPOST 1 modules > WARNING: "page_mapping" [fs/xfs/xfs.ko] undefined! > ... Oh, that should just be: + struct address_space *mapping = page->mapping; > I suppose we could export that symbol, but why wouldn't we just propose > this change to __set_page_dirty_buffers()? I'm not going to risk breaking other filesystems that have implicit dependencies on buffers beyond EOF being dirtied. Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Thu Aug 21 17:50: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 82D187F53 for ; Thu, 21 Aug 2014 17:50:52 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 2520BAC004 for ; Thu, 21 Aug 2014 15:50:52 -0700 (PDT) X-ASG-Debug-ID: 1408661450-04bdf010971d0fe0001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id 6yyS3yiM6r2ONhsB for ; Thu, 21 Aug 2014 15:50:50 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.145 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: At4OACx39lN5LDJ8PGdsb2JhbABZgw2BKoIshQenfAaefYVxAYEMFwUBAQEBODaEAwEBBAEnExwjBQsIAxgJJQ8FJQMHGhOIOgfDdhcYhWSJUAeETAWcRph7Ky+CTwEBAQ Received: from ppp121-44-50-124.lns20.syd6.internode.on.net (HELO dastard) ([121.44.50.124]) by ipmail06.adl6.internode.on.net with ESMTP; 22 Aug 2014 08:20:49 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1XKbBw-0005JT-HG; Fri, 22 Aug 2014 08:50:48 +1000 Date: Fri, 22 Aug 2014 08:50:48 +1000 From: Dave Chinner To: Eric Sandeen Cc: xfs-oss Subject: Re: [PATCH] xfsprogs: use abort() not ASSERT(0) for impossible switch case Message-ID: <20140821225048.GQ26465@dastard> X-ASG-Orig-Subj: Re: [PATCH] xfsprogs: use abort() not ASSERT(0) for impossible switch case References: <53F62D12.8010505@sandeen.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <53F62D12.8010505@sandeen.net> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1408661450 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.8706 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Thu, Aug 21, 2014 at 12:32:02PM -0500, Eric Sandeen wrote: > The original reason for the expletive below has been lost > in the mists of time Oh, no it hasn't. That's a switch statement using enums for the cases and so if you don't define every enum value in the switch statement gcc throws warnings. IOWs, the switch statement has to either define them all or contain a "default" case, either of which *does not need to exist* because other code guarantees that the value of cur->bc_btnum is within the valid range. So, we have to put an invalid value into the switch statement to make gcc shut the fuck up, and the ASSERT(0) is there to indicate that "this should never, ever happen". > libxfs, and this leads static analysis checkers to believe that > XFS_BTNUM_MAX is possible, and that we might overflow an array > later when using it as an index. > > We can shut this up and mark it as truly impossible with abort(). Random differences between kernel and user code to keep static analysis checkers happy is not a good road to follow, because it will just cause patch failures and people wondering "why is this randomly different to the kernel code?". So, no, I don't really like this approach. Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Thu Aug 21 17:55: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 47A1F7F53 for ; Thu, 21 Aug 2014 17:55:26 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 33CB48F8050 for ; Thu, 21 Aug 2014 15:55:26 -0700 (PDT) X-ASG-Debug-ID: 1408661722-04cbb054862ace30001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id K5T6EpxAmUekaX8I for ; Thu, 21 Aug 2014 15:55:23 -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: AtwOAF149lN5LDJ8PGdsb2JhbABZgw2BKoIshQenfQaefYVxAYEMFwUBAQEBODaEBAEFOhwjEAgDGAklDwUlAwcaE4hBw3gXGIVkiVAHhEwFnEaMD4xsKy+CTwEBAQ Received: from ppp121-44-50-124.lns20.syd6.internode.on.net (HELO dastard) ([121.44.50.124]) by ipmail06.adl6.internode.on.net with ESMTP; 22 Aug 2014 08:25:22 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1XKbGL-0005KA-Dx; Fri, 22 Aug 2014 08:55:21 +1000 Date: Fri, 22 Aug 2014 08:55:21 +1000 From: Dave Chinner To: Eric Sandeen Cc: xfs-oss Subject: Re: [PATCH V2] xfsprogs: use ASSERT_ALWAYS for impossible switch case Message-ID: <20140821225521.GR26465@dastard> X-ASG-Orig-Subj: Re: [PATCH V2] xfsprogs: use ASSERT_ALWAYS for impossible switch case References: <53F62D12.8010505@sandeen.net> <53F639F6.6050905@sandeen.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <53F639F6.6050905@sandeen.net> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1408661722 X-Barracuda-URL: http://192.48.176.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.8706 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Thu, Aug 21, 2014 at 01:27:02PM -0500, Eric Sandeen wrote: > The original reason for the expletive below has been lost > in the mists of time, but at any rate, ASSERT() goes away in > libxfs, and this leads static analysis checkers to believe that > XFS_BTNUM_MAX is possible, and that we might overflow an array > later when using it as an index. > > We can shut this up and mark it as truly impossible by adding > a userspace definition for ASSERT_ALWAYS and using it. > > Signed-off-by: Eric Sandeen > --- > > V2: do it in a kernel-compatible way. > > diff --git a/include/xfs_btree.h b/include/xfs_btree.h > index 2590d40..f24f787 100644 > --- a/include/xfs_btree.h > +++ b/include/xfs_btree.h > @@ -69,7 +69,7 @@ do { \ > 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; \ > + case XFS_BTNUM_MAX: ASSERT_ALWAYS(0); /* fucking gcc */ ; break; \ > } \ > } while (0) > > @@ -83,7 +83,7 @@ do { \ > 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; \ > + case XFS_BTNUM_MAX: ASSERT_ALWAYS(0); /* fucking gcc */ ; break; \ > } \ > } while (0) Which we don't want in kernel space, because we want that case to be optimised out by the compiler for production kernels.... What we should really do is properly abstract the btree stats structure and put a pointer into the cursor so that the switch statement can go away.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From sandeen@redhat.com Thu Aug 21 19:51: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 C79357F53 for ; Thu, 21 Aug 2014 19:51:55 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id A70E48F804B for ; Thu, 21 Aug 2014 17:51:52 -0700 (PDT) X-ASG-Debug-ID: 1408668711-04bdf010971d32e0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id c3CeV1g5YXjbqtxM (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 21 Aug 2014 17:51:51 -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-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 s7M0ppvt021167 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK) for ; Thu, 21 Aug 2014 20:51:51 -0400 Received: from liberator.sandeen.net (ovpn01.gateway.prod.ext.phx2.redhat.com [10.5.9.1]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s7M0pnnr026609 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES128-SHA bits=128 verify=NO) for ; Thu, 21 Aug 2014 20:51:50 -0400 Message-ID: <53F6942B.80808@redhat.com> Date: Thu, 21 Aug 2014 19:51:55 -0500 From: Eric Sandeen MIME-Version: 1.0 To: xfs-oss Subject: [PATCH 0/4] xfs: more code refactoring Content-Type: text/plain; charset=ISO-8859-1 X-ASG-Orig-Subj: [PATCH 0/4] xfs: more code refactoring Content-Transfer-Encoding: 7bit X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1408668711 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 combine some directory & rt code which was cut&paste long ago... libxfs/xfs_dir2.c | 67 +++--------------- libxfs/xfs_dir2.h | 2 libxfs/xfs_rtbitmap.c | 45 ++++++++++-- xfs_file.c | 178 ++++++++++++++------------------------------------ xfs_inode.c | 24 ++++-- xfs_log_recover.c | 83 ++++++++--------------- xfs_rtalloc.c | 55 --------------- xfs_rtalloc.h | 4 + xfs_symlink.c | 8 +- 9 files changed, 158 insertions(+), 308 deletions(-) From sandeen@sandeen.net Thu Aug 21 19:55: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=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 79BF17F53 for ; Thu, 21 Aug 2014 19:55:21 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 593B3304062 for ; Thu, 21 Aug 2014 17:55:17 -0700 (PDT) X-ASG-Debug-ID: 1408668915-04cb6c550025a180001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id KI3fedTMBwALi3JG for ; Thu, 21 Aug 2014 17:55:16 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1 with cipher DHE-RSA-AES128-SHA (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 96844602D4F3; Thu, 21 Aug 2014 19:55:15 -0500 (CDT) Message-ID: <53F694F9.9030406@sandeen.net> Date: Thu, 21 Aug 2014 19:55:21 -0500 From: Eric Sandeen MIME-Version: 1.0 To: Eric Sandeen , xfs-oss Subject: [PATCH 1/4] xfs: check resblks before calling xfs_dir_canenter References: <53F6942B.80808@redhat.com> X-ASG-Orig-Subj: [PATCH 1/4] xfs: check resblks before calling xfs_dir_canenter In-Reply-To: <53F6942B.80808@redhat.com> 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: 1408668915 X-Barracuda-URL: http://192.48.176.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.8709 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Move the resblks test out of the xfs_dir_canenter, and into the caller. This makes a little more sense on the face of it; xfs_dir_canenter immediately returns if resblks !=0; and given some of the comments preceding the calls: * Check for ability to enter directory entry, if no space reserved. even more so. It also facilitates the next patch. Signed-off-by: Eric Sandeen --- diff --git a/fs/xfs/libxfs/xfs_dir2.c b/fs/xfs/libxfs/xfs_dir2.c index 6cef221..ea84e1c 100644 --- a/fs/xfs/libxfs/xfs_dir2.c +++ b/fs/xfs/libxfs/xfs_dir2.c @@ -535,22 +535,17 @@ out_free: /* * See if this entry can be added to the directory without allocating space. - * First checks that the caller couldn't reserve enough space (resblks = 0). */ int xfs_dir_canenter( xfs_trans_t *tp, xfs_inode_t *dp, - struct xfs_name *name, /* name of entry to add */ - uint resblks) + struct xfs_name *name) /* name of entry to add */ { struct xfs_da_args *args; int rval; int v; /* type-checking value */ - if (resblks) - return 0; - ASSERT(S_ISDIR(dp->i_d.di_mode)); args = kmem_zalloc(sizeof(*args), KM_SLEEP | KM_NOFS); diff --git a/fs/xfs/libxfs/xfs_dir2.h b/fs/xfs/libxfs/xfs_dir2.h index c8e86b0..4dff261 100644 --- a/fs/xfs/libxfs/xfs_dir2.h +++ b/fs/xfs/libxfs/xfs_dir2.h @@ -136,7 +136,7 @@ extern int xfs_dir_replace(struct xfs_trans *tp, struct xfs_inode *dp, xfs_fsblock_t *first, struct xfs_bmap_free *flist, xfs_extlen_t tot); extern int xfs_dir_canenter(struct xfs_trans *tp, struct xfs_inode *dp, - struct xfs_name *name, uint resblks); + struct xfs_name *name); /* * Direct call from the bmap code, bypassing the generic directory layer. diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c index fea3c92..c92cb48 100644 --- a/fs/xfs/xfs_inode.c +++ b/fs/xfs/xfs_inode.c @@ -1153,9 +1153,11 @@ xfs_create( if (error) goto out_trans_cancel; - error = xfs_dir_canenter(tp, dp, name, resblks); - if (error) - goto out_trans_cancel; + if (!resblks) { + error = xfs_dir_canenter(tp, dp, name); + if (error) + goto out_trans_cancel; + } /* * A newly created regular or special file just has one directory @@ -1421,9 +1423,11 @@ xfs_link( goto error_return; } - error = xfs_dir_canenter(tp, tdp, target_name, resblks); - if (error) - goto error_return; + if (!resblks) { + error = xfs_dir_canenter(tp, tdp, target_name); + if (error) + goto error_return; + } xfs_bmap_init(&free_list, &first_block); @@ -2759,9 +2763,11 @@ xfs_rename( * If there's no space reservation, check the entry will * fit before actually inserting it. */ - error = xfs_dir_canenter(tp, target_dp, target_name, spaceres); - if (error) - goto error_return; + if (!spaceres) { + error = xfs_dir_canenter(tp, target_dp, target_name); + if (error) + goto error_return; + } /* * If target does not exist and the rename crosses * directories, adjust the target directory link count diff --git a/fs/xfs/xfs_symlink.c b/fs/xfs/xfs_symlink.c index 6a944a2..02ae62a 100644 --- a/fs/xfs/xfs_symlink.c +++ b/fs/xfs/xfs_symlink.c @@ -269,9 +269,11 @@ xfs_symlink( /* * Check for ability to enter directory entry, if no space reserved. */ - error = xfs_dir_canenter(tp, dp, link_name, resblks); - if (error) - goto error_return; + if (!resblks) { + error = xfs_dir_canenter(tp, dp, link_name); + if (error) + goto error_return; + } /* * Initialize the bmap freelist prior to calling either * bmapi or the directory create code. From sandeen@sandeen.net Thu Aug 21 19:58: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=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 08E977F53 for ; Thu, 21 Aug 2014 19:58:39 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id E8FFD304062 for ; Thu, 21 Aug 2014 17:58:38 -0700 (PDT) X-ASG-Debug-ID: 1408669117-04cb6c54fd25a2a0001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id AEKZGFn6GH67c15Z for ; Thu, 21 Aug 2014 17:58:37 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1 with cipher DHE-RSA-AES128-SHA (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 485B3602D4F3; Thu, 21 Aug 2014 19:58:37 -0500 (CDT) Message-ID: <53F695C3.1020607@sandeen.net> Date: Thu, 21 Aug 2014 19:58:43 -0500 From: Eric Sandeen MIME-Version: 1.0 To: Eric Sandeen , xfs-oss Subject: [PATCH 2/4] xfs: combine xfs_dir_canenter into xfs_dir_createname References: <53F6942B.80808@redhat.com> X-ASG-Orig-Subj: [PATCH 2/4] xfs: combine xfs_dir_canenter into xfs_dir_createname In-Reply-To: <53F6942B.80808@redhat.com> 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: 1408669117 X-Barracuda-URL: http://192.48.176.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.8709 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- xfs_dir_canenter and xfs_dir_createname are almost identical. Fold the former into the latter, with a helpful wrapper for the former. If createname is called without an inode number, it now only checks for space, and does not actually add the entry. Signed-off-by: Eric Sandeen --- diff --git a/fs/xfs/libxfs/xfs_dir2.c b/fs/xfs/libxfs/xfs_dir2.c index ea84e1c..fdd391f 100644 --- a/fs/xfs/libxfs/xfs_dir2.c +++ b/fs/xfs/libxfs/xfs_dir2.c @@ -237,7 +237,8 @@ xfs_dir_init( } /* - Enter a name in a directory. + * Enter a name in a directory. + * If inum is 0, only test for available space. */ int xfs_dir_createname( @@ -254,10 +255,12 @@ xfs_dir_createname( int v; /* type-checking value */ ASSERT(S_ISDIR(dp->i_d.di_mode)); - rval = xfs_dir_ino_validate(tp->t_mountp, inum); - if (rval) - return rval; - XFS_STATS_INC(xs_dir_create); + if (inum) { + rval = xfs_dir_ino_validate(tp->t_mountp, inum); + if (rval) + return rval; + XFS_STATS_INC(xs_dir_create); + } args = kmem_zalloc(sizeof(*args), KM_SLEEP | KM_NOFS); if (!args) @@ -276,6 +279,8 @@ xfs_dir_createname( args->whichfork = XFS_DATA_FORK; args->trans = tp; args->op_flags = XFS_DA_OP_ADDNAME | XFS_DA_OP_OKNOENT; + if (!inum) + args->op_flags |= XFS_DA_OP_JUSTCHECK; if (dp->i_d.di_format == XFS_DINODE_FMT_LOCAL) { rval = xfs_dir2_sf_addname(args); @@ -542,50 +547,7 @@ xfs_dir_canenter( xfs_inode_t *dp, struct xfs_name *name) /* name of entry to add */ { - struct xfs_da_args *args; - int rval; - int v; /* type-checking value */ - - ASSERT(S_ISDIR(dp->i_d.di_mode)); - - args = kmem_zalloc(sizeof(*args), KM_SLEEP | KM_NOFS); - if (!args) - return -ENOMEM; - - args->geo = dp->i_mount->m_dir_geo; - args->name = name->name; - args->namelen = name->len; - args->filetype = name->type; - args->hashval = dp->i_mount->m_dirnameops->hashname(name); - args->dp = dp; - args->whichfork = XFS_DATA_FORK; - args->trans = tp; - args->op_flags = XFS_DA_OP_JUSTCHECK | XFS_DA_OP_ADDNAME | - XFS_DA_OP_OKNOENT; - - if (dp->i_d.di_format == XFS_DINODE_FMT_LOCAL) { - rval = xfs_dir2_sf_addname(args); - goto out_free; - } - - rval = xfs_dir2_isblock(args, &v); - if (rval) - goto out_free; - if (v) { - rval = xfs_dir2_block_addname(args); - goto out_free; - } - - rval = xfs_dir2_isleaf(args, &v); - if (rval) - goto out_free; - if (v) - rval = xfs_dir2_leaf_addname(args); - else - rval = xfs_dir2_node_addname(args); -out_free: - kmem_free(args); - return rval; + return xfs_dir_createname(tp, dp, name, 0, NULL, NULL, 0); } /* From sandeen@sandeen.net Thu Aug 21 20:00: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 E91917F53 for ; Thu, 21 Aug 2014 20:00:41 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 670C7AC002 for ; Thu, 21 Aug 2014 18:00:41 -0700 (PDT) X-ASG-Debug-ID: 1408669239-04cbb054882af250001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id bIToUep8HaaYneYD for ; Thu, 21 Aug 2014 18:00:39 -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 59460602D4F3; Thu, 21 Aug 2014 20:00:39 -0500 (CDT) Message-ID: <53F6963D.9090500@sandeen.net> Date: Thu, 21 Aug 2014 20:00:45 -0500 From: Eric Sandeen MIME-Version: 1.0 To: Eric Sandeen , xfs-oss Subject: [PATCH 3/4] xfs: combine xfs_rtmodify_summary and xfs_rtget_summary References: <53F6942B.80808@redhat.com> X-ASG-Orig-Subj: [PATCH 3/4] xfs: combine xfs_rtmodify_summary and xfs_rtget_summary In-Reply-To: <53F6942B.80808@redhat.com> 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: 1408669239 X-Barracuda-URL: http://192.48.176.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.8709 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- xfs_rtmodify_summary and xfs_rtget_summary are almost identical; fold them into xfs_rtmodify_summary_int(), with wrappers for each of the original calls. The _int function modifies if a delta is passed, and returns a summary pointer if *sum is passed. Signed-off-by: Eric Sandeen --- diff --git a/fs/xfs/libxfs/xfs_rtbitmap.c b/fs/xfs/libxfs/xfs_rtbitmap.c index f4dd697..50e3b93 100644 --- a/fs/xfs/libxfs/xfs_rtbitmap.c +++ b/fs/xfs/libxfs/xfs_rtbitmap.c @@ -424,20 +424,24 @@ xfs_rtfind_forw( } /* - * Read and modify the summary information for a given extent size, + * Read and/or modify the summary information for a given extent size, * bitmap block combination. * Keeps track of a current summary block, so we don't keep reading * it from the buffer cache. + * + * Summary information is returned in *sum if specified. + * If no delta is specified, returns summary only. */ int -xfs_rtmodify_summary( - xfs_mount_t *mp, /* file system mount point */ +xfs_rtmodify_summary_int( + xfs_mount_t *mp, /* file system mount structure */ xfs_trans_t *tp, /* transaction pointer */ int log, /* log2 of extent size */ xfs_rtblock_t bbno, /* bitmap block number */ int delta, /* change to make to summary info */ xfs_buf_t **rbpp, /* in/out: summary block buffer */ - xfs_fsblock_t *rsb) /* in/out: summary block number */ + xfs_fsblock_t *rsb, /* in/out: summary block number */ + xfs_suminfo_t *sum) /* out: summary info for this block */ { xfs_buf_t *bp; /* buffer for the summary block */ int error; /* error value */ @@ -480,15 +484,40 @@ xfs_rtmodify_summary( } } /* - * Point to the summary information, modify and log it. + * Point to the summary information, modify/log it, and/or copy it out. */ sp = XFS_SUMPTR(mp, bp, so); - *sp += delta; - xfs_trans_log_buf(tp, bp, (uint)((char *)sp - (char *)bp->b_addr), - (uint)((char *)sp - (char *)bp->b_addr + sizeof(*sp) - 1)); + if (delta) { + uint first = (uint)((char *)sp - (char *)bp->b_addr); + + *sp += delta; + xfs_trans_log_buf(tp, bp, first, first + sizeof(*sp) - 1); + } + if (sum) { + /* + * Drop the buffer if we're not asked to remember it. + */ + if (!rbpp) + xfs_trans_brelse(tp, bp); + *sum = *sp; + } return 0; } +int +xfs_rtmodify_summary( + xfs_mount_t *mp, /* file system mount structure */ + xfs_trans_t *tp, /* transaction pointer */ + int log, /* log2 of extent size */ + xfs_rtblock_t bbno, /* bitmap block number */ + int delta, /* change to make to summary info */ + xfs_buf_t **rbpp, /* in/out: summary block buffer */ + xfs_fsblock_t *rsb) /* in/out: summary block number */ +{ + return xfs_rtmodify_summary_int(mp, tp, log, bbno, + delta, rbpp, rsb, NULL); +} + /* * Set the given range of bitmap bits to the given value. * Do whatever I/O and logging is required. diff --git a/fs/xfs/xfs_rtalloc.c b/fs/xfs/xfs_rtalloc.c index 909e143..d1160cc 100644 --- a/fs/xfs/xfs_rtalloc.c +++ b/fs/xfs/xfs_rtalloc.c @@ -46,7 +46,7 @@ * Keeps track of a current summary block, so we don't keep reading * it from the buffer cache. */ -STATIC int /* error */ +int xfs_rtget_summary( xfs_mount_t *mp, /* file system mount structure */ xfs_trans_t *tp, /* transaction pointer */ @@ -56,60 +56,9 @@ xfs_rtget_summary( xfs_fsblock_t *rsb, /* in/out: summary block number */ xfs_suminfo_t *sum) /* out: summary info for this block */ { - xfs_buf_t *bp; /* buffer for summary block */ - int error; /* error value */ - xfs_fsblock_t sb; /* summary fsblock */ - int so; /* index into the summary file */ - xfs_suminfo_t *sp; /* pointer to returned data */ - - /* - * Compute entry number in the summary file. - */ - so = XFS_SUMOFFS(mp, log, bbno); - /* - * Compute the block number in the summary file. - */ - sb = XFS_SUMOFFSTOBLOCK(mp, so); - /* - * If we have an old buffer, and the block number matches, use that. - */ - if (rbpp && *rbpp && *rsb == sb) - bp = *rbpp; - /* - * Otherwise we have to get the buffer. - */ - else { - /* - * If there was an old one, get rid of it first. - */ - if (rbpp && *rbpp) - xfs_trans_brelse(tp, *rbpp); - error = xfs_rtbuf_get(mp, tp, sb, 1, &bp); - if (error) { - return error; - } - /* - * Remember this buffer and block for the next call. - */ - if (rbpp) { - *rbpp = bp; - *rsb = sb; - } - } - /* - * Point to the summary information & copy it out. - */ - sp = XFS_SUMPTR(mp, bp, so); - *sum = *sp; - /* - * Drop the buffer if we're not asked to remember it. - */ - if (!rbpp) - xfs_trans_brelse(tp, bp); - return 0; + return xfs_rtmodify_summary_int(mp, tp, log, bbno, 0, rbpp, rsb, sum); } - /* * Return whether there are any free extents in the size range given * by low and high, for the bitmap block bbno. diff --git a/fs/xfs/xfs_rtalloc.h b/fs/xfs/xfs_rtalloc.h index c642795..76c0a4a 100644 --- a/fs/xfs/xfs_rtalloc.h +++ b/fs/xfs/xfs_rtalloc.h @@ -111,6 +111,10 @@ int xfs_rtfind_forw(struct xfs_mount *mp, struct xfs_trans *tp, xfs_rtblock_t *rtblock); int xfs_rtmodify_range(struct xfs_mount *mp, struct xfs_trans *tp, xfs_rtblock_t start, xfs_extlen_t len, int val); +int xfs_rtmodify_summary_int(struct xfs_mount *mp, struct xfs_trans *tp, + int log, xfs_rtblock_t bbno, int delta, + xfs_buf_t **rbpp, xfs_fsblock_t *rsb, + xfs_suminfo_t *sum); int xfs_rtmodify_summary(struct xfs_mount *mp, struct xfs_trans *tp, int log, xfs_rtblock_t bbno, int delta, xfs_buf_t **rbpp, xfs_fsblock_t *rsb); From sandeen@sandeen.net Thu Aug 21 20:03: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 (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id AB2D57F53 for ; Thu, 21 Aug 2014 20:03:18 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 3B282AC002 for ; Thu, 21 Aug 2014 18:03:15 -0700 (PDT) X-ASG-Debug-ID: 1408669393-04cb6c54ff25a4a0001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id 6QrhAoZAk8lAJBCf for ; Thu, 21 Aug 2014 18:03:13 -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 98E566096EF1; Thu, 21 Aug 2014 20:03:13 -0500 (CDT) Message-ID: <53F696D7.2030906@sandeen.net> Date: Thu, 21 Aug 2014 20:03:19 -0500 From: Eric Sandeen MIME-Version: 1.0 To: Eric Sandeen , xfs-oss Subject: [PATCH 4/4] xfs: remove rbpp check from xfs_rtmodify_summary_int References: <53F6942B.80808@redhat.com> X-ASG-Orig-Subj: [PATCH 4/4] xfs: remove rbpp check from xfs_rtmodify_summary_int In-Reply-To: <53F6942B.80808@redhat.com> 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: 1408669393 X-Barracuda-URL: http://192.48.176.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.8709 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- rbpp is always passed into xfs_rtmodify_summary and xfs_rtget_summary, so there is no need to test for it in xfs_rtmodify_summary_int. Signed-off-by: Eric Sandeen --- diff --git a/fs/xfs/libxfs/xfs_rtbitmap.c b/fs/xfs/libxfs/xfs_rtbitmap.c index 50e3b93..7c818f1 100644 --- a/fs/xfs/libxfs/xfs_rtbitmap.c +++ b/fs/xfs/libxfs/xfs_rtbitmap.c @@ -460,7 +460,7 @@ xfs_rtmodify_summary_int( /* * If we have an old buffer, and the block number matches, use that. */ - if (rbpp && *rbpp && *rsb == sb) + if (*rbpp && *rsb == sb) bp = *rbpp; /* * Otherwise we have to get the buffer. @@ -469,7 +469,7 @@ xfs_rtmodify_summary_int( /* * If there was an old one, get rid of it first. */ - if (rbpp && *rbpp) + if (*rbpp) xfs_trans_brelse(tp, *rbpp); error = xfs_rtbuf_get(mp, tp, sb, 1, &bp); if (error) { @@ -478,10 +478,8 @@ xfs_rtmodify_summary_int( /* * Remember this buffer and block for the next call. */ - if (rbpp) { - *rbpp = bp; - *rsb = sb; - } + *rbpp = bp; + *rsb = sb; } /* * Point to the summary information, modify/log it, and/or copy it out. @@ -493,14 +491,8 @@ xfs_rtmodify_summary_int( *sp += delta; xfs_trans_log_buf(tp, bp, first, first + sizeof(*sp) - 1); } - if (sum) { - /* - * Drop the buffer if we're not asked to remember it. - */ - if (!rbpp) - xfs_trans_brelse(tp, bp); + if (sum) *sum = *sp; - } return 0; } From bfoster@redhat.com Fri Aug 22 06:41: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 5A8627F53 for ; Fri, 22 Aug 2014 06:41:13 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 49292304081 for ; Fri, 22 Aug 2014 04:41:10 -0700 (PDT) X-ASG-Debug-ID: 1408707668-04cb6c54fd3b5a40001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id Xc8yZp45MIDd9g6X (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 22 Aug 2014 04:41:09 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx14.intmail.prod.int.phx2.redhat.com (int-mx14.intmail.prod.int.phx2.redhat.com [10.5.11.27]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s7MBf6wo001080 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Fri, 22 Aug 2014 07:41:06 -0400 Received: from laptop.bfoster (vpn-61-227.rdu2.redhat.com [10.10.61.227]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s7MBf3V2004125 (version=TLSv1/SSLv3 cipher=AES128-GCM-SHA256 bits=128 verify=NO); Fri, 22 Aug 2014 07:41:05 -0400 Date: Fri, 22 Aug 2014 07:35:41 -0400 From: Brian Foster To: Eric Sandeen Cc: Eric Sandeen , xfs-oss , Jeff Liu Subject: Re: [PATCH V2] xfs: combine xfs_seek_hole & xfs_seek_data Message-ID: <20140822113541.GD3152@laptop.bfoster> X-ASG-Orig-Subj: Re: [PATCH V2] xfs: combine xfs_seek_hole & xfs_seek_data References: <53F55765.6030205@redhat.com> <53F64723.4070001@sandeen.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <53F64723.4070001@sandeen.net> User-Agent: Mutt/1.5.23 (2014-03-12) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.27 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1408707668 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Thu, Aug 21, 2014 at 02:23:15PM -0500, Eric Sandeen wrote: > xfs_seek_hole & xfs_seek_data are remarkably similar; > so much so that they can be combined, saving a fair > bit of semi-complex code duplication. > > The following patch passes generic/285 and generic/286, > which specifically test seek behavior. > > Signed-off-by: Eric Sandeen > --- Looks good to me: Reviewed-by: Brian Foster > > V2: comment update as suggested by Brian > > diff --git a/fs/xfs/xfs_file.c b/fs/xfs/xfs_file.c > index 076b170..1da3b7d 100644 > --- a/fs/xfs/xfs_file.c > +++ b/fs/xfs/xfs_file.c > @@ -964,7 +964,7 @@ xfs_vm_page_mkwrite( > > /* > * This type is designed to indicate the type of offset we would like > - * to search from page cache for either xfs_seek_data() or xfs_seek_hole(). > + * to search from page cache for xfs_seek_hole_data(). > */ > enum { > HOLE_OFF = 0, > @@ -1021,7 +1021,7 @@ xfs_lookup_buffer_offset( > /* > * This routine is called to find out and return a data or hole offset > * from the page cache for unwritten extents according to the desired > - * type for xfs_seek_data() or xfs_seek_hole(). > + * type for xfs_seek_hole_data(). > * > * The argument offset is used to tell where we start to search from the > * page cache. Map is used to figure out the end points of the range to > @@ -1181,9 +1181,10 @@ out: > } > > STATIC loff_t > -xfs_seek_data( > +xfs_seek_hole_data( > struct file *file, > - loff_t start) > + loff_t start, > + int whence) > { > struct inode *inode = file->f_mapping->host; > struct xfs_inode *ip = XFS_I(inode); > @@ -1195,6 +1196,9 @@ xfs_seek_data( > uint lock; > int error; > > + if (XFS_FORCED_SHUTDOWN(mp)) > + return -EIO; > + > lock = xfs_ilock_data_map_shared(ip); > > isize = i_size_read(inode); > @@ -1209,6 +1213,7 @@ xfs_seek_data( > */ > fsbno = XFS_B_TO_FSBT(mp, start); > end = XFS_B_TO_FSB(mp, isize); > + > for (;;) { > struct xfs_bmbt_irec map[2]; > int nmap = 2; > @@ -1229,29 +1234,48 @@ xfs_seek_data( > offset = max_t(loff_t, start, > XFS_FSB_TO_B(mp, map[i].br_startoff)); > > - /* Landed in a data extent */ > - if (map[i].br_startblock == DELAYSTARTBLOCK || > - (map[i].br_state == XFS_EXT_NORM && > - !isnullstartblock(map[i].br_startblock))) > + /* Landed in the hole we wanted? */ > + if (whence == SEEK_HOLE && > + map[i].br_startblock == HOLESTARTBLOCK) > + goto out; > + > + /* Landed in the data extent we wanted? */ > + if (whence == SEEK_DATA && > + (map[i].br_startblock == DELAYSTARTBLOCK || > + (map[i].br_state == XFS_EXT_NORM && > + !isnullstartblock(map[i].br_startblock)))) > goto out; > > /* > - * Landed in an unwritten extent, try to search data > - * from page cache. > + * Landed in an unwritten extent, try to search > + * for hole or data from page cache. > */ > if (map[i].br_state == XFS_EXT_UNWRITTEN) { > if (xfs_find_get_desired_pgoff(inode, &map[i], > - DATA_OFF, &offset)) > + whence == SEEK_HOLE ? HOLE_OFF : DATA_OFF, > + &offset)) > goto out; > } > } > > /* > - * map[0] is hole or its an unwritten extent but > - * without data in page cache. Probably means that > - * we are reading after EOF if nothing in map[1]. > + * We only received one extent out of the two requested. This > + * means we've hit EOF and didn't find what we are looking for. > */ > if (nmap == 1) { > + /* > + * If we were looking for a hole, set offset to > + * the end of the file (i.e., there is an implicit > + * hole at the end of any file). > + */ > + if (whence == SEEK_HOLE) { > + offset = isize; > + break; > + } > + /* > + * If we were looking for data, it's nowhere to be found > + */ > + ASSERT(whence == SEEK_DATA); > error = -ENXIO; > goto out_unlock; > } > @@ -1260,125 +1284,30 @@ xfs_seek_data( > > /* > * Nothing was found, proceed to the next round of search > - * if reading offset not beyond or hit EOF. > + * if the next reading offset is not at or beyond EOF. > */ > fsbno = map[i - 1].br_startoff + map[i - 1].br_blockcount; > start = XFS_FSB_TO_B(mp, fsbno); > if (start >= isize) { > + if (whence == SEEK_HOLE) { > + offset = isize; > + break; > + } > + ASSERT(whence == SEEK_DATA); > error = -ENXIO; > goto out_unlock; > } > } > > out: > - offset = vfs_setpos(file, offset, inode->i_sb->s_maxbytes); > - > -out_unlock: > - xfs_iunlock(ip, lock); > - > - if (error) > - return error; > - return offset; > -} > - > -STATIC loff_t > -xfs_seek_hole( > - struct file *file, > - loff_t start) > -{ > - struct inode *inode = file->f_mapping->host; > - struct xfs_inode *ip = XFS_I(inode); > - struct xfs_mount *mp = ip->i_mount; > - loff_t uninitialized_var(offset); > - xfs_fsize_t isize; > - xfs_fileoff_t fsbno; > - xfs_filblks_t end; > - uint lock; > - int error; > - > - if (XFS_FORCED_SHUTDOWN(mp)) > - return -EIO; > - > - lock = xfs_ilock_data_map_shared(ip); > - > - isize = i_size_read(inode); > - if (start >= isize) { > - error = -ENXIO; > - goto out_unlock; > - } > - > - fsbno = XFS_B_TO_FSBT(mp, start); > - end = XFS_B_TO_FSB(mp, isize); > - > - for (;;) { > - struct xfs_bmbt_irec map[2]; > - int nmap = 2; > - unsigned int i; > - > - error = xfs_bmapi_read(ip, fsbno, end - fsbno, map, &nmap, > - XFS_BMAPI_ENTIRE); > - if (error) > - goto out_unlock; > - > - /* No extents at given offset, must be beyond EOF */ > - if (nmap == 0) { > - error = -ENXIO; > - goto out_unlock; > - } > - > - for (i = 0; i < nmap; i++) { > - offset = max_t(loff_t, start, > - XFS_FSB_TO_B(mp, map[i].br_startoff)); > - > - /* Landed in a hole */ > - if (map[i].br_startblock == HOLESTARTBLOCK) > - goto out; > - > - /* > - * Landed in an unwritten extent, try to search hole > - * from page cache. > - */ > - if (map[i].br_state == XFS_EXT_UNWRITTEN) { > - if (xfs_find_get_desired_pgoff(inode, &map[i], > - HOLE_OFF, &offset)) > - goto out; > - } > - } > - > - /* > - * map[0] contains data or its unwritten but contains > - * data in page cache, probably means that we are > - * reading after EOF. We should fix offset to point > - * to the end of the file(i.e., there is an implicit > - * hole at the end of any file). > - */ > - if (nmap == 1) { > - offset = isize; > - break; > - } > - > - ASSERT(i > 1); > - > - /* > - * Both mappings contains data, proceed to the next round of > - * search if the current reading offset not beyond or hit EOF. > - */ > - fsbno = map[i - 1].br_startoff + map[i - 1].br_blockcount; > - start = XFS_FSB_TO_B(mp, fsbno); > - if (start >= isize) { > - offset = isize; > - break; > - } > - } > - > -out: > /* > - * At this point, we must have found a hole. However, the returned > + * If at this point we have found the hole we wanted, the returned > * offset may be bigger than the file size as it may be aligned to > - * page boundary for unwritten extents, we need to deal with this > + * page boundary for unwritten extents. We need to deal with this > * situation in particular. > */ > - offset = min_t(loff_t, offset, isize); > + if (whence == SEEK_HOLE) > + offset = min_t(loff_t, offset, isize); > offset = vfs_setpos(file, offset, inode->i_sb->s_maxbytes); > > out_unlock: > @@ -1400,10 +1329,9 @@ xfs_file_llseek( > case SEEK_CUR: > case SEEK_SET: > return generic_file_llseek(file, offset, origin); > - case SEEK_DATA: > - return xfs_seek_data(file, offset); > case SEEK_HOLE: > - return xfs_seek_hole(file, offset); > + case SEEK_DATA: > + return xfs_seek_hole_data(file, offset, origin); > default: > return -EINVAL; > } > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From bfoster@redhat.com Fri Aug 22 06:41: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 EDB887F58 for ; Fri, 22 Aug 2014 06:41:20 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id DC9518F8052 for ; Fri, 22 Aug 2014 04:41:17 -0700 (PDT) X-ASG-Debug-ID: 1408707676-04cb6c54fd3b5eb0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id Zz9UrCGV2342gatg (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 22 Aug 2014 04:41: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 s7MBfFMk001119 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Fri, 22 Aug 2014 07:41:15 -0400 Received: from laptop.bfoster (vpn-61-227.rdu2.redhat.com [10.10.61.227]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s7MBfCi2018584 (version=TLSv1/SSLv3 cipher=AES128-GCM-SHA256 bits=128 verify=NO); Fri, 22 Aug 2014 07:41:14 -0400 Date: Fri, 22 Aug 2014 07:35:50 -0400 From: Brian Foster To: Eric Sandeen Cc: Eric Sandeen , xfs-oss , Jeff Liu Subject: Re: [PATCH] xfs: lseek: the "whence" argument is called "whence" Message-ID: <20140822113550.GE3152@laptop.bfoster> X-ASG-Orig-Subj: Re: [PATCH] xfs: lseek: the "whence" argument is called "whence" References: <53F55765.6030205@redhat.com> <53F64723.4070001@sandeen.net> <53F648CC.9080604@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <53F648CC.9080604@redhat.com> User-Agent: Mutt/1.5.23 (2014-03-12) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.26 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1408707677 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Thu, Aug 21, 2014 at 02:30:20PM -0500, Eric Sandeen wrote: > For some reason, the older commit: > > 965c8e5 lseek: the "whence" argument is called "whence" > > lseek: the "whence" argument is called "whence" > > But the kernel decided to call it "origin" instead. > Fix most of the sites. > > left out xfs. So fix xfs. > > Signed-off-by: Eric Sandeen > --- Reviewed-by: Brian Foster > > diff --git a/fs/xfs/xfs_file.c b/fs/xfs/xfs_file.c > index 1da3b7d..0fe36e4 100644 > --- a/fs/xfs/xfs_file.c > +++ b/fs/xfs/xfs_file.c > @@ -1322,16 +1322,16 @@ STATIC loff_t > xfs_file_llseek( > struct file *file, > loff_t offset, > - int origin) > + int whence) > { > - switch (origin) { > + switch (whence) { > case SEEK_END: > case SEEK_CUR: > case SEEK_SET: > - return generic_file_llseek(file, offset, origin); > + return generic_file_llseek(file, offset, whence); > case SEEK_HOLE: > case SEEK_DATA: > - return xfs_seek_hole_data(file, offset, origin); > + return xfs_seek_hole_data(file, offset, whence); > default: > return -EINVAL; > } > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From jeff.liu@oracle.com Fri Aug 22 06:50: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 (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 95E777F5E for ; Fri, 22 Aug 2014 06:50:45 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 23834AC005 for ; Fri, 22 Aug 2014 04:50:44 -0700 (PDT) X-ASG-Debug-ID: 1408708239-04cbb054855870a0001-NocioJ Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) by cuda.sgi.com with ESMTP id E8ilJEsfWymUWQbr (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 22 Aug 2014 04:50:39 -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 s7MBocOx003272 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Fri, 22 Aug 2014 11:50:38 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 s7MBobh4020247 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Fri, 22 Aug 2014 11:50:37 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 s7MBoagV020210; Fri, 22 Aug 2014 11:50:37 GMT Received: from [192.168.1.103] (/123.119.96.223) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Fri, 22 Aug 2014 04:50:35 -0700 Message-ID: <53F72E87.7060601@oracle.com> Date: Fri, 22 Aug 2014 19:50: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: Eric Sandeen , Eric Sandeen , xfs-oss Subject: Re: [PATCH V2] xfs: combine xfs_seek_hole & xfs_seek_data References: <53F55765.6030205@redhat.com> <53F64723.4070001@sandeen.net> X-ASG-Orig-Subj: Re: [PATCH V2] xfs: combine xfs_seek_hole & xfs_seek_data In-Reply-To: <53F64723.4070001@sandeen.net> 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: 1408708239 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.8720 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 08/22/2014 03:23 AM, Eric Sandeen wrote: > xfs_seek_hole & xfs_seek_data are remarkably similar; > so much so that they can be combined, saving a fair > bit of semi-complex code duplication. > > The following patch passes generic/285 and generic/286, > which specifically test seek behavior. > > Signed-off-by: Eric Sandeen Looks good to me. Reviewed-by: Jie Liu Cheers, -Jeff From jeff.liu@oracle.com Fri Aug 22 06:54: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 6C80C7F53 for ; Fri, 22 Aug 2014 06:54:39 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id ED650AC004 for ; Fri, 22 Aug 2014 04:54:38 -0700 (PDT) X-ASG-Debug-ID: 1408708476-04cb6c54fe3c42c0001-NocioJ Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) by cuda.sgi.com with ESMTP id U0vc7ZIKq9oksZNl (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 22 Aug 2014 04:54: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 s7MBsZha030739 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Fri, 22 Aug 2014 11:54:36 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 s7MBsYK8028308 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Fri, 22 Aug 2014 11:54:34 GMT Received: from abhmp0019.oracle.com (abhmp0019.oracle.com [141.146.116.25]) by aserz7022.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id s7MBsYwA027649; Fri, 22 Aug 2014 11:54:34 GMT Received: from [192.168.1.103] (/123.119.96.223) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Fri, 22 Aug 2014 04:54:33 -0700 Message-ID: <53F72F76.9080301@oracle.com> Date: Fri, 22 Aug 2014 19:54:30 +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: Eric Sandeen , Eric Sandeen CC: xfs-oss Subject: Re: [PATCH] xfs: lseek: the "whence" argument is called "whence" References: <53F55765.6030205@redhat.com> <53F64723.4070001@sandeen.net> <53F648CC.9080604@redhat.com> X-ASG-Orig-Subj: Re: [PATCH] xfs: lseek: the "whence" argument is called "whence" In-Reply-To: <53F648CC.9080604@redhat.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: 1408708477 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.8720 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 08/22/2014 03:30 AM, Eric Sandeen wrote: > For some reason, the older commit: > > 965c8e5 lseek: the "whence" argument is called "whence" > > lseek: the "whence" argument is called "whence" > > But the kernel decided to call it "origin" instead. > Fix most of the sites. > > left out xfs. So fix xfs. > > Signed-off-by: Eric Sandeen Looks good to me too. Reviewed-by: Jie Liu Cheers, -Jeff From bfoster@redhat.com Fri Aug 22 07:07: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 DE2787F53 for ; Fri, 22 Aug 2014 07:07:19 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 5E361AC003 for ; Fri, 22 Aug 2014 05:07:16 -0700 (PDT) X-ASG-Debug-ID: 1408709233-04cb6c54fd3c5e90001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id j8mlJpNxa6N6fxUC (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 22 Aug 2014 05:07:14 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-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 s7MC73r8016582 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Fri, 22 Aug 2014 08:07:03 -0400 Received: from laptop.bfoster (vpn-61-227.rdu2.redhat.com [10.10.61.227]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s7MC6xvo017692 (version=TLSv1/SSLv3 cipher=AES128-GCM-SHA256 bits=128 verify=NO); Fri, 22 Aug 2014 08:07:02 -0400 Date: Fri, 22 Aug 2014 08:06:59 -0400 From: Brian Foster To: Namjae Jeon Cc: Dave Chinner , "Theodore Ts'o" , linux-kernel@vger.kernel.org, xfs@oss.sgi.com, linux-fsdevel@vger.kernel.org, =?utf-8?B?THVrw6HFoQ==?= Czerner , linux-ext4 Subject: Re: [PATCH v5 2/10] xfs: Add support FALLOC_FL_INSERT_RANGE for fallocate Message-ID: <20140822120659.GF3152@laptop.bfoster> X-ASG-Orig-Subj: Re: [PATCH v5 2/10] xfs: Add support FALLOC_FL_INSERT_RANGE for fallocate References: <004301cfb2c6$6ef2d330$4cd87990$@samsung.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <004301cfb2c6$6ef2d330$4cd87990$@samsung.com> User-Agent: Mutt/1.5.23 (2014-03-12) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.27 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1408709234 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Fri, Aug 08, 2014 at 02:05:55PM +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. > > Signed-off-by: Namjae Jeon > Signed-off-by: Ashish Sangwan > Reviewed-by: Brian Foster > --- > Changelog > > v5: > - remove allocation part. > > 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/libxfs/xfs_bmap.c | 379 ++++++++++++++++++++++++++++++++++++++++++++++- > fs/xfs/libxfs/xfs_bmap.h | 9 +- > fs/xfs/xfs_bmap_util.c | 123 ++++++++++++++- > fs/xfs/xfs_bmap_util.h | 2 + > fs/xfs/xfs_file.c | 38 ++++- > fs/xfs/xfs_trace.h | 1 + > 6 files changed, 547 insertions(+), 5 deletions(-) > > diff --git a/fs/xfs/libxfs/xfs_bmap.c b/fs/xfs/libxfs/xfs_bmap.c > index de2d26d..62f5aa7 100644 > --- a/fs/xfs/libxfs/xfs_bmap.c > +++ b/fs/xfs/libxfs/xfs_bmap.c > @@ -5413,7 +5413,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, > @@ -5443,7 +5443,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 -EFSCORRUPTED; > } > @@ -5600,3 +5600,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 -EFSCORRUPTED; > + } > + > + if (XFS_FORCED_SHUTDOWN(mp)) > + return -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 -EFSCORRUPTED; > + } > + > + if (XFS_FORCED_SHUTDOWN(mp)) > + return -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 = -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/libxfs/xfs_bmap.h b/fs/xfs/libxfs/xfs_bmap.h > index b879ca5..135cf81 100644 > --- a/fs/xfs/libxfs/xfs_bmap.h > +++ b/fs/xfs/libxfs/xfs_bmap.h > @@ -177,10 +177,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 d32889a..815584e 100644 > --- a/fs/xfs/xfs_bmap_util.c > +++ b/fs/xfs/xfs_bmap_util.c > @@ -1505,7 +1505,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); > @@ -1529,6 +1529,127 @@ out: > } > > /* > + * xfs_insert_file_space() > + * This routine create hole space by shifting extents 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. > + * 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; > + } Hi Namjae, Sorry for finding things so late, but it looks like this suffers from the same couple bugs we've recently discovered with the collapse range patches. See the following for a couple fixes that have been proposed recently: http://oss.sgi.com/archives/xfs/2014-08/msg00292.html This one helps prevent scenarios where we try to cancel a transaction that is dirty. This leads to a shutdown on XFS. The idea is basically to avoid logging until we actually make a change, so errors hit early in the function (before we change anything) won't lead to an abort in the error path. It looks like the bmap split and shift functions in this patch could use the very same attention. http://oss.sgi.com/archives/xfs/2014-08/index.html This one deals with a problem with the high level shift algorithm. The problem with the algorithm here is that 'current_ext' can change unexpectedly once we release the ilock due to writeback on parts of the file before the range being collapsed/inserted. E.g., it is not a stable index once ilock is dropped. The temporary solution is to flush the entire file, since we have the iolock during the entire operation and nothing else can dirty the file. The better fix is to track via an offset across iterations of the shift, rather than the extent count (iirc, xfs_bunmapi() and other bmap functions provide examples of this kind of algorithm). Brian P.S., It's probably a good idea to remove my r-b tag on the next post as well to avoid confusion and remind me that I need to take another look at this. ;) Thanks again. > + > +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 2fdb72d..6cb116c 100644 > --- a/fs/xfs/xfs_bmap_util.h > +++ b/fs/xfs/xfs_bmap_util.h > @@ -98,6 +98,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 fcf91a2..09c82e7 100644 > --- a/fs/xfs/xfs_file.c > +++ b/fs/xfs/xfs_file.c > @@ -771,11 +771,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); > @@ -805,6 +807,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)) { > @@ -855,8 +879,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 to create a hole inside the file. 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 Fri Aug 22 08:19: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=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 E69947F53 for ; Fri, 22 Aug 2014 08:19:38 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id A3565304075 for ; Fri, 22 Aug 2014 06:19:35 -0700 (PDT) X-ASG-Debug-ID: 1408713574-04bdf010a137c100001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 029lzvy9hNrWcHSg (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 22 Aug 2014 06:19:34 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-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 s7MDJXxP015988 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Fri, 22 Aug 2014 09:19:33 -0400 Received: from laptop.bfoster (vpn-61-227.rdu2.redhat.com [10.10.61.227]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s7MDJVpu013367 (version=TLSv1/SSLv3 cipher=AES128-GCM-SHA256 bits=128 verify=NO); Fri, 22 Aug 2014 09:19:33 -0400 Date: Fri, 22 Aug 2014 09:19:31 -0400 From: Brian Foster To: Eric Sandeen Cc: Eric Sandeen , xfs-oss Subject: Re: [PATCH 1/4] xfs: check resblks before calling xfs_dir_canenter Message-ID: <20140822131930.GA3915@laptop.bfoster> X-ASG-Orig-Subj: Re: [PATCH 1/4] xfs: check resblks before calling xfs_dir_canenter References: <53F6942B.80808@redhat.com> <53F694F9.9030406@sandeen.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <53F694F9.9030406@sandeen.net> User-Agent: Mutt/1.5.23 (2014-03-12) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1408713574 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Thu, Aug 21, 2014 at 07:55:21PM -0500, Eric Sandeen wrote: > Move the resblks test out of the xfs_dir_canenter, > and into the caller. > > This makes a little more sense on the face of it; > xfs_dir_canenter immediately returns if resblks !=0; > and given some of the comments preceding the calls: > > * Check for ability to enter directory entry, if no space reserved. > > even more so. > > It also facilitates the next patch. > > Signed-off-by: Eric Sandeen > --- Reviewed-by: Brian Foster > > > diff --git a/fs/xfs/libxfs/xfs_dir2.c b/fs/xfs/libxfs/xfs_dir2.c > index 6cef221..ea84e1c 100644 > --- a/fs/xfs/libxfs/xfs_dir2.c > +++ b/fs/xfs/libxfs/xfs_dir2.c > @@ -535,22 +535,17 @@ out_free: > > /* > * See if this entry can be added to the directory without allocating space. > - * First checks that the caller couldn't reserve enough space (resblks = 0). > */ > int > xfs_dir_canenter( > xfs_trans_t *tp, > xfs_inode_t *dp, > - struct xfs_name *name, /* name of entry to add */ > - uint resblks) > + struct xfs_name *name) /* name of entry to add */ > { > struct xfs_da_args *args; > int rval; > int v; /* type-checking value */ > > - if (resblks) > - return 0; > - > ASSERT(S_ISDIR(dp->i_d.di_mode)); > > args = kmem_zalloc(sizeof(*args), KM_SLEEP | KM_NOFS); > diff --git a/fs/xfs/libxfs/xfs_dir2.h b/fs/xfs/libxfs/xfs_dir2.h > index c8e86b0..4dff261 100644 > --- a/fs/xfs/libxfs/xfs_dir2.h > +++ b/fs/xfs/libxfs/xfs_dir2.h > @@ -136,7 +136,7 @@ extern int xfs_dir_replace(struct xfs_trans *tp, struct xfs_inode *dp, > xfs_fsblock_t *first, > struct xfs_bmap_free *flist, xfs_extlen_t tot); > extern int xfs_dir_canenter(struct xfs_trans *tp, struct xfs_inode *dp, > - struct xfs_name *name, uint resblks); > + struct xfs_name *name); > > /* > * Direct call from the bmap code, bypassing the generic directory layer. > diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c > index fea3c92..c92cb48 100644 > --- a/fs/xfs/xfs_inode.c > +++ b/fs/xfs/xfs_inode.c > @@ -1153,9 +1153,11 @@ xfs_create( > if (error) > goto out_trans_cancel; > > - error = xfs_dir_canenter(tp, dp, name, resblks); > - if (error) > - goto out_trans_cancel; > + if (!resblks) { > + error = xfs_dir_canenter(tp, dp, name); > + if (error) > + goto out_trans_cancel; > + } > > /* > * A newly created regular or special file just has one directory > @@ -1421,9 +1423,11 @@ xfs_link( > goto error_return; > } > > - error = xfs_dir_canenter(tp, tdp, target_name, resblks); > - if (error) > - goto error_return; > + if (!resblks) { > + error = xfs_dir_canenter(tp, tdp, target_name); > + if (error) > + goto error_return; > + } > > xfs_bmap_init(&free_list, &first_block); > > @@ -2759,9 +2763,11 @@ xfs_rename( > * If there's no space reservation, check the entry will > * fit before actually inserting it. > */ > - error = xfs_dir_canenter(tp, target_dp, target_name, spaceres); > - if (error) > - goto error_return; > + if (!spaceres) { > + error = xfs_dir_canenter(tp, target_dp, target_name); > + if (error) > + goto error_return; > + } > /* > * If target does not exist and the rename crosses > * directories, adjust the target directory link count > diff --git a/fs/xfs/xfs_symlink.c b/fs/xfs/xfs_symlink.c > index 6a944a2..02ae62a 100644 > --- a/fs/xfs/xfs_symlink.c > +++ b/fs/xfs/xfs_symlink.c > @@ -269,9 +269,11 @@ xfs_symlink( > /* > * Check for ability to enter directory entry, if no space reserved. > */ > - error = xfs_dir_canenter(tp, dp, link_name, resblks); > - if (error) > - goto error_return; > + if (!resblks) { > + error = xfs_dir_canenter(tp, dp, link_name); > + if (error) > + goto error_return; > + } > /* > * Initialize the bmap freelist prior to calling either > * bmapi or the directory create code. > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From bfoster@redhat.com Fri Aug 22 08:19: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=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 02F017F58 for ; Fri, 22 Aug 2014 08:19:44 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id DAE83304053 for ; Fri, 22 Aug 2014 06:19:43 -0700 (PDT) X-ASG-Debug-ID: 1408713582-04cb6c54fd3fd420001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id ZKCzRT0s1UjfEE60 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 22 Aug 2014 06:19: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-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 s7MDJfRc008308 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Fri, 22 Aug 2014 09:19:41 -0400 Received: from laptop.bfoster (vpn-61-227.rdu2.redhat.com [10.10.61.227]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s7MDJdtK027691 (version=TLSv1/SSLv3 cipher=AES128-GCM-SHA256 bits=128 verify=NO); Fri, 22 Aug 2014 09:19:41 -0400 Date: Fri, 22 Aug 2014 09:19:39 -0400 From: Brian Foster To: Eric Sandeen Cc: Eric Sandeen , xfs-oss Subject: Re: [PATCH 2/4] xfs: combine xfs_dir_canenter into xfs_dir_createname Message-ID: <20140822131938.GB3915@laptop.bfoster> X-ASG-Orig-Subj: Re: [PATCH 2/4] xfs: combine xfs_dir_canenter into xfs_dir_createname References: <53F6942B.80808@redhat.com> <53F695C3.1020607@sandeen.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <53F695C3.1020607@sandeen.net> User-Agent: Mutt/1.5.23 (2014-03-12) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.24 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1408713582 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Thu, Aug 21, 2014 at 07:58:43PM -0500, Eric Sandeen wrote: > xfs_dir_canenter and xfs_dir_createname are > almost identical. > > Fold the former into the latter, with a helpful > wrapper for the former. If createname is called without > an inode number, it now only checks for space, and does > not actually add the entry. > > Signed-off-by: Eric Sandeen > --- Reviewed-by: Brian Foster > > diff --git a/fs/xfs/libxfs/xfs_dir2.c b/fs/xfs/libxfs/xfs_dir2.c > index ea84e1c..fdd391f 100644 > --- a/fs/xfs/libxfs/xfs_dir2.c > +++ b/fs/xfs/libxfs/xfs_dir2.c > @@ -237,7 +237,8 @@ xfs_dir_init( > } > > /* > - Enter a name in a directory. > + * Enter a name in a directory. > + * If inum is 0, only test for available space. > */ > int > xfs_dir_createname( > @@ -254,10 +255,12 @@ xfs_dir_createname( > int v; /* type-checking value */ > > ASSERT(S_ISDIR(dp->i_d.di_mode)); > - rval = xfs_dir_ino_validate(tp->t_mountp, inum); > - if (rval) > - return rval; > - XFS_STATS_INC(xs_dir_create); > + if (inum) { > + rval = xfs_dir_ino_validate(tp->t_mountp, inum); > + if (rval) > + return rval; > + XFS_STATS_INC(xs_dir_create); > + } > > args = kmem_zalloc(sizeof(*args), KM_SLEEP | KM_NOFS); > if (!args) > @@ -276,6 +279,8 @@ xfs_dir_createname( > args->whichfork = XFS_DATA_FORK; > args->trans = tp; > args->op_flags = XFS_DA_OP_ADDNAME | XFS_DA_OP_OKNOENT; > + if (!inum) > + args->op_flags |= XFS_DA_OP_JUSTCHECK; > > if (dp->i_d.di_format == XFS_DINODE_FMT_LOCAL) { > rval = xfs_dir2_sf_addname(args); > @@ -542,50 +547,7 @@ xfs_dir_canenter( > xfs_inode_t *dp, > struct xfs_name *name) /* name of entry to add */ > { > - struct xfs_da_args *args; > - int rval; > - int v; /* type-checking value */ > - > - ASSERT(S_ISDIR(dp->i_d.di_mode)); > - > - args = kmem_zalloc(sizeof(*args), KM_SLEEP | KM_NOFS); > - if (!args) > - return -ENOMEM; > - > - args->geo = dp->i_mount->m_dir_geo; > - args->name = name->name; > - args->namelen = name->len; > - args->filetype = name->type; > - args->hashval = dp->i_mount->m_dirnameops->hashname(name); > - args->dp = dp; > - args->whichfork = XFS_DATA_FORK; > - args->trans = tp; > - args->op_flags = XFS_DA_OP_JUSTCHECK | XFS_DA_OP_ADDNAME | > - XFS_DA_OP_OKNOENT; > - > - if (dp->i_d.di_format == XFS_DINODE_FMT_LOCAL) { > - rval = xfs_dir2_sf_addname(args); > - goto out_free; > - } > - > - rval = xfs_dir2_isblock(args, &v); > - if (rval) > - goto out_free; > - if (v) { > - rval = xfs_dir2_block_addname(args); > - goto out_free; > - } > - > - rval = xfs_dir2_isleaf(args, &v); > - if (rval) > - goto out_free; > - if (v) > - rval = xfs_dir2_leaf_addname(args); > - else > - rval = xfs_dir2_node_addname(args); > -out_free: > - kmem_free(args); > - return rval; > + return xfs_dir_createname(tp, dp, name, 0, NULL, NULL, 0); > } > > /* > > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From bfoster@redhat.com Fri Aug 22 08:19: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 1DA387F53 for ; Fri, 22 Aug 2014 08: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 E35DD304053 for ; Fri, 22 Aug 2014 06:19:57 -0700 (PDT) X-ASG-Debug-ID: 1408713593-04bdf0109737c2a0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 5yTNS1MM4ql9BTqx (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 22 Aug 2014 06:19: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-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 s7MDJruC016045 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Fri, 22 Aug 2014 09:19:53 -0400 Received: from laptop.bfoster (vpn-61-227.rdu2.redhat.com [10.10.61.227]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s7MDJp1S006145 (version=TLSv1/SSLv3 cipher=AES128-GCM-SHA256 bits=128 verify=NO); Fri, 22 Aug 2014 09:19:53 -0400 Date: Fri, 22 Aug 2014 09:19:51 -0400 From: Brian Foster To: Eric Sandeen Cc: Eric Sandeen , xfs-oss Subject: Re: [PATCH 3/4] xfs: combine xfs_rtmodify_summary and xfs_rtget_summary Message-ID: <20140822131950.GC3915@laptop.bfoster> X-ASG-Orig-Subj: Re: [PATCH 3/4] xfs: combine xfs_rtmodify_summary and xfs_rtget_summary References: <53F6942B.80808@redhat.com> <53F6963D.9090500@sandeen.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <53F6963D.9090500@sandeen.net> 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: 1408713594 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Thu, Aug 21, 2014 at 08:00:45PM -0500, Eric Sandeen wrote: > xfs_rtmodify_summary and xfs_rtget_summary are > almost identical; fold them into > xfs_rtmodify_summary_int(), with wrappers for > each of the original calls. > > The _int function modifies if a delta is passed, > and returns a summary pointer if *sum is passed. > > Signed-off-by: Eric Sandeen > --- > > diff --git a/fs/xfs/libxfs/xfs_rtbitmap.c b/fs/xfs/libxfs/xfs_rtbitmap.c > index f4dd697..50e3b93 100644 > --- a/fs/xfs/libxfs/xfs_rtbitmap.c > +++ b/fs/xfs/libxfs/xfs_rtbitmap.c > @@ -424,20 +424,24 @@ xfs_rtfind_forw( > } > > /* > - * Read and modify the summary information for a given extent size, > + * Read and/or modify the summary information for a given extent size, > * bitmap block combination. > * Keeps track of a current summary block, so we don't keep reading > * it from the buffer cache. > + * > + * Summary information is returned in *sum if specified. > + * If no delta is specified, returns summary only. > */ > int > -xfs_rtmodify_summary( > - xfs_mount_t *mp, /* file system mount point */ > +xfs_rtmodify_summary_int( > + xfs_mount_t *mp, /* file system mount structure */ > xfs_trans_t *tp, /* transaction pointer */ > int log, /* log2 of extent size */ > xfs_rtblock_t bbno, /* bitmap block number */ > int delta, /* change to make to summary info */ > xfs_buf_t **rbpp, /* in/out: summary block buffer */ > - xfs_fsblock_t *rsb) /* in/out: summary block number */ > + xfs_fsblock_t *rsb, /* in/out: summary block number */ > + xfs_suminfo_t *sum) /* out: summary info for this block */ > { > xfs_buf_t *bp; /* buffer for the summary block */ > int error; /* error value */ > @@ -480,15 +484,40 @@ xfs_rtmodify_summary( > } > } > /* > - * Point to the summary information, modify and log it. > + * Point to the summary information, modify/log it, and/or copy it out. > */ > sp = XFS_SUMPTR(mp, bp, so); > - *sp += delta; > - xfs_trans_log_buf(tp, bp, (uint)((char *)sp - (char *)bp->b_addr), > - (uint)((char *)sp - (char *)bp->b_addr + sizeof(*sp) - 1)); > + if (delta) { > + uint first = (uint)((char *)sp - (char *)bp->b_addr); > + > + *sp += delta; > + xfs_trans_log_buf(tp, bp, first, first + sizeof(*sp) - 1); > + } > + if (sum) { > + /* > + * Drop the buffer if we're not asked to remember it. > + */ > + if (!rbpp) > + xfs_trans_brelse(tp, bp); This introduces some potentially weird circumstances (e.g., acquire, log, release of a buffer), but I think it's resolved by the next patch. Reviewed-by: Brian Foster > + *sum = *sp; > + } > return 0; > } > > +int > +xfs_rtmodify_summary( > + xfs_mount_t *mp, /* file system mount structure */ > + xfs_trans_t *tp, /* transaction pointer */ > + int log, /* log2 of extent size */ > + xfs_rtblock_t bbno, /* bitmap block number */ > + int delta, /* change to make to summary info */ > + xfs_buf_t **rbpp, /* in/out: summary block buffer */ > + xfs_fsblock_t *rsb) /* in/out: summary block number */ > +{ > + return xfs_rtmodify_summary_int(mp, tp, log, bbno, > + delta, rbpp, rsb, NULL); > +} > + > /* > * Set the given range of bitmap bits to the given value. > * Do whatever I/O and logging is required. > diff --git a/fs/xfs/xfs_rtalloc.c b/fs/xfs/xfs_rtalloc.c > index 909e143..d1160cc 100644 > --- a/fs/xfs/xfs_rtalloc.c > +++ b/fs/xfs/xfs_rtalloc.c > @@ -46,7 +46,7 @@ > * Keeps track of a current summary block, so we don't keep reading > * it from the buffer cache. > */ > -STATIC int /* error */ > +int > xfs_rtget_summary( > xfs_mount_t *mp, /* file system mount structure */ > xfs_trans_t *tp, /* transaction pointer */ > @@ -56,60 +56,9 @@ xfs_rtget_summary( > xfs_fsblock_t *rsb, /* in/out: summary block number */ > xfs_suminfo_t *sum) /* out: summary info for this block */ > { > - xfs_buf_t *bp; /* buffer for summary block */ > - int error; /* error value */ > - xfs_fsblock_t sb; /* summary fsblock */ > - int so; /* index into the summary file */ > - xfs_suminfo_t *sp; /* pointer to returned data */ > - > - /* > - * Compute entry number in the summary file. > - */ > - so = XFS_SUMOFFS(mp, log, bbno); > - /* > - * Compute the block number in the summary file. > - */ > - sb = XFS_SUMOFFSTOBLOCK(mp, so); > - /* > - * If we have an old buffer, and the block number matches, use that. > - */ > - if (rbpp && *rbpp && *rsb == sb) > - bp = *rbpp; > - /* > - * Otherwise we have to get the buffer. > - */ > - else { > - /* > - * If there was an old one, get rid of it first. > - */ > - if (rbpp && *rbpp) > - xfs_trans_brelse(tp, *rbpp); > - error = xfs_rtbuf_get(mp, tp, sb, 1, &bp); > - if (error) { > - return error; > - } > - /* > - * Remember this buffer and block for the next call. > - */ > - if (rbpp) { > - *rbpp = bp; > - *rsb = sb; > - } > - } > - /* > - * Point to the summary information & copy it out. > - */ > - sp = XFS_SUMPTR(mp, bp, so); > - *sum = *sp; > - /* > - * Drop the buffer if we're not asked to remember it. > - */ > - if (!rbpp) > - xfs_trans_brelse(tp, bp); > - return 0; > + return xfs_rtmodify_summary_int(mp, tp, log, bbno, 0, rbpp, rsb, sum); > } > > - > /* > * Return whether there are any free extents in the size range given > * by low and high, for the bitmap block bbno. > diff --git a/fs/xfs/xfs_rtalloc.h b/fs/xfs/xfs_rtalloc.h > index c642795..76c0a4a 100644 > --- a/fs/xfs/xfs_rtalloc.h > +++ b/fs/xfs/xfs_rtalloc.h > @@ -111,6 +111,10 @@ int xfs_rtfind_forw(struct xfs_mount *mp, struct xfs_trans *tp, > xfs_rtblock_t *rtblock); > int xfs_rtmodify_range(struct xfs_mount *mp, struct xfs_trans *tp, > xfs_rtblock_t start, xfs_extlen_t len, int val); > +int xfs_rtmodify_summary_int(struct xfs_mount *mp, struct xfs_trans *tp, > + int log, xfs_rtblock_t bbno, int delta, > + xfs_buf_t **rbpp, xfs_fsblock_t *rsb, > + xfs_suminfo_t *sum); > int xfs_rtmodify_summary(struct xfs_mount *mp, struct xfs_trans *tp, int log, > xfs_rtblock_t bbno, int delta, xfs_buf_t **rbpp, > xfs_fsblock_t *rsb); > > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From bfoster@redhat.com Fri Aug 22 08:20: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 (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 66BE57F53 for ; Fri, 22 Aug 2014 08:20:14 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id E8ABDAC004 for ; Fri, 22 Aug 2014 06:20:10 -0700 (PDT) X-ASG-Debug-ID: 1408713609-04cbb05487608c30001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id C7RDfEQsIEVhJDs8 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 22 Aug 2014 06:20:09 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx14.intmail.prod.int.phx2.redhat.com (int-mx14.intmail.prod.int.phx2.redhat.com [10.5.11.27]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s7MDK7KP028704 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Fri, 22 Aug 2014 09:20:08 -0400 Received: from laptop.bfoster (vpn-61-227.rdu2.redhat.com [10.10.61.227]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s7MDK5H0025900 (version=TLSv1/SSLv3 cipher=AES128-GCM-SHA256 bits=128 verify=NO); Fri, 22 Aug 2014 09:20:07 -0400 Date: Fri, 22 Aug 2014 09:20:05 -0400 From: Brian Foster To: Eric Sandeen Cc: Eric Sandeen , xfs-oss Subject: Re: [PATCH 4/4] xfs: remove rbpp check from xfs_rtmodify_summary_int Message-ID: <20140822132004.GD3915@laptop.bfoster> X-ASG-Orig-Subj: Re: [PATCH 4/4] xfs: remove rbpp check from xfs_rtmodify_summary_int References: <53F6942B.80808@redhat.com> <53F696D7.2030906@sandeen.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <53F696D7.2030906@sandeen.net> User-Agent: Mutt/1.5.23 (2014-03-12) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.27 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1408713609 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Thu, Aug 21, 2014 at 08:03:19PM -0500, Eric Sandeen wrote: > rbpp is always passed into xfs_rtmodify_summary > and xfs_rtget_summary, so there is no need to > test for it in xfs_rtmodify_summary_int. > Looks fine, but this is also called through a variety of twisty paths. Could we add a top-level error check or assert? Brian > Signed-off-by: Eric Sandeen > --- > > diff --git a/fs/xfs/libxfs/xfs_rtbitmap.c b/fs/xfs/libxfs/xfs_rtbitmap.c > index 50e3b93..7c818f1 100644 > --- a/fs/xfs/libxfs/xfs_rtbitmap.c > +++ b/fs/xfs/libxfs/xfs_rtbitmap.c > @@ -460,7 +460,7 @@ xfs_rtmodify_summary_int( > /* > * If we have an old buffer, and the block number matches, use that. > */ > - if (rbpp && *rbpp && *rsb == sb) > + if (*rbpp && *rsb == sb) > bp = *rbpp; > /* > * Otherwise we have to get the buffer. > @@ -469,7 +469,7 @@ xfs_rtmodify_summary_int( > /* > * If there was an old one, get rid of it first. > */ > - if (rbpp && *rbpp) > + if (*rbpp) > xfs_trans_brelse(tp, *rbpp); > error = xfs_rtbuf_get(mp, tp, sb, 1, &bp); > if (error) { > @@ -478,10 +478,8 @@ xfs_rtmodify_summary_int( > /* > * Remember this buffer and block for the next call. > */ > - if (rbpp) { > - *rbpp = bp; > - *rsb = sb; > - } > + *rbpp = bp; > + *rsb = sb; > } > /* > * Point to the summary information, modify/log it, and/or copy it out. > @@ -493,14 +491,8 @@ xfs_rtmodify_summary_int( > *sp += delta; > xfs_trans_log_buf(tp, bp, first, first + sizeof(*sp) - 1); > } > - if (sum) { > - /* > - * Drop the buffer if we're not asked to remember it. > - */ > - if (!rbpp) > - xfs_trans_brelse(tp, bp); > + if (sum) > *sum = *sp; > - } > return 0; > } > > > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From sandeen@sandeen.net Fri Aug 22 10:01: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 (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id D75997F53 for ; Fri, 22 Aug 2014 10:01:38 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 75CB6AC003 for ; Fri, 22 Aug 2014 08:01:35 -0700 (PDT) X-ASG-Debug-ID: 1408719693-04cb6c54ff441a60001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id qWL7Cn5esSpvzhhB for ; Fri, 22 Aug 2014 08: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 104376574438; Fri, 22 Aug 2014 10:01:33 -0500 (CDT) Message-ID: <53F75B54.8050802@sandeen.net> Date: Fri, 22 Aug 2014 10:01:40 -0500 From: Eric Sandeen MIME-Version: 1.0 To: Brian Foster CC: Eric Sandeen , xfs-oss Subject: Re: [PATCH 3/4] xfs: combine xfs_rtmodify_summary and xfs_rtget_summary References: <53F6942B.80808@redhat.com> <53F6963D.9090500@sandeen.net> <20140822131950.GC3915@laptop.bfoster> X-ASG-Orig-Subj: Re: [PATCH 3/4] xfs: combine xfs_rtmodify_summary and xfs_rtget_summary In-Reply-To: <20140822131950.GC3915@laptop.bfoster> 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: 1408719693 X-Barracuda-URL: http://192.48.176.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.8723 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 8/22/14, 8:19 AM, Brian Foster wrote: > On Thu, Aug 21, 2014 at 08:00:45PM -0500, Eric Sandeen wrote: ... >> @@ -480,15 +484,40 @@ xfs_rtmodify_summary( >> } >> } >> /* >> - * Point to the summary information, modify and log it. >> + * Point to the summary information, modify/log it, and/or copy it out. >> */ >> sp = XFS_SUMPTR(mp, bp, so); >> - *sp += delta; >> - xfs_trans_log_buf(tp, bp, (uint)((char *)sp - (char *)bp->b_addr), >> - (uint)((char *)sp - (char *)bp->b_addr + sizeof(*sp) - 1)); >> + if (delta) { >> + uint first = (uint)((char *)sp - (char *)bp->b_addr); >> + >> + *sp += delta; >> + xfs_trans_log_buf(tp, bp, first, first + sizeof(*sp) - 1); >> + } >> + if (sum) { >> + /* >> + * Drop the buffer if we're not asked to remember it. >> + */ >> + if (!rbpp) >> + xfs_trans_brelse(tp, bp); > > This introduces some potentially weird circumstances (e.g., acquire, > log, release of a buffer), but I think it's resolved by the next patch. > > Reviewed-by: Brian Foster does it introduce it, or just highlight it? I thought it was weird too, but I think it existed before; that's what prompted me to go looking at callers and drop the rbpp checks, FWIW. -Eric From sandeen@sandeen.net Fri Aug 22 10:23: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 987BD7F53 for ; Fri, 22 Aug 2014 10:23:40 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 87BD1304077 for ; Fri, 22 Aug 2014 08:23:37 -0700 (PDT) X-ASG-Debug-ID: 1408721016-04cb6c54fd44a9a0001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id vzV7GGczFnHsGYhT for ; Fri, 22 Aug 2014 08:23:36 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1 with cipher DHE-RSA-AES128-SHA (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 174E56096EF0; Fri, 22 Aug 2014 10:23:36 -0500 (CDT) Message-ID: <53F7607F.2020604@sandeen.net> Date: Fri, 22 Aug 2014 10:23:43 -0500 From: Eric Sandeen MIME-Version: 1.0 To: Brian Foster CC: Eric Sandeen , xfs-oss Subject: Re: [PATCH 3/4] xfs: combine xfs_rtmodify_summary and xfs_rtget_summary References: <53F6942B.80808@redhat.com> <53F6963D.9090500@sandeen.net> <20140822131950.GC3915@laptop.bfoster> <53F75B54.8050802@sandeen.net> X-ASG-Orig-Subj: Re: [PATCH 3/4] xfs: combine xfs_rtmodify_summary and xfs_rtget_summary In-Reply-To: <53F75B54.8050802@sandeen.net> 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: 1408721016 X-Barracuda-URL: http://192.48.176.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.8723 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 8/22/14, 10:01 AM, Eric Sandeen wrote: > On 8/22/14, 8:19 AM, Brian Foster wrote: >> On Thu, Aug 21, 2014 at 08:00:45PM -0500, Eric Sandeen wrote: > > ... > >>> @@ -480,15 +484,40 @@ xfs_rtmodify_summary( >>> } >>> } >>> /* >>> - * Point to the summary information, modify and log it. >>> + * Point to the summary information, modify/log it, and/or copy it out. >>> */ >>> sp = XFS_SUMPTR(mp, bp, so); >>> - *sp += delta; >>> - xfs_trans_log_buf(tp, bp, (uint)((char *)sp - (char *)bp->b_addr), >>> - (uint)((char *)sp - (char *)bp->b_addr + sizeof(*sp) - 1)); >>> + if (delta) { >>> + uint first = (uint)((char *)sp - (char *)bp->b_addr); >>> + >>> + *sp += delta; >>> + xfs_trans_log_buf(tp, bp, first, first + sizeof(*sp) - 1); >>> + } >>> + if (sum) { >>> + /* >>> + * Drop the buffer if we're not asked to remember it. >>> + */ >>> + if (!rbpp) >>> + xfs_trans_brelse(tp, bp); >> >> This introduces some potentially weird circumstances (e.g., acquire, >> log, release of a buffer), but I think it's resolved by the next patch. >> >> Reviewed-by: Brian Foster > > does it introduce it, or just highlight it? I thought it was weird too, > but I think it existed before; that's what prompted me to go looking at > callers and drop the rbpp checks, FWIW. Oh, right, if delta & sum,there's a problem if (!rpbb). And I did introduce that as a new issue. But the code at that point never sees (!rbpp) so I think it's safe. I could respin patches 3 & 4, to do them in the opposite order, if desired. -Eric From service1@sb2.waiyoufa.net Fri Aug 22 14:31:52 2014 Return-Path: X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 76BC37F4E for ; Fri, 22 Aug 2014 14:31:51 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 1A9DBAC005 for ; Fri, 22 Aug 2014 12:31:47 -0700 (PDT) X-ASG-Debug-ID: 1408735799-04bdf0109a420120001-NocioJ Received: from sb2.waiyoufa.net (25.10-88-23.rdns.scalabledns.com [23.88.10.25]) by cuda.sgi.com with ESMTP id bPILIwFh6TTDLgEu for ; Fri, 22 Aug 2014 12:30:01 -0700 (PDT) X-Barracuda-Envelope-From: service1@sb2.waiyoufa.net X-Barracuda-Apparent-Source-IP: 23.88.10.25 DKIM-Signature: v=1; a=rsa-sha256; c=simple; d=sb2.waiyoufa.net; s=dkimss; t=1408735783; x=1409340583; q=dns/txt; h=DomainKey-Signature: Received:Reply-To:Message-ID:From:To:Subject:Date:MIME-Version: Content-Type:Disposition-Notification-To; bh=M8nzdWgEsft455R8byj pd7qKHffbn1lqGtNm1NnE8Os=; b=HgCxQ76fXVeB+7WEPhIsAUxSsFxXjgTfLKI K8z82OTpAWfRzCDczL/dgrTMKWKBI0iju+RJZkroHlgVHjlDPQUguIwDvJZI6iz/ s057eVTzRumv/P5wlo6G8CtB4N3fxrp8n0xpkD0iS7j+pGXgyGjRReK7Dr10Q5rv 57BlF2/I= DomainKey-Signature: a=rsa-sha1; s=dkimss; d=sb2.waiyoufa.net; c=simple; q=dns; h=message-id:from; b=MvWB3cvE/E1xxHpbi1emCGunn4NjnsS+j6u5uOVCJsBS3cMrutbI+7xWxQ7i qhom6pzDbLJe70FgJLgs3ho1dKMPIAZHnODI017Bj5DGoWK2T6l90VK1w vVhW/iMPgwVrwOOpHIsjhRed7YJXtkT1VwRqnYOKSn02+14L/Re7tA=; Received: from mbmxezhg by 127.0.0.1 with ESMTP id md50000346943.msg for ; Sat, 23 Aug 2014 03:29:38 +0800 X-Spam-Processed: 127.0.0.1, Sat, 23 Aug 2014 03:29:38 +0800 (not processed: spam filter heuristic analysis disabled) X-Authenticated-Sender: service1@sb2.waiyoufa.net X-RemoteIP: 1.195.42.225 X-Return-Path: service1@sb2.waiyoufa.net X-Envelope-From: service1@sb2.waiyoufa.net X-Barracuda-Connect: 25.10-88-23.rdns.scalabledns.com[23.88.10.25] X-Barracuda-Start-Time: 1408735800 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: -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 Message-Id: <20140822193147.A20ECA4219B@cuda.sgi.com> Date: Fri, 22 Aug 2014 12:31:47 -0700 (PDT) From: service1@sb2.waiyoufa.net To: undisclosed-recipients:; X-Real From Sender ------fromto: xfs@oss.sgi.com Reply-To: Message-ID: <20140823032829605303@sb2.waiyoufa.net> From: "Eric Jia" To: Subject: =?utf-8?B?UmU60KHQsNC80LDRjyDQstGL0LPQvtC00L3QsNGPINGG0LU=?= =?utf-8?B?0L3QsCDQtNC70Y8g0YjQsNGA0LjQutC+0LLQvtC5INGA0L7Quw==?= =?utf-8?B?0LjQutC+0LLRi9C5INC/0L7QtNGI0LjQv9C90LjQuiAgU2s=?= =?utf-8?B?eXBlOiBkbmN0LXNvdXJjZXM=?= Date: Sat, 23 Aug 2014 03:28:22 +0800 MIME-Version: 1.0 Content-Type: multipart/related; type="multipart/alternative"; boundary="----=_NextPart_000_0DE5_019902BD.1B87C660" X-mailer: Kgmpn 2 Disposition-Notification-To: bearing-eric@dnct-sources.com This is a multi-part message in MIME format. ------=_NextPart_000_0DE5_019902BD.1B87C660 Content-Type: multipart/alternative; boundary="----=_NextPart_001_0157_019902BD.1B87C660" ------=_NextPart_001_0157_019902BD.1B87C660 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 RGVhciBTaXIsDQpUaGlzIGlzIEVyaWMgIGZyb20gRE5DVCBCZWFyaW5nIChISykgTGltaXRlZA0K QmVhcmluZyBwaG90byBhbGJ1bSBvbiBGYWNlYm9va++8mmh0dHBzOi8vd3d3LmZhY2Vib29rLmNv bS9lcmljLmJlc3QucHJvZHVjdHMvcGhvdG9zX2FsYnVtcw0KV2UgaGF2ZSBleHBvcnQgdGhlIGJl YXJpbmdzIHRvIHRoZSBFdXJvcGVhbiAmIEFtZXJpY2FuIE1hcmtldHMvTWlkZGxlIEVhc3QgTWFy a2V0L0FzaWEgTWFya2V0IHNpbmNlIHRoZSB5ZWFyIG9mIDE5OTYuICANCldlIGNhbiBzdXBwbHkg dGhlIGZvbGxvd2luZyBiZWFyaW5ncyBhbmQgc3RlZWwgYmFsbHM6DQoxKURlZXAgZ3Jvb3ZlIGJh bGwgYmVhcmluZ3MgIA0KMilDZXJhbWljIGJlYXJpbmdzDQozKVRhcGVyZWQgcm9sbGVyIGJlYXJp bmdzDQo0KVN0YWlubGVzcyBTdGVlbCBiZWFyaW5ncw0KNSlTZWxmLWFsaWduaW5nIGJhbGwvcm9s bGVyIGJlYXJpbmcNCjYpVGFwZXJlZCByb2xsZXIgYmVhcmluZw0KRnJlZSBzYW1wbGVzIGF2YWls YWJsZSBmb3IgdGhlIHNtYWxsIHNpemUgYmVhcmluZ3MsIGZlZWwgZnJlZWx5IGxldCBtZSBrbm93 IGlmIHlvdSB0aGVtIHRvIGV2YWx1YXRlIGl0Lg0KU2t5cGU6IGRuY3Qtc291cmNlcw0KDQoNCg0K LS0NCg0KRXJpYyBKaWEgKEV4cG9ydGluZyBEaXJlY3RvcikNCkROQ1QgQmVhcmluZyAoSEspIExp bWl0ZWQNCkhlYWRxdWFydGVyczogQy01MDMsIEhpZ2gtdGVjaCBab25lLCBYaW54aWFuZyBDaXR5 LCBIZW5hbiwgQ2hpbmEgIDQ1MzAwMw0KKDogKzg2LTM3My0zODc3MTE2IE1vYmlsZTorODYtMTM4 IDkxODQ2NTE2ICgyNEhvdXJzKQ0KV2Vic2l0ZTp3d3cuZG5jdGJlYXJpbmcuY29tICo6YmVhcmlu Zy1lcmljQGRuY3Qtc291cmNlcy5jb20gU2t5cGU6IGRuY3Qtc291cmNlcw0KLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0N ClAgVGhpbmsgb2YgdGhlIGVudmlyb25tZW50IC0gcGxlYXNlIGRvbid0IHByaW50IHRoaXMgZS1t YWlsIHVubGVzcyB5b3UgcmVhbGx5IG5lZWQgdG8uIA0KVGhpcyBlbWFpbCBpcyBjb25maWRlbnRp YWwuIElmIHlvdSBhcmUgbm90IHRoZSBpbnRlbmRlZCByZWNpcGllbnQgb2YgdGhpcyBtZXNzYWdl IHlvdSBhcmUgaGVyZWJ5IG5vdGlmaWVkIHRoYXQgYW55IHVzZSwgcmV2aWV3LCByZXRyYW5zbWlz c2lvbiwgZGlzc2VtaW5hdGlvbiwgZGlzdHJpYnV0aW9uLCByZXByb2R1Y3Rpb24gb3IgYW55IGFj dGlvbiB0YWtlbiBpbiByZWxpYW5jZSB1cG9uIHRoaXMgbWVzc2FnZSBpcyBwcm9oaWJpdGVkLiBJ ZiB5b3UgaGF2ZSByZWNlaXZlZCB0aGlzIGVtYWlsIGluIGVycm9yLCBwbGVhc2UgY29udGFjdCB0 aGUgc2VuZGVyIGJ5IHJldHVybiBlbWFpbCBhbmQgZGVsZXRlIHRoZSBlbWFpbCBhbmQgYW55IGF0 dGFjaG1lbnRzLiBBbnkgcGVyc29uYWwgdmlld3MvIG9waW5pb25zIGV4cHJlc3NlZCBpbiB0aGlz IG1lc3NhZ2UgYXJlIHRob3NlIG9mIHRoZSBpbmRpdmlkdWFsIHNlbmRlciBhbmQgbWF5IG5vdCBu ZWNlc3NhcmlseSByZWZsZWN0IHRoZSB2aWV3cy8gb3BpbmlvbnMgb2YgdGhlIGNvbXBhbnkuDQoN Cg0KDQoNCg0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NClVuc3Vic2NyaWJlIHRoaXMgZW1haWwgLiBQbGVh c2UgZ28gaW50byA6IGh0dHBzOi8vamluc2h1anUubmV0L2YvQ2hUS01tDQotLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLQ0KDQp= ------=_NextPart_001_0157_019902BD.1B87C660 Content-Type: text/html; charset="utf-8" Content-Transfer-Encoding: base64 PCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwv L0VOIj4NCjxIVE1MIHhtbG5zOm8+PEhFQUQ+DQo8TUVUQSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNo YXJzZXQ9dXRmLTgiIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlPg0KPE1FVEEgbmFtZT1HRU5FUkFU T1IgY29udGVudD0iTVNIVE1MIDExLjAwLjk2MDAuMTcyMzkiPjwvSEVBRD4NCjxCT0RZPjxTUEFO IA0Kc3R5bGU9IldISVRFLVNQQUNFOiBub3JtYWw7IFdPUkQtU1BBQ0lORzogMHB4OyBURVhULVRS QU5TRk9STTogbm9uZTsgQ09MT1I6IHJnYigwLDAsMCk7IEZPTlQ6IDE0cHgvMjVweCBBcmlhbDsg T1JQSEFOUzogMjsgV0lET1dTOiAyOyBMRVRURVItU1BBQ0lORzogbm9ybWFsOyBURVhULUlOREVO VDogMHB4OyAtd2Via2l0LXRleHQtc2l6ZS1hZGp1c3Q6IGF1dG87IC13ZWJraXQtdGV4dC1zdHJv a2Utd2lkdGg6IDBweCI+PFNQQU4gDQpzdHlsZT0iQ09MT1I6IHJnYigyNTUsMCwwKSI+DQo8UCBj bGFzcz1Nc29Ob3JtYWwgDQpzdHlsZT0iVEVYVC1BTElHTjogbGVmdDsgTUFSR0lOOiAwY20gMGNt IDBwdDsgTElORS1IRUlHSFQ6IDEycHQ7IG1zby1tYXJnaW4tdG9wLWFsdDogYXV0bzsgbXNvLW1h cmdpbi1ib3R0b20tYWx0OiBhdXRvOyBtc28tbGluZS1oZWlnaHQtcnVsZTogZXhhY3RseTsgbXNv LXBhZ2luYXRpb246IHdpZG93LW9ycGhhbiIgDQphbGlnbj1sZWZ0PjxTUEFOIGxhbmc9RU4tVVMg DQpzdHlsZT0nRk9OVC1GQU1JTFk6ICJBcmlhbCIsInNhbnMtc2VyaWYiOyBDT0xPUjogYmxhY2s7 IG1zby1iaWRpLWZvbnQtc2l6ZTogMTAuNXB0OyBtc28tZmFyZWFzdC1mb250LWZhbWlseTog5a6L 5L2TOyBtc28tZm9udC1rZXJuaW5nOiAwcHQnPjxTUEFOIA0Kc3R5bGU9IldISVRFLVNQQUNFOiBu b3JtYWw7IFdPUkQtU1BBQ0lORzogMHB4OyBURVhULVRSQU5TRk9STTogbm9uZTsgRkxPQVQ6IG5v bmU7IENPTE9SOiByZ2IoMCwwLDApOyBGT05UOiAxNHB4LzIzcHggYXJpYWw7IE9SUEhBTlM6IDI7 IFdJRE9XUzogMjsgRElTUExBWTogaW5saW5lICFpbXBvcnRhbnQ7IExFVFRFUi1TUEFDSU5HOiBu b3JtYWw7IFRFWFQtSU5ERU5UOiAwcHg7IC13ZWJraXQtdGV4dC1zaXplLWFkanVzdDogYXV0bzsg LXdlYmtpdC10ZXh0LXN0cm9rZS13aWR0aDogMHB4Ij5EPC9TUEFOPjxTUEFOIA0Kc3R5bGU9IldI SVRFLVNQQUNFOiBub3JtYWw7IFdPUkQtU1BBQ0lORzogMHB4OyBURVhULVRSQU5TRk9STTogbm9u ZTsgQ09MT1I6IHJnYigwLDAsMCk7IEZPTlQ6IDE0cHgvMjVweCBBcmlhbDsgT1JQSEFOUzogMjsg V0lET1dTOiAyOyBMRVRURVItU1BBQ0lORzogbm9ybWFsOyBURVhULUlOREVOVDogMHB4OyAtd2Vi a2l0LXRleHQtc2l6ZS1hZGp1c3Q6IGF1dG87IC13ZWJraXQtdGV4dC1zdHJva2Utd2lkdGg6IDBw eCI+ZWFyIA0KU2lyLDwvU1BBTj48L1A+DQo8SDIgDQpzdHlsZT0iRk9OVC1GQU1JTFk6IGFyaWFs OyBGT05ULVZBUklBTlQ6IG5vcm1hbDsgV0hJVEUtU1BBQ0U6IG5vcm1hbDsgV09SRC1TUEFDSU5H OiAwcHg7IFRFWFQtVFJBTlNGT1JNOiBub25lOyBDT0xPUjogcmdiKDAsMCwwKTsgRk9OVC1TVFlM RTogbm9ybWFsOyBPUlBIQU5TOiAyOyBXSURPV1M6IDI7IExFVFRFUi1TUEFDSU5HOiBub3JtYWw7 IFRFWFQtSU5ERU5UOiAwcHg7IC13ZWJraXQtdGV4dC1zaXplLWFkanVzdDogYXV0bzsgLXdlYmtp dC10ZXh0LXN0cm9rZS13aWR0aDogMHB4Ij4NCjxESVYgDQpzdHlsZT0iRk9OVC1TSVpFOiAxNHB4 OyBGT05ULUZBTUlMWTogVGFob21hLCBzYW5zLXNlcmlmLCDlrovkvZM7IExJTkUtSEVJR0hUOiAy NXB4Ij48Rk9OVCANCmZhY2U9QXJpYWw+PFNQQU4gc3R5bGU9IkZPTlQtV0VJR0hUOiBub3JtYWwi PlRoaXMgaXMgRXJpYyAmbmJzcDtmcm9tIEROQ1Q8U1BBTiANCmNsYXNzPUFwcGxlLWNvbnZlcnRl ZC1zcGFjZT4mbmJzcDs8L1NQQU4+PC9TUEFOPjxTUEFOIA0Kc3R5bGU9IkJBQ0tHUk9VTkQtQ09M T1I6IHJnYigyNTUsMjA0LDApIj5CZWFyaW5nPC9TUEFOPjxTUEFOIA0Kc3R5bGU9IkZPTlQtV0VJ R0hUOiBub3JtYWwiPjxTUEFOIGNsYXNzPUFwcGxlLWNvbnZlcnRlZC1zcGFjZT4mbmJzcDs8L1NQ QU4+KEhLKSANCkxpbWl0ZWQ8L1NQQU4+PC9GT05UPjwvRElWPg0KPERJVj4NCjxESVY+PFNQQU4g c3R5bGU9IkZPTlQtV0VJR0hUOiBub3JtYWwiPjxJIHN0eWxlPSJGT05ULVNJWkU6IDE2cHgiPjxT UEFOIA0Kc3R5bGU9IkZPTlQtRkFNSUxZOiBhcmlhbDsgTElORS1IRUlHSFQ6IDIzcHgiPjxGT05U IGNvbG9yPWJsYWNrIHNpemU9MyANCmZhY2U9QXJpYWw+QmVhcmluZyBwaG90byBhbGJ1bSBvbiBG YWNlYm9va++8mjwvRk9OVD48L1NQQU4+PEEgDQpzdHlsZT0iQ09MT1I6IHJnYig1MSw1MSwxNTMp IiANCmhyZWY9Imh0dHBzOi8vd3d3LmZhY2Vib29rLmNvbS9lcmljLmJlc3QucHJvZHVjdHMvcGhv dG9zX2FsYnVtcyIgDQp0YXJnZXQ9X2JsYW5rPmh0dHBzOi8vd3d3LmZhY2Vib29rLmNvbS9lcmlj LmJlc3QucHJvZHVjdHMvcGhvdG9zX2FsYnVtczwvQT48L0k+PC9TUEFOPjwvRElWPg0KPERJViAN CnN0eWxlPSJGT05ULVNJWkU6IDE0cHg7IEZPTlQtRkFNSUxZOiBUYWhvbWEsIHNhbnMtc2VyaWYs IOWui+S9kzsgTElORS1IRUlHSFQ6IDI1cHgiPjxGT05UIA0KZmFjZT1BcmlhbD48U1BBTiBzdHls ZT0iRk9OVC1XRUlHSFQ6IG5vcm1hbCI+V2UgaGF2ZSBleHBvcnQgdGhlIGJlYXJpbmdzIHRvIHRo ZSANCkV1cm9wZWFuICZhbXA7IEFtZXJpY2FuIE1hcmtldHMvTWlkZGxlIEVhc3QgTWFya2V0L0Fz aWEgTWFya2V0PFNQQU4gDQpjbGFzcz1BcHBsZS1jb252ZXJ0ZWQtc3BhY2U+Jm5ic3A7PC9TUEFO PjwvU1BBTj48U1BBTiANCnN0eWxlPSJCQUNLR1JPVU5ELUNPTE9SOiByZ2IoMjU1LDAsMCkiPnNp bmNlIHRoZSB5ZWFyIG9mIDE5OTY8L1NQQU4+PFNQQU4gDQpzdHlsZT0iRk9OVC1XRUlHSFQ6IG5v cm1hbCI+LiAmbmJzcDs8L1NQQU4+PC9GT05UPjwvRElWPg0KPERJViANCnN0eWxlPSJGT05ULVNJ WkU6IDE0cHg7IEZPTlQtRkFNSUxZOiBUYWhvbWEsIHNhbnMtc2VyaWYsIOWui+S9kzsgRk9OVC1X RUlHSFQ6IG5vcm1hbDsgTElORS1IRUlHSFQ6IDI1cHgiPjxGT05UIA0KZmFjZT1BcmlhbD5XZSBj YW4gc3VwcGx5IHRoZSBmb2xsb3dpbmcgYmVhcmluZ3MgYW5kIHN0ZWVsIGJhbGxzOjwvRk9OVD48 L0RJVj4NCjxESVYgDQpzdHlsZT0iRk9OVC1TSVpFOiAxNHB4OyBGT05ULUZBTUlMWTogVGFob21h LCBzYW5zLXNlcmlmLCDlrovkvZM7IExJTkUtSEVJR0hUOiAyNXB4Ij48Rk9OVCANCmNvbG9yPXJl ZCBmYWNlPUFyaWFsPjxJIHN0eWxlPSJGT05ULVdFSUdIVDogbm9ybWFsIj4xKURlZXAgZ3Jvb3Zl IGJhbGwgYmVhcmluZ3MgDQombmJzcDs8L0k+PC9GT05UPjwvRElWPg0KPERJViANCnN0eWxlPSJG T05ULVNJWkU6IDE0cHg7IEZPTlQtRkFNSUxZOiBUYWhvbWEsIHNhbnMtc2VyaWYsIOWui+S9kzsg TElORS1IRUlHSFQ6IDI1cHgiPjxGT05UIA0KY29sb3I9cmVkIGZhY2U9QXJpYWw+PEk+MilDZXJh bWljIGJlYXJpbmdzPC9JPjwvRk9OVD48L0RJVj4NCjxESVYgDQpzdHlsZT0iRk9OVC1TSVpFOiAx NHB4OyBGT05ULUZBTUlMWTogVGFob21hLCBzYW5zLXNlcmlmLCDlrovkvZM7IExJTkUtSEVJR0hU OiAyNXB4Ij48Rk9OVCANCmNvbG9yPXJlZCBmYWNlPUFyaWFsPjxJIHN0eWxlPSJGT05ULVdFSUdI VDogbm9ybWFsIj4zKVRhcGVyZWQgcm9sbGVyIA0KYmVhcmluZ3M8L0k+PC9GT05UPjwvRElWPg0K PERJViANCnN0eWxlPSJGT05ULVNJWkU6IDE0cHg7IEZPTlQtRkFNSUxZOiBUYWhvbWEsIHNhbnMt c2VyaWYsIOWui+S9kzsgTElORS1IRUlHSFQ6IDI1cHgiPjxGT05UIA0KY29sb3I9cmVkIGZhY2U9 QXJpYWw+PEk+NClTdGFpbmxlc3MgU3RlZWwgYmVhcmluZ3M8L0k+PC9GT05UPjwvRElWPg0KPERJ ViANCnN0eWxlPSJGT05ULVNJWkU6IDE0cHg7IEZPTlQtRkFNSUxZOiBUYWhvbWEsIHNhbnMtc2Vy aWYsIOWui+S9kzsgTElORS1IRUlHSFQ6IDI1cHgiPjxGT05UIA0KY29sb3I9cmVkIGZhY2U9QXJp YWw+PEk+NSlTZWxmLWFsaWduaW5nIGJhbGwvcm9sbGVyIGJlYXJpbmc8L0k+PC9GT05UPjwvRElW Pg0KPERJViANCnN0eWxlPSJGT05ULVNJWkU6IDE0cHg7IEZPTlQtRkFNSUxZOiBUYWhvbWEsIHNh bnMtc2VyaWYsIOWui+S9kzsgTElORS1IRUlHSFQ6IDI1cHgiPjxGT05UIA0KY29sb3I9cmVkIGZh Y2U9QXJpYWw+PEk+NilUYXBlcmVkIHJvbGxlciBiZWFyaW5nPC9JPjwvRk9OVD48L0RJVj4NCjxE SVYgDQpzdHlsZT0iRk9OVC1TSVpFOiAxNHB4OyBGT05ULUZBTUlMWTogYXJpYWw7IENPTE9SOiBy Z2IoMjU1LDAsMjU1KTsgTElORS1IRUlHSFQ6IDI1cHgiPjxJPkZyZWUgDQpzYW1wbGVzIGF2YWls YWJsZSBmb3IgdGhlIHNtYWxsIHNpemUgYmVhcmluZ3MsIGZlZWwgZnJlZWx5IGxldCBtZSBrbm93 IGlmIHlvdSANCnRoZW0gdG8gZXZhbHVhdGUgaXQuPC9JPjwvRElWPg0KPERJViANCnN0eWxlPSJG T05ULVNJWkU6IDE0cHg7IEZPTlQtRkFNSUxZOiBhcmlhbDsgQ09MT1I6IHJnYigyNTUsMCwyNTUp OyBMSU5FLUhFSUdIVDogMjVweCI+PFNQQU4gDQpzdHlsZT0iQ09MT1I6IHJnYigyNTUsMCwwKSI+ PEZPTlQgc3R5bGU9IkJBQ0tHUk9VTkQtQ09MT1I6IHllbGxvdyI+U2t5cGU6IA0KZG5jdC1zb3Vy Y2VzPC9GT05UPjwvU1BBTj48L1NQQU4+PC9ESVY+PC9ESVY+PC9IMj4NCjxQIGNsYXNzPU1zb05v cm1hbCANCnN0eWxlPSJURVhULUFMSUdOOiBsZWZ0OyBNQVJHSU46IDBjbSAwY20gMHB0OyBtc28t cGFnaW5hdGlvbjogd2lkb3ctb3JwaGFuIiANCmFsaWduPWxlZnQ+PFNQQU4gbGFuZz1FTi1VUyAN CnN0eWxlPSdGT05ULUZBTUlMWTogIkFyaWFsIiwic2Fucy1zZXJpZiI7IENPTE9SOiByZWQ7IG1z by1iaWRpLWZvbnQtc2l6ZTogMTAuNXB0OyBtc28tZmFyZWFzdC1mb250LWZhbWlseTog5a6L5L2T OyBtc28tZm9udC1rZXJuaW5nOiAwcHQnPjxJTUcgDQpib3JkZXI9MCBoc3BhY2U9MCBhbHQ9IiIg c3JjPSJjaWQ6MDAwMUQ2QzExMDZBXzBEOUVDQzQ5XzBDRDAzNjc5IiANCmFsaWduPWJhc2VsaW5l PjwvU1BBTj48L1A+DQo8UCBjbGFzcz1Nc29Ob3JtYWwgDQpzdHlsZT0iVEVYVC1BTElHTjogbGVm dDsgTUFSR0lOOiAwY20gMGNtIDBwdDsgbXNvLXBhZ2luYXRpb246IHdpZG93LW9ycGhhbiIgDQph bGlnbj1sZWZ0PjxTUEFOIGxhbmc9RU4tVVMgDQpzdHlsZT0nRk9OVC1GQU1JTFk6ICJBcmlhbCIs InNhbnMtc2VyaWYiOyBDT0xPUjogcmVkOyBtc28tYmlkaS1mb250LXNpemU6IDEwLjVwdDsgbXNv LWZhcmVhc3QtZm9udC1mYW1pbHk6IOWui+S9kzsgbXNvLWZvbnQta2VybmluZzogMHB0Jz48SU1H IA0KYm9yZGVyPTAgaHNwYWNlPTAgYWx0PSIiIHNyYz0iY2lkOjAwMDcxMzk1M0IzOF8wNTU5MEIy MF8wQzgxMkIyMyIgDQphbGlnbj1iYXNlbGluZT48L1NQQU4+PC9QPg0KPFAgY2xhc3M9TXNvTm9y bWFsIA0Kc3R5bGU9IlRFWFQtQUxJR046IGxlZnQ7IE1BUkdJTjogMGNtIDBjbSAwcHQ7IG1zby1w YWdpbmF0aW9uOiB3aWRvdy1vcnBoYW4iIA0KYWxpZ249bGVmdD48U1BBTiBsYW5nPUVOLVVTIA0K c3R5bGU9J0ZPTlQtRkFNSUxZOiAiQXJpYWwiLCJzYW5zLXNlcmlmIjsgQ09MT1I6IHJlZDsgbXNv LWJpZGktZm9udC1zaXplOiAxMC41cHQ7IG1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiDlrovkvZM7 IG1zby1mb250LWtlcm5pbmc6IDBwdCc+PElNRyANCmJvcmRlcj0wIGhzcGFjZT0wIGFsdD0iIiBz cmM9ImNpZDowMDAzMTc2QkU5OEVfMDMzMkJBMDJfMDMwNjI2MTIiIA0KYWxpZ249YmFzZWxpbmU+ PC9TUEFOPjwvUD48L1NQQU4+PC9TUEFOPg0KPEgyIA0Kc3R5bGU9IkZPTlQtU0laRTogMTRweDsg Rk9OVC1GQU1JTFk6IGFyaWFsOyBGT05ULVZBUklBTlQ6IG5vcm1hbDsgV0hJVEUtU1BBQ0U6IG5v cm1hbDsgV09SRC1TUEFDSU5HOiAwcHg7IFRFWFQtVFJBTlNGT1JNOiBub25lOyBDT0xPUjogcmdi KDAsMCwwKTsgRk9OVC1TVFlMRTogbm9ybWFsOyBPUlBIQU5TOiAyOyBXSURPV1M6IDI7IExFVFRF Ui1TUEFDSU5HOiBub3JtYWw7IExJTkUtSEVJR0hUOiBub3JtYWw7IFRFWFQtSU5ERU5UOiAwcHg7 IC13ZWJraXQtdGV4dC1zaXplLWFkanVzdDogYXV0bzsgLXdlYmtpdC10ZXh0LXN0cm9rZS13aWR0 aDogMHB4Ij4NCjxESVYgc3R5bGU9IkxJTkUtSEVJR0hUOiAyNXB4Ij4NCjxESVYgc3R5bGU9IkNP TE9SOiByZ2IoMjU1LDAsMjU1KSI+PFNQQU4gc3R5bGU9IkNPTE9SOiByZ2IoMjU1LDAsMCkiPjxT UEFOIA0Kc3R5bGU9IldISVRFLVNQQUNFOiBub3JtYWw7IFdPUkQtU1BBQ0lORzogMHB4OyBURVhU LVRSQU5TRk9STTogbm9uZTsgRkxPQVQ6IG5vbmU7IENPTE9SOiByZ2IoMCwwLDApOyBGT05UOiAx NHB4LzIzcHggYXJpYWw7IE9SUEhBTlM6IDI7IFdJRE9XUzogMjsgRElTUExBWTogaW5saW5lICFp bXBvcnRhbnQ7IExFVFRFUi1TUEFDSU5HOiBub3JtYWw7IFRFWFQtSU5ERU5UOiAwcHg7IC13ZWJr aXQtdGV4dC1zaXplLWFkanVzdDogYXV0bzsgLXdlYmtpdC10ZXh0LXN0cm9rZS13aWR0aDogMHB4 Ij4tLTwvU1BBTj48QlIgDQpzdHlsZT0iV0hJVEUtU1BBQ0U6IG5vcm1hbDsgV09SRC1TUEFDSU5H OiAwcHg7IFRFWFQtVFJBTlNGT1JNOiBub25lOyBDT0xPUjogcmdiKDAsMCwwKTsgRk9OVDogMTRw eC8yM3B4IGFyaWFsOyBPUlBIQU5TOiAyOyBXSURPV1M6IDI7IExFVFRFUi1TUEFDSU5HOiBub3Jt YWw7IFRFWFQtSU5ERU5UOiAwcHg7IC13ZWJraXQtdGV4dC1zaXplLWFkanVzdDogYXV0bzsgLXdl YmtpdC10ZXh0LXN0cm9rZS13aWR0aDogMHB4Ij4NCjxESVYgDQpzdHlsZT0iV0hJVEUtU1BBQ0U6 IG5vcm1hbDsgV09SRC1TUEFDSU5HOiAwcHg7IFRFWFQtVFJBTlNGT1JNOiBub25lOyBDT0xPUjog cmdiKDAsMCwwKTsgRk9OVDogMTRweC8yM3B4IGFyaWFsOyBPUlBIQU5TOiAyOyBXSURPV1M6IDI7 IExFVFRFUi1TUEFDSU5HOiBub3JtYWw7IFRFWFQtSU5ERU5UOiAwcHg7IC13ZWJraXQtdGV4dC1z aXplLWFkanVzdDogYXV0bzsgLXdlYmtpdC10ZXh0LXN0cm9rZS13aWR0aDogMHB4Ij4NCjxESVY+ DQo8RElWPg0KPERJVj4NCjxESVY+PFNQQU4gbGFuZz1FTi1VUyANCnN0eWxlPSJGT05ULVNJWkU6 IDEwcHQ7IEZPTlQtRkFNSUxZOiBWZXJkYW5hOyBDT0xPUjogYmx1ZSI+PEZPTlQgDQpjb2xvcj0j MDAwMDAwPjxGT05UIGZhY2U9QXJpYWw+PFNUUk9ORz48RU0+RXJpYyBKaWE8U1BBTiANCmNsYXNz PUFwcGxlLWNvbnZlcnRlZC1zcGFjZT4mbmJzcDs8L1NQQU4+PC9FTT48L1NUUk9ORz4oRXhwb3J0 aW5nIA0KRGlyZWN0b3IpPC9GT05UPjwvRk9OVD48L1NQQU4+PC9ESVY+PFNQQU4gbGFuZz1FTi1V UyANCnN0eWxlPSJGT05ULVNJWkU6IDEwcHQ7IEZPTlQtRkFNSUxZOiBWZXJkYW5hOyBDT0xPUjog Ymx1ZSI+PEZPTlQgDQpjb2xvcj0jMDAwMDAwPjxGT05UIGZhY2U9QXJpYWw+PC9GT05UPg0KPERJ Vj48L0ZPTlQ+PEZPTlQgY29sb3I9Ymx1ZSBzaXplPTQgZmFjZT0iQ29taWMgU2FucyBNUyI+RE5D VCBCZWFyaW5nIChISykgDQpMaW1pdGVkPC9GT05UPjxGT05UIHNpemU9Mz48Rk9OVCBjb2xvcj0j MDAwMDAwPjxTUEFOIA0Kc3R5bGU9IkNPTE9SOiByZ2IoMCwwLDEyOCkiPjxTVFJPTkc+PEJSPjwv U1RST05HPjxGT05UIA0Kc3R5bGU9IkZPTlQtRkFNSUxZOiBWZXJkYW5hOyBGT05ULVZBUklBTlQ6 IG5vcm1hbDsgV0hJVEUtU1BBQ0U6IG5vcm1hbDsgV09SRC1TUEFDSU5HOiAwcHg7IFRFWFQtVFJB TlNGT1JNOiBub25lOyBGT05ULVdFSUdIVDogbm9ybWFsOyBGT05ULVNUWUxFOiBub3JtYWw7IE9S UEhBTlM6IDI7IFdJRE9XUzogMjsgTEVUVEVSLVNQQUNJTkc6IG5vcm1hbDsgVEVYVC1JTkRFTlQ6 IDBweDsgLXdlYmtpdC10ZXh0LXNpemUtYWRqdXN0OiBhdXRvOyAtd2Via2l0LXRleHQtc3Ryb2tl LXdpZHRoOiAwcHgiIA0KY29sb3I9IzAwMDAwMCBzaXplPTE+SGVhZHF1YXJ0ZXJzOiBDLTUwMywg SGlnaC10ZWNoIFpvbmUsIFhpbnhpYW5nIENpdHksIEhlbmFuLCANCkNoaW5hJm5ic3A7IDQ1MzAw MzxCUj48U1BBTiBsYW5nPUVOIA0Kc3R5bGU9IkZPTlQtRkFNSUxZOiBXaW5nZGluZ3M7IENPTE9S OiBtYXJvb24iPig8L1NQQU4+OiArODYtMzczLTM4NzcxMTY8U1BBTiANCmNsYXNzPUFwcGxlLWNv bnZlcnRlZC1zcGFjZT4mbmJzcDs8L1NQQU4+PFdCUj48V0JSPjxXQlI+PFdCUj48V0JSPjxXQlI+ PFdCUj48V0JSPjxXQlI+PFdCUj5Nb2JpbGU6Kzg2LTEzOCANCjkxODQ2NTE2PFNQQU4gY2xhc3M9 QXBwbGUtY29udmVydGVkLXNwYWNlPiZuYnNwOzwvU1BBTj48L0ZPTlQ+PEZPTlQgDQpzdHlsZT0i Rk9OVC1GQU1JTFk6IFZlcmRhbmE7IEZPTlQtVkFSSUFOVDogbm9ybWFsOyBXSElURS1TUEFDRTog bm9ybWFsOyBXT1JELVNQQUNJTkc6IDBweDsgVEVYVC1UUkFOU0ZPUk06IG5vbmU7IEZPTlQtV0VJ R0hUOiBub3JtYWw7IENPTE9SOiByZ2IoMCwwLDI1NSk7IEZPTlQtU1RZTEU6IG5vcm1hbDsgT1JQ SEFOUzogMjsgV0lET1dTOiAyOyBMRVRURVItU1BBQ0lORzogbm9ybWFsOyBURVhULUlOREVOVDog MHB4OyAtd2Via2l0LXRleHQtc2l6ZS1hZGp1c3Q6IGF1dG87IC13ZWJraXQtdGV4dC1zdHJva2Ut d2lkdGg6IDBweCIgDQpzaXplPTE+PEZPTlQgY29sb3I9IzAwMDAwMD4oMjRIb3Vycyk8QlI+PC9G T05UPjxGT05UIA0KY29sb3I9IzAwMDAwMD5XZWJzaXRlOnd3dy5kbmN0YmVhcmluZy5jb208U1BB TiANCmNsYXNzPUFwcGxlLWNvbnZlcnRlZC1zcGFjZT4mbmJzcDs8L1NQQU4+PFdCUj48V0JSPjxX QlI+PFdCUj48V0JSPjxXQlI+PFdCUj48V0JSPjxXQlI+PFdCUj48V0JSPjxXQlI+PFdCUj48V0JS PjxXQlI+PFdCUj48V0JSPjxXQlI+PFdCUj48V0JSPjxXQlI+PFdCUj48V0JSPjxXQlI+PFdCUj48 V0JSPjxXQlI+PFdCUj48U1BBTiANCmxhbmc9RU4gc3R5bGU9IkZPTlQtRkFNSUxZOiBXaW5nZGlu Z3M7IENPTE9SOiBvbGl2ZSI+KjwvU1BBTj46PEEgDQpzdHlsZT0iQ09MT1I6IHJnYig1MSw1MSwx NTMpIiBocmVmPSJtYWlsdG86YmVhcmluZy1lcmljQGRuY3Qtc291cmNlcy5jb20iIA0KdGFyZ2V0 PV9ibGFuaz5iZWFyaW5nLWVyaWNAZG5jdC1zb3VyY2VzLmNvbTwvQT48U1BBTiANCmNsYXNzPUFw cGxlLWNvbnZlcnRlZC1zcGFjZT4mbmJzcDs8L1NQQU4+PFdCUj48V0JSPjxXQlI+PFdCUj48V0JS PjxXQlI+PFdCUj48V0JSPjxXQlI+PFdCUj48Rk9OVCANCmZhY2U9QXJpYWw+U2t5cGU6IGRuY3Qt c291cmNlczxCUj48L0ZPTlQ+PEZPTlQgDQpzaXplPTM+LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS08Rk9OVCANCmNvbG9yPSMwMDAwZmY+LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tPEJSPjwvRk9OVD48L0ZPTlQ+PC9GT05UPjwvRk9OVD48U1RST05HIA0Kc3R5bGU9 IkZPTlQtU0laRTogMTNweDsgRk9OVC1GQU1JTFk6IFZlcmRhbmE7IEZPTlQtVkFSSUFOVDogbm9y bWFsOyBXSElURS1TUEFDRTogbm9ybWFsOyBXT1JELVNQQUNJTkc6IDBweDsgVEVYVC1UUkFOU0ZP Uk06IG5vbmU7IENPTE9SOiByZ2IoMCwwLDI1NSk7IEZPTlQtU1RZTEU6IG5vcm1hbDsgT1JQSEFO UzogMjsgV0lET1dTOiAyOyBMRVRURVItU1BBQ0lORzogbm9ybWFsOyBMSU5FLUhFSUdIVDogMjJw eDsgVEVYVC1JTkRFTlQ6IDBweDsgLXdlYmtpdC10ZXh0LXNpemUtYWRqdXN0OiBhdXRvOyAtd2Vi a2l0LXRleHQtc3Ryb2tlLXdpZHRoOiAwcHgiPjxTUEFOIA0KbGFuZz1FTi1QSCANCnN0eWxlPSJG T05ULVNJWkU6IDE4cHQ7IEZPTlQtRkFNSUxZOiBXZWJkaW5nczsgQ09MT1I6IGdyZWVuIj5QPC9T UEFOPjxJPjxTUEFOIA0KbGFuZz1FTi1QSCBzdHlsZT0iRk9OVC1GQU1JTFk6IFdlYmRpbmdzOyBD T0xPUjogbmF2eSI+PFNQQU4gDQpjbGFzcz1BcHBsZS1jb252ZXJ0ZWQtc3BhY2U+Jm5ic3A7PC9T UEFOPjwvU1BBTj48L0k+PEk+PFNQQU4gbGFuZz1FTi1QSCANCnN0eWxlPSJGT05ULVNJWkU6IDcu NXB0OyBDT0xPUjogZ3JlZW4iPlRoaW5rIG9mIHRoZSBlbnZpcm9ubWVudCAtIHBsZWFzZSBkb24n dCANCnByaW50IHRoaXMgZS1tYWlsIHVubGVzcyB5b3UgcmVhbGx5IG5lZWQgdG8uPC9TUEFOPjwv ST48U1BBTiANCnN0eWxlPSJDT0xPUjogYmxhY2siPjxvOnA+PC9vOnA+PC9TUEFOPjwvU1RST05H PjxTUEFOIA0Kc3R5bGU9IldISVRFLVNQQUNFOiBub3JtYWw7IFdPUkQtU1BBQ0lORzogMHB4OyBU RVhULVRSQU5TRk9STTogbm9uZTsgRkxPQVQ6IG5vbmU7IENPTE9SOiByZ2IoMCwwLDI1NSk7IEZP TlQ6IDEzcHgvMjJweCBWZXJkYW5hOyBPUlBIQU5TOiAyOyBXSURPV1M6IDI7IERJU1BMQVk6IGlu bGluZSAhaW1wb3J0YW50OyBMRVRURVItU1BBQ0lORzogbm9ybWFsOyBURVhULUlOREVOVDogMHB4 OyAtd2Via2l0LXRleHQtc2l6ZS1hZGp1c3Q6IGF1dG87IC13ZWJraXQtdGV4dC1zdHJva2Utd2lk dGg6IDBweCI+PFNQQU4gDQpjbGFzcz1BcHBsZS1jb252ZXJ0ZWQtc3BhY2U+Jm5ic3A7PC9TUEFO PjwvU1BBTj48QlIgDQpzdHlsZT0iV0hJVEUtU1BBQ0U6IG5vcm1hbDsgV09SRC1TUEFDSU5HOiAw cHg7IFRFWFQtVFJBTlNGT1JNOiBub25lOyBDT0xPUjogcmdiKDAsMCwyNTUpOyBGT05UOiAxM3B4 LzIycHggVmVyZGFuYTsgT1JQSEFOUzogMjsgV0lET1dTOiAyOyBMRVRURVItU1BBQ0lORzogbm9y bWFsOyBURVhULUlOREVOVDogMHB4OyAtd2Via2l0LXRleHQtc2l6ZS1hZGp1c3Q6IGF1dG87IC13 ZWJraXQtdGV4dC1zdHJva2Utd2lkdGg6IDBweCI+PFNQQU4gDQpzdHlsZT0iRk9OVC1TSVpFOiA4 cHQ7IEZPTlQtRkFNSUxZOiBWZXJkYW5hOyBGT05ULVZBUklBTlQ6IG5vcm1hbDsgV0hJVEUtU1BB Q0U6IG5vcm1hbDsgV09SRC1TUEFDSU5HOiAwcHg7IFRFWFQtVFJBTlNGT1JNOiBub25lOyBGT05U LVdFSUdIVDogbm9ybWFsOyBDT0xPUjogYmx1ZTsgRk9OVC1TVFlMRTogbm9ybWFsOyBPUlBIQU5T OiAyOyBXSURPV1M6IDI7IExFVFRFUi1TUEFDSU5HOiBub3JtYWw7IFRFWFQtSU5ERU5UOiAwcHg7 IC13ZWJraXQtdGV4dC1zaXplLWFkanVzdDogYXV0bzsgLXdlYmtpdC10ZXh0LXN0cm9rZS13aWR0 aDogMHB4Ij48Rk9OVCANCnNpemU9MT5UaGlzIGVtYWlsIGlzIGNvbmZpZGVudGlhbC4gSWYgeW91 IGFyZSBub3QgdGhlIGludGVuZGVkIHJlY2lwaWVudCBvZiB0aGlzIA0KbWVzc2FnZSB5b3UgYXJl IGhlcmVieSBub3RpZmllZCB0aGF0IGFueSB1c2UsIHJldmlldywgcmV0cmFuc21pc3Npb24sIA0K ZGlzc2VtaW5hdGlvbiwgZGlzdHJpYnV0aW9uLCByZXByb2R1Y3Rpb24gb3IgYW55IGFjdGlvbiB0 YWtlbiBpbiByZWxpYW5jZSB1cG9uIA0KdGhpcyBtZXNzYWdlIGlzIHByb2hpYml0ZWQuIElmIHlv dSBoYXZlIHJlY2VpdmVkIHRoaXMgZW1haWwgaW4gZXJyb3IsIHBsZWFzZSANCmNvbnRhY3QgdGhl IHNlbmRlciBieSByZXR1cm4gZW1haWwgYW5kIGRlbGV0ZSB0aGUgZW1haWwgYW5kIGFueSBhdHRh Y2htZW50cy4gQW55IA0KcGVyc29uYWwgdmlld3MvIG9waW5pb25zIGV4cHJlc3NlZCBpbiB0aGlz IG1lc3NhZ2UgYXJlIHRob3NlIG9mIHRoZSBpbmRpdmlkdWFsIA0Kc2VuZGVyIGFuZCBtYXkgbm90 IG5lY2Vzc2FyaWx5IHJlZmxlY3QgdGhlIHZpZXdzLyBvcGluaW9ucyBvZiB0aGUgDQpjb21wYW55 LjwvRk9OVD48L1NQQU4+PC9TUEFOPjwvRk9OVD48L0ZPTlQ+PC9TUEFOPjwvRElWPjwvRElWPjwv RElWPjwvRElWPjwvRElWPjwvU1BBTj48L0RJVj48L0RJVj48L0gyPjxicj48YnI+PGJyPjxicj48 YnI+PGJyPjxicj4NCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPGJyPg0KVW5zdWJzY3JpYmUgdGhpcyBlbWFp bCAuIFBsZWFzZSBnbyBpbnRvIDogaHR0cHM6Ly9qaW5zaHVqdS5uZXQvZi9DaFRLTW08YnI+DQot LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLTxicj4NCjwvQk9EWT48L0hUTUw+DQp= ------=_NextPart_001_0157_019902BD.1B87C660-- ------=_NextPart_000_0DE5_019902BD.1B87C660 Content-Type: image/jpeg; name="DNCT Ball bearing Series.jpg" Content-Transfer-Encoding: base64 Content-ID: <0001D6C1106A_0D9ECC49_0CD03679> /9j/4AAQSkZJRgABAgEAYABgAAD/4RckRXhpZgAATU0AKgAAAAgABwESAAMAAAABAAEAAAEaAAUA AAABAAAAYgEbAAUAAAABAAAAagEoAAMAAAABAAIAAAExAAIAAAAcAAAAcgEyAAIAAAAUAAAAjodp AAQAAAABAAAApAAAANAADqYAAAAnEAAOpgAAACcQQWRvYmUgUGhvdG9zaG9wIENTNCBXaW5kb3dz ADIwMTQ6MDY6MTkgMTE6MjY6MzUAAAAAA6ABAAMAAAAB//8AAKACAAQAAAABAAAEAKADAAQAAAAB AAAB5wAAAAAAAAAGAQMAAwAAAAEABgAAARoABQAAAAEAAAEeARsABQAAAAEAAAEmASgAAwAAAAEA AgAAAgEABAAAAAEAAAEuAgIABAAAAAEAABXuAAAAAAAAAEgAAAABAAAASAAAAAH/2P/gABBKRklG AAECAABIAEgAAP/tAAxBZG9iZV9DTQAC/+4ADkFkb2JlAGSAAAAAAf/bAIQADAgICAkIDAkJDBEL CgsRFQ8MDA8VGBMTFRMTGBEMDAwMDAwRDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAENCwsN Dg0QDg4QFA4ODhQUDg4ODhQRDAwMDAwREQwMDAwMDBEMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM DAwM/8AAEQgATACgAwEiAAIRAQMRAf/dAAQACv/EAT8AAAEFAQEBAQEBAAAAAAAAAAMAAQIEBQYH CAkKCwEAAQUBAQEBAQEAAAAAAAAAAQACAwQFBgcICQoLEAABBAEDAgQCBQcGCAUDDDMBAAIRAwQh EjEFQVFhEyJxgTIGFJGhsUIjJBVSwWIzNHKC0UMHJZJT8OHxY3M1FqKygyZEk1RkRcKjdDYX0lXi ZfKzhMPTdePzRieUpIW0lcTU5PSltcXV5fVWZnaGlqa2xtbm9jdHV2d3h5ent8fX5/cRAAICAQIE BAMEBQYHBwYFNQEAAhEDITESBEFRYXEiEwUygZEUobFCI8FS0fAzJGLhcoKSQ1MVY3M08SUGFqKy gwcmNcLSRJNUoxdkRVU2dGXi8rOEw9N14/NGlKSFtJXE1OT0pbXF1eX1VmZ2hpamtsbW5vYnN0dX Z3eHl6e3x//aAAwDAQACEQMRAD8A1626afBBy+q9MwZOVkNrc3QtHuP9rb7W/wBpc/8AWj6znBBw sV0WmQ9w/wCn9H3bK/z9v87Z+j/MsXL5HTi679YyPtrnNa5j6PcCCGveGNeGMYynd6L3/wAx6iCn vK/rh9XrHhoySCdASBH/AEXOci9W67TVisbh3guuD3vuZq6qmlvqZFjWn3Mudurpp3f6T1f8GuGu oxMltDMrDdjtx6/S9XGFZc+SXetl1sdvutbv+nV/g/8ABKfRWUtvOLWftAtxchjGu0bY4bL9rJ+j XdXX7ElM8/D6zffQbMqtjMmluWymq6WsoeTuffc32+oz/Cvt/wAKouzH4vUH2fVvqlnpB36HHybD vcP3C57WYtrnfuMsR8bo+ZTm9V6XdjirIssqcKT7WmvfPpabf9JRvT5eFbj/AKHLxTXv0YCJrfH5 oP738lIlT1XQPrMOpvdg51f2TqtTZfSdG2aTuq/lfyFu0D6XaSvLLW32PY/FJPUsICyh7T7rKmn3 VOd+fbi/mO+nZQ//AEla9I6B1JvV+kU9RZo5/ttA7WNHv/zvpoxGqg3XQqztCQrTh3CrW8+RRK9G VEpyolNUo+SbVKUgkprdYayzpd4f9FrHT4bS0hyN/ikyn3Yl1TzLqqKYnwJu2/8AUrF+uPUxRhN6 TQQczOjcP9HTy+1/7u+P8xav+KcD7T1MNkVirHa34A3hInYeK3v5Po6zut9e6b0PEOVn2ETIppYN 1trwJ9LHq/Pf/wCBs/wr661PrXWMLonTbuo5zi2mkfRGrnuPtrpqB+lZY7/1J+jXnVvSs362U29f yc6pmY0ezpj5bWzHn9HS63Sz9JP7n6xZ/P8A+CpoKGPUP8av1iZl7qMGjFxTrXVeH2WOaNHuN1dl NX/W66/Z/pF3n1Y+tGB9YsFt9H6LJaIyMUmXMcDsftOnqVb2/o7f+oXi/XcR3TbsfBtqOM+trsq3 HJ3GsWBuyt0fzbnMa+z0Vb+qN+f0nr3ST7qrb76WWA8OryXtrsH+Zf8A56BKn//Q4k0vzMvMveGP ZjlrbN7gHAPeyv1GMPuue6135n0P5xdR9Wuj15uMcq8Sx5JcAYkguZXVu/0dNbVx+TQ1mY62wuab NayIgXMIZaywu/NbG5dh9W+q5PT3u6dfjum4i1uK5wqvYXgH1MduR6deVjZH879Ov9//AINJTY6z 0HAFBdVUKnt+i9ntI+YXHsybMO+rIqIORjWB4nhzmn3Md/IurO1eldRxsg4+/LbX0vHd9LKz7KmM A/kU03W25D/3Kf0Pqf6Zef8AWR0zNywPq9Sb6MZgqmyRkZlrzZ6nUKsX2uexrh/Ms/mqvT/Q+l+j qFKXyGW4PU6et9IrsycPNBfWxu4lo/7UYVxG/wDSVe7+p7Lf8Eusv6z03rXQ8lm6bwyRpJbazVm7 09/pW7x/xNn+BtXM9Cys7poZlYji9lvvspDg2TBYL8aw+yrK2/o37/0V9f6K5V/2Qy/LGT07Kse/ cDbjtDacxjSQ64vqe+ne/wD4r9E9JTIYmQ++2yip7mMptZXDTL7Hs27atNzm1/zj7P5ti6j/ABYe s/omXTqf1ppaPMM1/Kucz8DqNea93T7Myqqpz2N6jmvNbjS8em9u15Dm72+3ZWz9Ku++pPTWdI6S 6t0tda4Ph+joAPve0/Qfa53qbP3PTrTobhIdBwiQdCNFXsA5CsX2NdYXMEBAcx7gSAUjuuQO+9QI 7oGZ1XpeDrmZlNJH5peC7/ttm56w8n68YBJZ0vFu6hYPz49Oof1nHdZ/57TaRb0YY5xgCfJYPWPr Zi4TjidNDc7qGo0M01R+fdZ9Gzb+5/249c51PrXV+oMLM/KbjYx5xMXQEeFtvu3/AOfcs+pjrAKM av0qj2b9J39Y/S/zkiQN0gEpA66/IsstsOTk3OnJyDy4/wCir/4Nq9Q/xZ4jsb7Zu+k9lRd8ZtXI dG6H6e2y0aj6LfBdZj9Rf0XonWM+nS6rHrbQYkC2xz8fGLv5Pr2MTRZNlRoCg4H+MDrtnWet/ZKS 53S+lO2Oj6D8gFzHvd/Vc2yhn/B03/4LNW19VsWjA6PZ9b+tyKKGGzBqcPzfotyzP0rcpztmH/o6 f03/AGp/R8Hg0h/ULcAWvonI9DIfqYxwW0OtsZru9PFb6vqfvrX+u/1kd1i+rpuIw1dIwS1lOLXo bLANlFRa38/b9Cr/AAH9dOrWz0W3pTzmZk5PWup3ZmV/O5zzfeP3agf0dQ/6NbF1X1Oov6j9YcDD eBZTj2fay5wk1Noixmx37jsl2PVs/wCEWVj9MdiUudcWm5/vyHjRogfQa7/RUMXpH+Lz6vu6fgWd UyWbMrqIaa2uA3Mx2+6hp/OZZfu+03M/4mmz346aDxHTYJIoP//R5/rPTnU2vtNP2nEuM30jRwI/ w1LvzLf+rVPBwun5XrN+10Zb7ajVjs6jaceyh0fo3fpGvqt9P2/QtrYvWz9SKHCHZbyP6jVh9Y+o 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 J/2570kuYavSp2QY+i0HmB+9/KcrfRKbKhfW1v6S0Vvq3aAvpd6grc7+WrtP7D9EbPWnvujd/wBN CP7B3jd9r3SI2bee21JCTqnR3dQsfl4AL7i7WpzdxaHF1hrvrZ+mx8imx7v8G+jJq/SV2f6SeLgj Cx34NZNmRkFrbGwNzA51dlz7GML207/RZRh47/1iz+efXWi5X7Jln7Q9X6P6P1/S9Xb/ACfT/SbF u/Vv/m/A+ybt2vpx6cfy/R9L27/3/wDDIdEvY/U2k0YltTvpN2bo/eO5zvyrS650inq+AcazR7Ht tpeIltjD7XN3Bzfo7mf1Hqt9XPS25HpzyyZ+BWynIeWyur/XHCIxzg05bhsH2mtl0O/0r/Qrbaxr v3K/tP8A1ytV2fV/rFuB1bMzrXOz+qUChzWANLaz7bTXW11vpbcf9HRj+rZ/N+rZb6+VZ6fYpIfV P0fL8L9k4eM3HzsXOr6j+kNV2I5r62tYI3fZ2fZ8Or16/wBL6NuPvss9X/CLc/xaMzWY2cHgV9PL 6nYlLdwDHua6zLr2PLvSdufXvoZ+iqf/ADa0frF/zJ+0M/b32f149u/duifzvR/lfvra6d9g+xVf s30/se39D6MbI/k7Eh1UX//Z/+0dgFBob3Rvc2hvcCAzLjAAOEJJTQQEAAAAAAAHHAIAAALb6wA4 QklNBCUAAAAAABALfqPtv5uEyJGcznS33alIOEJJTQPtAAAAAAAQAGAAAAABAAIAYAAAAAEAAjhC SU0EJgAAAAAADgAAAAAAAAAAAAA/gAAAOEJJTQQNAAAAAAAEAAAAHjhCSU0EGQAAAAAABAAAAB44 QklNA/MAAAAAAAkAAAAAAAAAAAEAOEJJTScQAAAAAAAKAAEAAAAAAAAAAjhCSU0D9QAAAAAASAAv ZmYAAQBsZmYABgAAAAAAAQAvZmYAAQChmZoABgAAAAAAAQAyAAAAAQBaAAAABgAAAAAAAQA1AAAA AQAtAAAABgAAAAAAAThCSU0D+AAAAAAAcAAA/////////////////////////////wPoAAAAAP// //////////////////////////8D6AAAAAD/////////////////////////////A+gAAAAA//// /////////////////////////wPoAAA4QklNBAAAAAAAAAIABDhCSU0EAgAAAAAADgAAAAAAAAAA AAAAAAAAOEJJTQQwAAAAAAAHAQEBAQEBAQA4QklNBC0AAAAAAAYAAQAAABw4QklNBAgAAAAAABAA AAABAAACQAAAAkAAAAAAOEJJTQQeAAAAAAAEAAAAADhCSU0EGgAAAAADZQAAAAYAAAAAAAAAAAAA AecAAAQAAAAAGABEAE4AQwBUACAAQgBhAGwAbAAgAGIAZQBhAHIAaQBuAGcAIABTAGUAcgBpAGUA cwAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAEAAAAAecAAAAAAAAAAAAAAAAAAAAA AQAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAQAAAAAAAG51bGwAAAACAAAABmJvdW5kc09iamMAAAAB AAAAAAAAUmN0MQAAAAQAAAAAVG9wIGxvbmcAAAAAAAAAAExlZnRsb25nAAAAAAAAAABCdG9tbG9u ZwAAAecAAAAAUmdodGxvbmcAAAQAAAAABnNsaWNlc1ZsTHMAAAABT2JqYwAAAAEAAAAAAAVzbGlj ZQAAABIAAAAHc2xpY2VJRGxvbmcAAAAAAAAAB2dyb3VwSURsb25nAAAAAAAAAAZvcmlnaW5lbnVt AAAADEVTbGljZU9yaWdpbgAAAA1hdXRvR2VuZXJhdGVkAAAAAFR5cGVlbnVtAAAACkVTbGljZVR5 cGUAAAAASW1nIAAAAAZib3VuZHNPYmpjAAAAAQAAAAAAAFJjdDEAAAAEAAAAAFRvcCBsb25nAAAA AAAAAABMZWZ0bG9uZwAAAAAAAAAAQnRvbWxvbmcAAAHnAAAAAFJnaHRsb25nAAAEAAAAAAN1cmxU RVhUAAAAAQAAAAAAAG51bGxURVhUAAAAAQAAAAAAAE1zZ2VURVhUAAAAAQAAAAAABmFsdFRhZ1RF WFQAAAABAAAAAAAOY2VsbFRleHRJc0hUTUxib29sAQAAAAhjZWxsVGV4dFRFWFQAAAABAAAAAAAJ aG9yekFsaWduZW51bQAAAA9FU2xpY2VIb3J6QWxpZ24AAAAHZGVmYXVsdAAAAAl2ZXJ0QWxpZ25l bnVtAAAAD0VTbGljZVZlcnRBbGlnbgAAAAdkZWZhdWx0AAAAC2JnQ29sb3JUeXBlZW51bQAAABFF U2xpY2VCR0NvbG9yVHlwZQAAAABOb25lAAAACXRvcE91dHNldGxvbmcAAAAAAAAACmxlZnRPdXRz ZXRsb25nAAAAAAAAAAxib3R0b21PdXRzZXRsb25nAAAAAAAAAAtyaWdodE91dHNldGxvbmcAAAAA ADhCSU0EKAAAAAAADAAAAAI/8AAAAAAAADhCSU0EEQAAAAAAAQEAOEJJTQQUAAAAAAAEAAAAHDhC SU0EDAAAAAAWCgAAAAEAAACgAAAATAAAAeAAAI6AAAAV7gAYAAH/2P/gABBKRklGAAECAABIAEgA AP/tAAxBZG9iZV9DTQAC/+4ADkFkb2JlAGSAAAAAAf/bAIQADAgICAkIDAkJDBELCgsRFQ8MDA8V GBMTFRMTGBEMDAwMDAwRDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAENCwsNDg0QDg4QFA4O DhQUDg4ODhQRDAwMDAwREQwMDAwMDBEMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM/8AAEQgA TACgAwEiAAIRAQMRAf/dAAQACv/EAT8AAAEFAQEBAQEBAAAAAAAAAAMAAQIEBQYHCAkKCwEAAQUB AQEBAQEAAAAAAAAAAQACAwQFBgcICQoLEAABBAEDAgQCBQcGCAUDDDMBAAIRAwQhEjEFQVFhEyJx gTIGFJGhsUIjJBVSwWIzNHKC0UMHJZJT8OHxY3M1FqKygyZEk1RkRcKjdDYX0lXiZfKzhMPTdePz RieUpIW0lcTU5PSltcXV5fVWZnaGlqa2xtbm9jdHV2d3h5ent8fX5/cRAAICAQIEBAMEBQYHBwYF NQEAAhEDITESBEFRYXEiEwUygZEUobFCI8FS0fAzJGLhcoKSQ1MVY3M08SUGFqKygwcmNcLSRJNU oxdkRVU2dGXi8rOEw9N14/NGlKSFtJXE1OT0pbXF1eX1VmZ2hpamtsbW5vYnN0dXZ3eHl6e3x//a AAwDAQACEQMRAD8A1626afBBy+q9MwZOVkNrc3QtHuP9rb7W/wBpc/8AWj6znBBwsV0WmQ9w/wCn 9H3bK/z9v87Z+j/MsXL5HTi679YyPtrnNa5j6PcCCGveGNeGMYynd6L3/wAx6iCnvK/rh9XrHhoy SCdASBH/AEXOci9W67TVisbh3guuD3vuZq6qmlvqZFjWn3Mudurpp3f6T1f8GuGuoxMltDMrDdjt x6/S9XGFZc+SXetl1sdvutbv+nV/g/8ABKfRWUtvOLWftAtxchjGu0bY4bL9rJ+jXdXX7ElM8/D6 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 2vpx6cfy/R9L27/3/wDDIdEvY/U2k0YltTvpN2bo/eO5zvyrS650inq+AcazR7HttpeIltjD7XN3 Bzfo7mf1Hqt9XPS25HpzyyZ+BWynIeWyur/XHCIxzg05bhsH2mtl0O/0r/Qrbaxrv3K/tP8A1ytV 2fV/rFuB1bMzrXOz+qUChzWANLaz7bTXW11vpbcf9HRj+rZ/N+rZb6+VZ6fYpIfVP0fL8L9k4eM3 HzsXOr6j+kNV2I5r62tYI3fZ2fZ8Or16/wBL6NuPvss9X/CLc/xaMzWY2cHgV9PL6nYlLdwDHua6 zLr2PLvSdufXvoZ+iqf/ADa0frF/zJ+0M/b32f149u/duifzvR/lfvra6d9g+xVfs30/se39D6Mb I/k7Eh1UX//ZOEJJTQQhAAAAAABVAAAAAQEAAAAPAEEAZABvAGIAZQAgAFAAaABvAHQAbwBzAGgA bwBwAAAAEwBBAGQAbwBiAGUAIABQAGgAbwB0AG8AcwBoAG8AcAAgAEMAUwA0AAAAAQA4QklND6AA AAAAAQxtYW5pSVJGUgAAAQA4QklNQW5EcwAAAOAAAAAQAAAAAQAAAAAAAG51bGwAAAADAAAAAEFG U3Rsb25nAAAAAAAAAABGckluVmxMcwAAAAFPYmpjAAAAAQAAAAAAAG51bGwAAAACAAAAAEZySURs b25nCzSXXAAAAABGckdBZG91YkA+AAAAAAAAAAAAAEZTdHNWbExzAAAAAU9iamMAAAABAAAAAAAA bnVsbAAAAAQAAAAARnNJRGxvbmcAAAAAAAAAAEFGcm1sb25nAAAAAAAAAABGc0ZyVmxMcwAAAAFs b25nCzSXXAAAAABMQ250bG9uZwAAAAAAADhCSU1Sb2xsAAAACAAAAAAAAAAAOEJJTQ+hAAAAAAAc bWZyaQAAAAIAAAAQAAAAAQAAAAAAAAABAAAAADhCSU0EBgAAAAAABwAFAAAAAQEA/+EaUGh0dHA6 Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8APD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBD ZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIg eDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNC4yLjItYzA2MyA1My4zNTI2MjQsIDIwMDgvMDcvMzAt MTg6MTI6MTggICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcv MTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIi IHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6 Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5h ZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29t L3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NU eXBlL1Jlc291cmNlRXZlbnQjIiB4bWxuczpzdFJlZj0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAv MS4wL3NUeXBlL1Jlc291cmNlUmVmIyIgeG1sbnM6dGlmZj0iaHR0cDovL25zLmFkb2JlLmNvbS90 aWZmLzEuMC8iIHhtbG5zOmV4aWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20vZXhpZi8xLjAvIiB4bXA6 Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCBDUzQgV2luZG93cyIgeG1wOkNyZWF0ZURhdGU9 IjIwMTQtMDUtMjlUMDg6NTY6MTgrMDg6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDE0LTA2LTE5VDEx OjI2OjM1KzA4OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDE0LTA2LTE5VDExOjI2OjM1KzA4OjAw IiBkYzpmb3JtYXQ9ImltYWdlL2pwZWciIHBob3Rvc2hvcDpDb2xvck1vZGU9IjMiIHhtcE1NOklu c3RhbmNlSUQ9InhtcC5paWQ6N0FDNDJFMzI1RUY3RTMxMUFCRkJGRTdERjkyMTEyNzYiIHhtcE1N OkRvY3VtZW50SUQ9InhtcC5kaWQ6QjBFQ0IxQjVDREU2RTMxMTkxQjBGRERBMjJCMkYzMTUiIHht cE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDpCMEVDQjFCNUNERTZFMzExOTFCMEZEREEy MkIyRjMxNSIgdGlmZjpPcmllbnRhdGlvbj0iMSIgdGlmZjpYUmVzb2x1dGlvbj0iOTYwMDAwLzEw MDAwIiB0aWZmOllSZXNvbHV0aW9uPSI5NjAwMDAvMTAwMDAiIHRpZmY6UmVzb2x1dGlvblVuaXQ9 IjIiIHRpZmY6TmF0aXZlRGlnZXN0PSIyNTYsMjU3LDI1OCwyNTksMjYyLDI3NCwyNzcsMjg0LDUz MCw1MzEsMjgyLDI4MywyOTYsMzAxLDMxOCwzMTksNTI5LDUzMiwzMDYsMjcwLDI3MSwyNzIsMzA1 LDMxNSwzMzQzMjszRjRCNkJGQTlCNzQ0NjEzNDk2MTc4MkZENzY0Mjc4NyIgZXhpZjpQaXhlbFhE aW1lbnNpb249IjEwMjQiIGV4aWY6UGl4ZWxZRGltZW5zaW9uPSI0ODciIGV4aWY6Q29sb3JTcGFj ZT0iNjU1MzUiIGV4aWY6TmF0aXZlRGlnZXN0PSIzNjg2NCw0MDk2MCw0MDk2MSwzNzEyMSwzNzEy Miw0MDk2Miw0MDk2MywzNzUxMCw0MDk2NCwzNjg2NywzNjg2OCwzMzQzNCwzMzQzNywzNDg1MCwz NDg1MiwzNDg1NSwzNDg1NiwzNzM3NywzNzM3OCwzNzM3OSwzNzM4MCwzNzM4MSwzNzM4MiwzNzM4 MywzNzM4NCwzNzM4NSwzNzM4NiwzNzM5Niw0MTQ4Myw0MTQ4NCw0MTQ4Niw0MTQ4Nyw0MTQ4OCw0 MTQ5Miw0MTQ5Myw0MTQ5NSw0MTcyOCw0MTcyOSw0MTczMCw0MTk4NSw0MTk4Niw0MTk4Nyw0MTk4 OCw0MTk4OSw0MTk5MCw0MTk5MSw0MTk5Miw0MTk5Myw0MTk5NCw0MTk5NSw0MTk5Niw0MjAxNiww LDIsNCw1LDYsNyw4LDksMTAsMTEsMTIsMTMsMTQsMTUsMTYsMTcsMTgsMjAsMjIsMjMsMjQsMjUs MjYsMjcsMjgsMzA7QThBQjcxNkYxNUJGQzdEREZFQzA0QjIyOTAzMEQ3MUYiPiA8eG1wTU06SGlz dG9yeT4gPHJkZjpTZXE+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJjcmVhdGVkIiBzdEV2dDppbnN0 YW5jZUlEPSJ4bXAuaWlkOkIwRUNCMUI1Q0RFNkUzMTE5MUIwRkREQTIyQjJGMzE1IiBzdEV2dDp3 aGVuPSIyMDE0LTA1LTI5VDA5OjA4OjMxKzA4OjAwIiBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZG9i ZSBQaG90b3Nob3AgQ1M0IFdpbmRvd3MiLz4gPHJkZjpsaSBzdEV2dDphY3Rpb249ImNvbnZlcnRl ZCIgc3RFdnQ6cGFyYW1ldGVycz0iZnJvbSBpbWFnZS9qcGVnIHRvIGFwcGxpY2F0aW9uL3ZuZC5h ZG9iZS5waG90b3Nob3AiLz4gPHJkZjpsaSBzdEV2dDphY3Rpb249InNhdmVkIiBzdEV2dDppbnN0 YW5jZUlEPSJ4bXAuaWlkOkIxRUNCMUI1Q0RFNkUzMTE5MUIwRkREQTIyQjJGMzE1IiBzdEV2dDp3 aGVuPSIyMDE0LTA1LTI5VDA5OjA4OjMxKzA4OjAwIiBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZG9i ZSBQaG90b3Nob3AgQ1M0IFdpbmRvd3MiIHN0RXZ0OmNoYW5nZWQ9Ii8iLz4gPHJkZjpsaSBzdEV2 dDphY3Rpb249InNhdmVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOkNEMkJEOUU2NTdGN0Uz MTE5NEJBQjAwMEQ3QzAxMTVBIiBzdEV2dDp3aGVuPSIyMDE0LTA2LTE5VDEwOjE3OjQ1KzA4OjAw IiBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgQ1M0IFdpbmRvd3MiIHN0RXZ0 OmNoYW5nZWQ9Ii8iLz4gPHJkZjpsaSBzdEV2dDphY3Rpb249InNhdmVkIiBzdEV2dDppbnN0YW5j ZUlEPSJ4bXAuaWlkOkNFMkJEOUU2NTdGN0UzMTE5NEJBQjAwMEQ3QzAxMTVBIiBzdEV2dDp3aGVu PSIyMDE0LTA2LTE5VDEwOjE3OjQ1KzA4OjAwIiBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQ aG90b3Nob3AgQ1M0IFdpbmRvd3MiIHN0RXZ0OmNoYW5nZWQ9Ii8iLz4gPHJkZjpsaSBzdEV2dDph Y3Rpb249InNhdmVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOkNGMkJEOUU2NTdGN0UzMTE5 NEJBQjAwMEQ3QzAxMTVBIiBzdEV2dDp3aGVuPSIyMDE0LTA2LTE5VDEwOjE5OjQ4KzA4OjAwIiBz dEV2dDpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgQ1M0IFdpbmRvd3MiIHN0RXZ0OmNo YW5nZWQ9Ii8iLz4gPHJkZjpsaSBzdEV2dDphY3Rpb249InNhdmVkIiBzdEV2dDppbnN0YW5jZUlE PSJ4bXAuaWlkOjc1QzQyRTMyNUVGN0UzMTFBQkZCRkU3REY5MjExMjc2IiBzdEV2dDp3aGVuPSIy MDE0LTA2LTE5VDExOjAyOjQ5KzA4OjAwIiBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90 b3Nob3AgQ1M0IFdpbmRvd3MiIHN0RXZ0OmNoYW5nZWQ9Ii8iLz4gPHJkZjpsaSBzdEV2dDphY3Rp b249InNhdmVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOjc2QzQyRTMyNUVGN0UzMTFBQkZC RkU3REY5MjExMjc2IiBzdEV2dDp3aGVuPSIyMDE0LTA2LTE5VDExOjAyOjQ5KzA4OjAwIiBzdEV2 dDpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgQ1M0IFdpbmRvd3MiIHN0RXZ0OmNoYW5n ZWQ9Ii8iLz4gPHJkZjpsaSBzdEV2dDphY3Rpb249InNhdmVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4 bXAuaWlkOjc3QzQyRTMyNUVGN0UzMTFBQkZCRkU3REY5MjExMjc2IiBzdEV2dDp3aGVuPSIyMDE0 LTA2LTE5VDExOjA1OjE2KzA4OjAwIiBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3No b3AgQ1M0IFdpbmRvd3MiIHN0RXZ0OmNoYW5nZWQ9Ii8iLz4gPHJkZjpsaSBzdEV2dDphY3Rpb249 InNhdmVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOjc4QzQyRTMyNUVGN0UzMTFBQkZCRkU3 REY5MjExMjc2IiBzdEV2dDp3aGVuPSIyMDE0LTA2LTE5VDExOjI2OjI4KzA4OjAwIiBzdEV2dDpz b2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgQ1M0IFdpbmRvd3MiIHN0RXZ0OmNoYW5nZWQ9 Ii8iLz4gPHJkZjpsaSBzdEV2dDphY3Rpb249InNhdmVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAu aWlkOjc5QzQyRTMyNUVGN0UzMTFBQkZCRkU3REY5MjExMjc2IiBzdEV2dDp3aGVuPSIyMDE0LTA2 LTE5VDExOjI2OjM1KzA4OjAwIiBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3Ag Q1M0IFdpbmRvd3MiIHN0RXZ0OmNoYW5nZWQ9Ii8iLz4gPHJkZjpsaSBzdEV2dDphY3Rpb249ImNv bnZlcnRlZCIgc3RFdnQ6cGFyYW1ldGVycz0iZnJvbSBhcHBsaWNhdGlvbi92bmQuYWRvYmUucGhv dG9zaG9wIHRvIGltYWdlL2pwZWciLz4gPHJkZjpsaSBzdEV2dDphY3Rpb249ImRlcml2ZWQiIHN0 RXZ0OnBhcmFtZXRlcnM9ImNvbnZlcnRlZCBmcm9tIGFwcGxpY2F0aW9uL3ZuZC5hZG9iZS5waG90 b3Nob3AgdG8gaW1hZ2UvanBlZyIvPiA8cmRmOmxpIHN0RXZ0OmFjdGlvbj0ic2F2ZWQiIHN0RXZ0 Omluc3RhbmNlSUQ9InhtcC5paWQ6N0FDNDJFMzI1RUY3RTMxMUFCRkJGRTdERjkyMTEyNzYiIHN0 RXZ0OndoZW49IjIwMTQtMDYtMTlUMTE6MjY6MzUrMDg6MDAiIHN0RXZ0OnNvZnR3YXJlQWdlbnQ9 IkFkb2JlIFBob3Rvc2hvcCBDUzQgV2luZG93cyIgc3RFdnQ6Y2hhbmdlZD0iLyIvPiA8L3JkZjpT ZXE+IDwveG1wTU06SGlzdG9yeT4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9 InhtcC5paWQ6NzlDNDJFMzI1RUY3RTMxMUFCRkJGRTdERjkyMTEyNzYiIHN0UmVmOmRvY3VtZW50 SUQ9InhtcC5kaWQ6QjBFQ0IxQjVDREU2RTMxMTkxQjBGRERBMjJCMkYzMTUiIHN0UmVmOm9yaWdp bmFsRG9jdW1lbnRJRD0ieG1wLmRpZDpCMEVDQjFCNUNERTZFMzExOTFCMEZEREEyMkIyRjMxNSIv PiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gICAgICAgICAgICAg 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 ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8P3hwYWNrZXQgZW5kPSJ3 Ij8+/+4ADkFkb2JlAGRAAAAAAf/bAIQABAMDAwMDBAMDBAYEAwQGBwUEBAUHCAYGBwYGCAoICQkJ CQgKCgwMDAwMCgwMDAwMDAwMDAwMDAwMDAwMDAwMDAEEBQUIBwgPCgoPFA4ODhQUDg4ODhQRDAwM DAwREQwMDAwMDBEMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM/8AAEQgB5wQAAwERAAIRAQMR Af/dAAQAgP/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8AmNXDspY7MB92+RY2qRl6 V5GpHif2jijkro0lahj1J6+G2KUWhIIqSOg6ntvilVVmYU5GoHWvcnArYMnKtTQ1PX6MK0GyX2oS DUAmp7b5Aobo5X7RrTffxOIVQdpVBappQnrTvhS19YY1+I1374Eq8TN3Yih6V8BiqIjdv5j274qu 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 uxV//9k= ------=_NextPart_000_0DE5_019902BD.1B87C660 Content-Type: image/jpeg; name="DNCT Roller bearing Series.jpg" Content-Transfer-Encoding: base64 Content-ID: <000713953B38_05590B20_0C812B23> /9j/4AAQSkZJRgABAgEAYABgAAD/4Ri/RXhpZgAATU0AKgAAAAgABwESAAMAAAABAAEAAAEaAAUA AAABAAAAYgEbAAUAAAABAAAAagEoAAMAAAABAAIAAAExAAIAAAAcAAAAcgEyAAIAAAAUAAAAjodp AAQAAAABAAAApAAAANAADqYAAAAnEAAOpgAAACcQQWRvYmUgUGhvdG9zaG9wIENTNCBXaW5kb3dz ADIwMTQ6MDg6MDkgMDY6NDc6NTEAAAAAA6ABAAMAAAAB//8AAKACAAQAAAABAAAEGaADAAQAAAAB AAABrAAAAAAAAAAGAQMAAwAAAAEABgAAARoABQAAAAEAAAEeARsABQAAAAEAAAEmASgAAwAAAAEA AgAAAgEABAAAAAEAAAEuAgIABAAAAAEAABeJAAAAAAAAAEgAAAABAAAASAAAAAH/2P/gABBKRklG AAECAABIAEgAAP/tAAxBZG9iZV9DTQAC/+4ADkFkb2JlAGSAAAAAAf/bAIQADAgICAkIDAkJDBEL CgsRFQ8MDA8VGBMTFRMTGBEMDAwMDAwRDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAENCwsN Dg0QDg4QFA4ODhQUDg4ODhQRDAwMDAwREQwMDAwMDBEMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM DAwM/8AAEQgAQQCgAwEiAAIRAQMRAf/dAAQACv/EAT8AAAEFAQEBAQEBAAAAAAAAAAMAAQIEBQYH CAkKCwEAAQUBAQEBAQEAAAAAAAAAAQACAwQFBgcICQoLEAABBAEDAgQCBQcGCAUDDDMBAAIRAwQh EjEFQVFhEyJxgTIGFJGhsUIjJBVSwWIzNHKC0UMHJZJT8OHxY3M1FqKygyZEk1RkRcKjdDYX0lXi ZfKzhMPTdePzRieUpIW0lcTU5PSltcXV5fVWZnaGlqa2xtbm9jdHV2d3h5ent8fX5/cRAAICAQIE BAMEBQYHBwYFNQEAAhEDITESBEFRYXEiEwUygZEUobFCI8FS0fAzJGLhcoKSQ1MVY3M08SUGFqKy gwcmNcLSRJNUoxdkRVU2dGXi8rOEw9N14/NGlKSFtJXE1OT0pbXF1eX1VmZ2hpamtsbW5vYnN0dX Z3eHl6e3x//aAAwDAQACEQMRAD8A0cnIZj1l7omCdSQABG6x5aHu9Nu5jf0bLLbbbKqKK7b7a2LP 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 AAAHHAIAAALb6wA4QklNBCUAAAAAABALfqPtv5uEyJGcznS33alIOEJJTQPtAAAAAAAQAGAAAAAB AAIAYAAAAAEAAjhCSU0EJgAAAAAADgAAAAAAAAAAAAA/gAAAOEJJTQQNAAAAAAAEAAAAHjhCSU0E GQAAAAAABAAAAB44QklNA/MAAAAAAAkAAAAAAAAAAAEAOEJJTScQAAAAAAAKAAEAAAAAAAAAAjhC SU0D9QAAAAAASAAvZmYAAQBsZmYABgAAAAAAAQAvZmYAAQChmZoABgAAAAAAAQAyAAAAAQBaAAAA BgAAAAAAAQA1AAAAAQAtAAAABgAAAAAAAThCSU0D+AAAAAAAcAAA//////////////////////// /////wPoAAAAAP////////////////////////////8D6AAAAAD///////////////////////// ////A+gAAAAA/////////////////////////////wPoAAA4QklNBAAAAAAAAAIABjhCSU0EAgAA AAAAEgAAAAAAAAAAAAAAAAAAAAAAADhCSU0EMAAAAAAACQEBAQEBAQEBAQA4QklNBC0AAAAAAAYA AQAAACQ4QklNBAgAAAAAABAAAAABAAACQAAAAkAAAAAAOEJJTQQeAAAAAAAEAAAAADhCSU0EGgAA AAADaQAAAAYAAAAAAAAAAAAAAawAAAQZAAAAGgBEAE4AQwBUACAAUgBvAGwAbABlAHIAIABiAGUA YQByAGkAbgBnACAAUwBlAHIAaQBlAHMAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAA BBkAAAGsAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAEAAAAAAABudWxs AAAAAgAAAAZib3VuZHNPYmpjAAAAAQAAAAAAAFJjdDEAAAAEAAAAAFRvcCBsb25nAAAAAAAAAABM ZWZ0bG9uZwAAAAAAAAAAQnRvbWxvbmcAAAGsAAAAAFJnaHRsb25nAAAEGQAAAAZzbGljZXNWbExz AAAAAU9iamMAAAABAAAAAAAFc2xpY2UAAAASAAAAB3NsaWNlSURsb25nAAAAAAAAAAdncm91cElE bG9uZwAAAAAAAAAGb3JpZ2luZW51bQAAAAxFU2xpY2VPcmlnaW4AAAANYXV0b0dlbmVyYXRlZAAA AABUeXBlZW51bQAAAApFU2xpY2VUeXBlAAAAAEltZyAAAAAGYm91bmRzT2JqYwAAAAEAAAAAAABS Y3QxAAAABAAAAABUb3AgbG9uZwAAAAAAAAAATGVmdGxvbmcAAAAAAAAAAEJ0b21sb25nAAABrAAA AABSZ2h0bG9uZwAABBkAAAADdXJsVEVYVAAAAAEAAAAAAABudWxsVEVYVAAAAAEAAAAAAABNc2dl VEVYVAAAAAEAAAAAAAZhbHRUYWdURVhUAAAAAQAAAAAADmNlbGxUZXh0SXNIVE1MYm9vbAEAAAAI Y2VsbFRleHRURVhUAAAAAQAAAAAACWhvcnpBbGlnbmVudW0AAAAPRVNsaWNlSG9yekFsaWduAAAA B2RlZmF1bHQAAAAJdmVydEFsaWduZW51bQAAAA9FU2xpY2VWZXJ0QWxpZ24AAAAHZGVmYXVsdAAA AAtiZ0NvbG9yVHlwZWVudW0AAAARRVNsaWNlQkdDb2xvclR5cGUAAAAATm9uZQAAAAl0b3BPdXRz ZXRsb25nAAAAAAAAAApsZWZ0T3V0c2V0bG9uZwAAAAAAAAAMYm90dG9tT3V0c2V0bG9uZwAAAAAA AAALcmlnaHRPdXRzZXRsb25nAAAAAAA4QklNBCgAAAAAAAwAAAACP/AAAAAAAAA4QklNBBEAAAAA AAEBADhCSU0EFAAAAAAABAAAACU4QklNBAwAAAAAF6UAAAABAAAAoAAAAEEAAAHgAAB54AAAF4kA GAAB/9j/4AAQSkZJRgABAgAASABIAAD/7QAMQWRvYmVfQ00AAv/uAA5BZG9iZQBkgAAAAAH/2wCE AAwICAgJCAwJCQwRCwoLERUPDAwPFRgTExUTExgRDAwMDAwMEQwMDAwMDAwMDAwMDAwMDAwMDAwM DAwMDAwMDAwBDQsLDQ4NEA4OEBQODg4UFA4ODg4UEQwMDAwMEREMDAwMDAwRDAwMDAwMDAwMDAwM DAwMDAwMDAwMDAwMDAwMDP/AABEIAEEAoAMBIgACEQEDEQH/3QAEAAr/xAE/AAABBQEBAQEBAQAA AAAAAAADAAECBAUGBwgJCgsBAAEFAQEBAQEBAAAAAAAAAAEAAgMEBQYHCAkKCxAAAQQBAwIEAgUH BggFAwwzAQACEQMEIRIxBUFRYRMicYEyBhSRobFCIyQVUsFiMzRygtFDByWSU/Dh8WNzNRaisoMm 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 aSKerby/6UPl+QLs+pf+J/6o/wDhTN/6pi4FJJD699R/o5Pxt/8APwXQ9b/5A6h/4Wt/6hq8ASQK 12+u/wA8z/wtV+RbGJ/OH5rjEkFz6Jg8n4rsfql/Qs7/AI5v/nteFJIhBfb/AK3/APJ//XGf9SuD +qn/AHp/8ZT/ANTeuMSTuin1vK/5Ns/8KWfksXT/AFS/mcr+vT/56avn1JNS/QWX/Sbv+Md+Up8X svnxJAMZfo13B+C476y/8ts/sLyNJPHVD9Ej6A/qj8idvHzXzqkl1U//2QA4QklNBCEAAAAAAFUA AAABAQAAAA8AQQBkAG8AYgBlACAAUABoAG8AdABvAHMAaABvAHAAAAATAEEAZABvAGIAZQAgAFAA aABvAHQAbwBzAGgAbwBwACAAQwBTADQAAAABADhCSU0PoAAAAAABDG1hbmlJUkZSAAABADhCSU1B bkRzAAAA4AAAABAAAAABAAAAAAAAbnVsbAAAAAMAAAAAQUZTdGxvbmcAAAAAAAAAAEZySW5WbExz AAAAAU9iamMAAAABAAAAAAAAbnVsbAAAAAIAAAAARnJJRGxvbmcLNJdcAAAAAEZyR0Fkb3ViQD4A AAAAAAAAAAAARlN0c1ZsTHMAAAABT2JqYwAAAAEAAAAAAABudWxsAAAABAAAAABGc0lEbG9uZwAA AAAAAAAAQUZybWxvbmcAAAAAAAAAAEZzRnJWbExzAAAAAWxvbmcLNJdcAAAAAExDbnRsb25nAAAA AAAAOEJJTVJvbGwAAAAIAAAAAAAAAAA4QklND6EAAAAAABxtZnJpAAAAAgAAABAAAAABAAAAAAAA AAEAAAAAOEJJTQQGAAAAAAAHAAgBAQABAQD/4R4uaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4w LwA8P3hwYWNrZXQgYmVnaW49Iu+7vyIgaWQ9Ilc1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCI/PiA8 eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJBZG9iZSBYTVAgQ29y ZSA0LjIuMi1jMDYzIDUzLjM1MjYyNCwgMjAwOC8wNy8zMC0xODoxMjoxOCAgICAgICAgIj4gPHJk ZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgt bnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMu YWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRz LzEuMS8iIHhtbG5zOnBob3Rvc2hvcD0iaHR0cDovL25zLmFkb2JlLmNvbS9waG90b3Nob3AvMS4w LyIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0 RXZ0PSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VFdmVudCMiIHht bG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYj IiB4bWxuczp0aWZmPSJodHRwOi8vbnMuYWRvYmUuY29tL3RpZmYvMS4wLyIgeG1sbnM6ZXhpZj0i aHR0cDovL25zLmFkb2JlLmNvbS9leGlmLzEuMC8iIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhv dG9zaG9wIENTNCBXaW5kb3dzIiB4bXA6Q3JlYXRlRGF0ZT0iMjAxNC0wNS0yOVQwODo1NjoxOCsw ODowMCIgeG1wOk1vZGlmeURhdGU9IjIwMTQtMDgtMDlUMDY6NDc6NTErMDg6MDAiIHhtcDpNZXRh ZGF0YURhdGU9IjIwMTQtMDgtMDlUMDY6NDc6NTErMDg6MDAiIGRjOmZvcm1hdD0iaW1hZ2UvanBl ZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDowRTZE QTAwNTBEMUZFNDExQTkzQ0YyQzk4MzA1OUYxNCIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDpC MEVDQjFCNUNERTZFMzExOTFCMEZEREEyMkIyRjMxNSIgeG1wTU06T3JpZ2luYWxEb2N1bWVudElE PSJ4bXAuZGlkOkIwRUNCMUI1Q0RFNkUzMTE5MUIwRkREQTIyQjJGMzE1IiB0aWZmOk9yaWVudGF0 aW9uPSIxIiB0aWZmOlhSZXNvbHV0aW9uPSI5NjAwMDAvMTAwMDAiIHRpZmY6WVJlc29sdXRpb249 Ijk2MDAwMC8xMDAwMCIgdGlmZjpSZXNvbHV0aW9uVW5pdD0iMiIgdGlmZjpOYXRpdmVEaWdlc3Q9 IjI1NiwyNTcsMjU4LDI1OSwyNjIsMjc0LDI3NywyODQsNTMwLDUzMSwyODIsMjgzLDI5NiwzMDEs MzE4LDMxOSw1MjksNTMyLDMwNiwyNzAsMjcxLDI3MiwzMDUsMzE1LDMzNDMyO0IwQkM4MEY3Njk3 N0I2OTA5MjlBQzQxRkE5NTlCM0FGIiBleGlmOlBpeGVsWERpbWVuc2lvbj0iMTA0OSIgZXhpZjpQ aXhlbFlEaW1lbnNpb249IjQyOCIgZXhpZjpDb2xvclNwYWNlPSI2NTUzNSIgZXhpZjpOYXRpdmVE aWdlc3Q9IjM2ODY0LDQwOTYwLDQwOTYxLDM3MTIxLDM3MTIyLDQwOTYyLDQwOTYzLDM3NTEwLDQw OTY0LDM2ODY3LDM2ODY4LDMzNDM0LDMzNDM3LDM0ODUwLDM0ODUyLDM0ODU1LDM0ODU2LDM3Mzc3 LDM3Mzc4LDM3Mzc5LDM3MzgwLDM3MzgxLDM3MzgyLDM3MzgzLDM3Mzg0LDM3Mzg1LDM3Mzg2LDM3 Mzk2LDQxNDgzLDQxNDg0LDQxNDg2LDQxNDg3LDQxNDg4LDQxNDkyLDQxNDkzLDQxNDk1LDQxNzI4 LDQxNzI5LDQxNzMwLDQxOTg1LDQxOTg2LDQxOTg3LDQxOTg4LDQxOTg5LDQxOTkwLDQxOTkxLDQx OTkyLDQxOTkzLDQxOTk0LDQxOTk1LDQxOTk2LDQyMDE2LDAsMiw0LDUsNiw3LDgsOSwxMCwxMSwx MiwxMywxNCwxNSwxNiwxNywxOCwyMCwyMiwyMywyNCwyNSwyNiwyNywyOCwzMDtEMTYwNDU2N0VC MEZEOTA5N0E0MTZFNDRCOTVCNjRCMCI+IDx4bXBNTTpIaXN0b3J5PiA8cmRmOlNlcT4gPHJkZjps aSBzdEV2dDphY3Rpb249ImNyZWF0ZWQiIHN0RXZ0Omluc3RhbmNlSUQ9InhtcC5paWQ6QjBFQ0Ix QjVDREU2RTMxMTkxQjBGRERBMjJCMkYzMTUiIHN0RXZ0OndoZW49IjIwMTQtMDUtMjlUMDk6MDg6 MzErMDg6MDAiIHN0RXZ0OnNvZnR3YXJlQWdlbnQ9IkFkb2JlIFBob3Rvc2hvcCBDUzQgV2luZG93 cyIvPiA8cmRmOmxpIHN0RXZ0OmFjdGlvbj0iY29udmVydGVkIiBzdEV2dDpwYXJhbWV0ZXJzPSJm cm9tIGltYWdlL2pwZWcgdG8gYXBwbGljYXRpb24vdm5kLmFkb2JlLnBob3Rvc2hvcCIvPiA8cmRm OmxpIHN0RXZ0OmFjdGlvbj0ic2F2ZWQiIHN0RXZ0Omluc3RhbmNlSUQ9InhtcC5paWQ6QjFFQ0Ix QjVDREU2RTMxMTkxQjBGRERBMjJCMkYzMTUiIHN0RXZ0OndoZW49IjIwMTQtMDUtMjlUMDk6MDg6 MzErMDg6MDAiIHN0RXZ0OnNvZnR3YXJlQWdlbnQ9IkFkb2JlIFBob3Rvc2hvcCBDUzQgV2luZG93 cyIgc3RFdnQ6Y2hhbmdlZD0iLyIvPiA8cmRmOmxpIHN0RXZ0OmFjdGlvbj0ic2F2ZWQiIHN0RXZ0 Omluc3RhbmNlSUQ9InhtcC5paWQ6Q0QyQkQ5RTY1N0Y3RTMxMTk0QkFCMDAwRDdDMDExNUEiIHN0 RXZ0OndoZW49IjIwMTQtMDYtMTlUMTA6MTc6NDUrMDg6MDAiIHN0RXZ0OnNvZnR3YXJlQWdlbnQ9 IkFkb2JlIFBob3Rvc2hvcCBDUzQgV2luZG93cyIgc3RFdnQ6Y2hhbmdlZD0iLyIvPiA8cmRmOmxp IHN0RXZ0OmFjdGlvbj0ic2F2ZWQiIHN0RXZ0Omluc3RhbmNlSUQ9InhtcC5paWQ6Q0UyQkQ5RTY1 N0Y3RTMxMTk0QkFCMDAwRDdDMDExNUEiIHN0RXZ0OndoZW49IjIwMTQtMDYtMTlUMTA6MTc6NDUr MDg6MDAiIHN0RXZ0OnNvZnR3YXJlQWdlbnQ9IkFkb2JlIFBob3Rvc2hvcCBDUzQgV2luZG93cyIg c3RFdnQ6Y2hhbmdlZD0iLyIvPiA8cmRmOmxpIHN0RXZ0OmFjdGlvbj0ic2F2ZWQiIHN0RXZ0Omlu c3RhbmNlSUQ9InhtcC5paWQ6Q0YyQkQ5RTY1N0Y3RTMxMTk0QkFCMDAwRDdDMDExNUEiIHN0RXZ0 OndoZW49IjIwMTQtMDYtMTlUMTA6MTk6NDgrMDg6MDAiIHN0RXZ0OnNvZnR3YXJlQWdlbnQ9IkFk b2JlIFBob3Rvc2hvcCBDUzQgV2luZG93cyIgc3RFdnQ6Y2hhbmdlZD0iLyIvPiA8cmRmOmxpIHN0 RXZ0OmFjdGlvbj0ic2F2ZWQiIHN0RXZ0Omluc3RhbmNlSUQ9InhtcC5paWQ6NzVDNDJFMzI1RUY3 RTMxMUFCRkJGRTdERjkyMTEyNzYiIHN0RXZ0OndoZW49IjIwMTQtMDYtMTlUMTE6MDI6NDkrMDg6 MDAiIHN0RXZ0OnNvZnR3YXJlQWdlbnQ9IkFkb2JlIFBob3Rvc2hvcCBDUzQgV2luZG93cyIgc3RF dnQ6Y2hhbmdlZD0iLyIvPiA8cmRmOmxpIHN0RXZ0OmFjdGlvbj0ic2F2ZWQiIHN0RXZ0Omluc3Rh bmNlSUQ9InhtcC5paWQ6NzZDNDJFMzI1RUY3RTMxMUFCRkJGRTdERjkyMTEyNzYiIHN0RXZ0Ondo ZW49IjIwMTQtMDYtMTlUMTE6MDI6NDkrMDg6MDAiIHN0RXZ0OnNvZnR3YXJlQWdlbnQ9IkFkb2Jl IFBob3Rvc2hvcCBDUzQgV2luZG93cyIgc3RFdnQ6Y2hhbmdlZD0iLyIvPiA8cmRmOmxpIHN0RXZ0 OmFjdGlvbj0ic2F2ZWQiIHN0RXZ0Omluc3RhbmNlSUQ9InhtcC5paWQ6NzdDNDJFMzI1RUY3RTMx MUFCRkJGRTdERjkyMTEyNzYiIHN0RXZ0OndoZW49IjIwMTQtMDYtMTlUMTE6MDU6MTYrMDg6MDAi IHN0RXZ0OnNvZnR3YXJlQWdlbnQ9IkFkb2JlIFBob3Rvc2hvcCBDUzQgV2luZG93cyIgc3RFdnQ6 Y2hhbmdlZD0iLyIvPiA8cmRmOmxpIHN0RXZ0OmFjdGlvbj0ic2F2ZWQiIHN0RXZ0Omluc3RhbmNl SUQ9InhtcC5paWQ6NzhDNDJFMzI1RUY3RTMxMUFCRkJGRTdERjkyMTEyNzYiIHN0RXZ0OndoZW49 IjIwMTQtMDYtMTlUMTE6MjY6MjgrMDg6MDAiIHN0RXZ0OnNvZnR3YXJlQWdlbnQ9IkFkb2JlIFBo b3Rvc2hvcCBDUzQgV2luZG93cyIgc3RFdnQ6Y2hhbmdlZD0iLyIvPiA8cmRmOmxpIHN0RXZ0OmFj dGlvbj0ic2F2ZWQiIHN0RXZ0Omluc3RhbmNlSUQ9InhtcC5paWQ6RTVDQTg3MEE1MUY4RTMxMUI2 QUJCMEZBQzEwRUI4MEUiIHN0RXZ0OndoZW49IjIwMTQtMDYtMjBUMTY6MDE6MTArMDg6MDAiIHN0 RXZ0OnNvZnR3YXJlQWdlbnQ9IkFkb2JlIFBob3Rvc2hvcCBDUzQgV2luZG93cyIgc3RFdnQ6Y2hh bmdlZD0iLyIvPiA8cmRmOmxpIHN0RXZ0OmFjdGlvbj0ic2F2ZWQiIHN0RXZ0Omluc3RhbmNlSUQ9 InhtcC5paWQ6RTZDQTg3MEE1MUY4RTMxMUI2QUJCMEZBQzEwRUI4MEUiIHN0RXZ0OndoZW49IjIw MTQtMDYtMjBUMTY6MDE6MTArMDg6MDAiIHN0RXZ0OnNvZnR3YXJlQWdlbnQ9IkFkb2JlIFBob3Rv c2hvcCBDUzQgV2luZG93cyIgc3RFdnQ6Y2hhbmdlZD0iLyIvPiA8cmRmOmxpIHN0RXZ0OmFjdGlv bj0ic2F2ZWQiIHN0RXZ0Omluc3RhbmNlSUQ9InhtcC5paWQ6RTlDQTg3MEE1MUY4RTMxMUI2QUJC MEZBQzEwRUI4MEUiIHN0RXZ0OndoZW49IjIwMTQtMDYtMjBUMTY6MDg6NTMrMDg6MDAiIHN0RXZ0 OnNvZnR3YXJlQWdlbnQ9IkFkb2JlIFBob3Rvc2hvcCBDUzQgV2luZG93cyIgc3RFdnQ6Y2hhbmdl ZD0iLyIvPiA8cmRmOmxpIHN0RXZ0OmFjdGlvbj0ic2F2ZWQiIHN0RXZ0Omluc3RhbmNlSUQ9Inht cC5paWQ6RUFDQTg3MEE1MUY4RTMxMUI2QUJCMEZBQzEwRUI4MEUiIHN0RXZ0OndoZW49IjIwMTQt MDYtMjBUMTY6MDg6NTgrMDg6MDAiIHN0RXZ0OnNvZnR3YXJlQWdlbnQ9IkFkb2JlIFBob3Rvc2hv cCBDUzQgV2luZG93cyIgc3RFdnQ6Y2hhbmdlZD0iLyIvPiA8cmRmOmxpIHN0RXZ0OmFjdGlvbj0i c2F2ZWQiIHN0RXZ0Omluc3RhbmNlSUQ9InhtcC5paWQ6MEM2REEwMDUwRDFGRTQxMUE5M0NGMkM5 ODMwNTlGMTQiIHN0RXZ0OndoZW49IjIwMTQtMDgtMDlUMDY6NDc6NDQrMDg6MDAiIHN0RXZ0OnNv ZnR3YXJlQWdlbnQ9IkFkb2JlIFBob3Rvc2hvcCBDUzQgV2luZG93cyIgc3RFdnQ6Y2hhbmdlZD0i LyIvPiA8cmRmOmxpIHN0RXZ0OmFjdGlvbj0ic2F2ZWQiIHN0RXZ0Omluc3RhbmNlSUQ9InhtcC5p aWQ6MEQ2REEwMDUwRDFGRTQxMUE5M0NGMkM5ODMwNTlGMTQiIHN0RXZ0OndoZW49IjIwMTQtMDgt MDlUMDY6NDc6NTErMDg6MDAiIHN0RXZ0OnNvZnR3YXJlQWdlbnQ9IkFkb2JlIFBob3Rvc2hvcCBD UzQgV2luZG93cyIgc3RFdnQ6Y2hhbmdlZD0iLyIvPiA8cmRmOmxpIHN0RXZ0OmFjdGlvbj0iY29u dmVydGVkIiBzdEV2dDpwYXJhbWV0ZXJzPSJmcm9tIGFwcGxpY2F0aW9uL3ZuZC5hZG9iZS5waG90 b3Nob3AgdG8gaW1hZ2UvanBlZyIvPiA8cmRmOmxpIHN0RXZ0OmFjdGlvbj0iZGVyaXZlZCIgc3RF dnQ6cGFyYW1ldGVycz0iY29udmVydGVkIGZyb20gYXBwbGljYXRpb24vdm5kLmFkb2JlLnBob3Rv c2hvcCB0byBpbWFnZS9qcGVnIi8+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJzYXZlZCIgc3RFdnQ6 aW5zdGFuY2VJRD0ieG1wLmlpZDowRTZEQTAwNTBEMUZFNDExQTkzQ0YyQzk4MzA1OUYxNCIgc3RF dnQ6d2hlbj0iMjAxNC0wOC0wOVQwNjo0Nzo1MSswODowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0i QWRvYmUgUGhvdG9zaG9wIENTNCBXaW5kb3dzIiBzdEV2dDpjaGFuZ2VkPSIvIi8+IDwvcmRmOlNl cT4gPC94bXBNTTpIaXN0b3J5PiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0i eG1wLmlpZDowRDZEQTAwNTBEMUZFNDExQTkzQ0YyQzk4MzA1OUYxNCIgc3RSZWY6ZG9jdW1lbnRJ RD0ieG1wLmRpZDpCMEVDQjFCNUNERTZFMzExOTFCMEZEREEyMkIyRjMxNSIgc3RSZWY6b3JpZ2lu YWxEb2N1bWVudElEPSJ4bXAuZGlkOkIwRUNCMUI1Q0RFNkUzMTE5MUIwRkREQTIyQjJGMzE1Ii8+ IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiAgICAgICAgICAgICAg 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 ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw/eHBhY2tldCBlbmQ9Inci Pz7/7gAhQWRvYmUAZEAAAAABAwAQAwIDBgAAAAAAAAAAAAAAAP/bAIQAAQEBAQEBAQEBAQEBAQEB AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQICAgICAgICAgICAwMDAwMDAwMDAwEBAQEBAQEB AQEBAgIBAgIDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMD /8IAEQgBrAQZAwERAAIRAQMRAf/EAR8AAAEEAwEBAQEAAAAAAAAAAAgFBgcJAwQKAgELAAEAAQUB AQEBAAAAAAAAAAAABAECAwUGAAcICRAAAQQCAgICAgAEBQQCAQMFAgEDBAUGBwAIERITCSEUEDEi FTIjFhcKIEEkGDM0NUIlNhkwQyYnEQABAwMDAwMCBAMGAQgEAB8BAgMEEQUGACESMRMHQSIUUQhh MiMVcUIWgZFSMyQXobHB0WJDNCUJ8OFykiYYEPHSU5NENbLiY3OCotNUlCDyo+NkZZU2VtYnN5cS AAEDAgQCBwUFBQUHAQUHBQEAEQIhAzFBEgRRYXGBkSIyEwUQ8KGxwdFCUiMU4WJysjMg8YKSBqLS Q7MkNBVTMMJjc5Pig9NEVCU1FqNkdDb/2gAMAwEBAhEDEQAAAD+q7nQgX4vZmuzQd9a7yq/Ecltd pd0cTCiTo6gf7+ti6yCbBabjEfAZMxUh0+5G8lnP3G++PzE/2nY07xy6vckIqYqNXkZc0JlIbZL7 H5Rs21RDU0aOyWPI3shiQf02GGKKnE6Iy7Co9Bpv6CxrCzV4BAWlu80UHbuBUcwKWtMAVpb7ZVnP pHL+gxBUBoa/gUo7o/4qJQtBnnIk7DkYX9tNjhOzGVGtkmZ/lEntz4sQQr452IRBKccl6Fdfs2Im Pe52d2g5ik6GIICoJXRq8gS/LRqbx5Q5XN0jk6TBErUVElrMEfJjnupjUhrnY9uGGXekYiskc/MZ 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 RTdOfYN3MseubPZXtbaTJtE1a5BdfU1vzr51Y7a9ldZW9Ftj6pewFr0770/axpes09mH069srPqF 2V79YNmPc7P/AKice7E9XKjZ+A9jsU7nfYdkGO7T+vXc+7dp7J0ns0K+jymjjS77Hcy15U5FY6td 31132NhfeXWOc3mFaE+nLe9d236ydHNIc/1to6htcm7FQJVo3i826t6XGDs5mQ2USugWOWy7YNcf AmypnZOza6wbh7L7PtcvmzcK2vSNT8t0fkfW/fr8xugI5hYVmd5Ty8eyuDcVyMCS2DsgnJNbRvL1 dhJX79K5bbC2uzWP193hrzWeURezfXLKAagdSMxT7dtlYhpqm63fStr7Qun8h+tKzA7/AOujK23s U6ayNMVd51gyyTNn9cbdtLbRs+uZ7EWFZ171b1I60ZDAwWbryRHVzCzYSRQNoeiNZRcGxPLskyq0 Y2U1a67y+/gOZbIeqcKXj1O5IaxHVGf5TeaxCZpvsJ0y2S05Y7wsw/2UBSfcr3G+QWF9pbzUYWHk knXV9hJdeahxV7Pdh28de6HyK3ZkLJ3GoWaWecUOaYT0/wBt2eMb1yLL8WsHXaHFTkao1paY7sTa PV9uztss6+ZJEkVOotlUs3MI24qCTSxKnG6Jhhlx/tJmYRtOaQ+xjCrTOsu7xdRqG5m5Zg7WIuyY uRD+oLMdxxUCQ78dW2CDwWvVG20JMcEUyDk9USSYP+qNow3v3ckXT2H9Lenuwe+e8Ps67+Rqet6w 9ZMsfzPqZ0yyPdz+HYFpbqzrD7D/APk6q7e5hiG1ux+cxTwrX9fP2rXReSd5DEZPsS77M9ivkfqN 1Py1ptpYtMTYvWvTez40e97R9UmMQ3jrbeVVi+0LnApuIjrDY1FuetyjUO6t3a9xrf2DfXr3CLVF /wDtp6Mvn8MuQpHYITSZ13exzrL0a78dms3kWES7mPUmh9sdYdd9ce1OOHb4dB3/AA+1vW+519ab q311++ujOe4eO6d6i6SwC9qMJiYxXnidm2T+E0M+v71fWprrtJWbozu26zYpt/IqvI2tO7XzLWGZ ae6f9e+2fVi++orY9hJzb6nO0hw42h946npexWmwz5x3UFDWhG1+xLbg6qyEWLGFRYTA2NlEq2vZ uQ00OFAsrQ3g3pjczBrVozi29g5idfu2oayDVuhLWdAyHXWVTH6TDMom27WiLxvJkhUk1tpWjaat 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 f1Z+4/6r4f5vkfF/SpTl7dD/AOF4+f8A1Z8O3f7x/wBV9v8A3G/qHgj5H7lx9n9M/Lr8T4/+m+vu rpX+fXiK8K0r6Urt/H119vH++f77/wDCa/1dB/3M/ovj++/1b3k/E/r3vez+nfj1+L2fb+av6lNY P/tP+yf7Y/0zav6D/p3s/s/9M/Eb/bvh9n2fk/zK+/uV5b//AJGX8Kcu1ZuvSn9R2fl/w0enKied f8PH1/6tadNetPd+fpXetf8ArV/t0r/Dt/f/AMtP+Ol8PzczXl/i9KctqU/46Pd60NeFKU3pTTnO vH29yv5fTl1/Dr66/wBH3KVRWtOHGu/Xfh/za99OX83GlK+tK7dOmhXlXatOP5d/pvTjpPHnxptx /wDX6aPL5Pd5Cn5O1x9a/wA3L6a/GnrSvX8fx0K9N6dOnp/w+mhSnGifr9PWn9lNGla8R1r+HSm9 dGla7U/5+u3Kleu+lfSnpSnUfX/hTX9h6fmrT1/DS+dO1Q9zlx7fHb/M5+yn/DTvd7XOi+HxKdrl XfnX/T1/9nT3a73+Uvl2aV4715U/7P6/9GpH+7X+yv75VXd+R+zf1R3f5+7/AEh/8EPdr+bue6ul 9n+tK8zX+mf92PiV9ez8n+T6U9NM935nP0/rn/dX4vHkK97v/wCk4cvzcvbpH+yf+1VO2Of9Cf03 +7cdq/K7H/wQcqde9pPapyqmnPjyrv1p7uX8dDs8a0FPy/8ApXX4enGlaenH1/NpXKvL1r0rRVeP roUp0/spXetN606aNKVoeNadfb/Z/foV6evWtfw/spoU6U9OlKa9v4dK/wDH0pXro040/D/1bUr9 dClPynrXr68fTp/ZodOhp0/+PWv/AA0adN+FKV47fXelf+fX/wA7/wD6TX//2Q== ------=_NextPart_000_0DE5_019902BD.1B87C660 Content-Type: image/jpeg; name="DNCT Ceramic Ball Bearing Series.jpg" Content-Transfer-Encoding: base64 Content-ID: <0003176BE98E_0332BA02_03062612> /9j/4AAQSkZJRgABAgEAYABgAAD/4Rh8RXhpZgAATU0AKgAAAAgABwESAAMAAAABAAEAAAEaAAUA AAABAAAAYgEbAAUAAAABAAAAagEoAAMAAAABAAIAAAExAAIAAAAcAAAAcgEyAAIAAAAUAAAAjodp AAQAAAABAAAApAAAANAADqYAAAAnEAAOpgAAACcQQWRvYmUgUGhvdG9zaG9wIENTNCBXaW5kb3dz ADIwMTQ6MDU6MjkgMDk6MDg6MTQAAAAAA6ABAAMAAAAB//8AAKACAAQAAAABAAAEAKADAAQAAAAB AAABegAAAAAAAAAGAQMAAwAAAAEABgAAARoABQAAAAEAAAEeARsABQAAAAEAAAEmASgAAwAAAAEA AgAAAgEABAAAAAEAAAEuAgIABAAAAAEAABdGAAAAAAAAAEgAAAABAAAASAAAAAH/2P/gABBKRklG AAECAABIAEgAAP/tAAxBZG9iZV9DTQAC/+4ADkFkb2JlAGSAAAAAAf/bAIQADAgICAkIDAkJDBEL CgsRFQ8MDA8VGBMTFRMTGBEMDAwMDAwRDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAENCwsN Dg0QDg4QFA4ODhQUDg4ODhQRDAwMDAwREQwMDAwMDBEMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM DAwM/8AAEQgAOwCgAwEiAAIRAQMRAf/dAAQACv/EAT8AAAEFAQEBAQEBAAAAAAAAAAMAAQIEBQYH CAkKCwEAAQUBAQEBAQEAAAAAAAAAAQACAwQFBgcICQoLEAABBAEDAgQCBQcGCAUDDDMBAAIRAwQh EjEFQVFhEyJxgTIGFJGhsUIjJBVSwWIzNHKC0UMHJZJT8OHxY3M1FqKygyZEk1RkRcKjdDYX0lXi ZfKzhMPTdePzRieUpIW0lcTU5PSltcXV5fVWZnaGlqa2xtbm9jdHV2d3h5ent8fX5/cRAAICAQIE BAMEBQYHBwYFNQEAAhEDITESBEFRYXEiEwUygZEUobFCI8FS0fAzJGLhcoKSQ1MVY3M08SUGFqKy gwcmNcLSRJNUoxdkRVU2dGXi8rOEw9N14/NGlKSFtJXE1OT0pbXF1eX1VmZ2hpamtsbW5vYnN0dX Z3eHl6e3x//aAAwDAQACEQMRAD8A5f6qfVRnU2jqXVrLMTorLfRdfWPc+yJ9NjnT6VTf8Jft+n+i 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 AAA/gAAAOEJJTQQNAAAAAAAEAAAAHjhCSU0EGQAAAAAABAAAAB44QklNA/MAAAAAAAkAAAAAAAAA AAEAOEJJTScQAAAAAAAKAAEAAAAAAAAAAjhCSU0D9QAAAAAASAAvZmYAAQBsZmYABgAAAAAAAQAv ZmYAAQChmZoABgAAAAAAAQAyAAAAAQBaAAAABgAAAAAAAQA1AAAAAQAtAAAABgAAAAAAAThCSU0D +AAAAAAAcAAA/////////////////////////////wPoAAAAAP////////////////////////// //8D6AAAAAD/////////////////////////////A+gAAAAA//////////////////////////// /wPoAAA4QklNBAAAAAAAAAIAAThCSU0EAgAAAAAAEgAAAAAAAAAAAAAAAAAAAAAAADhCSU0EMAAA AAAACQEBAQEBAQEBAQA4QklNBC0AAAAAAAYAAQAAAAo4QklNBAgAAAAAABAAAAABAAACQAAAAkAA AAAAOEJJTQQeAAAAAAAEAAAAADhCSU0EGgAAAAADOwAAAAYAAAAAAAAAAAAAAXoAAAQAAAAAAwAx ADEAMQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAEAAAAAXoAAAAAAAAAAAAAAAAA AAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAQAAAAAAAG51bGwAAAACAAAABmJvdW5kc09iamMA AAABAAAAAAAAUmN0MQAAAAQAAAAAVG9wIGxvbmcAAAAAAAAAAExlZnRsb25nAAAAAAAAAABCdG9t bG9uZwAAAXoAAAAAUmdodGxvbmcAAAQAAAAABnNsaWNlc1ZsTHMAAAABT2JqYwAAAAEAAAAAAAVz bGljZQAAABIAAAAHc2xpY2VJRGxvbmcAAAAAAAAAB2dyb3VwSURsb25nAAAAAAAAAAZvcmlnaW5l bnVtAAAADEVTbGljZU9yaWdpbgAAAA1hdXRvR2VuZXJhdGVkAAAAAFR5cGVlbnVtAAAACkVTbGlj ZVR5cGUAAAAASW1nIAAAAAZib3VuZHNPYmpjAAAAAQAAAAAAAFJjdDEAAAAEAAAAAFRvcCBsb25n AAAAAAAAAABMZWZ0bG9uZwAAAAAAAAAAQnRvbWxvbmcAAAF6AAAAAFJnaHRsb25nAAAEAAAAAAN1 cmxURVhUAAAAAQAAAAAAAG51bGxURVhUAAAAAQAAAAAAAE1zZ2VURVhUAAAAAQAAAAAABmFsdFRh Z1RFWFQAAAABAAAAAAAOY2VsbFRleHRJc0hUTUxib29sAQAAAAhjZWxsVGV4dFRFWFQAAAABAAAA AAAJaG9yekFsaWduZW51bQAAAA9FU2xpY2VIb3J6QWxpZ24AAAAHZGVmYXVsdAAAAAl2ZXJ0QWxp Z25lbnVtAAAAD0VTbGljZVZlcnRBbGlnbgAAAAdkZWZhdWx0AAAAC2JnQ29sb3JUeXBlZW51bQAA ABFFU2xpY2VCR0NvbG9yVHlwZQAAAABOb25lAAAACXRvcE91dHNldGxvbmcAAAAAAAAACmxlZnRP dXRzZXRsb25nAAAAAAAAAAxib3R0b21PdXRzZXRsb25nAAAAAAAAAAtyaWdodE91dHNldGxvbmcA AAAAADhCSU0EKAAAAAAADAAAAAI/8AAAAAAAADhCSU0EEQAAAAAAAQEAOEJJTQQUAAAAAAAEAAAA CjhCSU0EDAAAAAAXYgAAAAEAAACgAAAAOwAAAeAAAG6gAAAXRgAYAAH/2P/gABBKRklGAAECAABI AEgAAP/tAAxBZG9iZV9DTQAC/+4ADkFkb2JlAGSAAAAAAf/bAIQADAgICAkIDAkJDBELCgsRFQ8M DA8VGBMTFRMTGBEMDAwMDAwRDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAENCwsNDg0QDg4Q FA4ODhQUDg4ODhQRDAwMDAwREQwMDAwMDBEMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM/8AA EQgAOwCgAwEiAAIRAQMRAf/dAAQACv/EAT8AAAEFAQEBAQEBAAAAAAAAAAMAAQIEBQYHCAkKCwEA AQUBAQEBAQEAAAAAAAAAAQACAwQFBgcICQoLEAABBAEDAgQCBQcGCAUDDDMBAAIRAwQhEjEFQVFh EyJxgTIGFJGhsUIjJBVSwWIzNHKC0UMHJZJT8OHxY3M1FqKygyZEk1RkRcKjdDYX0lXiZfKzhMPT dePzRieUpIW0lcTU5PSltcXV5fVWZnaGlqa2xtbm9jdHV2d3h5ent8fX5/cRAAICAQIEBAMEBQYH BwYFNQEAAhEDITESBEFRYXEiEwUygZEUobFCI8FS0fAzJGLhcoKSQ1MVY3M08SUGFqKygwcmNcLS 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 pLH/AFv+d8yoSPDk92NwMvVR+XJ4Oz076u42HmUZHUMqqx4O/HoqJcXuHu9Tc76e36SB9a+pufjD Bfs+0NeLsprNQ0ztx6N351mx/qWK277Z6Nf9J9PZ7/2d9m3xp/Mf9qPS/wCIXI3R9mfExuPPP0v8 Ju/wv+k/lpkonjJ5iY9zglwQA0+WX6XyL4yHDEYIng448cif60enzInNruEWVssMab2tdr/bC6fr n1fyOt9G6UOi5NePXjsr9XGafSDq3Nra5uPaG/orK3VP/R/n+p+Z/hOWZz3XQ9B9b0KfT+0x9pdO 30vRnY7+Y+0e/wC1bfp7P0f/AFxVJ1pr1bQtu+qPq79X8yrqd1bmupe2jDD/AFHAFrqX7rt270/0 jfz1xXTLrMnpmNblgWWlpG57Q4kNJbW/3z9JgQ+vztxvV9XZs9n2yPRn1n/z/wBm/Tf+xH6P1v5C uN/mmcfRb9H6PA/m/wDg/wDR/wAhGFa69VFv9P6jk4AdUGi6h7txqcSIceXVuH0P5a0f+cRraX04 LXWAe02We2f5Ta6271jjkoo+geFWHFWjQx/euAcF8PS+H/unIzOq9Sy8jK6j1fMa3KqDGU4ewta6 ouO77G5odW30LHepZ61n6av+csZ6PvfFw2M6ji5OV6uRZfSbqPsorLahY1/pW3Pc+2uq3dt/pH8x 6n8zar18bG/zXP8AhJ/6P8pGwP5t0el9P/Bcf2p/wifevy+rzZxklxerF+trpKDi9ayeodAb0m3A yX15dbcjffofULzU671WPDmWVvcf5uz8z00Xpv8AjGymhjOqNfFbg5hxRUyqQZ224ja2e1357qrq 0H69f95//Xv/AESuVdwnDb1bs+Hj4BxipXKx/hPrvVcGv6z4mH9Yvq1linqWMAK7AYnb/gLp+hcz ds9Oxv6Sr/SVWLId1P8AxhuyXCrouFj9SsBY/qteO0XEEbS/1i9//ntc59QvW+35HoftL1drdv7M 9Lb+d/Tvtv6t6f8AovUXo9n7W+z6ftDfH5v7O3/9L9CnniqN7fo3+6v0s/j5uf0rExPqV0m3L6jf 9p6v1A667n2PJ3+jVPvuc6126164H645PVz1A4WbNdTWttZWKxUHl43Pudtdb9pd6nqM9Z9tnv8A U/mv5tQ+tW//AJyN9T9pb/0e77ft+1TuP9G9H9F6f/cb0/YgfWPf+1Dv+17vTrn7dt9X6P5vo/ov R/0W1A3fq+ZHTTZ//9k4QklNBCEAAAAAAFUAAAABAQAAAA8AQQBkAG8AYgBlACAAUABoAG8AdABv AHMAaABvAHAAAAATAEEAZABvAGIAZQAgAFAAaABvAHQAbwBzAGgAbwBwACAAQwBTADQAAAABADhC SU0EBgAAAAAABwAIAAAAAQEA/+ERCWh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8APD94cGFj a2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0 YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNC4yLjIt YzA2MyA1My4zNTI2MjQsIDIwMDgvMDcvMzAtMTg6MTI6MTggICAgICAgICI+IDxyZGY6UkRGIHht bG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxy ZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNv bS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4 bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5z OnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0 cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bWxuczp0aWZm PSJodHRwOi8vbnMuYWRvYmUuY29tL3RpZmYvMS4wLyIgeG1sbnM6ZXhpZj0iaHR0cDovL25zLmFk b2JlLmNvbS9leGlmLzEuMC8iIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNCBX aW5kb3dzIiB4bXA6Q3JlYXRlRGF0ZT0iMjAxNC0wNS0yOVQwODo1NjoxOCswODowMCIgeG1wOk1v ZGlmeURhdGU9IjIwMTQtMDUtMjlUMDk6MDg6MTQrMDg6MDAiIHhtcDpNZXRhZGF0YURhdGU9IjIw MTQtMDUtMjlUMDk6MDg6MTQrMDg6MDAiIGRjOmZvcm1hdD0iaW1hZ2UvanBlZyIgcGhvdG9zaG9w OkNvbG9yTW9kZT0iMyIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDpBRkVDQjFCNUNERTZFMzEx OTFCMEZEREEyMkIyRjMxNSIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDpBRUVDQjFCNUNERTZF MzExOTFCMEZEREEyMkIyRjMxNSIgeG1wTU06T3JpZ2luYWxEb2N1bWVudElEPSJ4bXAuZGlkOkFF RUNCMUI1Q0RFNkUzMTE5MUIwRkREQTIyQjJGMzE1IiB0aWZmOk9yaWVudGF0aW9uPSIxIiB0aWZm OlhSZXNvbHV0aW9uPSI5NjAwMDAvMTAwMDAiIHRpZmY6WVJlc29sdXRpb249Ijk2MDAwMC8xMDAw MCIgdGlmZjpSZXNvbHV0aW9uVW5pdD0iMiIgdGlmZjpOYXRpdmVEaWdlc3Q9IjI1NiwyNTcsMjU4 LDI1OSwyNjIsMjc0LDI3NywyODQsNTMwLDUzMSwyODIsMjgzLDI5NiwzMDEsMzE4LDMxOSw1Mjks NTMyLDMwNiwyNzAsMjcxLDI3MiwzMDUsMzE1LDMzNDMyOzc1MDJCQTg5RkYzNDAzMzc4Mjc1NzM4 RThBRDEzM0IzIiBleGlmOlBpeGVsWERpbWVuc2lvbj0iMTAyNCIgZXhpZjpQaXhlbFlEaW1lbnNp b249IjM3OCIgZXhpZjpDb2xvclNwYWNlPSI2NTUzNSIgZXhpZjpOYXRpdmVEaWdlc3Q9IjM2ODY0 LDQwOTYwLDQwOTYxLDM3MTIxLDM3MTIyLDQwOTYyLDQwOTYzLDM3NTEwLDQwOTY0LDM2ODY3LDM2 ODY4LDMzNDM0LDMzNDM3LDM0ODUwLDM0ODUyLDM0ODU1LDM0ODU2LDM3Mzc3LDM3Mzc4LDM3Mzc5 LDM3MzgwLDM3MzgxLDM3MzgyLDM3MzgzLDM3Mzg0LDM3Mzg1LDM3Mzg2LDM3Mzk2LDQxNDgzLDQx NDg0LDQxNDg2LDQxNDg3LDQxNDg4LDQxNDkyLDQxNDkzLDQxNDk1LDQxNzI4LDQxNzI5LDQxNzMw LDQxOTg1LDQxOTg2LDQxOTg3LDQxOTg4LDQxOTg5LDQxOTkwLDQxOTkxLDQxOTkyLDQxOTkzLDQx OTk0LDQxOTk1LDQxOTk2LDQyMDE2LDAsMiw0LDUsNiw3LDgsOSwxMCwxMSwxMiwxMywxNCwxNSwx NiwxNywxOCwyMCwyMiwyMywyNCwyNSwyNiwyNywyOCwzMDtFNEZCRTIwNDhENjhDREFGOEZCMzY4 RTZEMzk4NDY5QSI+IDx4bXBNTTpIaXN0b3J5PiA8cmRmOlNlcT4gPHJkZjpsaSBzdEV2dDphY3Rp b249ImNyZWF0ZWQiIHN0RXZ0Omluc3RhbmNlSUQ9InhtcC5paWQ6QUVFQ0IxQjVDREU2RTMxMTkx QjBGRERBMjJCMkYzMTUiIHN0RXZ0OndoZW49IjIwMTQtMDUtMjlUMDk6MDg6MTQrMDg6MDAiIHN0 RXZ0OnNvZnR3YXJlQWdlbnQ9IkFkb2JlIFBob3Rvc2hvcCBDUzQgV2luZG93cyIvPiA8cmRmOmxp IHN0RXZ0OmFjdGlvbj0ic2F2ZWQiIHN0RXZ0Omluc3RhbmNlSUQ9InhtcC5paWQ6QUZFQ0IxQjVD REU2RTMxMTkxQjBGRERBMjJCMkYzMTUiIHN0RXZ0OndoZW49IjIwMTQtMDUtMjlUMDk6MDg6MTQr MDg6MDAiIHN0RXZ0OnNvZnR3YXJlQWdlbnQ9IkFkb2JlIFBob3Rvc2hvcCBDUzQgV2luZG93cyIg c3RFdnQ6Y2hhbmdlZD0iLyIvPiA8L3JkZjpTZXE+IDwveG1wTU06SGlzdG9yeT4gPC9yZGY6RGVz Y3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+ICAgICAgICAgICAgICAgICAgICAgICAg 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 ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPD94cGFja2V0IGVuZD0idyI/Pv/uAA5BZG9i ZQBkQAAAAAH/2wCEAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEC AgICAgICAgICAgMDAwMDAwMDAwMBAQEBAQEBAQEBAQICAQICAwMDAwMDAwMDAwMDAwMDAwMDAwMD AwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA//AABEIAXoEAAMBEQACEQEDEQH/3QAEAID/xAGi AAAABgIDAQAAAAAAAAAAAAAHCAYFBAkDCgIBAAsBAAAGAwEBAQAAAAAAAAAAAAYFBAMHAggBCQAK CxAAAgEDBAEDAwIDAwMCBgl1AQIDBBEFEgYhBxMiAAgxFEEyIxUJUUIWYSQzF1JxgRhikSVDobHw JjRyChnB0TUn4VM2gvGSokRUc0VGN0djKFVWVxqywtLi8mSDdJOEZaOzw9PjKThm83UqOTpISUpY WVpnaGlqdnd4eXqFhoeIiYqUlZaXmJmapKWmp6ipqrS1tre4ubrExcbHyMnK1NXW19jZ2uTl5ufo 6er09fb3+Pn6EQACAQMCBAQDBQQEBAYGBW0BAgMRBCESBTEGACITQVEHMmEUcQhCgSORFVKhYhYz CbEkwdFDcvAX4YI0JZJTGGNE8aKyJjUZVDZFZCcKc4OTRnTC0uLyVWV1VjeEhaOzw9Pj8ykalKS0 xNTk9JWltcXV5fUoR1dmOHaGlqa2xtbm9md3h5ent8fX5/dIWGh4iJiouMjY6Pg5SVlpeYmZqbnJ 2en5KjpKWmp6ipqqusra6vr/2gAMAwEAAhEDEQA/ANGLKZfPY/KVc6VlXj8nhsnPWmasratayso5 5kNCiUNbNNQ1aLH+8PT61Yk3Fh7TdM9epKrKVbVWPxeQzOTqZIRkcVLUZJsNRwtTRmtyxbG19S9H VKscLxp4pYyzAWBJCe9+nXup1LuXJzyVlLJm8zHBuNGrP7v7XqKuigizkDVH8HpJ8RWlad4I6h1Y CBnKI/oKvx7117rnFm8tF4pWyiY2lyETbcy9NHLW5Ov+4hkDVWTnxGVnaeknBCxmSneIo62QKdRN 1QtwPVWbT1KoMtkYY6euRq2tq8HLEmV/ilbNkcfW0c8sdPj45cNWNFO1PEZLNpZzpcarAaj4ofXp sqXOoHp2WszNXHUYakzu48/V4VFrNvUuIqclVYpKaW1ZnWnoq6OnzFKI6WEEtCttcTEkqQfboGB1 vUANNOsv380zmNc5FQY3PJJuDHpiZanck+NyFAJ0psfKr1MGcxLVVW2kjyOCjh2V1UAW6oDQjqfB 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 3m/21FGesfPffboP6uyXIAEvjw/zY1p1rYvkrKj6yVkEheRSrqqpCiSaEWzOGaA6weBwPwffQC3y hHl1htLAjuK0p1Joa4Sxu7MwWVCGVItCyIXkAj8sbhoxqOoAC/8AXj3dmCVIGR0kl8JSKR5Jp8/2 dKKLKSU0UdpkjMQWTUxLlYlsxB1XCtY8geo+2zcKwo69pBr+Qr0m0hm0cK46v3/4TtdSL2J8tuyu 4cpT+TGdNbCgw+EZ0V0i3PvuQmaW7AmOpjw8fFidIPPPvFD73fNE1nyryXsFv8G4s0mofhWPipHn X16yR+7hstvdcw7hu5iqYYiB9vrXra9+Zvay9OfHfsPeCVcdHVxYSqoqJ3IDfcVcDxKIyCCLauSP p7wISJ5T4cTUdsL9pwP59ZnlgoLscAVP2Dj18qb5YduZTunuXeW8J6p6vDU1ZU7f2us7S2TD0VZK K3JJrvqlzeWMtU5tdkKX4A95kcocrR8q8pbdbiApeXiVuR5u1OPyHWNu9b0d83zcJWNduhOP6Wf5 Hoj+fkrqGWmyFHUVFFW0NTHXUVbG5DwVtHL91A8BUA+SJ1Vrn+lvZBzEJfB8EQED16EO0vDQHxBg Y63w/wCWTVbj7G+K/XvZW8Up33NuvbGErM5UQxiKnlyJimillVWvo8sEEcjD/VMT7xf36Jrebwma r6iSepX2VdURlrgAY6sO27jJ8JmYMpTPKgWQpMFa0UsEjKp/xPjcB1P9fYfgAD/mejutSCB0czcO +afaG28d2NPkP4Nj6nEVEWbybWFHR1OJppZY8jWMWRFaJYgeSA5AX8+0e4K47yCYc1I8un7dahJd WfE0/Z8+tZTPf8KR+2tq7ize39wdedf9m1iZrKUuEzWNrsntKsraPH1U8NNPU0NNK9HPNLTwo3oC n8+47sd/3e55g3KxhhBsYZKI7DDD1r0PL/k60tbGK6a+XxGXUQDkfKnlTqnP56/zFPkh/MVrsJB2 nWUO3uttn1cuS2x1xt37gYmnytSDGcpl6qqdqrL5SOLiOSUkQ/2QPclWd9cC3lLONZBrpOD9nQQE FrGKRgl/4m/zdX7/APCcz+XJ05mOq9x/MLf+xsJv7sDK7rrdobAh3DRUmXo9g4LCIhy2foqCsili bN5KplWJZCpZI76bewftd5LuvMe8bfclmtLSNHVPIlq/5umLwmO3jMf9qxyetlfvb4fdH9vbU/uf 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 ------=_NextPart_000_0DE5_019902BD.1B87C660-- From sandeen@sandeen.net Sat Aug 23 18:50: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 7E04B7F3F for ; Sat, 23 Aug 2014 18:50:17 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id F2187AC003 for ; Sat, 23 Aug 2014 16:50:16 -0700 (PDT) X-ASG-Debug-ID: 1408837813-04cbb05488764570001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id wEerhXFOEDtXhIOu for ; Sat, 23 Aug 2014 16:50:14 -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 57B9D63C3BD2; Sat, 23 Aug 2014 18:50:13 -0500 (CDT) Message-ID: <53F928B6.7080308@sandeen.net> Date: Sat, 23 Aug 2014 18:50:14 -0500 From: Eric Sandeen MIME-Version: 1.0 To: Brian Foster CC: Eric Sandeen , xfs-oss Subject: Re: [PATCH 4/4] xfs: remove rbpp check from xfs_rtmodify_summary_int References: <53F6942B.80808@redhat.com> <53F696D7.2030906@sandeen.net> <20140822132004.GD3915@laptop.bfoster> X-ASG-Orig-Subj: Re: [PATCH 4/4] xfs: remove rbpp check from xfs_rtmodify_summary_int In-Reply-To: <20140822132004.GD3915@laptop.bfoster> 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: 1408837813 X-Barracuda-URL: http://192.48.176.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.8766 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 8/22/14, 8:20 AM, Brian Foster wrote: > On Thu, Aug 21, 2014 at 08:03:19PM -0500, Eric Sandeen wrote: >> rbpp is always passed into xfs_rtmodify_summary >> and xfs_rtget_summary, so there is no need to >> test for it in xfs_rtmodify_summary_int. >> > > Looks fine, but this is also called through a variety of twisty paths. > Could we add a top-level error check or assert? We could, though it'll oops pretty fast if we don't send rbpp anyway. An ASSERT might be decent for documentation, though... -Eric > Brian > >> Signed-off-by: Eric Sandeen >> --- >> >> diff --git a/fs/xfs/libxfs/xfs_rtbitmap.c b/fs/xfs/libxfs/xfs_rtbitmap.c >> index 50e3b93..7c818f1 100644 >> --- a/fs/xfs/libxfs/xfs_rtbitmap.c >> +++ b/fs/xfs/libxfs/xfs_rtbitmap.c >> @@ -460,7 +460,7 @@ xfs_rtmodify_summary_int( >> /* >> * If we have an old buffer, and the block number matches, use that. >> */ >> - if (rbpp && *rbpp && *rsb == sb) >> + if (*rbpp && *rsb == sb) >> bp = *rbpp; >> /* >> * Otherwise we have to get the buffer. >> @@ -469,7 +469,7 @@ xfs_rtmodify_summary_int( >> /* >> * If there was an old one, get rid of it first. >> */ >> - if (rbpp && *rbpp) >> + if (*rbpp) >> xfs_trans_brelse(tp, *rbpp); >> error = xfs_rtbuf_get(mp, tp, sb, 1, &bp); >> if (error) { >> @@ -478,10 +478,8 @@ xfs_rtmodify_summary_int( >> /* >> * Remember this buffer and block for the next call. >> */ >> - if (rbpp) { >> - *rbpp = bp; >> - *rsb = sb; >> - } >> + *rbpp = bp; >> + *rsb = sb; >> } >> /* >> * Point to the summary information, modify/log it, and/or copy it out. >> @@ -493,14 +491,8 @@ xfs_rtmodify_summary_int( >> *sp += delta; >> xfs_trans_log_buf(tp, bp, first, first + sizeof(*sp) - 1); >> } >> - if (sum) { >> - /* >> - * Drop the buffer if we're not asked to remember it. >> - */ >> - if (!rbpp) >> - xfs_trans_brelse(tp, bp); >> + if (sum) >> *sum = *sp; >> - } >> return 0; >> } >> >> >> >> _______________________________________________ >> xfs mailing list >> xfs@oss.sgi.com >> http://oss.sgi.com/mailman/listinfo/xfs > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs > From root@krios.tbi.univie.ac.at Sat Aug 23 23:25: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 8EA597F3F for ; Sat, 23 Aug 2014 23:25:11 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 6F0378F8039 for ; Sat, 23 Aug 2014 21:25:08 -0700 (PDT) X-ASG-Debug-ID: 1408854305-04bdf0109a4727d0001-NocioJ Received: from krios.tbi.univie.ac.at (krios.tbi.univie.ac.at [131.130.44.60]) by cuda.sgi.com with ESMTP id CW01WpKBtlG4LRYp for ; Sat, 23 Aug 2014 21:25:06 -0700 (PDT) X-Barracuda-Envelope-From: root@krios.tbi.univie.ac.at X-Barracuda-Apparent-Source-IP: 131.130.44.60 Received: by krios.tbi.univie.ac.at (Postfix) id 5916F5EECF; Sun, 24 Aug 2014 06:25:03 +0200 (CEST) Delivered-To: root@krios.tbi.univie.ac.at Received: by krios.tbi.univie.ac.at (Postfix, from userid 0) id 403B45F2E1; Sun, 24 Aug 2014 06:25:03 +0200 (CEST) From: root@krios.tbi.univie.ac.at (Cron Daemon) To: root@krios.tbi.univie.ac.at Subject: Cron test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily ) Content-Type: text/plain; charset=UTF-8 X-ASG-Orig-Subj: Cron test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily ) X-Cron-Env: X-Cron-Env: X-Cron-Env: X-Cron-Env: Message-Id: <20140824042503.403B45F2E1@krios.tbi.univie.ac.at> Date: Sun, 24 Aug 2014 06:25:03 +0200 (CEST) X-Barracuda-Connect: krios.tbi.univie.ac.at[131.130.44.60] X-Barracuda-Start-Time: 1408854305 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.70 X-Barracuda-Spam-Status: No, SCORE=0.70 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, BSF_SC0_SA_TO_FROM_ADDR_MATCH, PR0N_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.8771 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) 0.50 BSF_SC0_SA_TO_FROM_ADDR_MATCH Sender Address Matches Recipient Address /etc/cron.daily/logrotate: error: error opening /home/git/gitlab/log/application.log: Permission denied error: error opening /home/git/gitlab/log/githost.log: Permission denied error: error opening /home/git/gitlab/log/production.log: Permission denied error: error opening /home/git/gitlab/log/satellites.log: Permission denied error: error opening /home/git/gitlab/log/sidekiq.log: Permission denied error: error opening /home/git/gitlab/log/unicorn.stderr.log: Permission denied error: error opening /home/git/gitlab/log/unicorn.stdout.log: Permission denied error: error opening /home/git/gitlab-shell/gitlab-shell.log: Permission denied run-parts: /etc/cron.daily/logrotate exited with return code 1 From alex@zadarastorage.com Sun Aug 24 04:20: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 (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 266587F4E for ; Sun, 24 Aug 2014 04:20:26 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 155F9304032 for ; Sun, 24 Aug 2014 02:20:23 -0700 (PDT) X-ASG-Debug-ID: 1408872020-04cbb0548677efc0001-NocioJ Received: from mail-wg0-f52.google.com (mail-wg0-f52.google.com [74.125.82.52]) by cuda.sgi.com with ESMTP id kO5eXn94m90Yxqjm (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Sun, 24 Aug 2014 02:20:21 -0700 (PDT) X-Barracuda-Envelope-From: alex@zadarastorage.com X-Barracuda-Apparent-Source-IP: 74.125.82.52 Received: by mail-wg0-f52.google.com with SMTP id a1so11921559wgh.35 for ; Sun, 24 Aug 2014 02:20:20 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:in-reply-to:references:date :message-id:subject:from:to:cc:content-type; bh=/CUTE6dGfa5uOvCjJaPW7mUaI2pzUnv3VNdt5cxebu8=; b=SYgXO2Ucj4xVog03TzilyecGCWDe/7npKmzKIJESnJ4XxWi6jAv00d8o5kL9KIPstD Rqnwu/RuGzoj2iuAg7aMpv8UViDYKyHMG+AEfqb0zIvYGLSj0bajSvx6I0f5c15nPLtr puZynd/3jSzFdJHVaddCmoiOCSMgIjCpXavT5b7VmltebdNCwWwtPBJufNFXRmoHHad2 QbAaf73vNM2SoMxAMkvG7qA4MFr2pKrn+SjVsY4QxwOnzT5nM0z+2iNKhEKaJVdXFZcA lnrdFKLsErKb+I8qsjrz6ouwFIyOnMCp491oytfm4s86VFHto1MhXRZYXXO+sMGRGpSi Jv0g== X-Gm-Message-State: ALoCoQmdfVJgnWcqQwM4X9lxaO17GCCGwMzAdSXUPhZInq4YMgG+RdMGRqawhH8dnhFGFbWxHf6Z MIME-Version: 1.0 X-Received: by 10.194.161.231 with SMTP id xv7mr1812665wjb.78.1408872020190; Sun, 24 Aug 2014 02:20:20 -0700 (PDT) Received: by 10.194.15.232 with HTTP; Sun, 24 Aug 2014 02:20:20 -0700 (PDT) In-Reply-To: <1408648692-15957-1-git-send-email-bfoster@redhat.com> References: <1408648692-15957-1-git-send-email-bfoster@redhat.com> Date: Sun, 24 Aug 2014 12:20:20 +0300 Message-ID: Subject: Re: [PATCH] xfs: fix double free of trans in log recovery on I/O error From: Alex Lyakas X-ASG-Orig-Subj: Re: [PATCH] xfs: fix double free of trans in log recovery on I/O error To: Brian Foster Cc: xfs@oss.sgi.com, Dave Chinner Content-Type: text/plain; charset=UTF-8 X-Barracuda-Connect: mail-wg0-f52.google.com[74.125.82.52] X-Barracuda-Start-Time: 1408872021 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=MARKETING_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.8776 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words Hi Brian, On Thu, Aug 21, 2014 at 10:18 PM, Brian Foster wrote: > XFS log recovery builds up an xlog_recover object as it passes through > the log operations on the physical log. These structures are managed via > a hash table and are allocated when a new transaction is encountered and > freed once a commit operation for the transaction is encountered. > > This state machine for active transactions is implemented by a > combination of xlog_do_recovery_pass(), which walks through the log > buffers and xlog_recover_process_data() which processes log operations > within each buffer. The latter function decides whether to allocate a > new xlog_recover, add to it or commit and ultimately free it. If an > error occurs at any point during the lifecycle of a particular > xlog_recover, xlog_recover_process_data() frees the object and returns > an error. > > xlog_recover_commit_trans() handles the final processing of the > transaction. It submits whatever I/O is required for the transaction and > frees xlog_recover object along with the transaction items it tracks. If > an error occurs at the final stages of the commit operation, such as I/O > failure, both xlog_recover_commit_trans() and > xlog_recover_process_data() attempt to free the trans object. > > Modify xlog_recover_commit_trans() to only free the trans object on > successful completion of the trans, including any I/O errors that might > occur when recovering the log. > > Signed-off-by: Brian Foster > --- > > Hi all, > > I found that the recent buffer I/O rework fixes didn't address the crash > reproduced by the dm-flakey/log recovery test case I posted recently. I > tracked the crash down to this, which allows the test to pass. This > addresses the crash I saw when running the reproducer manually with the > metadump that Alex posted as well. > > FWIW, I also went back and tested the xfs_buf_iowait() experiment in > both scenarios (Alex's metadump and xfstests test) and they all > reproduce the same crash for me. I think that either I'm still not > reproducing the original problem, something else might have contaminated > the original xfs_buf_iowait() test to give a false positive, or > something else entirely is going on. > > Alex, > > If you have a chance, I think it might be interesting to see whether you > reproduce any problems with this patch. It looks like this is a > regression introduced by: > > 2a84108f xfs: free the list of recovery items on error > > ... but I have no idea if that's in whatever kernel you're running. I am running kernel 3.8.13 with some changes (published at https://github.com/zadarastorage/zadara-xfs-pushback), but this problem also happens on pristine 3.8.13 from git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git, branch linux-stable-3.8.y. I do not have commit 2a84108f in this kernel. It was introduced in 3.14. I applied your patch to 3.8.13, but it doesn't fix the issue. Same problem happens when testing scenario that I described in http://oss.sgi.com/pipermail/xfs/2014-August/037637.html. Thanks, Alex. > > Brian > > fs/xfs/xfs_log_recover.c | 11 ++++++++--- > 1 file changed, 8 insertions(+), 3 deletions(-) > > diff --git a/fs/xfs/xfs_log_recover.c b/fs/xfs/xfs_log_recover.c > index 176c4b3..daca9a6 100644 > --- a/fs/xfs/xfs_log_recover.c > +++ b/fs/xfs/xfs_log_recover.c > @@ -3528,10 +3528,15 @@ out: > if (!list_empty(&done_list)) > list_splice_init(&done_list, &trans->r_itemq); > > - xlog_recover_free_trans(trans); > - > error2 = xfs_buf_delwri_submit(&buffer_list); > - return error ? error : error2; > + > + if (!error) > + error = error2; > + /* caller frees trans on error */ > + if (!error) > + xlog_recover_free_trans(trans); > + > + return error; > } > > STATIC int > -- > 1.8.3.1 > From alex@zadarastorage.com Sun Aug 24 04:22: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 941C37F4E for ; Sun, 24 Aug 2014 04:22:04 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 7416B8F804B for ; Sun, 24 Aug 2014 02:22:04 -0700 (PDT) X-ASG-Debug-ID: 1408872118-04cb6c55004f4c80001-NocioJ Received: from mail-wi0-f179.google.com (mail-wi0-f179.google.com [209.85.212.179]) by cuda.sgi.com with ESMTP id 7wiO5coBrLYQrfJK (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Sun, 24 Aug 2014 02:21:59 -0700 (PDT) X-Barracuda-Envelope-From: alex@zadarastorage.com X-Barracuda-Apparent-Source-IP: 209.85.212.179 Received: by mail-wi0-f179.google.com with SMTP id f8so1302326wiw.12 for ; Sun, 24 Aug 2014 02:21:58 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:in-reply-to:references:date :message-id:subject:from:to:cc:content-type; bh=J15mR9blNxjHPJqY0pGwIbCCeoz4wUq69kwT9xXlRR8=; b=lD1IzXNdygBXdwE5Wi2VtBkyRjSPZLzpLnqm0wN8GXSXtoO+I/Fl8ToDkotp97oQCy AatyilvmDLOKDZzy0dg75aqPXiBxXRFG9q2Cegefzfmq+KtD2Zkn7+soRmPZ0Aqmx+xf Z7Ia+5D0GQ+668aUfHD/lSAmfFhWqA3OTQTPP28sZ7jH3CHFLh/uJuycSj79tNKNhuFZ IdW5cVaq4UazRpMD2SkfOP03is47+5/lqqH/R7By9nAJnnWEQqtUfyBeSM6YSbX6Ukns +pTGSNiba80rjT/q3QQ8CiNwwuGpCIWRdZMWdQTqFXh0LpVdN53laOFhVlYEB3ebKpyJ zYsQ== X-Gm-Message-State: ALoCoQnfnKRljWVTYBNYJ7Lv7gea5iHNNmJ5hxdVqopO7OU1+QYCru4tjsBDsvzs2Wyln1yeqxvP MIME-Version: 1.0 X-Received: by 10.180.92.73 with SMTP id ck9mr8344251wib.54.1408872118191; Sun, 24 Aug 2014 02:21:58 -0700 (PDT) Received: by 10.194.15.232 with HTTP; Sun, 24 Aug 2014 02:21:58 -0700 (PDT) In-Reply-To: References: <1408648692-15957-1-git-send-email-bfoster@redhat.com> Date: Sun, 24 Aug 2014 12:21:58 +0300 Message-ID: Subject: Re: [PATCH] xfs: fix double free of trans in log recovery on I/O error From: Alex Lyakas X-ASG-Orig-Subj: Re: [PATCH] xfs: fix double free of trans in log recovery on I/O error To: Brian Foster Cc: xfs@oss.sgi.com, Dave Chinner Content-Type: text/plain; charset=UTF-8 X-Barracuda-Connect: mail-wi0-f179.google.com[209.85.212.179] X-Barracuda-Start-Time: 1408872119 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=MARKETING_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.8776 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words Forgot to mention that the metadump from this repro is here: https://drive.google.com/file/d/0ByBy89zr3kJNeWdBQ1RFbmJESTg/edit?usp=sharing On Sun, Aug 24, 2014 at 12:20 PM, Alex Lyakas wrote: > Hi Brian, > > On Thu, Aug 21, 2014 at 10:18 PM, Brian Foster wrote: >> XFS log recovery builds up an xlog_recover object as it passes through >> the log operations on the physical log. These structures are managed via >> a hash table and are allocated when a new transaction is encountered and >> freed once a commit operation for the transaction is encountered. >> >> This state machine for active transactions is implemented by a >> combination of xlog_do_recovery_pass(), which walks through the log >> buffers and xlog_recover_process_data() which processes log operations >> within each buffer. The latter function decides whether to allocate a >> new xlog_recover, add to it or commit and ultimately free it. If an >> error occurs at any point during the lifecycle of a particular >> xlog_recover, xlog_recover_process_data() frees the object and returns >> an error. >> >> xlog_recover_commit_trans() handles the final processing of the >> transaction. It submits whatever I/O is required for the transaction and >> frees xlog_recover object along with the transaction items it tracks. If >> an error occurs at the final stages of the commit operation, such as I/O >> failure, both xlog_recover_commit_trans() and >> xlog_recover_process_data() attempt to free the trans object. >> >> Modify xlog_recover_commit_trans() to only free the trans object on >> successful completion of the trans, including any I/O errors that might >> occur when recovering the log. >> >> Signed-off-by: Brian Foster >> --- >> >> Hi all, >> >> I found that the recent buffer I/O rework fixes didn't address the crash >> reproduced by the dm-flakey/log recovery test case I posted recently. I >> tracked the crash down to this, which allows the test to pass. This >> addresses the crash I saw when running the reproducer manually with the >> metadump that Alex posted as well. >> >> FWIW, I also went back and tested the xfs_buf_iowait() experiment in >> both scenarios (Alex's metadump and xfstests test) and they all >> reproduce the same crash for me. I think that either I'm still not >> reproducing the original problem, something else might have contaminated >> the original xfs_buf_iowait() test to give a false positive, or >> something else entirely is going on. >> >> Alex, >> >> If you have a chance, I think it might be interesting to see whether you >> reproduce any problems with this patch. It looks like this is a >> regression introduced by: >> >> 2a84108f xfs: free the list of recovery items on error >> >> ... but I have no idea if that's in whatever kernel you're running. > I am running kernel 3.8.13 with some changes (published at > https://github.com/zadarastorage/zadara-xfs-pushback), but this > problem also happens on pristine 3.8.13 from > git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git, > branch linux-stable-3.8.y. > > I do not have commit 2a84108f in this kernel. It was introduced in 3.14. > I applied your patch to 3.8.13, but it doesn't fix the issue. Same > problem happens when testing scenario that I described in > http://oss.sgi.com/pipermail/xfs/2014-August/037637.html. > > Thanks, > Alex. > >> >> Brian >> >> fs/xfs/xfs_log_recover.c | 11 ++++++++--- >> 1 file changed, 8 insertions(+), 3 deletions(-) >> >> diff --git a/fs/xfs/xfs_log_recover.c b/fs/xfs/xfs_log_recover.c >> index 176c4b3..daca9a6 100644 >> --- a/fs/xfs/xfs_log_recover.c >> +++ b/fs/xfs/xfs_log_recover.c >> @@ -3528,10 +3528,15 @@ out: >> if (!list_empty(&done_list)) >> list_splice_init(&done_list, &trans->r_itemq); >> >> - xlog_recover_free_trans(trans); >> - >> error2 = xfs_buf_delwri_submit(&buffer_list); >> - return error ? error : error2; >> + >> + if (!error) >> + error = error2; >> + /* caller frees trans on error */ >> + if (!error) >> + xlog_recover_free_trans(trans); >> + >> + return error; >> } >> >> STATIC int >> -- >> 1.8.3.1 >> From stan@hardwarefreak.com Sun Aug 24 15:14: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 (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 698C57F4E for ; Sun, 24 Aug 2014 15:14:47 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id EDC1DAC001 for ; Sun, 24 Aug 2014 13:14:43 -0700 (PDT) X-ASG-Debug-ID: 1408911282-04cbb054867a3860001-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 cKECPEteVhkJ9os4 for ; Sun, 24 Aug 2014 13:14:42 -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 B092A6C097; Sun, 24 Aug 2014 15:14:41 -0500 (CDT) Message-ID: <53FA47B4.6020103@hardwarefreak.com> Date: Sun, 24 Aug 2014 15:14:44 -0500 From: stan hoeppner User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Icedove/24.7.0 MIME-Version: 1.0 To: Dave Chinner CC: xfs@oss.sgi.com Subject: Re: inode64 directory placement determinism References: <20140818070153.GL20518@dastard> <20140818224853.GD26465@dastard> X-ASG-Orig-Subj: Re: inode64 directory placement determinism In-Reply-To: Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit X-Barracuda-Connect: mo-65-41-216-221.sta.embarqhsd.net[65.41.216.221] X-Barracuda-Start-Time: 1408911282 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On 08/18/2014 07:02 PM, Stan Hoeppner wrote: > On Tue, 19 Aug 2014 08:48:53 +1000, Dave Chinner > wrote: >> On Mon, Aug 18, 2014 at 11:16:12AM -0500, Stan Hoeppner wrote: >>> On Mon, 18 Aug 2014 17:01:53 +1000, Dave Chinner >>> wrote: >>>> On Sun, Aug 17, 2014 at 10:29:21PM -0500, Stan Hoeppner wrote: >>>>> Say I have a single 4TB disk in an md linear device. The md device >>>>> has >>> a >>>>> filesystem on it formatted with defaults. It has 4 AGs, 0-3. I > have >>>>> created 4 directories. Each should reside in a different AG, the >>>>> first >>>>> in >>>>> AG0. Now I expand the linear device with an identical 4TB disk and >>>>> execute >>>>> xfs_growfs. I now have 4 more AGs, 4-7. I create 4 more > directories. >>>>> >>>>> Will these 4 new dirs be created sequentially in AGs 4-7, or in the >>> first >>>>> 4 AGs? Is this deterministic, or is there any chance involved? On >>>>> the >>>> >>>> Deterministic, assuming single threaded *file-system-wide* directory >>>> creation. Completely unpredictable under concurrent directory >>>> creations. See xfs_ialloc_ag_select/xfs_ialloc_next_ag. >>>> >>>> Note that the rotor used to select the next AG is set to >>>> zero at mount. >>>> >>>> i.e. single threaded behaviour at agcount = 4: >>>> >>>> dir number rotor value destination AG >>>> 1 0 0 >>>> 2 1 1 >>>> 3 2 2 >>>> 4 3 3 >>>> 5 0 0 >>>> 6 1 1 >>>> .... >>>> >>>> So, if you do what you suggest, and grow *after* the first 4 dirs >>>> are created, the above is what you'll get because the rotor goes >>>> back to zero on the fourth directory create. Now, with changing from >>>> 4 to 8 AGs after the first 4: >>>> >>>> dir number rotor value new inode location (AG) >>>> 1 0 0 >>>> 2 1 1 >>>> 3 2 2 >>>> 4 3 3 >>>> >>>> 5 0 0 >>>> 6 1 1 >>>> 7 2 2 >>>> 8 3 3 >>>> 9 4 4 >>>> 10 5 5 >>>> 11 6 6 >>>> 13 7 7 >>>> 14 0 0 >>>> >>>>> real system these 4TB drives are actually 48TB LUNs. I'm after >>>>> deterministic parallel bandwidth to subsequently added RAIDs after >>>>> each >>>>> grow operation by simply writing to the proper directory. >>>> >>>> Just create new directories and use the inode number to >>>> determine their location. If the directory is not in the correct AG, >>>> remove it and create a new one, until you have directories located >>>> in the AGs you want. >>>> >>>> Cheers, >>>> >>>> Dave. >>> >>> >>> Thanks for the info Dave. Was hoping it would be more straightforward. > >>> Modifying the app for this is out of the question. They've spent 3+ >>> years >>> developing with EXT4 and decided to try XFS at the last minute. > Product >>> is >>> to ship in October, so optimizations I can suggest are limited. >> >> Perhaps you could actually tell us what the requirement for >> layout/separation is, and how they are acheiving it with ext4. We >> really need a more "directed" allocation ability, but it's not clear >> exactly what requirements need to drive that. >> >> Cheers, >> >> Dave. > > The test harness app writes to thousands of preallocated files in hundreds > of directories. The target is ~250MB/s at the application per array, more > if achievable, writing a combination of fast and slow streams from up to > ~1000 threads, to different files, circularly. The mix of stream rates and > the files they write will depend on the end customers' needs. Currently > they have 1 FS per array with 3 top level dirs each w/3 subdirs, 2 of these > with ~100 subdirs each, and hundreds files in each of those. Simply doing > a concat, growing and just running with it might work fine. The concern is > ending up with too many fast stream writers hitting AGs on a single array > which won't be able to keep up. Currently they simply duplicate the layout > on each new filesystem they mount. The application duplicates the same > layout on each filesystem and does its own load balancing among the group > of them. > > Ideally they'd obviously like to simply add files to existing directories > after growing, but that won't achieve scalable bandwidth. My apologies Dave. The above isn't really a description of a requirement, but simply how they do things currently. So let me take another stab at this. I think the generic requirement is best described as: Create a directory in the first AG in a range of specified AGs. Create all child directories and files in AGs within the range of AGs, starting with the first AG. In other words, we take the default behavior of the inode64 allocator and we apply it to a subset of AGs within the filesystem. Something like... agr = allocation group range 1. mkdir $directory agr=0,47 2. create $directory in AG0 and set flag in metadata to have inode64 allocator rotor new child directories of this parent across only the AGs in the range specified 3. file allocation policy need not be altered, files go in parent directory, parent AG. If we spill due to AG free space do what we already do and allow writing outside of the AGs in agr So when we expand the concat and grow XFS we simply do ~$ mkdir $directory agr=48,95 All child directories and files created in $directory will be allocated in AGs 48-95, only on the new LUN. Rinse and repeat. Such a feature would provide everything needed I think for this particular workload. I can imagine there are similar workloads out there that would benefit from something like this given the prevalence of large concatenated RAID6s today. Another scenario that might benefit from something like this is short stroking of mechanical storage, but controlling it at the filesystem level instead of the block or controller layer. Setting AGR with an mkdir switch might not fly due to it being a generic command for all filesystems. But it would sure be the most straightforward approach and easiest to use. Due to the timetable and other restrictions I wouldn't be able to use patches that might come from fleshing out our ideas here, but I think it would be very useful functionality for others. Cheers, Stan From stan@hardwarefreak.com Sun Aug 24 21:15: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 2F5967F4E for ; Sun, 24 Aug 2014 21:15:45 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 1E4748F8033 for ; Sun, 24 Aug 2014 19:15:42 -0700 (PDT) X-ASG-Debug-ID: 1408932939-04cbb054877b0870001-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 mIAelCCT0vWDotqf for ; Sun, 24 Aug 2014 19:15:39 -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 2A3D16C00D; Sun, 24 Aug 2014 21:15:39 -0500 (CDT) Message-ID: <53FA9C4B.20805@hardwarefreak.com> Date: Sun, 24 Aug 2014 21:15:39 -0500 From: Stan Hoeppner User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:24.0) Gecko/20100101 Thunderbird/24.6.0 MIME-Version: 1.0 To: Dave Chinner CC: xfs@oss.sgi.com Subject: Re: inode64 directory placement determinism References: <20140818070153.GL20518@dastard> <20140818224853.GD26465@dastard> <53FA47B4.6020103@hardwarefreak.com> X-ASG-Orig-Subj: Re: inode64 directory placement determinism In-Reply-To: <53FA47B4.6020103@hardwarefreak.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: 1408932939 X-Barracuda-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 8/24/2014 3:14 PM, stan hoeppner wrote: > Due to the timetable and other restrictions I wouldn't be able to use > patches that might come from fleshing out our ideas here, but I think it > would be very useful functionality for others. Let me restate the above as I don't "think" we'd be able to use patches in the short term for version 1 of the product. That may change if said hypothetical patches might become available within the next 3 weeks, which is probably highly unlikely. They brought me in very late in the game, unfortunately, so I'm racing against the clock. And of course I wasn't able to assist in architectural planning, and make such a feature request here long ago, allowing for sufficient lead time. Stan From david@fromorbit.com Sun Aug 24 21:19: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 1CD947F51 for ; Sun, 24 Aug 2014 21:19:47 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id F0A9F8F8033 for ; Sun, 24 Aug 2014 19:19:46 -0700 (PDT) X-ASG-Debug-ID: 1408933181-04cb6c5500523fa0001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id fYBMG1oRmWikjpEy for ; Sun, 24 Aug 2014 19:19:41 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.129 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AlkeAMKb+lN5LDJ8PGdsb2JhbABZgw1TV4IsiyqhOwwBAQEBAQEGnSGBXYVrAwIBgQ0XBQEBAQE4NoQDAQEEATocIwULCAMYCSUPBSUDBxoTiDoHDsBrGIVkh0CCEAeETAWVT4Z5mH0rLwGCTgEBAQ Received: from ppp121-44-50-124.lns20.syd6.internode.on.net (HELO dastard) ([121.44.50.124]) by ipmail06.adl2.internode.on.net with ESMTP; 25 Aug 2014 11:49:13 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1XLjsF-0005g5-FA; Mon, 25 Aug 2014 12:19:11 +1000 Date: Mon, 25 Aug 2014 12:19:11 +1000 From: Dave Chinner To: stan hoeppner Cc: xfs@oss.sgi.com Subject: Re: inode64 directory placement determinism Message-ID: <20140825021911.GX26465@dastard> X-ASG-Orig-Subj: Re: inode64 directory placement determinism References: <20140818070153.GL20518@dastard> <20140818224853.GD26465@dastard> <53FA47B4.6020103@hardwarefreak.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <53FA47B4.6020103@hardwarefreak.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: 1408933181 X-Barracuda-URL: http://192.48.176.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.8801 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Sun, Aug 24, 2014 at 03:14:44PM -0500, stan hoeppner wrote: > >The test harness app writes to thousands of preallocated files in hundreds > >of directories. The target is ~250MB/s at the application per array, more > >if achievable, writing a combination of fast and slow streams from up to > >~1000 threads, to different files, circularly. The mix of stream rates and > >the files they write will depend on the end customers' needs. Currently > >they have 1 FS per array with 3 top level dirs each w/3 subdirs, 2 of these > >with ~100 subdirs each, and hundreds files in each of those. Simply doing > >a concat, growing and just running with it might work fine. The concern is > >ending up with too many fast stream writers hitting AGs on a single array > >which won't be able to keep up. Currently they simply duplicate the layout > >on each new filesystem they mount. The application duplicates the same > >layout on each filesystem and does its own load balancing among the group > >of them. > > > >Ideally they'd obviously like to simply add files to existing directories > >after growing, but that won't achieve scalable bandwidth. > > > My apologies Dave. The above isn't really a description of a > requirement, but simply how they do things currently. So let me > take another stab at this. I think the generic requirement is best > described as: > > Create a directory in the first AG in a range of specified > AGs. Create all child directories and files in AGs within the > range of AGs, starting with the first AG. In other words, we > take the default behavior of the inode64 allocator and we apply > it to a subset of AGs within the filesystem. Something like... > > agr = allocation group range > > 1. mkdir $directory agr=0,47 > > 2. create $directory in AG0 and set flag in metadata to have inode64 > allocator rotor new child directories of this parent across only > the AGs in the range specified > > 3. file allocation policy need not be altered, files go in parent > directory, parent AG. If we spill due to AG free space do what > we already do and allow writing outside of the AGs in agr > > > So when we expand the concat and grow XFS we simply do > > ~$ mkdir $directory agr=48,95 > > All child directories and files created in $directory will be > allocated in AGs 48-95, only on the new LUN. Rinse and repeat. So you want a persistent, configurable AG rotor for a specific directory and all it's children? That's not all that simple to do, because there's no direct connection between the top level directory and indirect children. What you are really asking for is a specific instance of the more generic concept of specifying per-file allocation policy. That's been on the radar for a long time, but it's not as simple as it first sounds. This is something i started prototyping years ago when I was back at SGI: http://oss.sgi.com/archives/xfs/2009-02/msg00250.html but that patch series is *extremely* experimental. There are parts we should pull from it to start putting generic allocation policy frameworks in place, but the really difficult part of per-file allocation policy is the bit that I never got to: 1. persistence and what to do with kernels that don't understand specific policies 2. how to do the policies generically so that we don't make a huge mess of the code. 3. user interface for managing policies is has not been really thought through. SO, if someone wants a project that will keep them busy for many, many months... > Due to the timetable and other restrictions I wouldn't be able to > use patches that might come from fleshing out our ideas here, but I > think it would be very useful functionality for others. Yes, such things have long been considered useful. The problem is finding enough people to implement all the stuff we consider useful... Cheers, Dave. -- Dave Chinner david@fromorbit.com From suc@mexicocalendario2014.info Sun Aug 24 21:29: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=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 89ECA7F54 for ; Sun, 24 Aug 2014 21:29:12 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 35380AC001 for ; Sun, 24 Aug 2014 19:29:12 -0700 (PDT) X-ASG-Debug-ID: 1408933749-04bdf010974b4800001-NocioJ Received: from mail.mexicocalendario2014.info (mail.mexicocalendario2014.info [81.7.3.140]) by cuda.sgi.com with ESMTP id Kisf1w3pkCA03o2k for ; Sun, 24 Aug 2014 19:29:09 -0700 (PDT) X-Barracuda-Envelope-From: suc@mexicocalendario2014.info X-Barracuda-Apparent-Source-IP: 81.7.3.140 Received: from 81-7-3-140 (81.7.3.140) by mail.mexicocalendario2014.info id hvafna0our0b for ; Sun, 24 Aug 2014 21:29:08 -0500 (envelope-from ) mod: fd25f39a-7480-48bc-843f-89413644a548 Message-ID: <04f4135f3ca739fce5da2a5100104f7e@mexicocalendario2014.info> From: "Administracion" To: Subject: Eres un Buen Gerente? Date: Sun, 24 Aug 2014 21:29:08 -0500 X-ASG-Orig-Subj: Eres un Buen Gerente? MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="----=SPLITOR00A_001_238345706D" X-Barracuda-Connect: mail.mexicocalendario2014.info[81.7.3.140] X-Barracuda-Start-Time: 1408933749 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-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.8801 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. ------=SPLITOR00A_001_238345706D Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable =20 C=C3=B3mo manejar EXITOSAMENTE SUCURSALES 10 de septiembre, Guadalajara 11 de septiembre, M=C3=A9xico, D.F.=20 12 de septiembre, Monterrey=20 1. C=C3=93MO MANTENER EL ORDEN MIENTRAS DIRIGE A CONTROL REMOTO O LARGA = DISTANCIA=2E 2. CONTACTO Y COMUNICACI=C3=93N CON LAS SUCURSALES=2E 3. EQUIPOS CALIFICADOS EN LOS QUE USTED PUEDE CONFIAR=2E 4. QU=C3=89 TAN A MENUDO DEBER=C3=8DA VISITAR CADA SUCURSAL=2E Para obtener el contenido completo de este programa responda este correo = con la palabra Sucursales + Nombre + Tel=C3=A9fono + Sede (GDL, D.F. = =C3=B3 MTY) y se lo enviaremos a la brevedad=2E Mayores informes e inscripci=C3=B3n, - Solic=C3=ADtala ya L=C3=ADnea directa Guadalajara: 01 331 809 8213 L=C3=ADnea directa D.F. y Monterrey: 01 800 212 0660 Para YA no recibir estos boletines a: xfs@oss.sgi.com simplemente = env=C3=ADe un correo con asunto (fridf3y) ------=SPLITOR00A_001_238345706D Content-Type: text/html; charset="utf-8" Content-Transfer-Encoding: quoted-printable

 

C=C3=B3mo manejar = EXITOSAMENTE=20 SUCURSALES
10 de septiembre,=20 Guadalajara
11 de = septiembre,=20 M=C3=A9xico, D.F.
12 de septiembre, = Monterrey=20

1. C=C3=93MO MANTENER EL ORDEN MIENTRAS DIRIGE = A CONTROL=20 REMOTO O LARGA DISTANCIA.
2. CONTACTO Y = COMUNICACI=C3=93N CON=20 LAS SUCURSALES.
3. EQUIPOS CALIFICADOS EN LOS QUE = USTED=20 PUEDE CONFIAR.
4. QU=C3=89 TAN A MENUDO DEBER=C3=8DA = VISITAR CADA=20 = SUCURSAL.

Para obtener el contenido completo = de este=20 programa responda este correo con la palabra = Sucursales + Nombre + Tel=C3=A9fono + = Sede (GDL, D.F.=20 =C3=B3 MTY)
y se lo enviaremos a la=20 brevedad.

Mayores informes e = inscripci=C3=B3n, -=20 Solic=C3=ADtala ya
L=C3=ADnea directa = Guadalajara: 01 331=20 809 8213
L=C3=ADnea directa D.F. y  = Monterrey: 01=20 800 212 0660

Para YA no=20 recibir estos boletines a: xfs@oss.sgi.com simplemente = env=C3=ADe un=20 correo con asunto=20 = (fridf3y)

 

------=SPLITOR00A_001_238345706D-- From zhangqiang.buaa@gmail.com Sun Aug 24 22:34: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=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 43D4C7F56 for ; Sun, 24 Aug 2014 22:34:38 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 24267304051 for ; Sun, 24 Aug 2014 20:34:38 -0700 (PDT) X-ASG-Debug-ID: 1408937675-04cb6c5500526ef0001-NocioJ Received: from mail-lb0-f170.google.com (mail-lb0-f170.google.com [209.85.217.170]) by cuda.sgi.com with ESMTP id PPHn9rf3pVMzCv8j (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Sun, 24 Aug 2014 20:34:36 -0700 (PDT) X-Barracuda-Envelope-From: zhangqiang.buaa@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.217.170 X-Barracuda-IPDD: Level1 [gmail.com/209.85.217.170] Received: by mail-lb0-f170.google.com with SMTP id l4so11691299lbv.15 for ; Sun, 24 Aug 2014 20:34:34 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.217.170] X-Barracuda-IPDD: Level1 [gmail.com/209.85.217.170] 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=UXQhJiTAdPTaUQ4pPyzfgPurjiHVFk1SSN9GEAmUsM8=; b=wpK/geFwaVD9FNBq7/7NfbBWDaVtAZk7u/HB4Qd3aHaHJ4ESMMOUsoBjqifRdW51UX G9D8FD8aEjLTq5mHx5RqV4fWuZo//rVVXRuf6qEYtWUgpE8UD2NANqq9E4KEf+vPiDFC 8h9gJ8QvBp98AjVEyP05VdqZUam70ItltdLYNEwifBU2SkWSvKSDdSnvFTkRoQ4TTS2H RDBEirLZykSMP+S+vInZl+BP+J51NdvNMs0XS1UM2wNe78ZG4chy7AllHyDoQpvNIuTx vxYGxIuoinj20PW+rqOiCLDB483rMkKdoF0Kc4b739Tqzo8kW/RRYqOqAbtXIsw6V8nd qZYA== MIME-Version: 1.0 X-Received: by 10.112.247.11 with SMTP id ya11mr17776125lbc.28.1408937674797; Sun, 24 Aug 2014 20:34:34 -0700 (PDT) Received: by 10.114.161.116 with HTTP; Sun, 24 Aug 2014 20:34:34 -0700 (PDT) Date: Mon, 25 Aug 2014 11:34:34 +0800 Message-ID: Subject: bad performance on touch/cp file on XFS system From: Zhang Qiang X-ASG-Orig-Subj: bad performance on touch/cp file on XFS system To: xfs@oss.sgi.com Content-Type: multipart/alternative; boundary=001a113471dc9df63d05016bdd04 X-Barracuda-Connect: mail-lb0-f170.google.com[209.85.217.170] X-Barracuda-Start-Time: 1408937676 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.8802 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 --001a113471dc9df63d05016bdd04 Content-Type: text/plain; charset=UTF-8 Dear XFS community & developers, I am using CentOS 6.3 and xfs as base file system and use RAID5 as hardware storage. Detail environment as follow: OS: CentOS 6.3 Kernel: kernel-2.6.32-279.el6.x86_64 XFS option info(df output): /dev/sdb1 on /data type xfs (rw,noatime,nodiratime,nobarrier) Detail phenomenon: # df Filesystem Size Used Avail Use% Mounted on /dev/sda1 29G 17G 11G 61% / /dev/sdb1 893G 803G 91G 90% /data /dev/sda4 2.2T 1.6T 564G 75% /data1 # time touch /data1/1111 real 0m23.043s user 0m0.001s sys 0m0.349s # perf top Events: 6K cycles 16.96% [xfs] [k] xfs_inobt_get_rec 11.95% [xfs] [k] xfs_btree_increment 11.16% [xfs] [k] xfs_btree_get_rec 7.39% [xfs] [k] xfs_btree_get_block 5.02% [xfs] [k] xfs_dialloc 4.87% [xfs] [k] xfs_btree_rec_offset 4.33% [xfs] [k] xfs_btree_readahead 4.13% [xfs] [k] _xfs_buf_find 4.05% [kernel] [k] intel_idle 2.89% [xfs] [k] xfs_btree_rec_addr 1.04% [kernel] [k] kmem_cache_free It seems that some xfs kernel function spend much time (xfs_inobt_get_rec, xfs_btree_increment, etc.) I found a bug in bugzilla [1], is that is the same issue like this? It's very greatly appreciated if you can give constructive suggestion about this issue, as It's really hard to reproduce from another system and it's not possible to do upgrade on that online machine. [1] https://bugzilla.redhat.com/show_bug.cgi?format=multiple&id=813137 Thanks in advance Qiang --001a113471dc9df63d05016bdd04 Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: quoted-printable
Dear XFS community & developers,

I am using CentOS 6.3 and xfs as base file system and use RAID5 as= hardware storage.

Detail environment as follow:
=C2=A0 =C2=A0OS: CentOS 6.3
=C2=A0 =C2=A0Kernel: kernel-2.6.= 32-279.el6.x86_64
=C2=A0 =C2=A0XFS option info(df output): /dev/s= db1 on /data type xfs (rw,noatime,nodiratime,nobarrier)

Detail phenomenon:
=C2=A0 =C2=A0=C2=A0
=C2=A0 =C2=A0 # df
=C2=A0 =C2= =A0 Filesystem =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0Size =C2=A0Used Ava= il Use% Mounted on
=C2=A0 =C2=A0 /dev/sda1 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A029G =C2=A0 17G =C2=A0 11G =C2=A061% /
= =C2=A0 =C2=A0 /dev/sdb1 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 893G =C2= =A0803G =C2=A0 91G =C2=A090% /data
=C2=A0 =C2=A0 /dev/sda4 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 2.2T= =C2=A01.6T =C2=A0564G =C2=A075% /data1
=C2=A0 =C2=A0=C2=A0
=
=C2=A0 =C2=A0 # time touch /data1/1111
=C2=A0 =C2=A0 real = =C2=A0 =C2=A00m23.043s
=C2=A0 =C2=A0 user =C2=A0 =C2=A00m0.001s
=C2=A0 =C2=A0 sys =C2=A0 =C2=A0 0m0.349s
=C2=A0 =C2=A0= =C2=A0
=C2=A0 =C2=A0 # perf top
=C2=A0 =C2=A0 Events: 6K cycles
=C2=A0 =C2=A0 =C2=A016.96% =C2=A0[xfs] =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 [k] xfs_inobt_get_rec
= =C2=A0 =C2=A0 =C2=A011.95% =C2=A0[xfs] =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 [k] xfs_btree_increment
=C2=A0= =C2=A0 =C2=A011.16% =C2=A0[xfs] =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 [k] xfs_btree_get_rec
=C2=A0 =C2=A0 =C2=A0 7.39% =C2=A0[xfs] =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 [k] xfs_btree_get_block
= =C2=A0 =C2=A0 =C2=A0 5.02% =C2=A0[xfs] =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 [k] xfs_dialloc
=C2=A0 =C2=A0 = =C2=A0 4.87% =C2=A0[xfs] =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 [k] xfs_btree_rec_offset
=C2=A0 =C2=A0 =C2= =A0 4.33% =C2=A0[xfs] =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 [k] xfs_btree_readahead
=C2=A0 =C2=A0 =C2=A0 4.13% =C2=A0[xfs] =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 [k] _xfs_buf_find
=C2=A0 = =C2=A0 =C2=A0 4.05% =C2=A0[kernel] =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0[k] intel_idle
=C2=A0 =C2=A0 =C2=A0 2.89%= =C2=A0[xfs] =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0 [k] xfs_btree_rec_addr
=C2=A0 =C2=A0 =C2=A0 1.04% =C2=A0[= kernel] =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0[k] k= mem_cache_free


It seems that some xfs kernel function s= pend much time (xfs_inobt_get_rec, xfs_btree_increment, etc.)
I found a bug in bugzilla [1], is that is the same issue like t= his?

It's very greatly appreciated if you can give const= ructive suggestion about this issue, as It's really hard to reproduce f= rom another system and it's not possible to do upgrade on that online m= achine.



=
Thanks in advance
Qiang
--001a113471dc9df63d05016bdd04-- From david@fromorbit.com Mon Aug 25 00:18: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 19DB27F58 for ; Mon, 25 Aug 2014 00:18:13 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id DF7A1304048 for ; Sun, 24 Aug 2014 22:18:09 -0700 (PDT) X-ASG-Debug-ID: 1408943884-04bdf0109a4b9f90001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id HBNuEd7GpygDAEIF for ; Sun, 24 Aug 2014 22:18: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: AmUTACjG+lN5LDJ8PGdsb2JhbABZgw2BKoczp2wBAQEBBqRuAYETFwUBAQEBODaEAwEBBAE6HCMFCwgDGAklDwUlAwcaExSIJgfAHxcYhWSIZSJJB4RMBZxImH0rL4EHgUgBAQE Received: from ppp121-44-50-124.lns20.syd6.internode.on.net (HELO dastard) ([121.44.50.124]) by ipmail06.adl2.internode.on.net with ESMTP; 25 Aug 2014 14:48:03 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1XLmfJ-00061I-Bc; Mon, 25 Aug 2014 15:18:01 +1000 Date: Mon, 25 Aug 2014 15:18:01 +1000 From: Dave Chinner To: Zhang Qiang Cc: xfs@oss.sgi.com Subject: Re: bad performance on touch/cp file on XFS system Message-ID: <20140825051801.GY26465@dastard> X-ASG-Orig-Subj: Re: bad performance on touch/cp file on XFS system 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: 1408943884 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.8804 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Mon, Aug 25, 2014 at 11:34:34AM +0800, Zhang Qiang wrote: > Dear XFS community & developers, > > I am using CentOS 6.3 and xfs as base file system and use RAID5 as hardware > storage. > > Detail environment as follow: > OS: CentOS 6.3 > Kernel: kernel-2.6.32-279.el6.x86_64 > XFS option info(df output): /dev/sdb1 on /data type xfs > (rw,noatime,nodiratime,nobarrier) > > Detail phenomenon: > > # df > Filesystem Size Used Avail Use% Mounted on > /dev/sda1 29G 17G 11G 61% / > /dev/sdb1 893G 803G 91G 90% /data > /dev/sda4 2.2T 1.6T 564G 75% /data1 > > # time touch /data1/1111 > real 0m23.043s > user 0m0.001s > sys 0m0.349s > > # perf top > Events: 6K cycles > 16.96% [xfs] [k] xfs_inobt_get_rec > 11.95% [xfs] [k] xfs_btree_increment > 11.16% [xfs] [k] xfs_btree_get_rec > 7.39% [xfs] [k] xfs_btree_get_block > 5.02% [xfs] [k] xfs_dialloc > 4.87% [xfs] [k] xfs_btree_rec_offset > 4.33% [xfs] [k] xfs_btree_readahead > 4.13% [xfs] [k] _xfs_buf_find > 4.05% [kernel] [k] intel_idle > 2.89% [xfs] [k] xfs_btree_rec_addr > 1.04% [kernel] [k] kmem_cache_free > > > It seems that some xfs kernel function spend much time (xfs_inobt_get_rec, > xfs_btree_increment, etc.) > > I found a bug in bugzilla [1], is that is the same issue like this? No. > It's very greatly appreciated if you can give constructive suggestion about > this issue, as It's really hard to reproduce from another system and it's > not possible to do upgrade on that online machine. You've got very few free inodes, widely distributed in the allocated inode btree. The CPU time above is the btree search for the next free inode. This is the issue solved by this series of recent commits to add a new on-disk free inode btree index: 53801fd xfs: enable the finobt feature on v5 superblocks 0c153c1 xfs: report finobt status in fs geometry a3fa516 xfs: add finobt support to growfs 3efa4ff xfs: update the finobt on inode free 2b64ee5 xfs: refactor xfs_difree() inobt bits into xfs_difree_inobt() helper 6dd8638 xfs: use and update the finobt on inode allocation 0aa0a75 xfs: insert newly allocated inode chunks into the finobt 9d43b18 xfs: update inode allocation/free transaction reservations for finobt aafc3c2 xfs: support the XFS_BTNUM_FINOBT free inode btree type 8e2c84d xfs: reserve v5 superblock read-only compat. feature bit for finobt 57bd3db xfs: refactor xfs_ialloc_btree.c to support multiple inobt numbers Which is of no help to you, however, because it's not available in any CentOS kernel. There's really not much you can do to avoid the problem once you've punched random freespace holes in the allocated inode btree. IT generally doesn't affect many people; those that it does affect are normally using XFS as an object store indexed by a hard link farm (e.g. various backup programs do this). If you dump the superblock via xfs_db, the difference between icount and ifree will give you idea of how much "needle in a haystack" searching is going on. You can probably narrow it down to a specific AG by dumping the AGI headers and checking the same thing. filling in all the holes (by creating a bunch of zero length files in the appropriate AGs) might take some time, but it should make the problem go away until you remove more filesystem and create random free inode holes again... Cheers, Dave. -- Dave Chinner david@fromorbit.com From namjae.jeon@samsung.com Mon Aug 25 01:52: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=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 120DB7F5A for ; Mon, 25 Aug 2014 01:52:34 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id E5BE0304048 for ; Sun, 24 Aug 2014 23:52:30 -0700 (PDT) X-ASG-Debug-ID: 1408949547-04cb6c54fd52c6f0001-NocioJ Received: from mailout3.samsung.com (mailout3.samsung.com [203.254.224.33]) by cuda.sgi.com with ESMTP id fZXPXW5ZO0EbO4gn (version=TLSv1 cipher=RC4-MD5 bits=128 verify=NO) for ; Sun, 24 Aug 2014 23:52:28 -0700 (PDT) X-Barracuda-Envelope-From: namjae.jeon@samsung.com X-Barracuda-Apparent-Source-IP: 203.254.224.33 Received: from epcpsbgr4.samsung.com (u144.gpu120.samsung.co.kr [203.254.230.144]) by mailout3.samsung.com (Oracle Communications Messaging Server 7u4-24.01 (7.0.4.24.0) 64bit (built Nov 17 2011)) with ESMTP id <0NAU00HRPOFE7U70@mailout3.samsung.com> for xfs@oss.sgi.com; Mon, 25 Aug 2014 15:52:26 +0900 (KST) Received: from epcpsbgm2.samsung.com ( [172.20.52.115]) by epcpsbgr4.samsung.com (EPCPMTA) with SMTP id D9.5E.04442.A2DDAF35; Mon, 25 Aug 2014 15:52:26 +0900 (KST) X-AuditID: cbfee690-f79ce6d00000115a-27-53fadd2a22c4 Received: from epmmp2 ( [203.254.227.17]) by epcpsbgm2.samsung.com (EPCPMTA) with SMTP id A5.22.05196.A2DDAF35; Mon, 25 Aug 2014 15:52:26 +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 <0NAU00KUXOFEZTB1@mmp2.samsung.com>; Mon, 25 Aug 2014 15:52:26 +0900 (KST) From: Namjae Jeon To: 'Brian Foster' Cc: 'Dave Chinner' , 'Theodore Ts'o' , linux-kernel@vger.kernel.org, xfs@oss.sgi.com, linux-fsdevel@vger.kernel.org, =?iso-8859-2?Q?'Luk=E1=B9_Czerner'?= , 'linux-ext4' References: <004301cfb2c6$6ef2d330$4cd87990$@samsung.com> <20140822120659.GF3152@laptop.bfoster> In-reply-to: <20140822120659.GF3152@laptop.bfoster> Subject: RE: [PATCH v5 2/10] xfs: Add support FALLOC_FL_INSERT_RANGE for fallocate Date: Mon, 25 Aug 2014 15:52:26 +0900 X-ASG-Orig-Subj: RE: [PATCH v5 2/10] xfs: Add support FALLOC_FL_INSERT_RANGE for fallocate Message-id: <001901cfc031$2140a950$63c1fbf0$@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: AQH4GbaBpWRVdUyOkzDMM+qmsuCaGAJIM1vgm33n5UA= Content-language: ko X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFjrBIsWRmVeSWpSXmKPExsWyRsSkWFfr7q9gg7arkhbvPldZbDl2j9Fi 2YPNLBYz591hs9iz9ySLxeVdc9gsWnt+slss6rvF6MDhcWqRhEfTmaPMHqsvbGX0eL/vKpvH 501yAaxRXDYpqTmZZalF+nYJXBkLuvezFdzkr/iw16uBcRdPFyMnh4SAicSHJbuYIGwxiQv3 1rN1MXJxCAksZZRYe34vK0zRrv8rmCES0xkldq86xwjh/GWU6PpzBSjDwcEmoC3xZ4soSIOI gLrEnXkTWEBqmAVamCRWHF7FDpIQEkiSuLbmL9g6TgFjibZLD8A2CAuESJxuWMMGYrMIqEq8 6tgPVs8rYCnx+MZsKFtQ4sfkeywgu5gFdCS+TooACTMLyEtsXvOWGeJQBYkdZ18zQtxgJdHQ +5IdokZEYt+Ld2A3Swh8ZJe4/G8KI8QuAYlvkw+BzZQQkJXYdABqjqTEwRU3WCYwSsxCsnkW wuZZSDbPQrJhASPLKkbR1ILkguKk9CITveLE3OLSvHS95PzcTYzACD7979mEHYz3DlgfYhTg YFTi4V3B+StYiDWxrLgy9xCjKdBBE5mlRJPzgWkiryTe0NjMyMLUxNTYyNzSTEmc97XUz2Ah gfTEktTs1NSC1KL4otKc1OJDjEwcnFINjNNyzzPMvrDhxU4xzWf7PfOWrDV/NEfI4NTOSzdD u9hjFqdUav1g4VFgLilt9xFZ+LpwDlO8A8d0HtUbi1TLBJeYdmwwnxB3MPnOUkbWCOb5fg5B 7iwH3v9eP6vG69arhYX3t108VKs2Z6LMxYhepwPFArMkFL4VBfKVu092uOVw4MukxLbARUos xRmJhlrMRcWJAN+c9sXbAgAA X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFprEKsWRmVeSWpSXmKPExsVy+t9jQV2tu7+CDX4eE7R497nKYsuxe4wW yx5sZrGYOe8Om8WevSdZLC7vmsNm0drzk91iUd8tRgcOj1OLJDyazhxl9lh9YSujx/t9V9k8 Pm+SC2CNamC0yUhNTEktUkjNS85PycxLt1XyDo53jjc1MzDUNbS0MFdSyEvMTbVVcvEJ0HXL zAE6RUmhLDGnFCgUkFhcrKRvh2lCaIibrgVMY4Sub0gQXI+RARpIWMOYsaB7P1vBTf6KD3u9 Ghh38XQxcnJICJhI7Pq/ghnCFpO4cG89WxcjF4eQwHRGid2rzjFCOH8ZJbr+XAGq4uBgE9CW +LNFFKRBREBd4s68CSwgNcwCLUwSKw6vYgdJCAkkSVxb85cJxOYUMJZou/SAFcQWFgiRON2w hg3EZhFQlXjVsR+snlfAUuLxjdlQtqDEj8n3WEB2MQvoSHydFAESZhaQl9i85i3UoQoSO86+ ZoS4wUqiofclO0SNiMS+F+8YJzAKzUIyaRbCpFlIJs1C0rGAkWUVo2hqQXJBcVJ6rpFecWJu cWleul5yfu4mRnB6eCa9g3FVg8UhRgEORiUe3pWcv4KFWBPLiitzDzFKcDArifBOOQ4U4k1J rKxKLcqPLyrNSS0+xGgK9OdEZinR5Hxg6soriTc0NjEzsjQyN7QwMjZXEuc92GodKCSQnliS mp2aWpBaBNPHxMEp1cCob8O0IOjYggj5m92dTH+/bSrqZv5r7KL6SEWiYOP2yQJv4rftXLEh nW/pGV+vc87OYT1W0ypPS1/QzTk9tXLb3L+cB94UX97lN+P4BhvL0z+Fdom8S6zgyk5c/sNT f6bw+huqk5PPbxdW6Hlrcvjz0S+3fhrGWnzbwqPAVPDG2Lzqu1LIaw4vJZbijERDLeai4kQA t28YjiUDAAA= 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: 1408949548 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.8806 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.01 THREAD_INDEX thread-index: AcO7Y8iR61tzADqsRmmc5wNiFHEOig== > Hi Namjae, Hi Brian. Thanks for your mail :) > > Sorry for finding things so late, but it looks like this suffers from > the same couple bugs we've recently discovered with the collapse range > patches. See the following for a couple fixes that have been proposed > recently: > > http://oss.sgi.com/archives/xfs/2014-08/msg00292.html > > This one helps prevent scenarios where we try to cancel a transaction > that is dirty. This leads to a shutdown on XFS. The idea is basically to > avoid logging until we actually make a change, so errors hit early in > the function (before we change anything) won't lead to an abort in the > error path. It looks like the bmap split and shift functions in this > patch could use the very same attention. Okay, I will add this commit to insert range patch. > > http://oss.sgi.com/archives/xfs/2014-08/index.html > > This one deals with a problem with the high level shift algorithm. The > problem with the algorithm here is that 'current_ext' can change > unexpectedly once we release the ilock due to writeback on parts of the > file before the range being collapsed/inserted. E.g., it is not a stable > index once ilock is dropped. The temporary solution is to flush the > entire file, since we have the iolock during the entire operation and > nothing else can dirty the file. The better fix is to track via an > offset across iterations of the shift, rather than the extent count > (iirc, xfs_bunmapi() and other bmap functions provide examples of this > kind of algorithm). Okay, I will check your points. > > Brian > > P.S., It's probably a good idea to remove my r-b tag on the next post as > well to avoid confusion and remind me that I need to take another look > at this. ;) Thanks again. Okay, I will remove it. Thanks Brian! > > > -- > > 1.7.11-rc0 > > > > _______________________________________________ > > xfs mailing list > > xfs@oss.sgi.com > > http://oss.sgi.com/mailman/listinfo/xfs From zhangqiang.buaa@gmail.com Mon Aug 25 03:09: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=FREEMAIL_FROM,HTML_MESSAGE, 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 D37FC7F5E for ; Mon, 25 Aug 2014 03:09:11 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id C16B28F8037 for ; Mon, 25 Aug 2014 01:09:11 -0700 (PDT) X-ASG-Debug-ID: 1408954145-04cbb054887bafb0001-NocioJ Received: from mail-lb0-f170.google.com (mail-lb0-f170.google.com [209.85.217.170]) by cuda.sgi.com with ESMTP id Y4AT7H39jzpfrqjC (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Mon, 25 Aug 2014 01:09:06 -0700 (PDT) X-Barracuda-Envelope-From: zhangqiang.buaa@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.217.170 X-Barracuda-IPDD: Level1 [gmail.com/209.85.217.170] Received: by mail-lb0-f170.google.com with SMTP id l4so11833552lbv.1 for ; Mon, 25 Aug 2014 01:09:05 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.217.170] X-Barracuda-IPDD: Level1 [gmail.com/209.85.217.170] 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=UKhvAvzDLCS+lsOkiux9JEwhIpnnzN43UieczOkOAi4=; b=WUyjqUAZbOi7d8A3rFTFdAnC82kC0Lv2mdO2wRtbUx/nXYWzwPV8rWUz45rschprt7 sqVRwkr9oRbdLaDlIEvNskFi2DnFiPUKDE3r4WBGbgDUWQZ1yXll4Rk3szDH+i4aJLOZ F3lz8bkA2JwEScRn2+5zegBUSz3lL5cGCh2WXeph1uLuTU0IhnT80wkDL94VDCqDX95C famb7LnPy8c2F2MRBQyLv7NAoYEFkAolIA5Nhb+tbXYXik2bwdYBBs/sEajOP46UBUR9 CrmIZUPlduav9HhCueXDN/pSILrvAE6gOI9j/7ifwkGdvMNiX6zgvx8fpeSs7VYgmqv/ /3hQ== MIME-Version: 1.0 X-Received: by 10.152.6.100 with SMTP id z4mr7000983laz.71.1408954145430; Mon, 25 Aug 2014 01:09:05 -0700 (PDT) Received: by 10.114.161.116 with HTTP; Mon, 25 Aug 2014 01:09:05 -0700 (PDT) In-Reply-To: <20140825051801.GY26465@dastard> References: <20140825051801.GY26465@dastard> Date: Mon, 25 Aug 2014 16:09:05 +0800 Message-ID: Subject: Re: bad performance on touch/cp file on XFS system From: Zhang Qiang X-ASG-Orig-Subj: Re: bad performance on touch/cp file on XFS system To: Dave Chinner Cc: xfs@oss.sgi.com Content-Type: multipart/alternative; boundary=089e01493e8057e80405016fb33d X-Barracuda-Connect: mail-lb0-f170.google.com[209.85.217.170] X-Barracuda-Start-Time: 1408954146 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.8807 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 --089e01493e8057e80405016fb33d Content-Type: text/plain; charset=UTF-8 Thanks for your quick and clear response. Some comments bellow: 2014-08-25 13:18 GMT+08:00 Dave Chinner : > On Mon, Aug 25, 2014 at 11:34:34AM +0800, Zhang Qiang wrote: > > Dear XFS community & developers, > > > > I am using CentOS 6.3 and xfs as base file system and use RAID5 as > hardware > > storage. > > > > Detail environment as follow: > > OS: CentOS 6.3 > > Kernel: kernel-2.6.32-279.el6.x86_64 > > XFS option info(df output): /dev/sdb1 on /data type xfs > > (rw,noatime,nodiratime,nobarrier) > > > > Detail phenomenon: > > > > # df > > Filesystem Size Used Avail Use% Mounted on > > /dev/sda1 29G 17G 11G 61% / > > /dev/sdb1 893G 803G 91G 90% /data > > /dev/sda4 2.2T 1.6T 564G 75% /data1 > > > > # time touch /data1/1111 > > real 0m23.043s > > user 0m0.001s > > sys 0m0.349s > > > > # perf top > > Events: 6K cycles > > 16.96% [xfs] [k] xfs_inobt_get_rec > > 11.95% [xfs] [k] xfs_btree_increment > > 11.16% [xfs] [k] xfs_btree_get_rec > > 7.39% [xfs] [k] xfs_btree_get_block > > 5.02% [xfs] [k] xfs_dialloc > > 4.87% [xfs] [k] xfs_btree_rec_offset > > 4.33% [xfs] [k] xfs_btree_readahead > > 4.13% [xfs] [k] _xfs_buf_find > > 4.05% [kernel] [k] intel_idle > > 2.89% [xfs] [k] xfs_btree_rec_addr > > 1.04% [kernel] [k] kmem_cache_free > > > > > > It seems that some xfs kernel function spend much time > (xfs_inobt_get_rec, > > xfs_btree_increment, etc.) > > > > I found a bug in bugzilla [1], is that is the same issue like this? > > No. > > > > It's very greatly appreciated if you can give constructive suggestion > about > > this issue, as It's really hard to reproduce from another system and it's > > not possible to do upgrade on that online machine. > > You've got very few free inodes, widely distributed in the allocated > inode btree. The CPU time above is the btree search for the next > free inode. > > This is the issue solved by this series of recent commits to add a > new on-disk free inode btree index: > [Qiang] This meas that if I want to fix this issue, I have to apply the following patches and build my own kernel. As the on-disk structure has been changed, so should I also re-create xfs filesystem again? is there any user space tools to convert old disk filesystem to new one, and don't need to backup and restore currently data? > > 53801fd xfs: enable the finobt feature on v5 superblocks > 0c153c1 xfs: report finobt status in fs geometry > a3fa516 xfs: add finobt support to growfs > 3efa4ff xfs: update the finobt on inode free > 2b64ee5 xfs: refactor xfs_difree() inobt bits into xfs_difree_inobt() > helper > 6dd8638 xfs: use and update the finobt on inode allocation > 0aa0a75 xfs: insert newly allocated inode chunks into the finobt > 9d43b18 xfs: update inode allocation/free transaction reservations for > finobt > aafc3c2 xfs: support the XFS_BTNUM_FINOBT free inode btree type > 8e2c84d xfs: reserve v5 superblock read-only compat. feature bit for finobt > 57bd3db xfs: refactor xfs_ialloc_btree.c to support multiple inobt numbers > > Which is of no help to you, however, because it's not available in > any CentOS kernel. > [Qiang] Do you think if it's possible to just backport these patches to kernel 6.2.32 (CentOS 6.3) to fix this issue? Or it's better to backport to 3.10 kernel, used in CentOS 7.0? > There's really not much you can do to avoid the problem once you've > punched random freespace holes in the allocated inode btree. IT > generally doesn't affect many people; those that it does affect are > normally using XFS as an object store indexed by a hard link farm > (e.g. various backup programs do this). > OK, I see. Could you please guide me to reproduce this issue easily? as I have tried to use a 500G xfs partition, and use about 98 % spaces, but still can't reproduce this issue. Is there any easy way from your mind? > If you dump the superblock via xfs_db, the difference between icount > and ifree will give you idea of how much "needle in a haystack" > searching is going on. You can probably narrow it down to a specific > AG by dumping the AGI headers and checking the same thing. filling > in all the holes (by creating a bunch of zero length files in the > appropriate AGs) might take some time, but it should make the > problem go away until you remove more filesystem and create random > free inode holes again... > I will try to investigate the detail issue. Thanks for your kindly response. Qiang > > Cheers, > > Dave. > -- > Dave Chinner > david@fromorbit.com > --089e01493e8057e80405016fb33d Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: quoted-printable
Thanks for your quick and clear response. Some comments be= llow:


2014= -08-25 13:18 GMT+08:00 Dave Chinner <david@fromorbit.com>:=
On M= on, Aug 25, 2014 at 11:34:34AM +0800, Zhang Qiang wrote:
> Dear XFS community & developers,
>
> I am using CentOS 6.3 and xfs as base file system and use RAID5 as har= dware
> storage.
>
> Detail environment as follow:
>=C2=A0 =C2=A0 OS: CentOS 6.3
>=C2=A0 =C2=A0 Kernel: kernel-2.6.32-279.el6.x86_64
>=C2=A0 =C2=A0 XFS option info(df output): /dev/sdb1 on /data type xfs > (rw,noatime,nodiratime,nobarrier)
>
> Detail phenomenon:
>
>=C2=A0 =C2=A0 =C2=A0# df
>=C2=A0 =C2=A0 =C2=A0Filesystem=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= Size=C2=A0 Used Avail Use% Mounted on
>=C2=A0 =C2=A0 =C2=A0/dev/sda1=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 29G=C2=A0 =C2=A017G=C2=A0 =C2=A011G=C2=A0 61% /
>=C2=A0 =C2=A0 =C2=A0/dev/sdb1=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0893G=C2=A0 803G=C2=A0 =C2=A091G=C2=A0 90% /data
>=C2=A0 =C2=A0 =C2=A0/dev/sda4=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A02.2T=C2=A0 1.6T=C2=A0 564G=C2=A0 75% /data1
>
>=C2=A0 =C2=A0 =C2=A0# time touch /data1/1111
>=C2=A0 =C2=A0 =C2=A0real=C2=A0 =C2=A0 0m23.043s
>=C2=A0 =C2=A0 =C2=A0user=C2=A0 =C2=A0 0m0.001s
>=C2=A0 =C2=A0 =C2=A0sys=C2=A0 =C2=A0 =C2=A00m0.349s
>
>=C2=A0 =C2=A0 =C2=A0# perf top
>=C2=A0 =C2=A0 =C2=A0Events: 6K cycles
>=C2=A0 =C2=A0 =C2=A0 16.96%=C2=A0 [xfs]=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0[k] xfs_inobt_get_rec
>=C2=A0 =C2=A0 =C2=A0 11.95%=C2=A0 [xfs]=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0[k] xfs_btree_increment
>=C2=A0 =C2=A0 =C2=A0 11.16%=C2=A0 [xfs]=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0[k] xfs_btree_get_rec
>=C2=A0 =C2=A0 =C2=A0 =C2=A07.39%=C2=A0 [xfs]=C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0[k] xfs_btree_get_block >=C2=A0 =C2=A0 =C2=A0 =C2=A05.02%=C2=A0 [xfs]=C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0[k] xfs_dialloc
>=C2=A0 =C2=A0 =C2=A0 =C2=A04.87%=C2=A0 [xfs]=C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0[k] xfs_btree_rec_offset >=C2=A0 =C2=A0 =C2=A0 =C2=A04.33%=C2=A0 [xfs]=C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0[k] xfs_btree_readahead >=C2=A0 =C2=A0 =C2=A0 =C2=A04.13%=C2=A0 [xfs]=C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0[k] _xfs_buf_find
>=C2=A0 =C2=A0 =C2=A0 =C2=A04.05%=C2=A0 [kernel]=C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 [k] intel_idle
>=C2=A0 =C2=A0 =C2=A0 =C2=A02.89%=C2=A0 [xfs]=C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0[k] xfs_btree_rec_addr
>=C2=A0 =C2=A0 =C2=A0 =C2=A01.04%=C2=A0 [kernel]=C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 [k] kmem_cache_free
>
>
> It seems that some xfs kernel function spend much time (xfs_inobt_get_= rec,
> xfs_btree_increment, etc.)
>
> I found a bug in bugzilla [1], is that is the same issue like this?
No.
=C2=A0

> It's very greatly appreciated if you can give constructive suggest= ion about
> this issue, as It's really hard to reproduce from another system a= nd it's
> not possible to do upgrade on that online machine.

You've got very few free inodes, widely distributed in the alloca= ted
inode btree. The CPU time above is the btree search for the next
free inode.

This is the issue solved by this series of recent commits to add a
new on-disk free inode btree index:
[Qiang] This meas = that if I want to fix this issue, I have to apply the following patches and= build my own kernel.

As the on-disk structure has= been changed, so should I also re-create xfs filesystem again? is there an= y user space tools to convert old disk filesystem to new one, and don't= need to backup and restore currently data?

=C2=A0

53801fd xfs: enable the finobt feature on v5 superblocks
0c153c1 xfs: report finobt status in fs geometry
a3fa516 xfs: add finobt support to growfs
3efa4ff xfs: update the finobt on inode free
2b64ee5 xfs: refactor xfs_difree() inobt bits into xfs_difree_inobt() helpe= r
6dd8638 xfs: use and update the finobt on inode allocation
0aa0a75 xfs: insert newly allocated inode chunks into the finobt
9d43b18 xfs: update inode allocation/free transaction reservations for fino= bt
aafc3c2 xfs: support the XFS_BTNUM_FINOBT free inode btree type
8e2c84d xfs: reserve v5 superblock read-only compat. feature bit for finobt=
57bd3db xfs: refactor xfs_ialloc_btree.c to support multiple inobt numbers<= br>
Which is of no help to you, however, because it's not available in
any CentOS kernel.
[Qiang] Do you think if it's po= ssible to just backport these patches to kernel =C2=A06.2.32 (CentOS 6.3) t= o fix this issue?

Or it's better to backport t= o 3.10 kernel, used in CentOS 7.0?



There's really not much you can do to avoid the problem once you've=
punched random freespace holes in the allocated inode btree. IT
generally doesn't affect many people; those that it does affect are
normally using XFS as an object store indexed by a hard link farm
(e.g. various backup programs do this).
OK, I see.

Could you please guide me to reproduce this issue eas= ily? as I have tried to use a 500G xfs partition, and use about 98 % spaces= , but still can't reproduce this issue. Is there any easy way from your= mind?


If you dump the superblock via xfs_db, the difference between icount
and ifree will give you idea of how much "needle in a haystack" searching is going on. You can probably narrow it down to a specific
AG by dumping the AGI headers and checking the same thing. filling
in all the holes (by creating a bunch of zero length files in the
appropriate AGs) might take some time, but it should make the
problem go away until you remove more filesystem and create random
free inode holes again...
=C2=A0
I will try = to investigate the detail issue.

Thanks for your k= indly response.
Qiang
=C2=A0

Cheers,

Dave.
--
Dave Chinner
david@fromorbit.com

--089e01493e8057e80405016fb33d-- From zhangqiang.buaa@gmail.com Mon Aug 25 03:47: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,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 541267F4E for ; Mon, 25 Aug 2014 03:47:49 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 42234304051 for ; Mon, 25 Aug 2014 01:47:46 -0700 (PDT) X-ASG-Debug-ID: 1408956462-04cb6c54fe52f930001-NocioJ Received: from mail-lb0-f172.google.com (mail-lb0-f172.google.com [209.85.217.172]) by cuda.sgi.com with ESMTP id BrxRARjFF4ij8UkX (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Mon, 25 Aug 2014 01:47:43 -0700 (PDT) X-Barracuda-Envelope-From: zhangqiang.buaa@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.217.172 X-Barracuda-IPDD: Level1 [gmail.com/209.85.217.172] Received: by mail-lb0-f172.google.com with SMTP id z11so12038477lbi.3 for ; Mon, 25 Aug 2014 01:47:39 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.217.172] X-Barracuda-IPDD: Level1 [gmail.com/209.85.217.172] 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=Jn9/HOJOUa6hNZPW/o0SaVBrdoyN6WmvTchyTf/k4Dc=; b=ma6NYggBE60ixKsODLY8KlUCvRwVJ0EKpBEWHTBqFWeoSW+L1GM9X+n94FL4kTd+dc HSs5uBH27vLFQd0cFdYEaFLpZ/t4AqaSwEFW5y/9xlv7drkz6U8rRpmSvYsz9Wn8I2Ta qG3TWILWCg+W8GdAcQ103mH7fj4KObh0pMf9mGNliQNPsHDOyHQvy5vuC5LrWnzsUOGK 8IfqU/bBej0A3mnnTCx/QYlBfGdC4+PqDspvbTtW135RRa2LkRX448LkrAzUaIj/KSuY NhDWYRl45SipPJ7N59lo7N+M0LeKYYaT2zMgxvkMDO1jedUFK0BYr/M0udSPqh7W8AsK Irbg== MIME-Version: 1.0 X-Received: by 10.152.87.179 with SMTP id az19mr20247886lab.25.1408956459108; Mon, 25 Aug 2014 01:47:39 -0700 (PDT) Received: by 10.114.161.116 with HTTP; Mon, 25 Aug 2014 01:47:39 -0700 (PDT) In-Reply-To: <20140825051801.GY26465@dastard> References: <20140825051801.GY26465@dastard> Date: Mon, 25 Aug 2014 16:47:39 +0800 Message-ID: Subject: Re: bad performance on touch/cp file on XFS system From: Zhang Qiang X-ASG-Orig-Subj: Re: bad performance on touch/cp file on XFS system To: Dave Chinner Cc: xfs@oss.sgi.com Content-Type: multipart/alternative; boundary=001a11c353fa3fce430501703d36 X-Barracuda-Connect: mail-lb0-f172.google.com[209.85.217.172] X-Barracuda-Start-Time: 1408956463 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.8808 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 --001a11c353fa3fce430501703d36 Content-Type: text/plain; charset=UTF-8 I have checked icount and ifree, but I found there are about 11.8 percent free, so the free inode should not be too few. Here's the detail log, any new clue? # mount /dev/sda4 /data1/ # xfs_info /data1/ meta-data=/dev/sda4 isize=256 agcount=4, agsize=142272384 blks = sectsz=512 attr=2, projid32bit=0 data = bsize=4096 blocks=569089536, imaxpct=5 = sunit=0 swidth=0 blks naming =version 2 bsize=4096 ascii-ci=0 log =internal bsize=4096 blocks=277875, version=2 = sectsz=512 sunit=0 blks, lazy-count=1 realtime =none extsz=4096 blocks=0, rtextents=0 # umount /dev/sda4 # xfs_db /dev/sda4 xfs_db> sb 0 xfs_db> p magicnum = 0x58465342 blocksize = 4096 dblocks = 569089536 rblocks = 0 rextents = 0 uuid = 13ecf47b-52cf-4944-9a71-885bddc5e008 logstart = 536870916 rootino = 128 rbmino = 129 rsumino = 130 rextsize = 1 agblocks = 142272384 agcount = 4 rbmblocks = 0 logblocks = 277875 versionnum = 0xb4a4 sectsize = 512 inodesize = 256 inopblock = 16 fname = "\000\000\000\000\000\000\000\000\000\000\000\000" blocklog = 12 sectlog = 9 inodelog = 8 inopblog = 4 agblklog = 28 rextslog = 0 inprogress = 0 imax_pct = 5 icount = 220619904 ifree = 26202919 fdblocks = 147805479 frextents = 0 uquotino = 0 gquotino = 0 qflags = 0 flags = 0 shared_vn = 0 inoalignmt = 2 unit = 0 width = 0 dirblklog = 0 logsectlog = 0 logsectsize = 0 logsunit = 1 features2 = 0xa bad_features2 = 0xa xfs_db> sb 1 xfs_db> p magicnum = 0x58465342 blocksize = 4096 dblocks = 569089536 rblocks = 0 rextents = 0 uuid = 13ecf47b-52cf-4944-9a71-885bddc5e008 logstart = 536870916 rootino = 128 rbmino = null rsumino = null rextsize = 1 agblocks = 142272384 agcount = 4 rbmblocks = 0 logblocks = 277875 versionnum = 0xb4a4 sectsize = 512 inodesize = 256 inopblock = 16 fname = "\000\000\000\000\000\000\000\000\000\000\000\000" blocklog = 12 sectlog = 9 inodelog = 8 inopblog = 4 agblklog = 28 rextslog = 0 inprogress = 1 imax_pct = 5 icount = 0 ifree = 0 fdblocks = 568811645 frextents = 0 uquotino = 0 gquotino = 0 qflags = 0 flags = 0 shared_vn = 0 inoalignmt = 2 unit = 0 width = 0 dirblklog = 0 logsectlog = 0 logsectsize = 0 logsunit = 1 features2 = 0xa bad_features2 = 0xa xfs_db> sb 2 xfs_db> p magicnum = 0x58465342 blocksize = 4096 dblocks = 569089536 rblocks = 0 rextents = 0 uuid = 13ecf47b-52cf-4944-9a71-885bddc5e008 logstart = 536870916 rootino = null rbmino = null rsumino = null rextsize = 1 agblocks = 142272384 agcount = 4 rbmblocks = 0 logblocks = 277875 versionnum = 0xb4a4 sectsize = 512 inodesize = 256 inopblock = 16 fname = "\000\000\000\000\000\000\000\000\000\000\000\000" blocklog = 12 sectlog = 9 inodelog = 8 inopblog = 4 agblklog = 28 rextslog = 0 inprogress = 1 imax_pct = 5 icount = 0 ifree = 0 fdblocks = 568811645 frextents = 0 uquotino = 0 gquotino = 0 qflags = 0 flags = 0 shared_vn = 0 inoalignmt = 2 unit = 0 width = 0 dirblklog = 0 logsectlog = 0 logsectsize = 0 logsunit = 1 features2 = 0xa bad_features2 = 0xa xfs_db> sb 3 xfs_db> p magicnum = 0x58465342 blocksize = 4096 dblocks = 569089536 rblocks = 0 rextents = 0 uuid = 13ecf47b-52cf-4944-9a71-885bddc5e008 logstart = 536870916 rootino = 128 rbmino = null rsumino = null rextsize = 1 agblocks = 142272384 agcount = 4 rbmblocks = 0 logblocks = 277875 versionnum = 0xb4a4 sectsize = 512 inodesize = 256 inopblock = 16 fname = "\000\000\000\000\000\000\000\000\000\000\000\000" blocklog = 12 sectlog = 9 inodelog = 8 inopblog = 4 agblklog = 28 rextslog = 0 inprogress = 1 imax_pct = 5 icount = 0 ifree = 0 fdblocks = 568811645 frextents = 0 uquotino = 0 gquotino = 0 qflags = 0 flags = 0 shared_vn = 0 inoalignmt = 2 unit = 0 width = 0 dirblklog = 0 logsectlog = 0 logsectsize = 0 logsunit = 1 features2 = 0xa bad_features2 = 0xa 2014-08-25 13:18 GMT+08:00 Dave Chinner : > On Mon, Aug 25, 2014 at 11:34:34AM +0800, Zhang Qiang wrote: > > Dear XFS community & developers, > > > > I am using CentOS 6.3 and xfs as base file system and use RAID5 as > hardware > > storage. > > > > Detail environment as follow: > > OS: CentOS 6.3 > > Kernel: kernel-2.6.32-279.el6.x86_64 > > XFS option info(df output): /dev/sdb1 on /data type xfs > > (rw,noatime,nodiratime,nobarrier) > > > > Detail phenomenon: > > > > # df > > Filesystem Size Used Avail Use% Mounted on > > /dev/sda1 29G 17G 11G 61% / > > /dev/sdb1 893G 803G 91G 90% /data > > /dev/sda4 2.2T 1.6T 564G 75% /data1 > > > > # time touch /data1/1111 > > real 0m23.043s > > user 0m0.001s > > sys 0m0.349s > > > > # perf top > > Events: 6K cycles > > 16.96% [xfs] [k] xfs_inobt_get_rec > > 11.95% [xfs] [k] xfs_btree_increment > > 11.16% [xfs] [k] xfs_btree_get_rec > > 7.39% [xfs] [k] xfs_btree_get_block > > 5.02% [xfs] [k] xfs_dialloc > > 4.87% [xfs] [k] xfs_btree_rec_offset > > 4.33% [xfs] [k] xfs_btree_readahead > > 4.13% [xfs] [k] _xfs_buf_find > > 4.05% [kernel] [k] intel_idle > > 2.89% [xfs] [k] xfs_btree_rec_addr > > 1.04% [kernel] [k] kmem_cache_free > > > > > > It seems that some xfs kernel function spend much time > (xfs_inobt_get_rec, > > xfs_btree_increment, etc.) > > > > I found a bug in bugzilla [1], is that is the same issue like this? > > No. > > > It's very greatly appreciated if you can give constructive suggestion > about > > this issue, as It's really hard to reproduce from another system and it's > > not possible to do upgrade on that online machine. > > You've got very few free inodes, widely distributed in the allocated > inode btree. The CPU time above is the btree search for the next > free inode. > > This is the issue solved by this series of recent commits to add a > new on-disk free inode btree index: > > 53801fd xfs: enable the finobt feature on v5 superblocks > 0c153c1 xfs: report finobt status in fs geometry > a3fa516 xfs: add finobt support to growfs > 3efa4ff xfs: update the finobt on inode free > 2b64ee5 xfs: refactor xfs_difree() inobt bits into xfs_difree_inobt() > helper > 6dd8638 xfs: use and update the finobt on inode allocation > 0aa0a75 xfs: insert newly allocated inode chunks into the finobt > 9d43b18 xfs: update inode allocation/free transaction reservations for > finobt > aafc3c2 xfs: support the XFS_BTNUM_FINOBT free inode btree type > 8e2c84d xfs: reserve v5 superblock read-only compat. feature bit for finobt > 57bd3db xfs: refactor xfs_ialloc_btree.c to support multiple inobt numbers > > Which is of no help to you, however, because it's not available in > any CentOS kernel. > > There's really not much you can do to avoid the problem once you've > punched random freespace holes in the allocated inode btree. IT > generally doesn't affect many people; those that it does affect are > normally using XFS as an object store indexed by a hard link farm > (e.g. various backup programs do this). > > If you dump the superblock via xfs_db, the difference between icount > and ifree will give you idea of how much "needle in a haystack" > searching is going on. You can probably narrow it down to a specific > AG by dumping the AGI headers and checking the same thing. filling > in all the holes (by creating a bunch of zero length files in the > appropriate AGs) might take some time, but it should make the > problem go away until you remove more filesystem and create random > free inode holes again... > > Cheers, > > Dave. > -- > Dave Chinner > david@fromorbit.com > --001a11c353fa3fce430501703d36 Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: quoted-printable
I have checked icount and ifree, but I found there are abo= ut 11.8 percent free, so the free inode should not be too few.

Here's the detail log, any new clue?=C2=A0

<= div>
# mount /dev/sda4 /data1/
# xfs_info /data1/
meta-= data=3D/dev/sda4 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0isize=3D25= 6 =C2=A0 =C2=A0agcount=3D4, agsize=3D142272384 blks
=C2=A0 =C2=A0= =C2=A0 =C2=A0 =C2=A0=3D =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 sectsz=3D512 =C2=A0 attr=3D2, projid32bit=3D0
data =C2=A0 =C2=A0 =3D =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 bsize=3D4096 =C2=A0 blocks=3D569089536, ima= xpct=3D5
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=3D =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 sunit=3D0 =C2= =A0 =C2=A0 =C2=A0swidth=3D0 blks
naming =C2=A0 =3Dversion 2 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0bsize=3D4096 =C2=A0 ascii-ci= =3D0
log =C2=A0 =C2=A0 =C2=A0=3Dinternal =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0 =C2=A0 bsize=3D4096 =C2=A0 blocks=3D277875, version=3D2
= =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=3D =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 sectsz=3D512 =C2=A0 sunit=3D0 blk= s, lazy-count=3D1
realtime =3Dnone =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 extsz=3D4096 =C2=A0 blocks=3D0, rtextent= s=3D0
# umount /dev/sda4
# xfs_db /dev/sda4
xfs_db> s= b 0
xfs_db> p
magicnum =3D 0x58465342
bloc= ksize =3D 4096
dblocks =3D 569089536
rblocks =3D 0
rextents =3D 0
uuid =3D 13ecf47b-52cf-4944-9a71-885bddc5e008
logstart =3D 536870916
rootino =3D 128
rbmino =3D= 129
rsumino =3D 130
rextsize =3D 1
agblocks = =3D 142272384
agcount =3D 4
rbmblocks =3D 0
logblocks =3D 277875=
versionnum =3D 0xb4a4
sectsize =3D 512
inode= size =3D 256
inopblock =3D 16
fname =3D "\000\000\= 000\000\000\000\000\000\000\000\000\000"
blocklog =3D 12
sectlog =3D 9
inodelog =3D 8
=
inopblog =3D 4
agblklog =3D 28
rextslog =3D 0
inprogress =3D 0
imax_pct =3D 5
icount =3D 220619= 904
ifree =3D 26202919
fdblocks =3D 147805479
frextents =3D= 0
uquotino =3D 0
gquotino =3D 0
qflags =3D 0=
flags =3D 0
shared_vn =3D 0
inoalignmt =3D 2=
unit =3D 0
width =3D 0
dirblklog =3D 0
logsectlog =3D 0
=
logsectsize =3D 0
logsunit =3D 1
features2 =3D 0xa=
bad_features2 =3D 0xa
xfs_db> sb 1
xfs_db= > p
magicnum =3D 0x58465342
blocksize =3D 4096
dblocks= =3D 569089536
rblocks =3D 0
rextents =3D 0
u= uid =3D 13ecf47b-52cf-4944-9a71-885bddc5e008
logstart =3D 5368709= 16
rootino =3D 128
rbmino =3D null
rsumino =3D null
<= div>rextsize =3D 1
agblocks =3D 142272384
agcount =3D 4=
rbmblocks =3D 0
logblocks =3D 277875
version= num =3D 0xb4a4
sectsize =3D 512
inodesize =3D 256
inopblock =3D 1= 6
fname =3D "\000\000\000\000\000\000\000\000\000\000\000\00= 0"
blocklog =3D 12
sectlog =3D 9
inodelo= g =3D 8
inopblog =3D 4
agblklog =3D 28
rextslog =3D 0
inprogress =3D 1
imax_pct =3D 5
icount =3D 0
ifree =3D 0
fdblocks =3D 568811645
frextents =3D = 0
uquotino =3D 0
gquotino =3D 0
qflags =3D 0
flags =3D 0
= shared_vn =3D 0
inoalignmt =3D 2
unit =3D 0
w= idth =3D 0
dirblklog =3D 0
logsectlog =3D 0
l= ogsectsize =3D 0
logsunit =3D 1
features2 =3D 0xa
bad_features2 =3D= 0xa
xfs_db> sb 2
xfs_db> p
magicnum = =3D 0x58465342
blocksize =3D 4096
dblocks =3D 569089536=
rblocks =3D 0
rextents =3D 0
uuid =3D 13ecf47b-52cf-494= 4-9a71-885bddc5e008
logstart =3D 536870916
rootino =3D = null
rbmino =3D null
rsumino =3D null
rextsiz= e =3D 1
agblocks =3D 142272384
agcount =3D 4
rbmblocks =3D= 0
logblocks =3D 277875
versionnum =3D 0xb4a4
sectsize =3D 512
inodesize =3D 256
inopblock =3D 16
fname =3D "\000\000\000\000\000\000\000\000\000\000\000\000&qu= ot;
blocklog =3D 12
sectlog =3D 9
inodelog =3D 8
=
inopblog =3D 4
agblklog =3D 28
rextslog =3D 0
inprogress =3D 1
imax_pct =3D 5
icount =3D 0
ifree =3D 0
fdblocks =3D 568811645
frextents =3D 0
uquotino = =3D 0
gquotino =3D 0
qflags =3D 0
flags =3D 0=
shared_vn =3D 0
inoalignmt =3D 2
unit =3D 0<= /div>
width =3D 0
dirblklog =3D 0
logsectlog =3D 0
logsectsize =3D 0=
logsunit =3D 1
features2 =3D 0xa
bad_feature= s2 =3D 0xa
xfs_db> sb 3
xfs_db> p
magic= num =3D 0x58465342
blocksize =3D 4096
dblocks =3D 569089536
rblocks = =3D 0
rextents =3D 0
uuid =3D 13ecf47b-52cf-4944-9a71-8= 85bddc5e008
logstart =3D 536870916
rootino =3D 128
rbmino =3D null
rsumino =3D null
rextsize =3D 1
agblocks =3D 14227= 2384
agcount =3D 4
rbmblocks =3D 0
logblocks = =3D 277875
versionnum =3D 0xb4a4
sectsize =3D 512
=
inodesize =3D 256
inopblock =3D 16
fname =3D "\000\000\000\000\000\000\00= 0\000\000\000\000\000"
blocklog =3D 12
sectlog =3D= 9
inodelog =3D 8
inopblog =3D 4
agblklog =3D= 28
rextslog =3D 0
inprogress =3D 1
imax_pct =3D 5
icount =3D 0
ifree =3D 0
fdblocks =3D 568811645
=
frextents =3D 0
uquotino =3D 0
gquotino =3D 0
qflags =3D 0
flags =3D 0
shared_vn =3D 0
inoalignmt =3D 2
=
unit =3D 0
width =3D 0
dirblklog =3D 0
l= ogsectlog =3D 0
logsectsize =3D 0
logsunit =3D 1
<= div>features2 =3D 0xa
bad_features2 =3D 0xa



2014-08-25 13:18 GMT+08:00 Da= ve Chinner <david@fromorbit.com>:
On M= on, Aug 25, 2014 at 11:34:34AM +0800, Zhang Qiang wrote:
> Dear XFS community & developers,
>
> I am using CentOS 6.3 and xfs as base file system and use RAID5 as har= dware
> storage.
>
> Detail environment as follow:
>=C2=A0 =C2=A0 OS: CentOS 6.3
>=C2=A0 =C2=A0 Kernel: kernel-2.6.32-279.el6.x86_64
>=C2=A0 =C2=A0 XFS option info(df output): /dev/sdb1 on /data type xfs > (rw,noatime,nodiratime,nobarrier)
>
> Detail phenomenon:
>
>=C2=A0 =C2=A0 =C2=A0# df
>=C2=A0 =C2=A0 =C2=A0Filesystem=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= Size=C2=A0 Used Avail Use% Mounted on
>=C2=A0 =C2=A0 =C2=A0/dev/sda1=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 29G=C2=A0 =C2=A017G=C2=A0 =C2=A011G=C2=A0 61% /
>=C2=A0 =C2=A0 =C2=A0/dev/sdb1=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0893G=C2=A0 803G=C2=A0 =C2=A091G=C2=A0 90% /data
>=C2=A0 =C2=A0 =C2=A0/dev/sda4=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A02.2T=C2=A0 1.6T=C2=A0 564G=C2=A0 75% /data1
>
>=C2=A0 =C2=A0 =C2=A0# time touch /data1/1111
>=C2=A0 =C2=A0 =C2=A0real=C2=A0 =C2=A0 0m23.043s
>=C2=A0 =C2=A0 =C2=A0user=C2=A0 =C2=A0 0m0.001s
>=C2=A0 =C2=A0 =C2=A0sys=C2=A0 =C2=A0 =C2=A00m0.349s
>
>=C2=A0 =C2=A0 =C2=A0# perf top
>=C2=A0 =C2=A0 =C2=A0Events: 6K cycles
>=C2=A0 =C2=A0 =C2=A0 16.96%=C2=A0 [xfs]=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0[k] xfs_inobt_get_rec
>=C2=A0 =C2=A0 =C2=A0 11.95%=C2=A0 [xfs]=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0[k] xfs_btree_increment
>=C2=A0 =C2=A0 =C2=A0 11.16%=C2=A0 [xfs]=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0[k] xfs_btree_get_rec
>=C2=A0 =C2=A0 =C2=A0 =C2=A07.39%=C2=A0 [xfs]=C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0[k] xfs_btree_get_block >=C2=A0 =C2=A0 =C2=A0 =C2=A05.02%=C2=A0 [xfs]=C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0[k] xfs_dialloc
>=C2=A0 =C2=A0 =C2=A0 =C2=A04.87%=C2=A0 [xfs]=C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0[k] xfs_btree_rec_offset >=C2=A0 =C2=A0 =C2=A0 =C2=A04.33%=C2=A0 [xfs]=C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0[k] xfs_btree_readahead >=C2=A0 =C2=A0 =C2=A0 =C2=A04.13%=C2=A0 [xfs]=C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0[k] _xfs_buf_find
>=C2=A0 =C2=A0 =C2=A0 =C2=A04.05%=C2=A0 [kernel]=C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 [k] intel_idle
>=C2=A0 =C2=A0 =C2=A0 =C2=A02.89%=C2=A0 [xfs]=C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0[k] xfs_btree_rec_addr
>=C2=A0 =C2=A0 =C2=A0 =C2=A01.04%=C2=A0 [kernel]=C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 [k] kmem_cache_free
>
>
> It seems that some xfs kernel function spend much time (xfs_inobt_get_= rec,
> xfs_btree_increment, etc.)
>
> I found a bug in bugzilla [1], is that is the same issue like this?
No.

> It's very greatly appreciated if you can give constructive suggest= ion about
> this issue, as It's really hard to reproduce from another system a= nd it's
> not possible to do upgrade on that online machine.

You've got very few free inodes, widely distributed in the alloca= ted
inode btree. The CPU time above is the btree search for the next
free inode.

This is the issue solved by this series of recent commits to add a
new on-disk free inode btree index:

53801fd xfs: enable the finobt feature on v5 superblocks
0c153c1 xfs: report finobt status in fs geometry
a3fa516 xfs: add finobt support to growfs
3efa4ff xfs: update the finobt on inode free
2b64ee5 xfs: refactor xfs_difree() inobt bits into xfs_difree_inobt() helpe= r
6dd8638 xfs: use and update the finobt on inode allocation
0aa0a75 xfs: insert newly allocated inode chunks into the finobt
9d43b18 xfs: update inode allocation/free transaction reservations for fino= bt
aafc3c2 xfs: support the XFS_BTNUM_FINOBT free inode btree type
8e2c84d xfs: reserve v5 superblock read-only compat. feature bit for finobt=
57bd3db xfs: refactor xfs_ialloc_btree.c to support multiple inobt numbers<= br>
Which is of no help to you, however, because it's not available in
any CentOS kernel.

There's really not much you can do to avoid the problem once you've=
punched random freespace holes in the allocated inode btree. IT
generally doesn't affect many people; those that it does affect are
normally using XFS as an object store indexed by a hard link farm
(e.g. various backup programs do this).

If you dump the superblock via xfs_db, the difference between icount
and ifree will give you idea of how much "needle in a haystack" searching is going on. You can probably narrow it down to a specific
AG by dumping the AGI headers and checking the same thing. filling
in all the holes (by creating a bunch of zero length files in the
appropriate AGs) might take some time, but it should make the
problem go away until you remove more filesystem and create random
free inode holes again...

Cheers,

Dave.
--
Dave Chinner
david@fromorbit.com

--001a11c353fa3fce430501703d36-- From david@fromorbit.com Mon Aug 25 03:56: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=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 (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 77BA97F4E for ; Mon, 25 Aug 2014 03:56:22 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 17068AC002 for ; Mon, 25 Aug 2014 01:56:21 -0700 (PDT) X-ASG-Debug-ID: 1408956979-04bdf010a14bf3a0001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id Hn6vM6H65bkVG1O0 for ; Mon, 25 Aug 2014 01:56: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: AmUTAAv5+lN5LDJ8PGdsb2JhbABZgw2BKoczp3gBAQEBBqRuAYEbFwUBAQEBODaEAwEBBAE6HCMFCwgDGAklDwUlAwcaExSIJge/TBcYhWSIZSJJB4MvgR0FnEiYfSsvgQeBSAEBAQ Received: from ppp121-44-50-124.lns20.syd6.internode.on.net (HELO dastard) ([121.44.50.124]) by ipmail06.adl2.internode.on.net with ESMTP; 25 Aug 2014 18:26:18 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1XLq4W-0006TW-EX; Mon, 25 Aug 2014 18:56:16 +1000 Date: Mon, 25 Aug 2014 18:56:16 +1000 From: Dave Chinner To: Zhang Qiang Cc: xfs@oss.sgi.com Subject: Re: bad performance on touch/cp file on XFS system Message-ID: <20140825085616.GD20518@dastard> X-ASG-Orig-Subj: Re: bad performance on touch/cp file on XFS system References: <20140825051801.GY26465@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: 1408956979 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.8808 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Mon, Aug 25, 2014 at 04:09:05PM +0800, Zhang Qiang wrote: > Thanks for your quick and clear response. Some comments bellow: > > > 2014-08-25 13:18 GMT+08:00 Dave Chinner : > > > On Mon, Aug 25, 2014 at 11:34:34AM +0800, Zhang Qiang wrote: > > > Dear XFS community & developers, > > > > > > I am using CentOS 6.3 and xfs as base file system and use RAID5 as > > hardware > > > storage. > > > > > > Detail environment as follow: > > > OS: CentOS 6.3 > > > Kernel: kernel-2.6.32-279.el6.x86_64 > > > XFS option info(df output): /dev/sdb1 on /data type xfs > > > (rw,noatime,nodiratime,nobarrier) .... > > > It's very greatly appreciated if you can give constructive suggestion > > about > > > this issue, as It's really hard to reproduce from another system and it's > > > not possible to do upgrade on that online machine. > > > > You've got very few free inodes, widely distributed in the allocated > > inode btree. The CPU time above is the btree search for the next > > free inode. > > > > This is the issue solved by this series of recent commits to add a > > new on-disk free inode btree index: > > > [Qiang] This meas that if I want to fix this issue, I have to apply the > following patches and build my own kernel. Yes. Good luck, even I wouldn't attempt to do that. And then use xfsprogs 3.2.1, and make a new filesystem that enables metadata CRCs and the free inode btree feature. > As the on-disk structure has been changed, so should I also re-create xfs > filesystem again? Yes, you need to download the latest xfsprogs (3.2.1) to be able to make it with the necessary feature bits set. > is there any user space tools to convert old disk > filesystem to new one, and don't need to backup and restore currently data? No, we don't write utilities to mangle on disk formats. dump, mkfs and restore is far more reliable than any "in-place conversion" code we could write. It will probably be faster, too. > > Which is of no help to you, however, because it's not available in > > any CentOS kernel. > > > [Qiang] Do you think if it's possible to just backport these patches to > kernel 6.2.32 (CentOS 6.3) to fix this issue? > > Or it's better to backport to 3.10 kernel, used in CentOS 7.0? You can try, but if you break it you get to keep all the pieces yourself. Eventually someone who maintains the RHEL code will do a backport that will trickle down to CentOS. If you need it any sooner, then you'll need to do it yourself, or upgrade to RHEL and ask your support contact for it to be included in RHEL 7.1.... > > There's really not much you can do to avoid the problem once you've > > punched random freespace holes in the allocated inode btree. IT > > generally doesn't affect many people; those that it does affect are > > normally using XFS as an object store indexed by a hard link farm > > (e.g. various backup programs do this). > > > OK, I see. > > Could you please guide me to reproduce this issue easily? as I have tried > to use a 500G xfs partition, and use about 98 % spaces, but still can't > reproduce this issue. Is there any easy way from your mind? Search the archives for the test cases that were used for the patch set. There's a performance test case documented in the review discussions. Cheers, Dave. -- Dave Chinner david@fromorbit.com From zhangqiang.buaa@gmail.com Mon Aug 25 04:05: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=FREEMAIL_FROM,HTML_MESSAGE, 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 54B257F4E for ; Mon, 25 Aug 2014 04:05:40 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 42DF38F8033 for ; Mon, 25 Aug 2014 02:05:37 -0700 (PDT) X-ASG-Debug-ID: 1408957533-04cbb054867bc870001-NocioJ Received: from mail-la0-f51.google.com (mail-la0-f51.google.com [209.85.215.51]) by cuda.sgi.com with ESMTP id HVpFJ7tcUnIDWV6Y (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Mon, 25 Aug 2014 02:05:34 -0700 (PDT) X-Barracuda-Envelope-From: zhangqiang.buaa@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.215.51 X-Barracuda-IPDD: Level1 [gmail.com/209.85.215.51] Received: by mail-la0-f51.google.com with SMTP id pn19so12235804lab.24 for ; Mon, 25 Aug 2014 02:05:33 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.215.51] X-Barracuda-IPDD: Level1 [gmail.com/209.85.215.51] 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=7cm0RfRZspK94Efg/FFvSseiMvDhI/zyX+9xtmVahXA=; b=es/wsAPjLIeqrWRXId6UifYzlAtp5yKw5Zf6fVr5V8WNT7ZvnvT3Mscz92WepYR4Uy kVenv1f7UA0GLZK9it1wA7MGyPVg/Imcdus6+7DYw6rBvmtU81ZrniQsVMqoouZhOh0e kHVTNcwtW5NBB10WURb7hih5x0fFmOS72TVelYrsySWd0NtNuVPZUWSvWez36LDf5SJ7 iQ9Ditu4Vt5sk72JqeAPZfoQZO95OpQAE+s5ms20EJcQrHiDaE3idJEazMriefkXSujU fYY3C7JqJmzWx7e89yAePTycXJhKuzJrvjefvQf6nUsueItAsoZZs1XtTQRxoh2AuODD iP0Q== MIME-Version: 1.0 X-Received: by 10.112.199.161 with SMTP id jl1mr435091lbc.59.1408957533129; Mon, 25 Aug 2014 02:05:33 -0700 (PDT) Received: by 10.114.161.116 with HTTP; Mon, 25 Aug 2014 02:05:33 -0700 (PDT) In-Reply-To: <20140825085616.GD20518@dastard> References: <20140825051801.GY26465@dastard> <20140825085616.GD20518@dastard> Date: Mon, 25 Aug 2014 17:05:33 +0800 Message-ID: Subject: Re: bad performance on touch/cp file on XFS system From: Zhang Qiang X-ASG-Orig-Subj: Re: bad performance on touch/cp file on XFS system To: Dave Chinner Cc: xfs@oss.sgi.com Content-Type: multipart/alternative; boundary=001a11c34b184411fe0501707d35 X-Barracuda-Connect: mail-la0-f51.google.com[209.85.215.51] X-Barracuda-Start-Time: 1408957534 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.8808 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 --001a11c34b184411fe0501707d35 Content-Type: text/plain; charset=UTF-8 Great, thank you. >From my xfs_db debug, I found I have icount and ifree as follow: icount = 220619904 ifree = 26202919 So the number of free inode take about 10%, so that's not so few. So, are you still sure the patches can fix this issue? Here's the detail xfs_db info: # mount /dev/sda4 /data1/ # xfs_info /data1/ meta-data=/dev/sda4 isize=256 agcount=4, agsize=142272384 blks = sectsz=512 attr=2, projid32bit=0 data = bsize=4096 blocks=569089536, imaxpct=5 = sunit=0 swidth=0 blks naming =version 2 bsize=4096 ascii-ci=0 log =internal bsize=4096 blocks=277875, version=2 = sectsz=512 sunit=0 blks, lazy-count=1 realtime =none extsz=4096 blocks=0, rtextents=0 # umount /dev/sda4 # xfs_db /dev/sda4 xfs_db> sb 0 xfs_db> p magicnum = 0x58465342 blocksize = 4096 dblocks = 569089536 rblocks = 0 rextents = 0 uuid = 13ecf47b-52cf-4944-9a71-885bddc5e008 logstart = 536870916 rootino = 128 rbmino = 129 rsumino = 130 rextsize = 1 agblocks = 142272384 agcount = 4 rbmblocks = 0 logblocks = 277875 versionnum = 0xb4a4 sectsize = 512 inodesize = 256 inopblock = 16 fname = "\000\000\000\000\000\000\000\000\000\000\000\000" blocklog = 12 sectlog = 9 inodelog = 8 inopblog = 4 agblklog = 28 rextslog = 0 inprogress = 0 imax_pct = 5 icount = 220619904 ifree = 26202919 fdblocks = 147805479 frextents = 0 uquotino = 0 gquotino = 0 qflags = 0 flags = 0 shared_vn = 0 inoalignmt = 2 unit = 0 width = 0 dirblklog = 0 logsectlog = 0 logsectsize = 0 logsunit = 1 features2 = 0xa bad_features2 = 0xa xfs_db> sb 1 xfs_db> p magicnum = 0x58465342 blocksize = 4096 dblocks = 569089536 rblocks = 0 rextents = 0 uuid = 13ecf47b-52cf-4944-9a71-885bddc5e008 logstart = 536870916 rootino = 128 rbmino = null rsumino = null rextsize = 1 agblocks = 142272384 agcount = 4 rbmblocks = 0 logblocks = 277875 versionnum = 0xb4a4 sectsize = 512 inodesize = 256 inopblock = 16 fname = "\000\000\000\000\000\000\000\000\000\000\000\000" blocklog = 12 sectlog = 9 inodelog = 8 inopblog = 4 agblklog = 28 rextslog = 0 inprogress = 1 imax_pct = 5 icount = 0 ifree = 0 fdblocks = 568811645 frextents = 0 uquotino = 0 gquotino = 0 qflags = 0 flags = 0 shared_vn = 0 inoalignmt = 2 unit = 0 width = 0 dirblklog = 0 logsectlog = 0 logsectsize = 0 logsunit = 1 features2 = 0xa bad_features2 = 0xa xfs_db> sb 2 xfs_db> p magicnum = 0x58465342 blocksize = 4096 dblocks = 569089536 rblocks = 0 rextents = 0 uuid = 13ecf47b-52cf-4944-9a71-885bddc5e008 logstart = 536870916 rootino = null rbmino = null rsumino = null rextsize = 1 agblocks = 142272384 agcount = 4 rbmblocks = 0 logblocks = 277875 versionnum = 0xb4a4 sectsize = 512 inodesize = 256 inopblock = 16 fname = "\000\000\000\000\000\000\000\000\000\000\000\000" blocklog = 12 sectlog = 9 inodelog = 8 inopblog = 4 agblklog = 28 rextslog = 0 inprogress = 1 imax_pct = 5 icount = 0 ifree = 0 fdblocks = 568811645 frextents = 0 uquotino = 0 gquotino = 0 qflags = 0 flags = 0 shared_vn = 0 inoalignmt = 2 unit = 0 width = 0 dirblklog = 0 logsectlog = 0 logsectsize = 0 logsunit = 1 features2 = 0xa bad_features2 = 0xa xfs_db> sb 3 xfs_db> p magicnum = 0x58465342 blocksize = 4096 dblocks = 569089536 rblocks = 0 rextents = 0 uuid = 13ecf47b-52cf-4944-9a71-885bddc5e008 logstart = 536870916 rootino = 128 rbmino = null rsumino = null rextsize = 1 agblocks = 142272384 agcount = 4 rbmblocks = 0 logblocks = 277875 versionnum = 0xb4a4 sectsize = 512 inodesize = 256 inopblock = 16 fname = "\000\000\000\000\000\000\000\000\000\000\000\000" blocklog = 12 sectlog = 9 inodelog = 8 inopblog = 4 agblklog = 28 rextslog = 0 inprogress = 1 imax_pct = 5 icount = 0 ifree = 0 fdblocks = 568811645 frextents = 0 uquotino = 0 gquotino = 0 qflags = 0 flags = 0 shared_vn = 0 inoalignmt = 2 unit = 0 width = 0 dirblklog = 0 logsectlog = 0 logsectsize = 0 logsunit = 1 features2 = 0xa bad_features2 = 0xa Thanks Qiang 2014-08-25 16:56 GMT+08:00 Dave Chinner : > On Mon, Aug 25, 2014 at 04:09:05PM +0800, Zhang Qiang wrote: > > Thanks for your quick and clear response. Some comments bellow: > > > > > > 2014-08-25 13:18 GMT+08:00 Dave Chinner : > > > > > On Mon, Aug 25, 2014 at 11:34:34AM +0800, Zhang Qiang wrote: > > > > Dear XFS community & developers, > > > > > > > > I am using CentOS 6.3 and xfs as base file system and use RAID5 as > > > hardware > > > > storage. > > > > > > > > Detail environment as follow: > > > > OS: CentOS 6.3 > > > > Kernel: kernel-2.6.32-279.el6.x86_64 > > > > XFS option info(df output): /dev/sdb1 on /data type xfs > > > > (rw,noatime,nodiratime,nobarrier) > .... > > > > > It's very greatly appreciated if you can give constructive suggestion > > > about > > > > this issue, as It's really hard to reproduce from another system and > it's > > > > not possible to do upgrade on that online machine. > > > > > > You've got very few free inodes, widely distributed in the allocated > > > inode btree. The CPU time above is the btree search for the next > > > free inode. > > > > > > This is the issue solved by this series of recent commits to add a > > > new on-disk free inode btree index: > > > > > [Qiang] This meas that if I want to fix this issue, I have to apply the > > following patches and build my own kernel. > > Yes. Good luck, even I wouldn't attempt to do that. > > And then use xfsprogs 3.2.1, and make a new filesystem that enables > metadata CRCs and the free inode btree feature. > > > As the on-disk structure has been changed, so should I also re-create xfs > > filesystem again? > > Yes, you need to download the latest xfsprogs (3.2.1) to be able to > make it with the necessary feature bits set. > > > is there any user space tools to convert old disk > > filesystem to new one, and don't need to backup and restore currently > data? > > No, we don't write utilities to mangle on disk formats. dump, mkfs > and restore is far more reliable than any "in-place conversion" code > we could write. It will probably be faster, too. > > > > Which is of no help to you, however, because it's not available in > > > any CentOS kernel. > > > > > [Qiang] Do you think if it's possible to just backport these patches to > > kernel 6.2.32 (CentOS 6.3) to fix this issue? > > > > Or it's better to backport to 3.10 kernel, used in CentOS 7.0? > > You can try, but if you break it you get to keep all the pieces > yourself. Eventually someone who maintains the RHEL code will do a > backport that will trickle down to CentOS. If you need it any > sooner, then you'll need to do it yourself, or upgrade to RHEL > and ask your support contact for it to be included in RHEL 7.1.... > > > > There's really not much you can do to avoid the problem once you've > > > punched random freespace holes in the allocated inode btree. IT > > > generally doesn't affect many people; those that it does affect are > > > normally using XFS as an object store indexed by a hard link farm > > > (e.g. various backup programs do this). > > > > > OK, I see. > > > > Could you please guide me to reproduce this issue easily? as I have tried > > to use a 500G xfs partition, and use about 98 % spaces, but still can't > > reproduce this issue. Is there any easy way from your mind? > > Search the archives for the test cases that were used for the patch > set. There's a performance test case documented in the review > discussions. > > Cheers, > > Dave. > -- > Dave Chinner > david@fromorbit.com > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs > --001a11c34b184411fe0501707d35 Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: quoted-printable
Great, thank you.

From my xfs_db debug,= I found I have icount and ifree as follow:

i= count =3D 220619904
ifree =3D 26202919

S= o the number of free inode take about 10%, so that's not so few.

So, are you still sure the patches can fix this issue?<= /div>

Here's the detail xfs_db info:

<= /div>
# mount /dev/sda4 /data1/
# xfs_info /data1/
meta-data=3D/dev/sda4 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= isize=3D256 =C2=A0 =C2=A0agcount=3D4, agsize=3D142272384 blks
=C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=3D =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 sectsz=3D512 =C2=A0 attr=3D2, projid= 32bit=3D0
data =C2=A0 =C2=A0 =3D =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 bsize=3D4096 =C2=A0 blocks=3D= 569089536, imaxpct=3D5
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=3D =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 sunit=3D0 =C2=A0 =C2=A0 =C2= =A0swidth=3D0 blks
naming =C2=A0 =3Dversion 2 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0bsize=3D4096 =C2=A0 ascii-ci=3D0
l= og =C2=A0 =C2=A0 =C2=A0=3Dinternal =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 bsize=3D4096 =C2=A0 blocks=3D277875, version=3D2
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=3D =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 sectsz=3D512 =C2=A0 sunit=3D0 blk= s, lazy-count=3D1
realtime =3Dnone =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 extsz=3D4096 =C2=A0 blocks=3D0, rtextent= s=3D0
# umount /dev/sda4
# xfs_db /dev/sda4
x= fs_db> sb 0
xfs_db> p
magicnum =3D 0x58465342
blocksize =3D= 4096
dblocks =3D 569089536
rblocks =3D 0
rex= tents =3D 0
uuid =3D 13ecf47b-52cf-4944-9a71-885bddc5e008
logstart =3D 536870916
rootino =3D 128
rbmino =3D 129
rsumino =3D 130
rextsize =3D 1
agblocks =3D 142272384
agcount = =3D 4
rbmblocks =3D 0
logblocks =3D 277875
ve= rsionnum =3D 0xb4a4
sectsize =3D 512
inodesize =3D 256
inopblock =3D 1= 6
fname =3D "\000\000\000\000\000\000\000\000\000\000\000\00= 0"
blocklog =3D 12
sectlog =3D 9
inodelo= g =3D 8
inopblog =3D 4
agblklog =3D 28
rextslog =3D 0
inprogress =3D 0
imax_pct =3D 5
icount =3D 220619= 904
ifree =3D 26202919
fdblocks =3D 147805479
frextents =3D 0
uquotino =3D 0
gquotino =3D 0
qflags =3D 0
flags =3D 0
shared_vn =3D 0
inoalignmt =3D 2
unit =3D 0
width =3D 0
dirblklog =3D 0
log= sectlog =3D 0
logsectsize =3D 0
logsunit =3D 1
features2 =3D 0xa=
bad_features2 =3D 0xa
xfs_db> sb 1
xfs_db= > p
magicnum =3D 0x58465342
blocksize =3D 4096
=
dblocks =3D 569089536
rblocks =3D 0
rextents =3D 0
uuid =3D 13ecf47b-52c= f-4944-9a71-885bddc5e008
logstart =3D 536870916
rootino= =3D 128
rbmino =3D null
rsumino =3D null
rex= tsize =3D 1
agblocks =3D 142272384
agcount =3D 4
rbmblocks =3D= 0
logblocks =3D 277875
versionnum =3D 0xb4a4
sectsize =3D 512
inodesize =3D 256
inopblock =3D 16
fname =3D "\000\000\000\000\000\000\000\000\000\000\000\000&qu= ot;
blocklog =3D 12
sectlog =3D 9
inodelog =3D 8
=
inopblog =3D 4
agblklog =3D 28
rextslog =3D 0
inprogress =3D 1
imax_pct =3D 5
icount =3D 0
ifree =3D 0
fdblocks =3D 568811645
frextents =3D 0
uquotino = =3D 0
gquotino =3D 0
qflags =3D 0
flags =3D 0=
shared_vn =3D 0
inoalignmt =3D 2
unit =3D 0<= /div>
width =3D 0
dirblklog =3D 0
logsectlog =3D 0
logsectsize =3D 0=
logsunit =3D 1
features2 =3D 0xa
bad_feature= s2 =3D 0xa
xfs_db> sb 2
xfs_db> p
magic= num =3D 0x58465342
blocksize =3D 4096
dblocks =3D 569089536
rblocks = =3D 0
rextents =3D 0
uuid =3D 13ecf47b-52cf-4944-9a71-8= 85bddc5e008
logstart =3D 536870916
rootino =3D null
rbmino =3D null
rsumino =3D null
rextsize =3D 1
agblocks =3D 14227= 2384
agcount =3D 4
rbmblocks =3D 0
logblocks = =3D 277875
versionnum =3D 0xb4a4
sectsize =3D 512
=
inodesize =3D 256
inopblock =3D 16
fname =3D "\000\000\000\000\000\000\00= 0\000\000\000\000\000"
blocklog =3D 12
sectlog =3D= 9
inodelog =3D 8
inopblog =3D 4
agblklog =3D= 28
rextslog =3D 0
inprogress =3D 1
imax_pct =3D 5
icount =3D 0
ifree =3D 0
fdblocks =3D 568811645
=
frextents =3D 0
uquotino =3D 0
gquotino =3D 0
qflags =3D 0
flags =3D 0
shared_vn =3D 0
inoalignmt =3D 2
=
unit =3D 0
width =3D 0
dirblklog =3D 0
l= ogsectlog =3D 0
logsectsize =3D 0
logsunit =3D 1
<= div>features2 =3D 0xa
bad_features2 =3D 0xa
xfs_db> sb 3
xfs_db> p=
magicnum =3D 0x58465342
blocksize =3D 4096
d= blocks =3D 569089536
rblocks =3D 0
rextents =3D 0
=
uuid =3D 13ecf47b-52cf-4944-9a71-885bddc5e008
logstart =3D 536870916
rootino =3D 128
rbmino =3D = null
rsumino =3D null
rextsize =3D 1
agblocks= =3D 142272384
agcount =3D 4
rbmblocks =3D 0
= logblocks =3D 277875
versionnum =3D 0xb4a4
sectsize =3D 512
inodesize = =3D 256
inopblock =3D 16
fname =3D "\000\000\000\0= 00\000\000\000\000\000\000\000\000"
blocklog =3D 12
sectlog =3D 9
inodelog =3D 8
inopblog =3D 4
agblklog =3D 28
rextslog =3D 0
inprogress =3D 1
imax_pct =3D 5
icount =3D 0
ifree =3D 0
fdblocks =3D 568811645=
frextents =3D 0
uquotino =3D 0
gquotino =3D 0
qflags =3D 0
flags =3D 0
shared_vn =3D 0
inoalignmt =3D 2
unit =3D 0
width =3D 0
dirblklog =3D 0
log= sectlog =3D 0
logsectsize =3D 0
logsunit =3D 1
features2 =3D 0xa=
bad_features2 =3D 0xa


<= div>Thanks
Qiang

<= br>
2014-08-25 16:56 GMT+08:00 Dave Chinner <davi= d@fromorbit.com>:
On Mon, Aug 25, 2014 at 04:09:05PM +0800, Zhang Qiang wrote= :
> Thanks for your quick and clear response. Some comments bellow:
>
>
> 2014-08-25 13:18 GMT+08:00 Dave Chinner <david@fromorbit.com>:
>
> > On Mon, Aug 25, 2014 at 11:34:34AM +0800, Zhang Qiang wrote:
> > > Dear XFS community & developers,
> > >
> > > I am using CentOS 6.3 and xfs as base file system and use RA= ID5 as
> > hardware
> > > storage.
> > >
> > > Detail environment as follow:
> > >=C2=A0 =C2=A0 OS: CentOS 6.3
> > >=C2=A0 =C2=A0 Kernel: kernel-2.6.32-279.el6.x86_64
> > >=C2=A0 =C2=A0 XFS option info(df output): /dev/sdb1 on /data = type xfs
> > > (rw,noatime,nodiratime,nobarrier)
....

> > > It's very greatly appreciated if you can give constructi= ve suggestion
> > about
> > > this issue, as It's really hard to reproduce from anothe= r system and it's
> > > not possible to do upgrade on that online machine.
> >
> > You've got very few free inodes, widely distributed in the al= located
> > inode btree. The CPU time above is the btree search for the next<= br> > > free inode.
> >
> > This is the issue solved by this series of recent commits to add = a
> > new on-disk free inode btree index:
> >
> [Qiang] This meas that if I want to fix this issue, I have to apply th= e
> following patches and build my own kernel.

Yes. Good luck, even I wouldn't attempt to do that.

And then use xfsprogs 3.2.1, and make a new filesystem that enables
metadata CRCs and the free inode btree feature.

> As the on-disk structure has been changed, so should I also re-create = xfs
> filesystem again?

Yes, you need to download the latest xfsprogs (3.2.1) to be able to make it with the necessary feature bits set.

> is there any user space tools to convert old disk
> filesystem to new one, and don't need to backup and restore curren= tly data?

No, we don't write utilities to mangle on disk formats. dump, mkf= s
and restore is far more reliable than any "in-place conversion" c= ode
we could write. It will probably be faster, too.

> > Which is of no help to you, however, because it's not availab= le in
> > any CentOS kernel.
> >
> [Qiang] Do you think if it's possible to just backport these patch= es to
> kernel=C2=A0 6.2.32 (CentOS 6.3) to fix this issue?
>
> Or it's better to backport to 3.10 kernel, used in CentOS 7.0?

You can try, but if you break it you get to keep all the pieces
yourself. Eventually someone who maintains the RHEL code will do a
backport that will trickle down to CentOS. If you need it any
sooner, then you'll need to do it yourself, or upgrade to RHEL
and ask your support contact for it to be included in RHEL 7.1....

> > There's really not much you can do to avoid the problem once = you've
> > punched random freespace holes in the allocated inode btree. IT > > generally doesn't affect many people; those that it does affe= ct are
> > normally using XFS as an object store indexed by a hard link farm=
> > (e.g. various backup programs do this).
> >
> OK, I see.
>
> Could you please guide me to reproduce this issue easily? as I have tr= ied
> to use a 500G xfs partition, and use about 98 % spaces, but still can&= #39;t
> reproduce this issue. Is there any easy way from your mind?

Search the archives for the test cases that were used for the patch set. There's a performance test case documented in the review
discussions.

Cheers,

Dave.
--
Dave Chinner
david@fromorbit.com

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

--001a11c34b184411fe0501707d35-- From david@fromorbit.com Mon Aug 25 04:08: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 ACACF7F4E for ; Mon, 25 Aug 2014 04:08:51 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 4B2DCAC002 for ; Mon, 25 Aug 2014 02:08:48 -0700 (PDT) X-ASG-Debug-ID: 1408957725-04bdf010a04bf9b0001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id yYrUW7WGHPTLenZ8 for ; Mon, 25 Aug 2014 02:08:45 -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: AmQTAIP8+lN5LDJ8PGdsb2JhbABagw2BKoczp3gBAQEBBqRuAYEbFwUBAQEBODaEAwEBBAE6HCMFCwgDGAklDwUlAwcaE4g6B79EFxiFZIlQB4MvgR0FnEiYfSsvgk8BAQE Received: from ppp121-44-50-124.lns20.syd6.internode.on.net (HELO dastard) ([121.44.50.124]) by ipmail06.adl2.internode.on.net with ESMTP; 25 Aug 2014 18:38:45 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1XLqGZ-0006Wk-Ub; Mon, 25 Aug 2014 19:08:43 +1000 Date: Mon, 25 Aug 2014 19:08:43 +1000 From: Dave Chinner To: Zhang Qiang Cc: xfs@oss.sgi.com Subject: Re: bad performance on touch/cp file on XFS system Message-ID: <20140825090843.GE20518@dastard> X-ASG-Orig-Subj: Re: bad performance on touch/cp file on XFS system References: <20140825051801.GY26465@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: 1408957725 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.8808 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Mon, Aug 25, 2014 at 04:47:39PM +0800, Zhang Qiang wrote: > I have checked icount and ifree, but I found there are about 11.8 percent > free, so the free inode should not be too few. > > Here's the detail log, any new clue? > > # mount /dev/sda4 /data1/ > # xfs_info /data1/ > meta-data=/dev/sda4 isize=256 agcount=4, agsize=142272384 4 AGs > icount = 220619904 > ifree = 26202919 And 220 million inodes. There's your problem - that's an average of 55 million inodes per AGI btree assuming you are using inode64. If you are using inode32, then the inodes will be in 2 btrees, or maybe even only one. Anyway you look at it, searching btrees with tens of millions of entries is going to consume a *lot* of CPU time. So, really, the state your fs is in is probably unfixable without mkfs. And really, that's probably pushing the boundaries of what xfsdump and xfs-restore can support - it's going to take a long tiem to dump and restore that data.... With that many inodes, I'd be considering moving to 32 or 64 AGs to keep the btree size down to a more manageable size. The free inode btree would also help, but, really, 220M inodes in a 2TB filesystem is really pushing the boundaries of sanity..... Cheers, Dave. -- Dave Chinner david@fromorbit.com From zhangqiang.buaa@gmail.com Mon Aug 25 05:31: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=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 11F6B7F4E for ; Mon, 25 Aug 2014 05:31:17 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 0085930404E for ; Mon, 25 Aug 2014 03:31:13 -0700 (PDT) X-ASG-Debug-ID: 1408962671-04cb6c54fd533050001-NocioJ Received: from mail-lb0-f170.google.com (mail-lb0-f170.google.com [209.85.217.170]) by cuda.sgi.com with ESMTP id zH70WNAbnS14FOc9 (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Mon, 25 Aug 2014 03:31:12 -0700 (PDT) X-Barracuda-Envelope-From: zhangqiang.buaa@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.217.170 X-Barracuda-IPDD: Level1 [gmail.com/209.85.217.170] Received: by mail-lb0-f170.google.com with SMTP id l4so11994952lbv.1 for ; Mon, 25 Aug 2014 03:31:11 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.217.170] X-Barracuda-IPDD: Level1 [gmail.com/209.85.217.170] 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=1Znqku2513v6PmO/svCBtpVBGqt5TEwfZfyCcpwTp18=; b=AqgM7n/b9GKVBn2f2W04cG713KgIdLobgvMkonaupPRnRaQXraqIbkjwJ6SxDDi2N2 HCwxKBbuxkRESqWSZEOqyyjRgRZZXWFW0b1LtNIN38mH/6rpMHqAWrH3W1M8kLSbGyJb uCouMZKNauEb24jIDMt7+Uruv9JBPR753/+kzSeTUcKtJDNFEn3VoqTALdzyiCE64s/c zHsKBUQ5MLMmNF11uzBrwPMKkkFkTH0MEsOQtteVWnL6ooJyYUHgbTSObf4dKYmpjfsw 2Pwkf+KAeOYtZmwvNy7T97UyICmPtiJyEcBnIzvGWyMWsuyh4jybqtzUxYnQzTGPJD0U fiBw== MIME-Version: 1.0 X-Received: by 10.152.2.9 with SMTP id 9mr16741467laq.65.1408962671045; Mon, 25 Aug 2014 03:31:11 -0700 (PDT) Received: by 10.114.161.116 with HTTP; Mon, 25 Aug 2014 03:31:10 -0700 (PDT) In-Reply-To: <20140825090843.GE20518@dastard> References: <20140825051801.GY26465@dastard> <20140825090843.GE20518@dastard> Date: Mon, 25 Aug 2014 18:31:10 +0800 Message-ID: Subject: Re: bad performance on touch/cp file on XFS system From: Zhang Qiang X-ASG-Orig-Subj: Re: bad performance on touch/cp file on XFS system To: Dave Chinner Cc: xfs@oss.sgi.com Content-Type: multipart/alternative; boundary=089e0112c0b08270ac050171af03 X-Barracuda-Connect: mail-lb0-f170.google.com[209.85.217.170] X-Barracuda-Start-Time: 1408962672 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.8809 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 --089e0112c0b08270ac050171af03 Content-Type: text/plain; charset=UTF-8 2014-08-25 17:08 GMT+08:00 Dave Chinner : > On Mon, Aug 25, 2014 at 04:47:39PM +0800, Zhang Qiang wrote: > > I have checked icount and ifree, but I found there are about 11.8 percent > > free, so the free inode should not be too few. > > > > Here's the detail log, any new clue? > > > > # mount /dev/sda4 /data1/ > > # xfs_info /data1/ > > meta-data=/dev/sda4 isize=256 agcount=4, agsize=142272384 > > 4 AGs > Yes. > > > icount = 220619904 > > ifree = 26202919 > > And 220 million inodes. There's your problem - that's an average > of 55 million inodes per AGI btree assuming you are using inode64. > If you are using inode32, then the inodes will be in 2 btrees, or > maybe even only one. > You are right, all inodes stay on one AG. BTW, why i allocate 4 AGs, and all inodes stay in one AG for inode32?, sorry as I am not familiar with xfs currently. > > Anyway you look at it, searching btrees with tens of millions of > entries is going to consume a *lot* of CPU time. So, really, the > state your fs is in is probably unfixable without mkfs. And really, > that's probably pushing the boundaries of what xfsdump and > xfs-restore can support - it's going to take a long tiem to dump and > restore that data.... > Thanks reasonable. > With that many inodes, I'd be considering moving to 32 or 64 AGs to > keep the btree size down to a more manageable size. The free inode btree would also help, but, really, 220M inodes in a 2TB filesystem > is really pushing the boundaries of sanity..... > So the better inodes size in one AG is about 5M, is there any documents about these options I can learn more? I will spend more time to learn how to use xfs, and the internal of xfs, and try to contribute code. Thanks for your help. > Cheers, > > Dave. > -- > Dave Chinner > david@fromorbit.com > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs > --089e0112c0b08270ac050171af03 Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: quoted-printable



2014-08-25 17:08 GMT+08:00 Dave Chinner <david@fromorbit.com= >:
On Mon, Aug 25, 2014 at 04:4= 7:39PM +0800, Zhang Qiang wrote:
> I have checked icount and ifree, but I found there are about 11.8 perc= ent
> free, so the free inode should not be too few.
>
> Here's the detail log, any new clue?
>
> # mount /dev/sda4 /data1/
> # xfs_info /data1/
> meta-data=3D/dev/sda4=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = isize=3D256=C2=A0 =C2=A0 agcount=3D4, agsize=3D142272384

4 AGs
Yes.=C2=A0

> icount =3D 220619904
> ifree =3D 26202919

And 220 million inodes. There's your problem - that's an aver= age
of 55 million inodes per AGI btree assuming you are using inode64.
If you are using inode32, then the inodes will be in 2 btrees, or
maybe even only one.
=C2=A0
You are right, a= ll inodes stay on one AG.

BTW, why i allocate 4 AG= s, and all inodes stay in one AG for inode32?, sorry as I am not familiar w= ith xfs currently.
=C2=A0

Anyway you look at it, searching btrees with tens of millions of
entries is going to consume a *lot* of CPU time. So, really, the
state your fs is in is probably unfixable without mkfs. And really,
that's probably pushing the boundaries of what xfsdump and
xfs-restore can support - it's going to take a long tiem to dump and restore that data....
=C2=A0
=C2=A0Thanks re= asonable.



With that many inodes, I'd be considering moving to 32 or 64 AGs to
keep the btree size down to a more manageable size. The free inode=C2=A0
btree would also help, but, really, 220M inodes in a 2TB filesystem
is really pushing the boundaries of sanity.....
=C2=A0=
So the better inodes size in one AG is about 5M, is there any do= cuments about these options I can learn more?

I wi= ll spend more time to learn how to use xfs, and the internal of xfs, and tr= y to contribute code.

Thanks for your help.



Cheers,

Dave.
--
Dave Chinner
david@fromorbit.com

_____________________________= __________________
xfs mailing list
xfs@oss.sgi.com
http:= //oss.sgi.com/mailman/listinfo/xfs

--089e0112c0b08270ac050171af03-- From bfoster@redhat.com Mon Aug 25 09:20: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 575777F4E for ; Mon, 25 Aug 2014 09:20:43 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 45B6A304059 for ; Mon, 25 Aug 2014 07:20:39 -0700 (PDT) X-ASG-Debug-ID: 1408976435-04cb6c54fe53c380001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id M0eQ4glXtkaS3Zsh (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 25 Aug 2014 07:20:35 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-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 s7PEKRYV008681 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Mon, 25 Aug 2014 10:20:27 -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 s7PEKQv2009765; Mon, 25 Aug 2014 10:20:26 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id B67C512577F; Mon, 25 Aug 2014 10:20:25 -0400 (EDT) Date: Mon, 25 Aug 2014 10:20:25 -0400 From: Brian Foster To: Alex Lyakas Cc: xfs@oss.sgi.com, Dave Chinner Subject: Re: [PATCH] xfs: fix double free of trans in log recovery on I/O error Message-ID: <20140825142025.GA10135@bfoster.bfoster> X-ASG-Orig-Subj: Re: [PATCH] xfs: fix double free of trans in log recovery on I/O error References: <1408648692-15957-1-git-send-email-bfoster@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.23 (2014-03-12) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.24 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1408976435 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Sun, Aug 24, 2014 at 12:20:20PM +0300, Alex Lyakas wrote: > Hi Brian, > > On Thu, Aug 21, 2014 at 10:18 PM, Brian Foster wrote: > > XFS log recovery builds up an xlog_recover object as it passes through > > the log operations on the physical log. These structures are managed via > > a hash table and are allocated when a new transaction is encountered and > > freed once a commit operation for the transaction is encountered. > > > > This state machine for active transactions is implemented by a > > combination of xlog_do_recovery_pass(), which walks through the log > > buffers and xlog_recover_process_data() which processes log operations > > within each buffer. The latter function decides whether to allocate a > > new xlog_recover, add to it or commit and ultimately free it. If an > > error occurs at any point during the lifecycle of a particular > > xlog_recover, xlog_recover_process_data() frees the object and returns > > an error. > > > > xlog_recover_commit_trans() handles the final processing of the > > transaction. It submits whatever I/O is required for the transaction and > > frees xlog_recover object along with the transaction items it tracks. If > > an error occurs at the final stages of the commit operation, such as I/O > > failure, both xlog_recover_commit_trans() and > > xlog_recover_process_data() attempt to free the trans object. > > > > Modify xlog_recover_commit_trans() to only free the trans object on > > successful completion of the trans, including any I/O errors that might > > occur when recovering the log. > > > > Signed-off-by: Brian Foster > > --- > > > > Hi all, > > > > I found that the recent buffer I/O rework fixes didn't address the crash > > reproduced by the dm-flakey/log recovery test case I posted recently. I > > tracked the crash down to this, which allows the test to pass. This > > addresses the crash I saw when running the reproducer manually with the > > metadump that Alex posted as well. > > > > FWIW, I also went back and tested the xfs_buf_iowait() experiment in > > both scenarios (Alex's metadump and xfstests test) and they all > > reproduce the same crash for me. I think that either I'm still not > > reproducing the original problem, something else might have contaminated > > the original xfs_buf_iowait() test to give a false positive, or > > something else entirely is going on. > > > > Alex, > > > > If you have a chance, I think it might be interesting to see whether you > > reproduce any problems with this patch. It looks like this is a > > regression introduced by: > > > > 2a84108f xfs: free the list of recovery items on error > > > > ... but I have no idea if that's in whatever kernel you're running. > I am running kernel 3.8.13 with some changes (published at > https://github.com/zadarastorage/zadara-xfs-pushback), but this > problem also happens on pristine 3.8.13 from > git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git, > branch linux-stable-3.8.y. > > I do not have commit 2a84108f in this kernel. It was introduced in 3.14. > I applied your patch to 3.8.13, but it doesn't fix the issue. Same > problem happens when testing scenario that I described in > http://oss.sgi.com/pipermail/xfs/2014-August/037637.html. > Ok, thanks. Yeah, I don't see the double free regression in the 3.8.13 stable branch. I went back to that kernel to try and confirm some things. I do reproduce the problem with your metadump as well as the test case I put together. I tested Dave's buf hold across sync I/O patch and that does indeed prevent the problem. For whatever reason, neither the test case nor your metadump reproduce the same problem on latest kernels. Instead, they reproduce this double free regression. I suspect this is what you ran into when you reproduced on a more recent kernel. If you'd like, feel free to try and verify that by running your reproducer again on a recent kernel with this patch and see if you can still reproduce a crash as with the 3.8.13 kernel. Brian > Thanks, > Alex. > > > > > Brian > > > > fs/xfs/xfs_log_recover.c | 11 ++++++++--- > > 1 file changed, 8 insertions(+), 3 deletions(-) > > > > diff --git a/fs/xfs/xfs_log_recover.c b/fs/xfs/xfs_log_recover.c > > index 176c4b3..daca9a6 100644 > > --- a/fs/xfs/xfs_log_recover.c > > +++ b/fs/xfs/xfs_log_recover.c > > @@ -3528,10 +3528,15 @@ out: > > if (!list_empty(&done_list)) > > list_splice_init(&done_list, &trans->r_itemq); > > > > - xlog_recover_free_trans(trans); > > - > > error2 = xfs_buf_delwri_submit(&buffer_list); > > - return error ? error : error2; > > + > > + if (!error) > > + error = error2; > > + /* caller frees trans on error */ > > + if (!error) > > + xlog_recover_free_trans(trans); > > + > > + return error; > > } > > > > STATIC int > > -- > > 1.8.3.1 > > From bfoster@redhat.com Mon Aug 25 12:37: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 (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 7BEC87F4E for ; Mon, 25 Aug 2014 12:37:41 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 0C1EBAC001 for ; Mon, 25 Aug 2014 10:37:37 -0700 (PDT) X-ASG-Debug-ID: 1408988252-04cbb054867d5bd0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id iuYADwJBSNbHACSa (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 25 Aug 2014 10:37:34 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-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 s7PHbWnR006151 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK) for ; Mon, 25 Aug 2014 13:37:32 -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 s7PHbWjH013986 for ; Mon, 25 Aug 2014 13:37:32 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id F13BD12577F; Mon, 25 Aug 2014 13:37:30 -0400 (EDT) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH] xfs: trim eofblocks before collapse range Date: Mon, 25 Aug 2014 13:37:30 -0400 X-ASG-Orig-Subj: [PATCH] xfs: trim eofblocks before collapse range Message-Id: <1408988250-17772-1-git-send-email-bfoster@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.26 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1408988253 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 xfs_collapse_file_space() currently writes back the entire file undergoing collapse range to settle things down for the extent shift algorithm. While this prevents changes to the extent list during the collapse operation, the writeback itself is not enough to prevent unnecessary collapse failures. The current shift algorithm uses the extent index to iterate the in-core extent list. If a post-eof delalloc extent persists after the writeback (e.g., a prior zero range op where the end of the range aligns with eof can separate the post-eof blocks such that they are not written back and converted), xfs_bmap_shift_extents() becomes confused over the encoded br_startblock value and fails the collapse. As with the full writeback, this is a temporary fix until the algorithm is improved to cope with a volatile extent list and avoid attempts to shift post-eof extents. Signed-off-by: Brian Foster --- Hi all, This addresses the other fsx failure I've observed related to collapse range. It should also be addressed by reworking the algorithm as discussed in Dave's full file writeback patch. This patch applies on top of that and I think this is more suitable for a near-term -rc drop. Brian fs/xfs/xfs_bmap_util.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/fs/xfs/xfs_bmap_util.c b/fs/xfs/xfs_bmap_util.c index 76b6a29..1707980 100644 --- a/fs/xfs/xfs_bmap_util.c +++ b/fs/xfs/xfs_bmap_util.c @@ -1471,8 +1471,10 @@ xfs_collapse_file_space( shift_fsb = XFS_B_TO_FSB(mp, len); /* - * writeback the entire file to prevent concurrent writeback of ranges - * outside the collapsing region from changing the extent list. + * Writeback the entire file and force remove any post-eof blocks. The + * writeback prevents changes to the extent list via concurrent + * writeback and the eofblocks trim prevents the extent shift algorithm + * from running into a post-eof delalloc extent. * * XXX: This is a temporary fix until the extent shift loop below is * converted to use offsets and lookups within the ILOCK rather than @@ -1482,6 +1484,11 @@ xfs_collapse_file_space( error = filemap_write_and_wait(VFS_I(ip)->i_mapping); if (error) return error; + if (xfs_can_free_eofblocks(ip, true)) { + error = xfs_free_eofblocks(mp, ip, false); + if (error) + return error; + } error = xfs_free_file_space(ip, offset, len); if (error) -- 1.8.3.1 From bfoster@redhat.com Mon Aug 25 12:40: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 BE2E67F4E for ; Mon, 25 Aug 2014 12:40:26 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id AC1A68F8052 for ; Mon, 25 Aug 2014 10:40:23 -0700 (PDT) X-ASG-Debug-ID: 1408988422-04cbb054877d5f60001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 9E52tWnSM8LYdA7o (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 25 Aug 2014 10:40: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-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 s7PHeLLf011354 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK) for ; Mon, 25 Aug 2014 13:40:21 -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 s7PHeLtr003595 for ; Mon, 25 Aug 2014 13:40:21 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 65DAD12577F; Mon, 25 Aug 2014 13:40:20 -0400 (EDT) Date: Mon, 25 Aug 2014 13:40:20 -0400 From: Brian Foster To: xfs@oss.sgi.com Subject: Re: [PATCH] xfs: trim eofblocks before collapse range Message-ID: <20140825174020.GA17813@bfoster.bfoster> X-ASG-Orig-Subj: Re: [PATCH] xfs: trim eofblocks before collapse range References: <1408988250-17772-1-git-send-email-bfoster@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1408988250-17772-1-git-send-email-bfoster@redhat.com> User-Agent: Mutt/1.5.23 (2014-03-12) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.24 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1408988422 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Mon, Aug 25, 2014 at 01:37:30PM -0400, Brian Foster wrote: > xfs_collapse_file_space() currently writes back the entire file > undergoing collapse range to settle things down for the extent shift > algorithm. While this prevents changes to the extent list during the > collapse operation, the writeback itself is not enough to prevent > unnecessary collapse failures. > > The current shift algorithm uses the extent index to iterate the in-core > extent list. If a post-eof delalloc extent persists after the writeback > (e.g., a prior zero range op where the end of the range aligns with eof > can separate the post-eof blocks such that they are not written back and > converted), xfs_bmap_shift_extents() becomes confused over the encoded > br_startblock value and fails the collapse. > > As with the full writeback, this is a temporary fix until the algorithm > is improved to cope with a volatile extent list and avoid attempts to > shift post-eof extents. > > Signed-off-by: Brian Foster > --- > > Hi all, > > This addresses the other fsx failure I've observed related to collapse > range. It should also be addressed by reworking the algorithm as > discussed in Dave's full file writeback patch. This patch applies on top > of that and I think this is more suitable for a near-term -rc drop. > > Brian > Also, appended is a quick reproducer for the fsx sequence that leads to the failure. Brian ---8<--- #!/bin/sh FILE=$1 rm -f $FILE touch $FILE # create preallocation xfs_io -c "pwrite 0 32k" $FILE xfs_io -c "pwrite 32k 32k" $FILE xfs_io -c "pwrite 64k 32k" $FILE # 160k, dangling post-eof extent xfs_io -c "pwrite 96k 64k" $FILE xfs_io -c "zero 156k 4k" $FILE # create more extents xfs_io -c fsync $FILE for i in $(seq 0 8192 151152) do xfs_io -c "fpunch $i 4k" $FILE done # boom! xfs_io -c "fcollapse 0 4k" $FILE --- > fs/xfs/xfs_bmap_util.c | 11 +++++++++-- > 1 file changed, 9 insertions(+), 2 deletions(-) > > diff --git a/fs/xfs/xfs_bmap_util.c b/fs/xfs/xfs_bmap_util.c > index 76b6a29..1707980 100644 > --- a/fs/xfs/xfs_bmap_util.c > +++ b/fs/xfs/xfs_bmap_util.c > @@ -1471,8 +1471,10 @@ xfs_collapse_file_space( > shift_fsb = XFS_B_TO_FSB(mp, len); > > /* > - * writeback the entire file to prevent concurrent writeback of ranges > - * outside the collapsing region from changing the extent list. > + * Writeback the entire file and force remove any post-eof blocks. The > + * writeback prevents changes to the extent list via concurrent > + * writeback and the eofblocks trim prevents the extent shift algorithm > + * from running into a post-eof delalloc extent. > * > * XXX: This is a temporary fix until the extent shift loop below is > * converted to use offsets and lookups within the ILOCK rather than > @@ -1482,6 +1484,11 @@ xfs_collapse_file_space( > error = filemap_write_and_wait(VFS_I(ip)->i_mapping); > if (error) > return error; > + if (xfs_can_free_eofblocks(ip, true)) { > + error = xfs_free_eofblocks(mp, ip, false); > + if (error) > + return error; > + } > > error = xfs_free_file_space(ip, offset, len); > if (error) > -- > 1.8.3.1 > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From inv@mexicocalendario2014.info Mon Aug 25 13:03: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=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 9D4677F50 for ; Mon, 25 Aug 2014 13:03:11 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 7CD818F804B for ; Mon, 25 Aug 2014 11:03:08 -0700 (PDT) X-ASG-Debug-ID: 1408989786-04cbb054857d74f0001-NocioJ Received: from mail2.mexicocalendario2014.info (mail2.mexicocalendario2014.info [81.7.3.198]) by cuda.sgi.com with ESMTP id KtQWnBTRmP6DYoUO for ; Mon, 25 Aug 2014 11:03:06 -0700 (PDT) X-Barracuda-Envelope-From: inv@mexicocalendario2014.info X-Barracuda-Apparent-Source-IP: 81.7.3.198 Received: from 81-7-3-140 (81.7.3.140) by mail2.mexicocalendario2014.info id hvdt5i0our0k for ; Mon, 25 Aug 2014 13:03:04 -0500 (envelope-from ) mod: fd25f39a-7480-48bc-843f-89413644a548 Message-ID: <76a619a72a86f530df4887570017c709@mexicocalendario2014.info> From: "Lic. Estefania Mena" To: Subject: =?utf-8?Q?Administre_su_Inventario_/_Cierre_de_Inscripciones?= Date: Mon, 25 Aug 2014 13:03:04 -0500 X-ASG-Orig-Subj: =?utf-8?Q?Administre_su_Inventario_/_Cierre_de_Inscripciones?= MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="----=SPLITOR00A_001_294381983D" X-Barracuda-Connect: mail2.mexicocalendario2014.info[81.7.3.198] X-Barracuda-Start-Time: 1408989786 X-Barracuda-URL: http://192.48.176.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.8820 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. ------=SPLITOR00A_001_294381983D Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable =20 Las 7 Reglas de oro del control de Inventarios Guadalajara, JAL 10 de septiembre 2014 M=C3=A9xico, D.F. 04 de septiembre 2014 Monterrey, NL 12 de septiembre 2014 =C2=A1No pierda la oportunidad de ser un factor de crecimiento y = desarrollo desde su posici=C3=B3n en la organizaci=C3=B3n! - Alta confiabilidad operativa y financiera de sus registros=2E - Disposici=C3=B3n y prevenci=C3=B3n de obsoletos=2E - Elaboraci=C3=B3n de su propio plan de trabajo=2E Para obtener el contenido completo de este programa responda este correo = con la palabra info + Nombre + Tel=C3=A9fono + Sede (GDL, D.F. =C3=B3 MTY) = y se lo enviaremos a la brevedad=2E Mayores informes e inscripci=C3=B3n, - Solic=C3=ADtala ya L=C3=ADnea directa Guadalajara: 01 331 809 8213 L=C3=ADnea directa D.F. y Monterrey: 01 800 212 0660 Para YA no recibir estos boletines a: xfs@oss.sgi.com simplemente = env=C3=ADe un correo con asunto (noinfo) ------=SPLITOR00A_001_294381983D Content-Type: text/html; charset="utf-8" Content-Transfer-Encoding: quoted-printable

 

Las 7=20 Reglas de oro del control de=20 Inventarios
Guadalajara, JAL 10 de septiembre=20 2014
M=C3=A9xico, D.F. 04 de septiembre=20 2014
Monterrey, NL 12 de septiembre=20 2014

=C2=A1No pierda la oportunidad de ser un factor = de=20 crecimiento y desarrollo desde su posici=C3=B3n en la=20 = organizaci=C3=B3n!

- Alta confiabilidad operativa y financiera de = sus=20 registros.
- Disposici=C3=B3n y prevenci=C3=B3n de = obsoletos.
-=20 Elaboraci=C3=B3n de su propio plan de=20 = trabajo.

Para obtener el contenido completo = de este=20 programa responda este correo con la=20 palabra info + Nombre = +=20 Tel=C3=A9fono + Sede (GDL, D.F. =C3=B3 = MTY) y se lo=20 enviaremos a la brevedad.

Mayores = informes e=20 inscripci=C3=B3n, - Solic=C3=ADtala = ya
L=C3=ADnea directa=20 Guadalajara: 01 331 809 8213
L=C3=ADnea = directa D.F.=20 y  Monterrey: 01 800 212=20 0660

Para YA no=20 recibir estos boletines a: xfs@oss.sgi.com simplemente = env=C3=ADe un=20 correo con asunto=20 = (noinfo)

 

------=SPLITOR00A_001_294381983D-- From www-data@x1.wwwmailserver3.com Mon Aug 25 15:46: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=2.8 required=5.0 tests=HTML_IMAGE_ONLY_28, 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 (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 6584D7F4E for ; Mon, 25 Aug 2014 15:46:30 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id AAF27AC002 for ; Mon, 25 Aug 2014 13:46:29 -0700 (PDT) X-ASG-Debug-ID: 1408999582-04cbb054887e0f00001-NocioJ Received: from x1.wwwmailserver3.com ([78.153.148.245]) by cuda.sgi.com with ESMTP id WnyT61TQpbCuII90 (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO) for ; Mon, 25 Aug 2014 13:46:23 -0700 (PDT) X-Barracuda-Envelope-From: www-data@x1.wwwmailserver3.com X-Barracuda-Apparent-Source-IP: 78.153.148.245 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=x1.wwwmailserver3.com; s=dkim; h=Sender:Content-Type:MIME-Version:Date:From:Message-ID:Subject:To; bh=VUu17eDTFdbKabBJZ12LwNSyjqXZjcKO6fRwdW2PDEk=; b=G+gWJkSFmhMQKLSW3mKHqzY8YKzz1S0FIaOAEKPq5ZmNOby5hERpkc6sCGkrCat6PaObGehHvBfhVkhf6h+KsSclk8OZu0rue2uWsuCUc/I+JiU6KGFoGjh3FZW90F/Tk9PO/hJBzi/Li79btNllgz00mlmuolz9HMWasN+xP+w=; Received: from www-data by x1.wwwmailserver3.com with local (Exim 4.80) (envelope-from ) id 1XM18Y-0003fl-0t; Tue, 26 Aug 2014 00:45:10 +0400 To: , , , , , , , , , , , , , , Subject: =?windows-1251?B?1e7y6PLlIPPn7eDy/CDq4Oog/yDn4PDg4e7y?= =?windows-1251?B?4OvgIDQwMCDy+/H/9yDw8+Hr5ekg7eAg4ejt?= =?windows-1251?B?4PDt+/Ug7u/26O7t4PU/?= X-PHP-Originating-Script: 500:mailout.php X-ASG-Orig-Subj: =?windows-1251?B?1e7y6PLlIPPn7eDy/CDq4Oog/yDn4PDg4e7y?= =?windows-1251?B?4OvgIDQwMCDy+/H/9yDw8+Hr5ekg7eAg4ejt?= =?windows-1251?B?4PDt+/Ug7u/26O7t4PU/?= Message-ID: From: =?windows-1251?B?wOro7CDB4OTg5eI=?= Date: Mon, 25 Aug 2014 21:45:13 +0100 Organization: BINAROPTION7 MIME-Version: 1.0 Content-Type: multipart/related; type="multipart/alternative"; boundary="----=_NextPart_000_15F0_01CFC0AD.D9DF29B0" X-Priority: 3 X-MSMail-Priority: Normal X-Mailer: Microsoft Windows Live Mail 14.0.8117.416 X-MimeOLE: Produced By Microsoft MimeOLE V14.0.8117.416 Sender: www-data X-Barracuda-Connect: UNKNOWN[78.153.148.245] X-Barracuda-Start-Time: 1408999583 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: 1.73 X-Barracuda-Spam-Status: No, SCORE=1.73 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_SA090e, BSF_SC0_TG035a, BSF_SC5_MJ1963, DKIM_SIGNED, DKIM_VERIFIED, EXTRA_MPART_TYPE, HTML_IMAGE_ONLY_28, HTML_MESSAGE, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.8823 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 EXTRA_MPART_TYPE Header has extraneous Content-type:...type= entry -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 0.73 HTML_IMAGE_ONLY_28 BODY: HTML: images with 2400-2800 bytes of words 0.00 HTML_MESSAGE BODY: HTML included in message 0.40 BSF_SC0_SA090e Custom Rule SA090e 0.00 BSF_SC0_TG035a Message contains invalid style definition 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_15F0_01CFC0AD.D9DF29B0 Content-Type: multipart/alternative; boundary="----=_NextPart_001_15F1_01CFC0AD.D9DF29B0" ------=_NextPart_001_15F1_01CFC0AD.D9DF29B0 Content-Type: text/plain; charset="windows-1251" Content-Transfer-Encoding: quoted-printable =CC=E5=ED=FF =E7=EE=E2=F3=F2 =C5=EA=E0=F2=E5=F0=E8=ED=E0, =EC=ED=E5 32 =E3= =EE=E4=E0. =20 =C2 =ED=E0=F1=F2=EE=FF=F9=E5=E5 =E2=F0=E5=EC=FF =F3 =EC=E5=ED=FF =ED=E5=F2= =F2=E0=EA=EE=E9 =F0=E0=E1=EE=F2=FB, =ED=E0 =EA=EE=F2=EE=F0=F3=FE =ED=F3=E6= =ED=EE =E1=FB=EB=EE =E1=FB =F5=EE=E4=E8=F2=FC =EA=E0=E6=E4=FB=E9 =E4=E5=ED= =FC, =E5=F5=E0=F2=FC =ED=E0 =EC=E5=F2=F0=EE, =E6=E4=E0=F2=FC =E0=E2=F2=EE= =E1=F3=F1=E0 =ED=E0 =EE=F1=F2=E0=ED=EE=E2=EA=E5 =E8 =EF=F0. =D5=EE=F2=FF = =E1=FB=EB=E8 =E2=F0=E5=EC=E5=ED=E0, =FF =EA=EE=E3=E4=E0-=F2=EE =ED=E0=F7=E8= =ED=E0=EB=E0 =F1=E2=EE=FE =EA=E0=F0=FC=E5=F0=F3 =E2 =E1=E0=ED=EA=EE=E2=F1= =EA=EE=E5 =F1=F4=E5=F0=E5, =EC=ED=E5 =E1=FB=EB=EE =F2=EE=E3=E4=E0 19 =EB=E5= =F2. =C2 31 =E3=EE=E4 =EC=ED=E5 =EF=F0=E8=F8=EB=EE=F1=FC =F0=E0=F1=EF=F0=EE= =F9=E0=F2=FC=F1=FF =F1 =E1=E0=ED=EA=EE=E2=F1=EA=EE=E9 =E4=E5=FF=F2=E5=EB=FC= =ED=EE=F1=F2=FC=FE, =F5=EE=F2=FF =FF =F3=F1=EF=E5=EB=E0 =E2 =ED=E5=E9 =EE= =F7=E5=ED=FC =E4=E0=E6=E5 =EF=F0=E5=F3=F1=EF=E5=F2=FC (=EE=F2 =EF=F0=EE=F1= =F2=EE=E3=EE =EE=EF=E5=F0=E0=F6=E8=EE=ED=E8=F1=F2=E0 =FF =E4=EE=F0=EE=F1=EB= =E0 =E4=EE =F0=F3=EA=EE=E2=EE=E4=E8=F2=E5=EB=FF =F4=E8=EB=E8=E0=EB=E0 =EE= =E4=ED=EE=E3=EE =E8=E7 =EA=F0=F3=EF=ED=FB=F5 =E1=E0=ED=EA=EE=E2). =DF =F3= =F8=EB=E0 =E2 =E4=E5=EA=F0=E5=F2=ED=FB=E9 =EE=F2=EF=F3=F1=EA. =C8 =E2=EE=F2, =E3=EE=E4 =ED=E0=E7=E0=E4 =FF =F1=E5=F0=FC=E5=E7=ED=EE =EE= =E7=E0=E4=E0=F7=E8=EB=E0=F1=FC =EF=EE=E8=F1=EA=E0=EC=E8 =E7=E0=F0=E0=E1=EE= =F2=EA=E0 =E2 =E8=ED=F2=E5=F0=ED=E5=F2=E5, =F2.=EA. =E2=EE=E7=EC=EE=E6=ED= =EE=F1=F2=E8 =E2=FB=E9=F2=E8 =ED=E0 =EF=F0=E5=E6=ED=FE=FE =F0=E0=E1=EE=F2= =F3 =F3=E6=E5 =ED=E5 =EF=F0=E5=E4=F1=F2=E0=E2=EB=FF=EB=EE=F1=FC =E2=EE=E7= =EC=EE=E6=ED=FB=EC =EF=EE =F2=EE=E9 =EF=F0=E8=F7=E8=ED=E5, =F7=F2=EE =F0=E5= =E1=E5=ED=EE=EA =F7=E0=F1=F2=EE =E1=EE=EB=E5=E5=F2, =E0 =EA=E0=EA=EE=E9 =F0= =E0=E1=EE=F2=EE=E4=E0=F2=E5=EB=FC =E1=F3=E4=E5=F2 =FD=F2=EE =F2=E5=F0=EF=E5= =F2=FC?! =CA=E0=EA-=F2=EE =E2 =EE=E4=E8=ED =E8=E7 =E4=ED=E5=E9 =FF =E1=EB=F3=E6=E4= =E0=EB=E0 =E2 =E8=ED=F2=E5=F0=ED=E5=F2=E5 =ED=E0 =F2=E5=EC=F3 =EF=EE=E8=F1= =EA=E0 =E7=E0=F0=E0=E1=EE=F2=EA=E0 =E8 =F1=EB=F3=F7=E0=E9=ED=EE =ED=E0=F2= =EA=ED=F3=EB=E0=F1=FC =ED=E0 =E2=E8=E4=E5=EE-=F0=EE=EB=E8=EA =EE =F2=EE=EC= , =EA=E0=EA =EC=EE=E6=ED=EE =E7=E0=F0=E0=E1=E0=F2=FB=E2=E0=F2=FC =ED=E0 =E1= =E8=ED=E0=F0=ED=FB=F5 =EE=EF=F6=E8=EE=ED=E0=F5. =CA=EE=ED=E5=F7=ED=EE, =F2= =EE=E3=E4=E0 =F1=EB=EE=E2=EE=F1=EE=F7=E5=F2=E0=ED=E8=E5 "=E1=E8=ED=E0=F0=ED= =FB=E5 =EE=EF=F6=E8=EE=ED=FB" =EC=ED=E5 =E1=FB=EB=EE =E1=EE=EB=FC=F8=E5, = =F7=E5=EC =ED=E5=EF=EE=ED=FF=F2=ED=EE. =CF=F0=EE=E4=EE=EB=E6=E5=ED=E8=E5 =FD=F2=EE=E9 =E8=F1=F2=EE=F0=E8=E8 =E2=FB= =F1=EC=EE=E6=E5=F2=E5 =EF=F0=EE=F7=E8=F2=E0=F2=FC =ED=E0 =EC=EE=E5=EC =F1= =E0=E9=F2=E5. =C4=E0, =FF =F1 =F3=E2=E5=F0=E5=ED=ED=EE=F1=F2=FC=FE =ED=E0 100% =EC=EE=E3= =F3 =F1=EA=E0=E7=E0=F2=FC, =F7=F2=EE =E7=E0=F0=E0=E1=E0=F2=FB=E2=E0=F2=FC= =ED=E0 =E1=E8=ED=E0=F0=ED=FB=F5 =EE=EF=F6=E8=EE=ED=E0=F5 =ED=E5 =F2=EE=EB= =FC=EA=EE =EC=EE=E6=ED=EE, =ED=EE =E8 =ED=F3=E6=ED=EE! =CF=F0=E8=F7=E5=EC= =FD=F2=EE =EC=EE=E6=E5=F2 =E4=E5=EB=E0=F2=FC =EA=E0=E6=E4=FB=E9! =D2=E5=EF=E5=F0=FC =FF =EC=EE=E3=F3 =F1=E5=E1=E5 =EF=EE=E7=E2=EE=EB=E8=F2= =FC =ED=E5 =F0=E0=E1=EE=F2=E0=F2=FC =E2 =E1=E0=ED=EA=E5 =E8 =ED=E8 =EE=F2= =EA=EE=E3=EE =ED=E5 =E7=E0=E2=E8=F1=E5=F2=FC! =DF =F1=E0=EC=E0 =F0=E5=F8= =E0=FE =EA=EE=E3=E4=E0 =EC=ED=E5 =E7=E0=F0=E0=E1=E0=F2=FB=E2=E0=F2=FC =E8= =E2=EE =F1=EA=EE=EB=FC=EA=EE, =F5=EE=F2=FC =ED=EE=F7=FC=FE! =C8 =EC=ED=E5= =ED=E8=EA=F2=EE =ED=E5 =F1=EC=EE=E6=E5=F2 =F1=EA=E0=E7=E0=F2=FC: "=CF=EE= =F7=E5=EC=F3 =E2=FB =EE=EF=EE=E7=E4=E0=EB=E8 =ED=E0 =F0=E0=E1=EE=F2=F3?",= "=CE=EF=FF=F2=FC =E2=E0=F8 =F0=E5=E1=E5=ED=EE=EA =E7=E0=E1=EE=EB=E5=EB?"= =E8 =F2.=EF. =D2=C5=CF=C5=D0=DC =D1=C0=CC=CE=C5 =C2=C0=C6=CD=CE=C5! =CF=EE=EB=F3=F7=E8=F2=E5 =EE=F2 =EC=E5=ED=FF =CF=EE=F8=E0=E3=EE=E2=F3=FE = =E8=ED=F1=F2=F0=F3=EA=F6=E8=FE =EE=F2 "=C0" =E4=EE "=DF", =E2 =EA=EE=F2=EE= =F0=EE=E9 =E2=FB =F1=EC=EE=E6=E5=F2=E5 =F3=E7=ED=E0=F2=FC =E2=F1=B8: =EE=F2= =F0=E5=E3=E8=F1=F2=F0=E0=F6=E8=E8 =E4=EE =E2=FB=E2=EE=E4=E0 =E4=E5=ED=E5= =E3, =F1=F2=F0=E0=F2=E5=E3=E8=FE =E7=E0=F0=E0=E1=EE=F2=EA=E0 =E8 =F2.=EF. =DD=D2=D3 =C8=CD=D1=D2=D0=D3=CA=D6=C8=DE =C2=DB =CD=C0=C9=C4=C5=D2=C5 =CF= =CE =D1=D1=DB=CB=CA=C5 >>> =C1=E8=ED=E0=F0=ED=FB=E9 =D0=EE=E1=EE=F2 2014 http://blogir.ru ------=_NextPart_001_15F1_01CFC0AD.D9DF29B0 Content-Type: text/html; charset="windows-1251" Content-Transfer-Encoding: quoted-printable
=CC=E5=ED=FF =E7=EE=E2=F3=F2 =C5=EA= =E0=F2=E5=F0=E8=ED=E0, =EC=ED=E5 32=20 =E3=EE=E4=E0.

 
=C2 =ED=E0=F1=F2=EE=FF=F9=E5=E5 =E2=F0=E5=EC=FF =F3 =EC= =E5=ED=FF =ED=E5=F2 =F2=E0=EA=EE=E9 =F0=E0=E1=EE=F2=FB, =ED=E0 =EA=EE=F2=EE= =F0=F3=FE =ED=F3=E6=ED=EE=20 =E1=FB=EB=EE =E1=FB =F5=EE=E4=E8=F2=FC =EA=E0=E6=E4=FB=E9 =E4=E5=ED=FC, =E5= =F5=E0=F2=FC =ED=E0 =EC=E5=F2=F0=EE, =E6=E4=E0=F2=FC =E0=E2=F2=EE=E1=F3=F1= =E0 =ED=E0 =EE=F1=F2=E0=ED=EE=E2=EA=E5 =E8 =EF=F0.=20 =D5=EE=F2=FF =E1=FB=EB=E8 =E2=F0=E5=EC=E5=ED=E0, =FF =EA=EE=E3=E4=E0-=F2=EE= =ED=E0=F7=E8=ED=E0=EB=E0 =F1=E2=EE=FE =EA=E0=F0=FC=E5=F0=F3 =E2 =E1=E0=ED= =EA=EE=E2=F1=EA=EE=E5 =F1=F4=E5=F0=E5, =EC=ED=E5 =E1=FB=EB=EE=20 =F2=EE=E3=E4=E0 19 =EB=E5=F2. =C2 31 =E3=EE=E4 =EC=ED=E5 =EF=F0=E8=F8=EB=EE= =F1=FC =F0=E0=F1=EF=F0=EE=F9=E0=F2=FC=F1=FF =F1 =E1=E0=ED=EA=EE=E2=F1=EA=EE= =E9 =E4=E5=FF=F2=E5=EB=FC=ED=EE=F1=F2=FC=FE,=20 =F5=EE=F2=FF =FF =F3=F1=EF=E5=EB=E0 =E2 =ED=E5=E9 =EE=F7=E5=ED=FC =E4=E0=E6= =E5 =EF=F0=E5=F3=F1=EF=E5=F2=FC (=EE=F2 =EF=F0=EE=F1=F2=EE=E3=EE =EE=EF=E5= =F0=E0=F6=E8=EE=ED=E8=F1=F2=E0 =FF =E4=EE=F0=EE=F1=EB=E0 =E4=EE=20 =F0=F3=EA=EE=E2=EE=E4=E8=F2=E5=EB=FF =F4=E8=EB=E8=E0=EB=E0 =EE=E4=ED=EE=E3= =EE =E8=E7 =EA=F0=F3=EF=ED=FB=F5 =E1=E0=ED=EA=EE=E2). =DF =F3=F8=EB=E0 =E2= =E4=E5=EA=F0=E5=F2=ED=FB=E9 =EE=F2=EF=F3=F1=EA.
=C8=20 =E2=EE=F2, =E3=EE=E4 =ED=E0=E7=E0=E4 =FF =F1=E5=F0=FC=E5=E7=ED=EE =EE=E7=E0= =E4=E0=F7=E8=EB=E0=F1=FC =EF=EE=E8=F1=EA=E0=EC=E8 =E7=E0=F0=E0=E1=EE=F2=EA= =E0 =E2 =E8=ED=F2=E5=F0=ED=E5=F2=E5, =F2.=EA.=20 =E2=EE=E7=EC=EE=E6=ED=EE=F1=F2=E8 =E2=FB=E9=F2=E8 =ED=E0 =EF=F0=E5=E6=ED=FE= =FE =F0=E0=E1=EE=F2=F3 =F3=E6=E5 =ED=E5 =EF=F0=E5=E4=F1=F2=E0=E2=EB=FF=EB= =EE=F1=FC =E2=EE=E7=EC=EE=E6=ED=FB=EC =EF=EE =F2=EE=E9=20 =EF=F0=E8=F7=E8=ED=E5, =F7=F2=EE =F0=E5=E1=E5=ED=EE=EA =F7=E0=F1=F2=EE =E1= =EE=EB=E5=E5=F2, =E0 =EA=E0=EA=EE=E9 =F0=E0=E1=EE=F2=EE=E4=E0=F2=E5=EB=FC= =E1=F3=E4=E5=F2 =FD=F2=EE=20 =F2=E5=F0=EF=E5=F2=FC?!

=CA=E0=EA-=F2=EE =E2 =EE=E4=E8=ED =E8=E7 =E4=ED=E5= =E9 =FF =E1=EB=F3=E6=E4=E0=EB=E0 =E2 =E8=ED=F2=E5=F0=ED=E5=F2=E5 =ED=E0 =F2= =E5=EC=F3=20 =EF=EE=E8=F1=EA=E0 =E7=E0=F0=E0=E1=EE=F2=EA=E0 =E8 =F1=EB=F3=F7=E0=E9=ED=EE= =ED=E0=F2=EA=ED=F3=EB=E0=F1=FC =ED=E0 =E2=E8=E4=E5=EE-=F0=EE=EB=E8=EA =EE= =F2=EE=EC, =EA=E0=EA =EC=EE=E6=ED=EE=20 =E7=E0=F0=E0=E1=E0=F2=FB=E2=E0=F2=FC =ED=E0 =E1=E8=ED=E0=F0=ED=FB=F5 =EE=EF= =F6=E8=EE=ED=E0=F5. =CA=EE=ED=E5=F7=ED=EE, =F2=EE=E3=E4=E0 =F1=EB=EE=E2=EE= =F1=EE=F7=E5=F2=E0=ED=E8=E5 "=E1=E8=ED=E0=F0=ED=FB=E5=20 =EE=EF=F6=E8=EE=ED=FB" =EC=ED=E5 =E1=FB=EB=EE =E1=EE=EB=FC=F8=E5, =F7=E5=EC= =ED=E5=EF=EE=ED=FF=F2=ED=EE.
=CF=F0=EE=E4=EE=EB=E6=E5=ED=E8=E5 =FD=F2= =EE=E9 =E8=F1=F2=EE=F0=E8=E8 =E2=FB =F1=EC=EE=E6=E5=F2=E5=20 =EF=F0=EE=F7=E8=F2=E0=F2=FC
=ED=E0 =EC=EE=E5=EC=20 =F1=E0=E9=F2=E5.
=C4=E0, =FF =F1=20 =F3=E2=E5=F0=E5=ED=ED=EE=F1=F2=FC=FE =ED=E0 100% =EC=EE=E3=F3 =F1=EA=E0=E7= =E0=F2=FC, =F7=F2=EE =E7=E0=F0=E0=E1=E0=F2=FB=E2=E0=F2=FC =ED=E0 =E1=E8=ED= =E0=F0=ED=FB=F5 =EE=EF=F6=E8=EE=ED=E0=F5 =ED=E5=20 =F2=EE=EB=FC=EA=EE =EC=EE=E6=ED=EE, =ED=EE =E8 =ED=F3=E6=ED=EE! =CF=F0=E8= =F7=E5=EC =FD=F2=EE =EC=EE=E6=E5=F2 =E4=E5=EB=E0=F2=FC=20 =EA=E0=E6=E4=FB=E9!
=D2=E5=EF=E5=F0=FC =FF =EC=EE=E3=F3= =F1=E5=E1=E5 =EF=EE=E7=E2=EE=EB=E8=F2=FC =ED=E5 =F0=E0=E1=EE=F2=E0=F2=FC= =E2 =E1=E0=ED=EA=E5 =E8 =ED=E8=20 =EE=F2 =EA=EE=E3=EE =ED=E5 =E7=E0=E2=E8=F1=E5=F2=FC! =DF =F1=E0=EC=E0 =F0= =E5=F8=E0=FE =EA=EE=E3=E4=E0 =EC=ED=E5 =E7=E0=F0=E0=E1=E0=F2=FB=E2=E0=F2=FC= =E8 =E2=EE =F1=EA=EE=EB=FC=EA=EE, =F5=EE=F2=FC=20 =ED=EE=F7=FC=FE! =C8 =EC=ED=E5 =ED=E8=EA=F2=EE =ED=E5 =F1=EC=EE=E6=E5=F2 = =F1=EA=E0=E7=E0=F2=FC: "=CF=EE=F7=E5=EC=F3 =E2=FB =EE=EF=EE=E7=E4=E0=EB=E8= =ED=E0 =F0=E0=E1=EE=F2=F3?", "=CE=EF=FF=F2=FC=20 =E2=E0=F8 =F0=E5=E1=E5=ED=EE=EA =E7=E0=E1=EE=EB=E5=EB?" =E8 =F2.=EF.
<= STRONG>
=D2=C5=CF=C5=D0=DC =D1=C0= =CC=CE=C5=20 =C2=C0=C6=CD=CE=C5!
=CF=EE=EB=F3=F7=E8=F2=E5 =EE=F2 =EC= =E5=ED=FF =CF=EE=F8=E0=E3=EE=E2=F3=FE =E8=ED=F1=F2=F0=F3=EA=F6=E8=FE =EE=F2= "=C0" =E4=EE "=DF",=20 =E2 =EA=EE=F2=EE=F0=EE=E9 =E2=FB =F1=EC=EE=E6=E5=F2=E5 =F3=E7=ED=E0=F2=FC= =E2=F1=B8: =EE=F2 =F0=E5=E3=E8=F1=F2=F0=E0=F6=E8=E8 =E4=EE =E2=FB=E2=EE=E4= =E0 =E4=E5=ED=E5=E3, =F1=F2=F0=E0=F2=E5=E3=E8=FE=20 =E7=E0=F0=E0=E1=EE=F2=EA=E0 =E8 =F2.=EF.
=DD=D2=D3= =C8=CD=D1=D2=D0=D3=CA=D6=C8=DE =C2=DB =CD=C0=C9=C4=C5=D2=C5 =CF=CE =D1=D1=DB=CB=CA=C5 >>>
 
3D""=20
 
=C1=E8=ED=E0=F0=ED=FB=E9 =D0=EE= =E1=EE=F2 2014 http://blogir.ru
------=_NextPart_001_15F1_01CFC0AD.D9DF29B0-- ------=_NextPart_000_15F0_01CFC0AD.D9DF29B0 Content-Type: image/jpeg; name="screenshot-image1.jpg" Content-Transfer-Encoding: base64 Content-ID: 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 ly5cuXH7h/8AxX//2Q== ------=_NextPart_000_15F0_01CFC0AD.D9DF29B0-- From david@fromorbit.com Mon Aug 25 17: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 (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 1F6FC7F4E for ; Mon, 25 Aug 2014 17:27:08 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 0D44B8F8050 for ; Mon, 25 Aug 2014 15:27:07 -0700 (PDT) X-ASG-Debug-ID: 1409005621-04cbb054867e81b0001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id PAzwso3CTMSf5Q6z for ; Mon, 25 Aug 2014 15:27:02 -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: Ag8gABK3+1N5LDJ8PGdsb2JhbABAGoMNU1eNVqFZAQEBAQadIYdIAwIBgR0XBQEBAQE4NoQDAQEEATocIwULCAMYCSUPBSUDBxoTiDoHDja/NhiFZIkHSQeDL4EdBZVPhnmYfSsvgQeBSAEBAQ Received: from ppp121-44-50-124.lns20.syd6.internode.on.net (HELO dastard) ([121.44.50.124]) by ipmail04.adl6.internode.on.net with ESMTP; 26 Aug 2014 07:57:00 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1XM2j4-0008OY-0a; Tue, 26 Aug 2014 08:26:58 +1000 Date: Tue, 26 Aug 2014 08:26:57 +1000 From: Dave Chinner To: Zhang Qiang Cc: xfs@oss.sgi.com Subject: Re: bad performance on touch/cp file on XFS system Message-ID: <20140825222657.GF20518@dastard> X-ASG-Orig-Subj: Re: bad performance on touch/cp file on XFS system References: <20140825051801.GY26465@dastard> <20140825090843.GE20518@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: 1409005622 X-Barracuda-URL: http://192.48.176.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.8827 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 BSF_SC0_SA085 Custom Rule SA085 On Mon, Aug 25, 2014 at 06:31:10PM +0800, Zhang Qiang wrote: > 2014-08-25 17:08 GMT+08:00 Dave Chinner : > > > On Mon, Aug 25, 2014 at 04:47:39PM +0800, Zhang Qiang wrote: > > > I have checked icount and ifree, but I found there are about 11.8 percent > > > free, so the free inode should not be too few. > > > > > > Here's the detail log, any new clue? > > > > > > # mount /dev/sda4 /data1/ > > > # xfs_info /data1/ > > > meta-data=/dev/sda4 isize=256 agcount=4, agsize=142272384 > > > > 4 AGs > > > Yes. > > > > > > icount = 220619904 > > > ifree = 26202919 > > > > And 220 million inodes. There's your problem - that's an average > > of 55 million inodes per AGI btree assuming you are using inode64. > > If you are using inode32, then the inodes will be in 2 btrees, or > > maybe even only one. > > > > You are right, all inodes stay on one AG. > > BTW, why i allocate 4 AGs, and all inodes stay in one AG for inode32?, Because the top addresses in the 2nd AG go over 32 bits, hence only AG 0 can be used for inodes. Changing to inode64 will give you some relief, but any time allocation occurs in AG0 is will be slow. i.e. you'll be trading always slow for "unpredictably slow". > > With that many inodes, I'd be considering moving to 32 or 64 AGs to > > keep the btree size down to a more manageable size. The free inode > > btree would also help, but, really, 220M inodes in a 2TB filesystem > > is really pushing the boundaries of sanity..... > > > > So the better inodes size in one AG is about 5M, Not necessarily. But for your storage it's almost certainly going to minimise the problem you are seeing. > is there any documents > about these options I can learn more? http://xfs.org/index.php/XFS_Papers_and_Documentation Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Mon Aug 25 17:34: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 (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id C9E997F4E for ; Mon, 25 Aug 2014 17:34:40 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id B5AAC8F804B for ; Mon, 25 Aug 2014 15:34:40 -0700 (PDT) X-ASG-Debug-ID: 1409006078-04cb6c550055db00001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id hwJVf01hvTumwDXr for ; Mon, 25 Aug 2014 15:34: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: AmQTAGq5+1N5LDJ8PGdsb2JhbABagw2BKoczp3wBAQEBBqRuAYEdFwUBAQEBODaEBAEFOhwjEAgDDgoJJQ8FJQMHGhOIQb9nFxiFZIlQB4RMBZxImH0rL4EGJIElAQEB Received: from ppp121-44-50-124.lns20.syd6.internode.on.net (HELO dastard) ([121.44.50.124]) by ipmail04.adl6.internode.on.net with ESMTP; 26 Aug 2014 08:04:31 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1XM2qN-0008Po-3X; Tue, 26 Aug 2014 08:34:31 +1000 Date: Tue, 26 Aug 2014 08:34:31 +1000 From: Dave Chinner To: Brian Foster Cc: xfs@oss.sgi.com Subject: Re: [PATCH] xfs: trim eofblocks before collapse range Message-ID: <20140825223431.GG20518@dastard> X-ASG-Orig-Subj: Re: [PATCH] xfs: trim eofblocks before collapse range References: <1408988250-17772-1-git-send-email-bfoster@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1408988250-17772-1-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: 1409006078 X-Barracuda-URL: http://192.48.176.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.8826 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Mon, Aug 25, 2014 at 01:37:30PM -0400, Brian Foster wrote: > xfs_collapse_file_space() currently writes back the entire file > undergoing collapse range to settle things down for the extent shift > algorithm. While this prevents changes to the extent list during the > collapse operation, the writeback itself is not enough to prevent > unnecessary collapse failures. > > The current shift algorithm uses the extent index to iterate the in-core > extent list. If a post-eof delalloc extent persists after the writeback > (e.g., a prior zero range op where the end of the range aligns with eof > can separate the post-eof blocks such that they are not written back and > converted), xfs_bmap_shift_extents() becomes confused over the encoded > br_startblock value and fails the collapse. > > As with the full writeback, this is a temporary fix until the algorithm > is improved to cope with a volatile extent list and avoid attempts to > shift post-eof extents. > > Signed-off-by: Brian Foster > --- > > Hi all, > > This addresses the other fsx failure I've observed related to collapse > range. It should also be addressed by reworking the algorithm as > discussed in Dave's full file writeback patch. This patch applies on top > of that and I think this is more suitable for a near-term -rc drop. Added to my set of patches for testing. Cheers, Dave. -- Dave Chinner david@fromorbit.com From greg.freemyer@gmail.com Mon Aug 25 17:47: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=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 61A407F4E for ; Mon, 25 Aug 2014 17:47:17 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 31880304066 for ; Mon, 25 Aug 2014 15:47:17 -0700 (PDT) X-ASG-Debug-ID: 1409006831-04bdf0109a4ecc70001-NocioJ Received: from mail-wi0-f172.google.com (mail-wi0-f172.google.com [209.85.212.172]) by cuda.sgi.com with ESMTP id RqFBJXMiwD6VUy49 (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Mon, 25 Aug 2014 15:47:12 -0700 (PDT) X-Barracuda-Envelope-From: greg.freemyer@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.212.172 X-Barracuda-IPDD: Level1 [gmail.com/209.85.212.172] Received: by mail-wi0-f172.google.com with SMTP id n3so3285262wiv.11 for ; Mon, 25 Aug 2014 15:47:11 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.212.172] X-Barracuda-IPDD: Level1 [gmail.com/209.85.212.172] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:in-reply-to:references:from:date:message-id:subject:to :cc:content-type; bh=M/2sj9S9qg/WfH28NJfx+iVCQWe3NaKlhp2oHDh4+w0=; b=R9/HsT2YAjElaINGw3zFrpuP5o2rwqZ4Z+ee5wPmHWyWoCwtO1NoMHUmfF60vt+MTP 3z8O66FZpG9PiH+GZoa4K/FkOJpNrpqXtKq/Hy4cIbNogynYzRHkfP9FkqHn9xwI13Qk RJhgGXGxaSMFzuft72NbmHa26HhDbYdO/+uPzIlXgMvIzUeQwQbqwus0lKs7s13KdFU8 KtPUfPkehwNBLbeAMn74Uv6PakEQDkPGzieoH9wbFpPl+NCp31dm0EezrXMF1PdZH68D Qegl+VHLwHE6yk27ZvBumQQQRrMxjmJLL/n3DpMUluQTg96Cbdpgd1VVS8OJeuBh6vIb 7ueA== X-Received: by 10.180.88.167 with SMTP id bh7mr18557135wib.12.1409006831233; Mon, 25 Aug 2014 15:47:11 -0700 (PDT) MIME-Version: 1.0 Received: by 10.180.10.73 with HTTP; Mon, 25 Aug 2014 15:46:31 -0700 (PDT) In-Reply-To: <20140825222657.GF20518@dastard> References: <20140825051801.GY26465@dastard> <20140825090843.GE20518@dastard> <20140825222657.GF20518@dastard> From: Greg Freemyer Date: Mon, 25 Aug 2014 18:46:31 -0400 Message-ID: Subject: Re: bad performance on touch/cp file on XFS system To: Dave Chinner X-ASG-Orig-Subj: Re: bad performance on touch/cp file on XFS system Cc: Zhang Qiang , xfs-oss Content-Type: text/plain; charset=UTF-8 X-Barracuda-Connect: mail-wi0-f172.google.com[209.85.212.172] X-Barracuda-Start-Time: 1409006832 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.8827 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 Mon, Aug 25, 2014 at 6:26 PM, Dave Chinner wrote: > On Mon, Aug 25, 2014 at 06:31:10PM +0800, Zhang Qiang wrote: >> 2014-08-25 17:08 GMT+08:00 Dave Chinner : >> >> > On Mon, Aug 25, 2014 at 04:47:39PM +0800, Zhang Qiang wrote: >> > > I have checked icount and ifree, but I found there are about 11.8 percent >> > > free, so the free inode should not be too few. >> > > >> > > Here's the detail log, any new clue? >> > > >> > > # mount /dev/sda4 /data1/ >> > > # xfs_info /data1/ >> > > meta-data=/dev/sda4 isize=256 agcount=4, agsize=142272384 >> > >> > 4 AGs >> > >> Yes. >> >> > >> > > icount = 220619904 >> > > ifree = 26202919 >> > >> > And 220 million inodes. There's your problem - that's an average >> > of 55 million inodes per AGI btree assuming you are using inode64. >> > If you are using inode32, then the inodes will be in 2 btrees, or >> > maybe even only one. >> > >> >> You are right, all inodes stay on one AG. >> >> BTW, why i allocate 4 AGs, and all inodes stay in one AG for inode32?, > > Because the top addresses in the 2nd AG go over 32 bits, hence only > AG 0 can be used for inodes. Changing to inode64 will give you some > relief, but any time allocation occurs in AG0 is will be slow. i.e. > you'll be trading always slow for "unpredictably slow". > >> > With that many inodes, I'd be considering moving to 32 or 64 AGs to >> > keep the btree size down to a more manageable size. The free inode >> >> btree would also help, but, really, 220M inodes in a 2TB filesystem >> > is really pushing the boundaries of sanity..... >> > >> >> So the better inodes size in one AG is about 5M, > > Not necessarily. But for your storage it's almost certainly going to > minimise the problem you are seeing. > >> is there any documents >> about these options I can learn more? > > http://xfs.org/index.php/XFS_Papers_and_Documentation Given the apparently huge number of small files would he likely see a big performance increase if he replaced that 2TB or rust with SSD. Greg From webmaster@dev101.magizz.com Mon Aug 25 19:16: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=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 B09867F4E for ; Mon, 25 Aug 2014 19:16:47 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 8FC54304053 for ; Mon, 25 Aug 2014 17:16:44 -0700 (PDT) X-ASG-Debug-ID: 1409012200-04bdf010974f0640001-NocioJ Received: from vps.magizz.com (vps.magizz.com [162.251.83.157]) by cuda.sgi.com with ESMTP id 944sn97bNj3y9B4Z (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 25 Aug 2014 17:16:41 -0700 (PDT) X-Barracuda-Envelope-From: webmaster@dev101.magizz.com X-Barracuda-Apparent-Source-IP: 162.251.83.157 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=dev101.magizz.com; s=default; h=Content-Type:Content-Transfer-Encoding:MIME-Version:List-Unsubscribe:Message-ID:Reply-To:From:Date:Subject:To; bh=FvGqhmwKkD9ctnKfevRMDEc+ge/0eMcQoO8DbitSmE4=; b=wNcQUrQX4/zzmYSwo+whv9RzxGh8tFci8a9H4M2m03jZRW3IVQWVqbxRBVguRk87+e6v9bWPFNOb4llxCni8+Apm4Oqy1eIfx/mOD5/b571xMGSxIxEIr0YdG+373ylWNzezRp5GabvzOtgrdbQWGWar2/W8ZaJZscm9vDiPnVo=; Received: from dev101magizz by vps.magizz.com with local (Exim 4.82) (envelope-from ) id 1XM4RE-0005vF-4b for xfs@oss.sgi.com; Tue, 26 Aug 2014 04:16:40 +0400 To: xfs@oss.sgi.com Subject: Goodbye from our newsletter X-PHP-Script: dev101.magizz.com/mailz/index.php for 66.249.79.17 X-ASG-Orig-Subj: Goodbye from our newsletter Received: from crawl-66-249-79-17.googlebot.com [66.249.79.17] by dev101.magizz.com with HTTP; Tue, 26 Aug 2014 00:16:38 +0000 Date: Tue, 26 Aug 2014 00:16:40 +0000 From: Webmaster Reply-To: Webmaster Message-ID: X-Priority: 3 X-Mailer: PHPMailer 5.2.5 (https://github.com/Synchro/PHPMailer/) X-phpList-version: 3.0.6 X-MessageID: systemmessage X-ListMember: xfs@oss.sgi.com Precedence: bulk Bounces-To: webmaster@dev101.magizz.com List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Content-Type: text/plain; charset=UTF-8 X-AntiAbuse: This header was added to track abuse, please include it with any abuse report X-AntiAbuse: Primary Hostname - vps.magizz.com X-AntiAbuse: Original Domain - oss.sgi.com X-AntiAbuse: Originator/Caller UID/GID - [502 513] / [47 12] X-AntiAbuse: Sender Address Domain - dev101.magizz.com X-Get-Message-Sender-Via: vps.magizz.com: authenticated_id: dev101magizz/from_h X-Barracuda-Connect: vps.magizz.com[162.251.83.157] X-Barracuda-Start-Time: 1409012200 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 X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.8831 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature Goodbye from our Newsletter, sorry to see you go. You have been unsubscribed from our newsletters. This is the last email you will receive from us. Our newsletter system, phpList, will refuse to send you any further messages, without manual intervention by our administrator. If there is an error in this information, you can re-subscribe: please go to http://dev101.magizz.com/mailz/?p=subscribe and follow the steps. Thank you From webmaster@dev104.magizz.com Mon Aug 25 19:17: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=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 0ED627F54 for ; Mon, 25 Aug 2014 19:17:36 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id F13448F804B for ; Mon, 25 Aug 2014 17:17:32 -0700 (PDT) X-ASG-Debug-ID: 1409012250-04cbb054857ec950001-NocioJ Received: from vps.magizz.com (vps.magizz.com [162.251.83.157]) by cuda.sgi.com with ESMTP id 4Ha7oGHHN4jPJHdh (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 25 Aug 2014 17:17:30 -0700 (PDT) X-Barracuda-Envelope-From: webmaster@dev104.magizz.com X-Barracuda-Apparent-Source-IP: 162.251.83.157 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=dev104.magizz.com; s=default; h=Content-Type:Content-Transfer-Encoding:MIME-Version:List-Unsubscribe:Message-ID:Reply-To:From:Date:Subject:To; bh=mDpZSYmhCTMkgu2m85N9Sqkg4Hfx9wCn4pzdkw08y/E=; b=TVIDxMHeiVrB3f9JgWj9BBZXh6bVdlw3RMCe+EQ/l2Zcixe8fUac7Vl3X5Qj8DhQs/T5HxlVshonPjXQjpuLiqdyty6KJzZSApvBlQoT77wIKYYw7c3MxYXhBkj35RBuwthgMWg+B13EaP9k7T8af2qumFllIMKJmEt/1N8CzQM=; Received: from dev104magizz by vps.magizz.com with local (Exim 4.82) (envelope-from ) id 1XM4S2-0005wI-5s for xfs@oss.sgi.com; Tue, 26 Aug 2014 04:17:30 +0400 To: xfs@oss.sgi.com Subject: Goodbye from our newsletter X-PHP-Script: dev104.magizz.com/mailz/index.php for 66.249.79.27 X-ASG-Orig-Subj: Goodbye from our newsletter Received: from crawl-66-249-79-27.googlebot.com [66.249.79.27] by dev104.magizz.com with HTTP; Tue, 26 Aug 2014 00:17:29 +0000 Date: Tue, 26 Aug 2014 00:17:30 +0000 From: Webmaster Reply-To: Webmaster Message-ID: <804e5d135c2ca0a51ccc39d0dbfc1a26@dev104.magizz.com> X-Priority: 3 X-Mailer: PHPMailer 5.2.5 (https://github.com/Synchro/PHPMailer/) X-phpList-version: 3.0.6 X-MessageID: systemmessage X-ListMember: xfs@oss.sgi.com Precedence: bulk Bounces-To: webmaster@dev104.magizz.com List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Content-Type: text/plain; charset=UTF-8 X-AntiAbuse: This header was added to track abuse, please include it with any abuse report X-AntiAbuse: Primary Hostname - vps.magizz.com X-AntiAbuse: Original Domain - oss.sgi.com X-AntiAbuse: Originator/Caller UID/GID - [510 520] / [47 12] X-AntiAbuse: Sender Address Domain - dev104.magizz.com X-Get-Message-Sender-Via: vps.magizz.com: authenticated_id: dev104magizz/from_h X-Barracuda-Connect: vps.magizz.com[162.251.83.157] X-Barracuda-Start-Time: 1409012250 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 X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.8831 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature Goodbye from our Newsletter, sorry to see you go. You have been unsubscribed from our newsletters. This is the last email you will receive from us. Our newsletter system, phpList, will refuse to send you any further messages, without manual intervention by our administrator. If there is an error in this information, you can re-subscribe: please go to http://dev104.magizz.com/mailz/?p=subscribe and follow the steps. Thank you From dave@fromorbit.com Mon Aug 25 20:21: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 2BC6F7F4E for ; Mon, 25 Aug 2014 20:21:52 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id AF210AC002 for ; Mon, 25 Aug 2014 18:21:51 -0700 (PDT) X-ASG-Debug-ID: 1409016108-04cb6c54fd565410002-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id 5McUWAQnYbeEExAm for ; Mon, 25 Aug 2014 18:21:50 -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: AgwXACbg+1N5LDJ8PGdsb2JhbABZgw2IXadtAQEBAQamCRcFAQEBATgZHYRgO4ECAweIbpphpGaFfIlthDYFqFmKQoIqK4J+AQEB Received: from ppp121-44-50-124.lns20.syd6.internode.on.net (HELO dastard) ([121.44.50.124]) by ipmail04.adl6.internode.on.net with ESMTP; 26 Aug 2014 10:51:46 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1XM5SC-0000K9-53 for xfs@oss.sgi.com; Tue, 26 Aug 2014 11:21:44 +1000 Received: from dave by disappointment with local (Exim 4.82_1-5b7a7c0-XX) (envelope-from ) id 1XM5SC-0002U9-4J for xfs@oss.sgi.com; Tue, 26 Aug 2014 11:21:44 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [RFC, PATCH 0/4] xfs: clean up xlog_recover_process_data Date: Tue, 26 Aug 2014 11:21:37 +1000 X-ASG-Orig-Subj: [RFC, PATCH 0/4] xfs: clean up xlog_recover_process_data Message-Id: <1409016101-9511-1-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 2.0.0 X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1409016109 X-Barracuda-URL: http://192.48.176.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.8833 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Hi folks, The log recovery use-after-free that Brian posted a patch for has had several previous attempts sent and none have completed review. So let's put this one to bed for good. This patch set addresses the previous review feedback for fixing this problem. It factors xlog_recover_process_data() to make it cleaner and isolate the context of the transaction recvoery structure that is causing problems. It fixes a leak of the structure in an error condition that I noticed while factoring, as well as the double free that Brian and others have identified and tried to fix in the past. It then re-arranges the recovery item management code to put it all in one place, rather than in 3 separate parts of the file separated by several hundred lines of unrelated code. Comments? -Dave. From dave@fromorbit.com Mon Aug 25 20:21: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 DB4C77F4E for ; Mon, 25 Aug 2014 20:21:53 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id C98998F8033 for ; Mon, 25 Aug 2014 18:21:50 -0700 (PDT) X-ASG-Debug-ID: 1409016108-04cb6c54fd565410001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id eMJmQGTW3wUwj2Mc for ; Mon, 25 Aug 2014 18:21:48 -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: AlsTACbg+1N5LDJ8PGdsb2JhbABZgw2BKoczp20BAQEBBqYJFwUBAQEBODaEBAEFJy8zCBgxOQMHFBmIQb8wF4V8iW2ENgWoWYxsKy+CTwEBAQ Received: from ppp121-44-50-124.lns20.syd6.internode.on.net (HELO dastard) ([121.44.50.124]) by ipmail04.adl6.internode.on.net with ESMTP; 26 Aug 2014 10:51:46 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1XM5SC-0000KB-6J for xfs@oss.sgi.com; Tue, 26 Aug 2014 11:21:44 +1000 Received: from dave by disappointment with local (Exim 4.82_1-5b7a7c0-XX) (envelope-from ) id 1XM5SC-0002UI-5b for xfs@oss.sgi.com; Tue, 26 Aug 2014 11:21:44 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 2/4] xfs: recovery of XLOG_UNMOUNT_TRANS leaks memory Date: Tue, 26 Aug 2014 11:21:39 +1000 X-ASG-Orig-Subj: [PATCH 2/4] xfs: recovery of XLOG_UNMOUNT_TRANS leaks memory Message-Id: <1409016101-9511-3-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 2.0.0 In-Reply-To: <1409016101-9511-1-git-send-email-david@fromorbit.com> References: <1409016101-9511-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1409016108 X-Barracuda-URL: http://192.48.176.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.8833 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner It aborts recovery without freeing the current trans structure that we are decoding. Signed-off-by: Dave Chinner --- fs/xfs/xfs_log_recover.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/fs/xfs/xfs_log_recover.c b/fs/xfs/xfs_log_recover.c index 1970732f..460cf98 100644 --- a/fs/xfs/xfs_log_recover.c +++ b/fs/xfs/xfs_log_recover.c @@ -3587,8 +3587,9 @@ xlog_recovery_process_ophdr( /* unexpected flag values */ case XLOG_UNMOUNT_TRANS: xfs_warn(log->l_mp, "%s: Unmount LR", __func__); - error = 0; - break; + xlog_recover_free_trans(trans); + return 0; + case XLOG_START_TRANS: xfs_warn(log->l_mp, "%s: bad transaction 0x%x", __func__, tid); ASSERT(0); -- 2.0.0 From dave@fromorbit.com Mon Aug 25 20:21: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 021247F50 for ; Mon, 25 Aug 2014 20: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 76DD0AC001 for ; Mon, 25 Aug 2014 18:21:53 -0700 (PDT) X-ASG-Debug-ID: 1409016108-04cb6c54fd565410003-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id sWAtmPRbRHSwvBex for ; Mon, 25 Aug 2014 18:21:51 -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: AlsTACbg+1N5LDJ8PGdsb2JhbABZgw2BKoczp20BAQEBBqYJFwUBAQEBODaEBAEFJy8zCBgxOQMHFBmIQb9HhXyOIwWGEaJIimIcgW4rL4JPAQEB Received: from ppp121-44-50-124.lns20.syd6.internode.on.net (HELO dastard) ([121.44.50.124]) by ipmail04.adl6.internode.on.net with ESMTP; 26 Aug 2014 10:51:46 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1XM5SC-0000KA-5t for xfs@oss.sgi.com; Tue, 26 Aug 2014 11:21:44 +1000 Received: from dave by disappointment with local (Exim 4.82_1-5b7a7c0-XX) (envelope-from ) id 1XM5SC-0002UC-4o for xfs@oss.sgi.com; Tue, 26 Aug 2014 11:21:44 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 1/4] xfs: refactor xlog_recover_process_data() Date: Tue, 26 Aug 2014 11:21:38 +1000 X-ASG-Orig-Subj: [PATCH 1/4] xfs: refactor xlog_recover_process_data() Message-Id: <1409016101-9511-2-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 2.0.0 In-Reply-To: <1409016101-9511-1-git-send-email-david@fromorbit.com> References: <1409016101-9511-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1409016111 X-Barracuda-URL: http://192.48.176.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.8833 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner Clean up xlog_recover_process_data() structure in preparation for fixing the allocationa nd freeing context of the transaction being recovered. Signed-off-by: Dave Chinner --- fs/xfs/xfs_log_recover.c | 151 ++++++++++++++++++++++++++--------------------- 1 file changed, 84 insertions(+), 67 deletions(-) diff --git a/fs/xfs/xfs_log_recover.c b/fs/xfs/xfs_log_recover.c index 01becbb..1970732f 100644 --- a/fs/xfs/xfs_log_recover.c +++ b/fs/xfs/xfs_log_recover.c @@ -3531,12 +3531,78 @@ out: } STATIC int -xlog_recover_unmount_trans( - struct xlog *log) +xlog_recovery_process_ophdr( + struct xlog *log, + struct hlist_head rhash[], + struct xlog_rec_header *rhead, + struct xlog_op_header *ohead, + xfs_caddr_t dp, + xfs_caddr_t lp, + int pass) { - /* Do nothing now */ - xfs_warn(log->l_mp, "%s: Unmount LR", __func__); - return 0; + struct xlog_recover *trans; + xlog_tid_t tid; + int error; + unsigned long hash; + uint flags; + unsigned int hlen; + + hlen = be32_to_cpu(ohead->oh_len); + tid = be32_to_cpu(ohead->oh_tid); + hash = XLOG_RHASH(tid); + trans = xlog_recover_find_tid(&rhash[hash], tid); + if (!trans) { + /* add new tid if this is a new transaction */ + if (ohead->oh_flags & XLOG_START_TRANS) { + xlog_recover_new_tid(&rhash[hash], tid, + be64_to_cpu(rhead->h_lsn)); + } + return 0; + } + + error = -EIO; + if (dp + hlen > lp) { + xfs_warn(log->l_mp, "%s: bad length 0x%x", __func__, hlen); + WARN_ON(1); + goto out_free; + } + + flags = ohead->oh_flags & ~XLOG_END_TRANS; + if (flags & XLOG_WAS_CONT_TRANS) + flags &= ~XLOG_CONTINUE_TRANS; + + switch (flags) { + /* expected flag values */ + case 0: + case XLOG_CONTINUE_TRANS: + error = xlog_recover_add_to_trans(log, trans, dp, hlen); + break; + case XLOG_WAS_CONT_TRANS: + error = xlog_recover_add_to_cont_trans(log, trans, dp, hlen); + break; + case XLOG_COMMIT_TRANS: + error = xlog_recover_commit_trans(log, trans, pass); + break; + + /* unexpected flag values */ + case XLOG_UNMOUNT_TRANS: + xfs_warn(log->l_mp, "%s: Unmount LR", __func__); + error = 0; + break; + case XLOG_START_TRANS: + xfs_warn(log->l_mp, "%s: bad transaction 0x%x", __func__, tid); + ASSERT(0); + break; + default: + xfs_warn(log->l_mp, "%s: bad flag 0x%x", __func__, flags); + ASSERT(0); + break; + } + +out_free: + if (error) + xlog_recover_free_trans(trans); + return error; } /* @@ -3556,14 +3622,10 @@ xlog_recover_process_data( xfs_caddr_t dp, int pass) { + struct xlog_op_header *ohead; xfs_caddr_t lp; int num_logops; - xlog_op_header_t *ohead; - xlog_recover_t *trans; - xlog_tid_t tid; int error; - unsigned long hash; - uint flags; lp = dp + be32_to_cpu(rhead->h_len); num_logops = be32_to_cpu(rhead->h_num_logops); @@ -3573,69 +3635,24 @@ xlog_recover_process_data( return -EIO; while ((dp < lp) && num_logops) { - ASSERT(dp + sizeof(xlog_op_header_t) <= lp); - ohead = (xlog_op_header_t *)dp; - dp += sizeof(xlog_op_header_t); + ASSERT(dp + sizeof(struct xlog_op_header) <= lp); + + ohead = (struct xlog_op_header *)dp; + dp += sizeof(*ohead); + if (ohead->oh_clientid != XFS_TRANSACTION && ohead->oh_clientid != XFS_LOG) { xfs_warn(log->l_mp, "%s: bad clientid 0x%x", - __func__, ohead->oh_clientid); + __func__, ohead->oh_clientid); ASSERT(0); return -EIO; } - tid = be32_to_cpu(ohead->oh_tid); - hash = XLOG_RHASH(tid); - trans = xlog_recover_find_tid(&rhash[hash], tid); - if (trans == NULL) { /* not found; add new tid */ - if (ohead->oh_flags & XLOG_START_TRANS) - xlog_recover_new_tid(&rhash[hash], tid, - be64_to_cpu(rhead->h_lsn)); - } else { - if (dp + be32_to_cpu(ohead->oh_len) > lp) { - xfs_warn(log->l_mp, "%s: bad length 0x%x", - __func__, be32_to_cpu(ohead->oh_len)); - WARN_ON(1); - return -EIO; - } - flags = ohead->oh_flags & ~XLOG_END_TRANS; - if (flags & XLOG_WAS_CONT_TRANS) - flags &= ~XLOG_CONTINUE_TRANS; - switch (flags) { - case XLOG_COMMIT_TRANS: - error = xlog_recover_commit_trans(log, - trans, pass); - break; - case XLOG_UNMOUNT_TRANS: - error = xlog_recover_unmount_trans(log); - break; - case XLOG_WAS_CONT_TRANS: - error = xlog_recover_add_to_cont_trans(log, - trans, dp, - be32_to_cpu(ohead->oh_len)); - break; - case XLOG_START_TRANS: - xfs_warn(log->l_mp, "%s: bad transaction", - __func__); - ASSERT(0); - error = -EIO; - break; - case 0: - case XLOG_CONTINUE_TRANS: - error = xlog_recover_add_to_trans(log, trans, - dp, be32_to_cpu(ohead->oh_len)); - break; - default: - xfs_warn(log->l_mp, "%s: bad flag 0x%x", - __func__, flags); - ASSERT(0); - error = -EIO; - break; - } - if (error) { - xlog_recover_free_trans(trans); - return error; - } - } + + error = xlog_recovery_process_ophdr(log, rhash, rhead, ohead, + dp, lp, pass); + if (error) + return error; + dp += be32_to_cpu(ohead->oh_len); num_logops--; } -- 2.0.0 From dave@fromorbit.com Mon Aug 25 20: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 (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id F24417F54 for ; Mon, 25 Aug 2014 20:21:54 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id E0DDC304053 for ; Mon, 25 Aug 2014 18:21:54 -0700 (PDT) X-ASG-Debug-ID: 1409016111-04cbb054887efbf0001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id zmHfAPggLaezdGOf for ; Mon, 25 Aug 2014 18:21:52 -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: AlsTACbg+1N5LDJ8PGdsb2JhbABZgw2BKoczp20BAQEBBqYJFwUBAQEBODaEBAEFJy8zCBgxOQMHFBmIQb9HhXyOIwWGEa0oHoFuKy+CTwEBAQ Received: from ppp121-44-50-124.lns20.syd6.internode.on.net (HELO dastard) ([121.44.50.124]) by ipmail04.adl6.internode.on.net with ESMTP; 26 Aug 2014 10:51:46 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1XM5SC-0000KD-75 for xfs@oss.sgi.com; Tue, 26 Aug 2014 11:21:44 +1000 Received: from dave by disappointment with local (Exim 4.82_1-5b7a7c0-XX) (envelope-from ) id 1XM5SC-0002US-6S for xfs@oss.sgi.com; Tue, 26 Aug 2014 11:21:44 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 4/4] xfs: reorganise transaction recovery item code Date: Tue, 26 Aug 2014 11:21:41 +1000 X-ASG-Orig-Subj: [PATCH 4/4] xfs: reorganise transaction recovery item code Message-Id: <1409016101-9511-5-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 2.0.0 In-Reply-To: <1409016101-9511-1-git-send-email-david@fromorbit.com> References: <1409016101-9511-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1409016111 X-Barracuda-URL: http://192.48.176.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.8833 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner The code for managing transactions anf the items for recovery is spread across 3 different locations in the file. Move them all together so that it is easy to read the code without needing to jump long distances in the file. Signed-off-by: Dave Chinner --- fs/xfs/xfs_log_recover.c | 358 +++++++++++++++++++++++------------------------ 1 file changed, 179 insertions(+), 179 deletions(-) diff --git a/fs/xfs/xfs_log_recover.c b/fs/xfs/xfs_log_recover.c index 23895d5..b36d96a 100644 --- a/fs/xfs/xfs_log_recover.c +++ b/fs/xfs/xfs_log_recover.c @@ -1441,160 +1441,6 @@ xlog_clear_stale_blocks( ****************************************************************************** */ -STATIC xlog_recover_t * -xlog_recover_find_tid( - struct hlist_head *head, - xlog_tid_t tid) -{ - xlog_recover_t *trans; - - hlist_for_each_entry(trans, head, r_list) { - if (trans->r_log_tid == tid) - return trans; - } - return NULL; -} - -STATIC void -xlog_recover_new_tid( - struct hlist_head *head, - xlog_tid_t tid, - xfs_lsn_t lsn) -{ - xlog_recover_t *trans; - - trans = kmem_zalloc(sizeof(xlog_recover_t), KM_SLEEP); - trans->r_log_tid = tid; - trans->r_lsn = lsn; - INIT_LIST_HEAD(&trans->r_itemq); - - INIT_HLIST_NODE(&trans->r_list); - hlist_add_head(&trans->r_list, head); -} - -STATIC void -xlog_recover_add_item( - struct list_head *head) -{ - xlog_recover_item_t *item; - - item = kmem_zalloc(sizeof(xlog_recover_item_t), KM_SLEEP); - INIT_LIST_HEAD(&item->ri_list); - list_add_tail(&item->ri_list, head); -} - -STATIC int -xlog_recover_add_to_cont_trans( - struct xlog *log, - struct xlog_recover *trans, - xfs_caddr_t dp, - int len) -{ - xlog_recover_item_t *item; - xfs_caddr_t ptr, old_ptr; - int old_len; - - if (list_empty(&trans->r_itemq)) { - /* finish copying rest of trans header */ - xlog_recover_add_item(&trans->r_itemq); - ptr = (xfs_caddr_t) &trans->r_theader + - sizeof(xfs_trans_header_t) - len; - memcpy(ptr, dp, len); /* d, s, l */ - return 0; - } - /* take the tail entry */ - item = list_entry(trans->r_itemq.prev, xlog_recover_item_t, ri_list); - - old_ptr = item->ri_buf[item->ri_cnt-1].i_addr; - old_len = item->ri_buf[item->ri_cnt-1].i_len; - - ptr = kmem_realloc(old_ptr, len+old_len, old_len, KM_SLEEP); - memcpy(&ptr[old_len], dp, len); /* d, s, l */ - item->ri_buf[item->ri_cnt-1].i_len += len; - item->ri_buf[item->ri_cnt-1].i_addr = ptr; - trace_xfs_log_recover_item_add_cont(log, trans, item, 0); - return 0; -} - -/* - * The next region to add is the start of a new region. It could be - * a whole region or it could be the first part of a new region. Because - * of this, the assumption here is that the type and size fields of all - * format structures fit into the first 32 bits of the structure. - * - * This works because all regions must be 32 bit aligned. Therefore, we - * either have both fields or we have neither field. In the case we have - * neither field, the data part of the region is zero length. We only have - * a log_op_header and can throw away the header since a new one will appear - * later. If we have at least 4 bytes, then we can determine how many regions - * will appear in the current log item. - */ -STATIC int -xlog_recover_add_to_trans( - struct xlog *log, - struct xlog_recover *trans, - xfs_caddr_t dp, - int len) -{ - xfs_inode_log_format_t *in_f; /* any will do */ - xlog_recover_item_t *item; - xfs_caddr_t ptr; - - if (!len) - return 0; - if (list_empty(&trans->r_itemq)) { - /* we need to catch log corruptions here */ - if (*(uint *)dp != XFS_TRANS_HEADER_MAGIC) { - xfs_warn(log->l_mp, "%s: bad header magic number", - __func__); - ASSERT(0); - return -EIO; - } - if (len == sizeof(xfs_trans_header_t)) - xlog_recover_add_item(&trans->r_itemq); - memcpy(&trans->r_theader, dp, len); /* d, s, l */ - return 0; - } - - ptr = kmem_alloc(len, KM_SLEEP); - memcpy(ptr, dp, len); - in_f = (xfs_inode_log_format_t *)ptr; - - /* take the tail entry */ - item = list_entry(trans->r_itemq.prev, xlog_recover_item_t, ri_list); - if (item->ri_total != 0 && - item->ri_total == item->ri_cnt) { - /* tail item is in use, get a new one */ - xlog_recover_add_item(&trans->r_itemq); - item = list_entry(trans->r_itemq.prev, - xlog_recover_item_t, ri_list); - } - - if (item->ri_total == 0) { /* first region to be added */ - if (in_f->ilf_size == 0 || - in_f->ilf_size > XLOG_MAX_REGIONS_IN_ITEM) { - xfs_warn(log->l_mp, - "bad number of regions (%d) in inode log format", - in_f->ilf_size); - ASSERT(0); - kmem_free(ptr); - return -EIO; - } - - item->ri_total = in_f->ilf_size; - item->ri_buf = - kmem_zalloc(item->ri_total * sizeof(xfs_log_iovec_t), - KM_SLEEP); - } - ASSERT(item->ri_total > item->ri_cnt); - /* Description region is ri_buf[0] */ - item->ri_buf[item->ri_cnt].i_addr = ptr; - item->ri_buf[item->ri_cnt].i_len = len; - item->ri_cnt++; - trace_xfs_log_recover_item_add(log, trans, item, 0); - return 0; -} - /* * Sort the log items in the transaction. * @@ -3250,31 +3096,6 @@ xlog_recover_do_icreate_pass2( return 0; } -/* - * Free up any resources allocated by the transaction - * - * Remember that EFIs, EFDs, and IUNLINKs are handled later. - */ -STATIC void -xlog_recover_free_trans( - struct xlog_recover *trans) -{ - xlog_recover_item_t *item, *n; - int i; - - list_for_each_entry_safe(item, n, &trans->r_itemq, ri_list) { - /* Free the regions in the item. */ - list_del(&item->ri_list); - for (i = 0; i < item->ri_cnt; i++) - kmem_free(item->ri_buf[i].i_addr); - /* Free the item itself */ - kmem_free(item->ri_buf); - kmem_free(item); - } - /* Free the transaction recover structure */ - kmem_free(trans); -} - STATIC void xlog_recover_buffer_ra_pass2( struct xlog *log, @@ -3528,6 +3349,185 @@ out: return error ? error : error2; } + +STATIC xlog_recover_t * +xlog_recover_find_tid( + struct hlist_head *head, + xlog_tid_t tid) +{ + xlog_recover_t *trans; + + hlist_for_each_entry(trans, head, r_list) { + if (trans->r_log_tid == tid) + return trans; + } + return NULL; +} + +STATIC void +xlog_recover_new_tid( + struct hlist_head *head, + xlog_tid_t tid, + xfs_lsn_t lsn) +{ + xlog_recover_t *trans; + + trans = kmem_zalloc(sizeof(xlog_recover_t), KM_SLEEP); + trans->r_log_tid = tid; + trans->r_lsn = lsn; + INIT_LIST_HEAD(&trans->r_itemq); + + INIT_HLIST_NODE(&trans->r_list); + hlist_add_head(&trans->r_list, head); +} + +STATIC void +xlog_recover_add_item( + struct list_head *head) +{ + xlog_recover_item_t *item; + + item = kmem_zalloc(sizeof(xlog_recover_item_t), KM_SLEEP); + INIT_LIST_HEAD(&item->ri_list); + list_add_tail(&item->ri_list, head); +} + +STATIC int +xlog_recover_add_to_cont_trans( + struct xlog *log, + struct xlog_recover *trans, + xfs_caddr_t dp, + int len) +{ + xlog_recover_item_t *item; + xfs_caddr_t ptr, old_ptr; + int old_len; + + if (list_empty(&trans->r_itemq)) { + /* finish copying rest of trans header */ + xlog_recover_add_item(&trans->r_itemq); + ptr = (xfs_caddr_t) &trans->r_theader + + sizeof(xfs_trans_header_t) - len; + memcpy(ptr, dp, len); + return 0; + } + /* take the tail entry */ + item = list_entry(trans->r_itemq.prev, xlog_recover_item_t, ri_list); + + old_ptr = item->ri_buf[item->ri_cnt-1].i_addr; + old_len = item->ri_buf[item->ri_cnt-1].i_len; + + ptr = kmem_realloc(old_ptr, len+old_len, old_len, KM_SLEEP); + memcpy(&ptr[old_len], dp, len); + item->ri_buf[item->ri_cnt-1].i_len += len; + item->ri_buf[item->ri_cnt-1].i_addr = ptr; + trace_xfs_log_recover_item_add_cont(log, trans, item, 0); + return 0; +} + +/* + * The next region to add is the start of a new region. It could be + * a whole region or it could be the first part of a new region. Because + * of this, the assumption here is that the type and size fields of all + * format structures fit into the first 32 bits of the structure. + * + * This works because all regions must be 32 bit aligned. Therefore, we + * either have both fields or we have neither field. In the case we have + * neither field, the data part of the region is zero length. We only have + * a log_op_header and can throw away the header since a new one will appear + * later. If we have at least 4 bytes, then we can determine how many regions + * will appear in the current log item. + */ +STATIC int +xlog_recover_add_to_trans( + struct xlog *log, + struct xlog_recover *trans, + xfs_caddr_t dp, + int len) +{ + xfs_inode_log_format_t *in_f; /* any will do */ + xlog_recover_item_t *item; + xfs_caddr_t ptr; + + if (!len) + return 0; + if (list_empty(&trans->r_itemq)) { + /* we need to catch log corruptions here */ + if (*(uint *)dp != XFS_TRANS_HEADER_MAGIC) { + xfs_warn(log->l_mp, "%s: bad header magic number", + __func__); + ASSERT(0); + return -EIO; + } + if (len == sizeof(xfs_trans_header_t)) + xlog_recover_add_item(&trans->r_itemq); + memcpy(&trans->r_theader, dp, len); + return 0; + } + + ptr = kmem_alloc(len, KM_SLEEP); + memcpy(ptr, dp, len); + in_f = (xfs_inode_log_format_t *)ptr; + + /* take the tail entry */ + item = list_entry(trans->r_itemq.prev, xlog_recover_item_t, ri_list); + if (item->ri_total != 0 && + item->ri_total == item->ri_cnt) { + /* tail item is in use, get a new one */ + xlog_recover_add_item(&trans->r_itemq); + item = list_entry(trans->r_itemq.prev, + xlog_recover_item_t, ri_list); + } + + if (item->ri_total == 0) { /* first region to be added */ + if (in_f->ilf_size == 0 || + in_f->ilf_size > XLOG_MAX_REGIONS_IN_ITEM) { + xfs_warn(log->l_mp, + "bad number of regions (%d) in inode log format", + in_f->ilf_size); + ASSERT(0); + kmem_free(ptr); + return -EIO; + } + + item->ri_total = in_f->ilf_size; + item->ri_buf = + kmem_zalloc(item->ri_total * sizeof(xfs_log_iovec_t), + KM_SLEEP); + } + ASSERT(item->ri_total > item->ri_cnt); + /* Description region is ri_buf[0] */ + item->ri_buf[item->ri_cnt].i_addr = ptr; + item->ri_buf[item->ri_cnt].i_len = len; + item->ri_cnt++; + trace_xfs_log_recover_item_add(log, trans, item, 0); + return 0; +} +/* + * Free up any resources allocated by the transaction + * + * Remember that EFIs, EFDs, and IUNLINKs are handled later. + */ +STATIC void +xlog_recover_free_trans( + struct xlog_recover *trans) +{ + xlog_recover_item_t *item, *n; + int i; + + list_for_each_entry_safe(item, n, &trans->r_itemq, ri_list) { + /* Free the regions in the item. */ + list_del(&item->ri_list); + for (i = 0; i < item->ri_cnt; i++) + kmem_free(item->ri_buf[i].i_addr); + /* Free the item itself */ + kmem_free(item->ri_buf); + kmem_free(item); + } + /* Free the transaction recover structure */ + kmem_free(trans); +} + STATIC int xlog_recovery_process_ophdr( struct xlog *log, -- 2.0.0 From dave@fromorbit.com Mon Aug 25 20: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 (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 82ECB7F54 for ; Mon, 25 Aug 2014 20:21:55 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id 71961304053 for ; Mon, 25 Aug 2014 18:21:52 -0700 (PDT) X-ASG-Debug-ID: 1409016110-04cb6c54ff565420001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id YtZnR3ewXlZvKtbN for ; Mon, 25 Aug 2014 18:21:50 -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: AlsTACbg+1N5LDJ8PGdsb2JhbABZgw2BKoczp20BAQEBBqYJFwUBAQEBODaEBAEFJy8zCBgxOQMHFBmIQb8wF4V8iW2ENgWoWYxsKy+CTwEBAQ Received: from ppp121-44-50-124.lns20.syd6.internode.on.net (HELO dastard) ([121.44.50.124]) by ipmail04.adl6.internode.on.net with ESMTP; 26 Aug 2014 10:51:46 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1XM5SC-0000KC-6h for xfs@oss.sgi.com; Tue, 26 Aug 2014 11:21:44 +1000 Received: from dave by disappointment with local (Exim 4.82_1-5b7a7c0-XX) (envelope-from ) id 1XM5SC-0002UN-62 for xfs@oss.sgi.com; Tue, 26 Aug 2014 11:21:44 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 3/4] xfs: fix double free in xlog_recover_commit_trans Date: Tue, 26 Aug 2014 11:21:40 +1000 X-ASG-Orig-Subj: [PATCH 3/4] xfs: fix double free in xlog_recover_commit_trans Message-Id: <1409016101-9511-4-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 2.0.0 In-Reply-To: <1409016101-9511-1-git-send-email-david@fromorbit.com> References: <1409016101-9511-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1409016110 X-Barracuda-URL: http://192.48.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.60 X-Barracuda-Spam-Status: No, SCORE=2.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MV0249, MARKETING_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.8833 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words 2.00 BSF_SC0_MV0249 Custom rule MV0249 From: Dave Chinner When an error occurs during buffer submission in xlog_recover_commit_trans(), we free the trans structure twice. Fix it by only freeing the structure in the caller regardless of the success or failure of the function. Signed-off-by: Dave Chinner --- fs/xfs/xfs_log_recover.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/fs/xfs/xfs_log_recover.c b/fs/xfs/xfs_log_recover.c index 460cf98..23895d5 100644 --- a/fs/xfs/xfs_log_recover.c +++ b/fs/xfs/xfs_log_recover.c @@ -3524,8 +3524,6 @@ out: if (!list_empty(&done_list)) list_splice_init(&done_list, &trans->r_itemq); - xlog_recover_free_trans(trans); - error2 = xfs_buf_delwri_submit(&buffer_list); return error ? error : error2; } @@ -3571,6 +3569,11 @@ xlog_recovery_process_ophdr( if (flags & XLOG_WAS_CONT_TRANS) flags &= ~XLOG_CONTINUE_TRANS; + /* + * Callees must not free the trans structure. We own it, so we'll decide + * if we need to free it or not based on the operation being done and + * it's result. + */ switch (flags) { /* expected flag values */ case 0: @@ -3582,7 +3585,8 @@ xlog_recovery_process_ophdr( break; case XLOG_COMMIT_TRANS: error = xlog_recover_commit_trans(log, trans, pass); - break; + xlog_recover_free_trans(trans); + return error; /* unexpected flag values */ case XLOG_UNMOUNT_TRANS: -- 2.0.0 From david@fromorbit.com Mon Aug 25 21:38: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 B64187F4E for ; Mon, 25 Aug 2014 21:38:04 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id A4A7E304032 for ; Mon, 25 Aug 2014 19:38:01 -0700 (PDT) X-ASG-Debug-ID: 1409020678-04cb6c5500568de0001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id uHKZxg9ZfQFh2v5j for ; Mon, 25 Aug 2014 19:37: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: AicYAPPx+1N5LDJ8PGdsb2JhbABAGoMNU1evJwEBAQEGnSGHSAMCAYEcFwUBAQEBODaEBAEFOhwjEAgDGAklDwUlAwcaE4hBDja9NxiFZIkHSQeETAWVT4Z5mH0rL4EHgUgBAQE Received: from ppp121-44-50-124.lns20.syd6.internode.on.net (HELO dastard) ([121.44.50.124]) by ipmail04.adl6.internode.on.net with ESMTP; 26 Aug 2014 12:07:58 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1XM6dv-0000Ua-1k; Tue, 26 Aug 2014 12:37:55 +1000 Date: Tue, 26 Aug 2014 12:37:55 +1000 From: Dave Chinner To: Greg Freemyer Cc: Zhang Qiang , xfs-oss Subject: Re: bad performance on touch/cp file on XFS system Message-ID: <20140826023754.GH20518@dastard> X-ASG-Orig-Subj: Re: bad performance on touch/cp file on XFS system References: <20140825051801.GY26465@dastard> <20140825090843.GE20518@dastard> <20140825222657.GF20518@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: 1409020678 X-Barracuda-URL: http://192.48.176.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.8834 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 BSF_SC0_SA085 Custom Rule SA085 On Mon, Aug 25, 2014 at 06:46:31PM -0400, Greg Freemyer wrote: > On Mon, Aug 25, 2014 at 6:26 PM, Dave Chinner wrote: > > On Mon, Aug 25, 2014 at 06:31:10PM +0800, Zhang Qiang wrote: > >> 2014-08-25 17:08 GMT+08:00 Dave Chinner : > >> > >> > On Mon, Aug 25, 2014 at 04:47:39PM +0800, Zhang Qiang wrote: > >> > > I have checked icount and ifree, but I found there are about 11.8 percent > >> > > free, so the free inode should not be too few. > >> > > > >> > > Here's the detail log, any new clue? > >> > > > >> > > # mount /dev/sda4 /data1/ > >> > > # xfs_info /data1/ > >> > > meta-data=/dev/sda4 isize=256 agcount=4, agsize=142272384 > >> > > >> > 4 AGs > >> > > >> Yes. > >> > >> > > >> > > icount = 220619904 > >> > > ifree = 26202919 > >> > > >> > And 220 million inodes. There's your problem - that's an average > >> > of 55 million inodes per AGI btree assuming you are using inode64. > >> > If you are using inode32, then the inodes will be in 2 btrees, or > >> > maybe even only one. > >> > > >> > >> You are right, all inodes stay on one AG. > >> > >> BTW, why i allocate 4 AGs, and all inodes stay in one AG for inode32?, > > > > Because the top addresses in the 2nd AG go over 32 bits, hence only > > AG 0 can be used for inodes. Changing to inode64 will give you some > > relief, but any time allocation occurs in AG0 is will be slow. i.e. > > you'll be trading always slow for "unpredictably slow". > > > >> > With that many inodes, I'd be considering moving to 32 or 64 AGs to > >> > keep the btree size down to a more manageable size. The free inode > >> > >> btree would also help, but, really, 220M inodes in a 2TB filesystem > >> > is really pushing the boundaries of sanity..... > >> > > >> > >> So the better inodes size in one AG is about 5M, > > > > Not necessarily. But for your storage it's almost certainly going to > > minimise the problem you are seeing. > > > >> is there any documents > >> about these options I can learn more? > > > > http://xfs.org/index.php/XFS_Papers_and_Documentation > > Given the apparently huge number of small files would he likely see a > big performance increase if he replaced that 2TB or rust with SSD. Doubt it - the profiles showed the allocation being CPU bound searching the metadata that indexes all those inodes. Those same profiles showed all the signs that it was hitting the buffer cache most of the time, too, which is why it was CPU bound.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From BATV+51bc9e941fdcf2bf9be0+4020+infradead.org+hch@bombadil.srs.infradead.org Mon Aug 25 23:09: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 (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id B1B897F4E for ; Mon, 25 Aug 2014 23:09:26 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 9FB5D304051 for ; Mon, 25 Aug 2014 21:09:23 -0700 (PDT) X-ASG-Debug-ID: 1409026162-04cbb054877f6a00001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id 1NAF0NBojbjP8Trc (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 25 Aug 2014 21:09:22 -0700 (PDT) X-Barracuda-Envelope-From: BATV+51bc9e941fdcf2bf9be0+4020+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 1XM84P-0003xn-RJ; Tue, 26 Aug 2014 04:09:21 +0000 Date: Mon, 25 Aug 2014 21:09:21 -0700 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 1/4] xfs: refactor xlog_recover_process_data() Message-ID: <20140826040921.GA9591@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 1/4] xfs: refactor xlog_recover_process_data() References: <1409016101-9511-1-git-send-email-david@fromorbit.com> <1409016101-9511-2-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1409016101-9511-2-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.23 (2014-03-12) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1409026162 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.8836 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS > @@ -3556,14 +3622,10 @@ xlog_recover_process_data( > xfs_caddr_t dp, > int pass) > { > + struct xlog_op_header *ohead; > xfs_caddr_t lp; > int num_logops; > int error; > > lp = dp + be32_to_cpu(rhead->h_len); > num_logops = be32_to_cpu(rhead->h_num_logops); > @@ -3573,69 +3635,24 @@ xlog_recover_process_data( > return -EIO; > > while ((dp < lp) && num_logops) { > + ASSERT(dp + sizeof(struct xlog_op_header) <= lp); > + > + ohead = (struct xlog_op_header *)dp; > + dp += sizeof(*ohead); Using sizeof type and sizeof variable for the same thing right next to each other seems weird. Also why duplicate the addition instead of moving it below the assignment: ohead = (struct xlog_op_header *)dp; dp += sizeof(*ohead); ASSERT(dp <= lp); From david@fromorbit.com Mon Aug 25 23:55: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 467FD7F4E for ; Mon, 25 Aug 2014 23:55:16 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 3362F30404E for ; Mon, 25 Aug 2014 21:55:15 -0700 (PDT) X-ASG-Debug-ID: 1409028912-04cbb054887f8d30001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id FGZ1aFEBMRZMDc2W for ; Mon, 25 Aug 2014 21:55:12 -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: AmUTAOER/FN5LDJ8PGdsb2JhbABagw2BKoczp3oBAQEBBqRuAYEbFwUBAQEBODaEAwEBBAEnExwjBQsIAw4KCSUPBSUDBxoTiDoHvg8XGIVkiVAHhEwBBJxIjBGMbCsvgk8BAQE Received: from ppp121-44-50-124.lns20.syd6.internode.on.net (HELO dastard) ([121.44.50.124]) by ipmail04.adl6.internode.on.net with ESMTP; 26 Aug 2014 14:25:11 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1XM8mj-0000lj-V6; Tue, 26 Aug 2014 14:55:10 +1000 Date: Tue, 26 Aug 2014 14:55:09 +1000 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com Subject: Re: [PATCH 1/4] xfs: refactor xlog_recover_process_data() Message-ID: <20140826045509.GI20518@dastard> X-ASG-Orig-Subj: Re: [PATCH 1/4] xfs: refactor xlog_recover_process_data() References: <1409016101-9511-1-git-send-email-david@fromorbit.com> <1409016101-9511-2-git-send-email-david@fromorbit.com> <20140826040921.GA9591@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140826040921.GA9591@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: 1409028912 X-Barracuda-URL: http://192.48.176.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.8837 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Mon, Aug 25, 2014 at 09:09:21PM -0700, Christoph Hellwig wrote: > > @@ -3556,14 +3622,10 @@ xlog_recover_process_data( > > xfs_caddr_t dp, > > int pass) > > { > > + struct xlog_op_header *ohead; > > xfs_caddr_t lp; > > int num_logops; > > int error; > > > > lp = dp + be32_to_cpu(rhead->h_len); > > num_logops = be32_to_cpu(rhead->h_num_logops); > > @@ -3573,69 +3635,24 @@ xlog_recover_process_data( > > return -EIO; > > > > while ((dp < lp) && num_logops) { > > + ASSERT(dp + sizeof(struct xlog_op_header) <= lp); > > + > > + ohead = (struct xlog_op_header *)dp; > > + dp += sizeof(*ohead); > > Using sizeof type and sizeof variable for the same thing right next > to each other seems weird. Also why duplicate the addition instead > of moving it below the assignment: Oh, I missed converting the one in the ASSERT. > ohead = (struct xlog_op_header *)dp; > dp += sizeof(*ohead); > > ASSERT(dp <= lp); Yup, that makes sense. Cheers, Dave. -- Dave Chinner david@fromorbit.com From stan@hardwarefreak.com Tue Aug 26 01: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=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id C345C7F3F for ; Tue, 26 Aug 2014 01:18:53 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 6E586AC001 for ; Mon, 25 Aug 2014 23:18:53 -0700 (PDT) X-ASG-Debug-ID: 1409033930-04bdf010a05008f0001-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 mDzmCeREi8fiu7FY for ; Mon, 25 Aug 2014 23:18:51 -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: by greer.hardwarefreak.com (Postfix, from userid 33) id 8A5596C192; Tue, 26 Aug 2014 01:18:50 -0500 (CDT) To: Subject: storage, libaio, or XFS =?UTF-8?Q?problem=3F=20=20=33=2E=34=2E=32=36?= X-PHP-Originating-Script: 0:func.inc X-ASG-Orig-Subj: storage, libaio, or XFS =?UTF-8?Q?problem=3F=20=20=33=2E=34=2E=32=36?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Date: Tue, 26 Aug 2014 01:18:50 -0500 From: Stan Hoeppner Message-ID: <3fe8c34c0ccbbd720015d273fa2b8b30@localhost> X-Sender: stan@hardwarefreak.com User-Agent: RoundCube Webmail/0.3.1 X-Barracuda-Connect: mo-65-41-216-221.sta.embarqhsd.net[65.41.216.221] X-Barracuda-Start-Time: 1409033931 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Had some controller issues but believe we had those ironed out before this recent breakage. I had reformatted both 48TB LUNs on this test box with -f and defaults, and fired up the test app again. Throughput was fantastic with no dropped application buffers for ~30 minutes, and IO times were 1.x ms max, suggesting all the writes were acked by controller cache. The app was running perfectly. Then it hanged and spit out an internal error msg: Failed to reopen file /mnt/VOL1/sg-04/str-0015/f-0000000005 I have many call traces in dmesg, most are XFS, pasted below. I found no SCSI I/O errors in dmesg. Application is submitting writes via libaio and using O_DIRECT, writing to preallocated files. I don't see any errors in the storage controller log and everything seems to check out there. Using noop elevator, mpt2sas, no multipathing. The application process is hung in d state and kill -9 won't get rid of it. I can't unmount the hosed up filesystem. Any ideas? # ls -la /mnt/VOL1 ls: cannot access /mnt/VOL1: Input/output error # dd if=/mnt/VOL1 of=/dev/null bs=1M count=16 dd: opening `/mnt/VOL1': Input/output error # dd if=/dev/sdd of=/dev/null bs=1M count=16 16+0 records in 16+0 records out 16777216 bytes (17 MB) copied, 1.10989 s, 15.1 MB/s # ls -la /mnt/ ls: cannot access /mnt/VOL1: Input/output error total 8 drwxrwxrwt 6 root root 120 Aug 25 17:59 . drwxr-xr-x 21 root root 4096 Jul 15 09:39 .. drwxrwxrwt 3 root root 80 Aug 25 16:52 initramfs drwxr-xr-x 3 root root 4096 Apr 24 04:57 scratch drwxrwxrwx 5 root root 58 Aug 25 22:06 VOL0 d????????? ? ? ? ? ? VOL1 # umount /mnt/VOL1 umount: /mnt/VOL1: device is busy. (In some cases useful info about processes that use the device is found by lsof(8) or fuser(1)) Kernel 3.4.26 xfs_repair version 3.1.4 2 socket, 20 core Xeon(R) CPU E5-2650 v2 @ 2.60GHz MemTotal: 264573184 kB MemFree: 246519624 kB Buffers: 16820 kB Cached: 78120 kB SwapCached: 0 kB Active: 13130040 kB Inactive: 75352 kB Active(anon): 13110512 kB Inactive(anon): 276 kB Active(file): 19528 kB Inactive(file): 75076 kB Unevictable: 0 kB Mlocked: 0 kB SwapTotal: 0 kB SwapFree: 0 kB Dirty: 0 kB Writeback: 0 kB AnonPages: 13126968 kB Mapped: 11848 kB Shmem: 340 kB Slab: 208476 kB SReclaimable: 118240 kB SUnreclaim: 90236 kB KernelStack: 3976 kB PageTables: 32840 kB NFS_Unstable: 0 kB Bounce: 0 kB WritebackTmp: 0 kB CommitLimit: 132286592 kB Committed_AS: 25044716 kB VmallocTotal: 34359738367 kB VmallocUsed: 1050608 kB VmallocChunk: 34358680400 kB AnonHugePages: 13078528 kB HugePages_Total: 0 HugePages_Free: 0 HugePages_Rsvd: 0 HugePages_Surp: 0 Hugepagesize: 2048 kB DirectMap4k: 5056 kB DirectMap2M: 2045952 kB DirectMap1G: 266338304 kB /dev/sdc /mnt/VOL0 xfs rw,noatime,nodiratime,attr2,nobarrier,inode64,noquota 0 0 /dev/sdd /mnt/VOL1 xfs rw,noatime,nodiratime,attr2,nobarrier,inode64,noquota 0 0 major minor #blocks name 8 32 46837141504 sdc 8 48 46837141504 sdd 2x hardware RAID5 LUNs - 64KB su, 768KB sw 2 controllers, one per LUN, 3GB cache each, write back, FPGA RAID engine No LVM. LUNs directly formatted with XFS 26 Seagate SAS 3.5" 7.2K drives, 13 per RAID5, drive caches disabled My counterpart had what I'd guess is this same problem on the full test rig, which has 16 of these LUNS, 208 drives total. He was also testing with libaio. I have not dug into the logs on that host as of yet. Its config is identical to this box but for the number of LUNs, drives. [22635.102013] INFO: task kworker/7:0:45 blocked for more than 120 seconds. [22635.102016] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message. [22635.102018] kworker/7:0 D ffff8840666c0b08 0 45 2 0x00000000 [22635.102021] ffff8840666e7bd0 0000000000000046 ffff883f7c02d000 ffff8840666f5180 [22635.102026] ffff8840666e7b80 0000000000000206 00000000000122c0 00000000000122c0 [22635.102030] ffff8840666e7fd8 ffff8840666e6000 00000000000122c0 ffff8840666e6000 [22635.102033] Call Trace: [22635.102041] [] schedule+0x64/0x66 [22635.102044] [] rwsem_down_failed_common+0xdb/0x10d [22635.102047] [] rwsem_down_write_failed+0x13/0x15 [22635.102051] [] call_rwsem_down_write_failed+0x13/0x20 [22635.102055] [] ? _raw_spin_unlock_irqrestore+0x30/0x3d [22635.102058] [] ? down_write+0x25/0x27 [22635.102070] [] xfs_ilock+0x4f/0xb4 [xfs] [22635.102077] [] xfs_iomap_write_unwritten+0x1b3/0x32e [xfs] [22635.102080] [] ? _raw_spin_unlock_irqrestore+0x30/0x3d [22635.102084] [] ? xfs_setfilesize+0x128/0x128 [xfs] [22635.102088] [] ? mempool_free+0x73/0x78 [22635.102093] [] ? xfs_setfilesize+0x128/0x128 [xfs] [22635.102098] [] xfs_end_io+0x89/0xb4 [xfs] [22635.102102] [] process_one_work+0x204/0x327 [22635.102105] [] worker_thread+0x13b/0x25a [22635.102108] [] ? process_one_work+0x327/0x327 [22635.102111] [] kthread+0x89/0x91 [22635.102115] [] kernel_thread_helper+0x4/0x10 [22635.102118] [] ? __init_kthread_worker+0x3c/0x3c [22635.102120] [] ? gs_change+0xb/0xb [22635.102131] INFO: task streamRT-sa:5891 blocked for more than 120 seconds. [22635.102132] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message. [22635.102134] streamRT-sa D ffff883f52850348 0 5891 5114 0x00000004 [22635.102136] ffff884063af5b28 0000000000000082 000000000000029c ffff884066679100 [22635.102140] 0000000000000006 0000000000000001 00000000000122c0 00000000000122c0 [22635.102143] ffff884063af5fd8 ffff884063af4000 00000000000122c0 ffff884063af4000 [22635.102146] Call Trace: [22635.102149] [] schedule+0x64/0x66 [22635.102151] [] rwsem_down_failed_common+0xdb/0x10d [22635.102154] [] rwsem_down_write_failed+0x13/0x15 [22635.102156] [] call_rwsem_down_write_failed+0x13/0x20 [22635.102158] [] ? down_write+0x25/0x27 [22635.102164] [] xfs_ilock+0x4f/0xb4 [xfs] [22635.102170] [] xfs_rw_ilock+0x2c/0x33 [xfs] [22635.102172] [] ? _raw_spin_unlock_irq+0x27/0x32 [22635.102178] [] xfs_file_aio_write_checks+0x41/0xfe [xfs] [22635.102184] [] xfs_file_dio_aio_write+0x103/0x1fc [xfs] [22635.102189] [] xfs_file_aio_write+0x152/0x1b5 [xfs] [22635.102195] [] ? xfs_file_buffered_aio_write+0x179/0x179 [xfs] [22635.102199] [] aio_rw_vect_retry+0x85/0x18a [22635.102202] [] ? aio_fsync+0x29/0x29 [22635.102204] [] aio_run_iocb+0x7b/0x149 [22635.102207] [] io_submit_one+0x199/0x1f3 [22635.102209] [] do_io_submit+0xfa/0x271 [22635.102212] [] sys_io_submit+0x10/0x12 [22635.102215] [] system_call_fastpath+0x16/0x1b [22635.102217] INFO: task streamRT-sa:5895 blocked for more than 120 seconds. [22635.102218] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message. [22635.102219] streamRT-sa D ffff883f537fa3c8 0 5895 5114 0x00000004 [22635.102222] ffff883f7d057b28 0000000000000082 0000000000000000 ffff884066227100 [22635.102225] ffff883f7d057ad8 0000000000000002 00000000000122c0 00000000000122c0 [22635.102228] ffff883f7d057fd8 ffff883f7d056000 00000000000122c0 ffff883f7d056000 [22635.102232] Call Trace: [22635.102234] [] schedule+0x64/0x66 [22635.102236] [] rwsem_down_failed_common+0xdb/0x10d [22635.102239] [] rwsem_down_write_failed+0x13/0x15 [22635.102241] [] call_rwsem_down_write_failed+0x13/0x20 [22635.102243] [] ? down_write+0x25/0x27 [22635.102249] [] xfs_ilock+0x4f/0xb4 [xfs] [22635.102254] [] xfs_rw_ilock+0x2c/0x33 [xfs] [22635.102257] [] ? _raw_spin_unlock_irqrestore+0x30/0x3d [22635.102262] [] xfs_file_aio_write_checks+0x41/0xfe [xfs] [22635.102268] [] xfs_file_dio_aio_write+0x103/0x1fc [xfs] [22635.102274] [] xfs_file_aio_write+0x152/0x1b5 [xfs] [22635.102279] [] ? xfs_file_buffered_aio_write+0x179/0x179 [xfs] [22635.102282] [] aio_rw_vect_retry+0x85/0x18a [22635.102284] [] ? aio_fsync+0x29/0x29 [22635.102286] [] aio_run_iocb+0x7b/0x149 [22635.102288] [] io_submit_one+0x199/0x1f3 [22635.102291] [] do_io_submit+0xfa/0x271 [22635.102294] [] ? sys_rt_sigprocmask+0x69/0xa1 [22635.102297] [] sys_io_submit+0x10/0x12 [22635.102299] [] system_call_fastpath+0x16/0x1b [22635.102301] INFO: task streamRT-sa:5900 blocked for more than 120 seconds. [22635.102302] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message. [22635.102303] streamRT-sa D ffff883f53003b88 0 5900 5114 0x00000004 [22635.102305] ffff883f7d109b28 0000000000000082 0000000000000000 ffff884066679100 [22635.102309] ffff883f7d109ad8 0000000000000002 00000000000122c0 00000000000122c0 [22635.102312] ffff883f7d109fd8 ffff883f7d108000 00000000000122c0 ffff883f7d108000 [22635.102315] Call Trace: [22635.102318] [] schedule+0x64/0x66 [22635.102320] [] rwsem_down_failed_common+0xdb/0x10d [22635.102322] [] rwsem_down_write_failed+0x13/0x15 [22635.102324] [] call_rwsem_down_write_failed+0x13/0x20 [22635.102327] [] ? down_write+0x25/0x27 [22635.102332] [] xfs_ilock+0x4f/0xb4 [xfs] [22635.102338] [] xfs_rw_ilock+0x2c/0x33 [xfs] [22635.102340] [] ? _raw_spin_unlock_irqrestore+0x30/0x3d [22635.102346] [] xfs_file_aio_write_checks+0x41/0xfe [xfs] [22635.102351] [] xfs_file_dio_aio_write+0x103/0x1fc [xfs] [22635.102357] [] xfs_file_aio_write+0x152/0x1b5 [xfs] [22635.102362] [] ? resched_task+0x3e/0x75 [22635.102367] [] ? xfs_file_buffered_aio_write+0x179/0x179 [xfs] [22635.102369] [] aio_rw_vect_retry+0x85/0x18a [22635.102372] [] ? aio_fsync+0x29/0x29 [22635.102374] [] aio_run_iocb+0x7b/0x149 [22635.102376] [] io_submit_one+0x199/0x1f3 [22635.102379] [] do_io_submit+0xfa/0x271 [22635.102382] [] sys_io_submit+0x10/0x12 [22635.102384] [] system_call_fastpath+0x16/0x1b [22635.102386] INFO: task streamRT-sa:5904 blocked for more than 120 seconds. [22635.102387] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message. [22635.102388] streamRT-sa D ffff88405fd50a48 0 5904 5114 0x00000004 [22635.102390] ffff883f51c2bb28 0000000000000082 0000000000000000 ffff8840662d0080 [22635.102394] ffff883f51c2bad8 0000000000000002 00000000000122c0 00000000000122c0 [22635.102397] ffff883f51c2bfd8 ffff883f51c2a000 00000000000122c0 ffff883f51c2a000 [22635.102400] Call Trace: [22635.102402] [] schedule+0x64/0x66 [22635.102405] [] rwsem_down_failed_common+0xdb/0x10d [22635.102407] [] rwsem_down_write_failed+0x13/0x15 [22635.102409] [] call_rwsem_down_write_failed+0x13/0x20 [22635.102412] [] ? down_write+0x25/0x27 [22635.102417] [] xfs_ilock+0x4f/0xb4 [xfs] [22635.102423] [] xfs_rw_ilock+0x2c/0x33 [xfs] [22635.102425] [] ? _raw_spin_unlock_irqrestore+0x30/0x3d [22635.102430] [] xfs_file_aio_write_checks+0x41/0xfe [xfs] [22635.102436] [] xfs_file_dio_aio_write+0x103/0x1fc [xfs] [22635.102442] [] xfs_file_aio_write+0x152/0x1b5 [xfs] [22635.102447] [] ? xfs_file_buffered_aio_write+0x179/0x179 [xfs] [22635.102450] [] aio_rw_vect_retry+0x85/0x18a [22635.102452] [] ? aio_fsync+0x29/0x29 [22635.102454] [] aio_run_iocb+0x7b/0x149 [22635.102457] [] io_submit_one+0x199/0x1f3 [22635.102459] [] do_io_submit+0xfa/0x271 [22635.102461] [] ? sys_rt_sigprocmask+0x69/0xa1 [22635.102464] [] sys_io_submit+0x10/0x12 [22635.102466] [] system_call_fastpath+0x16/0x1b [22635.102468] INFO: task streamRT-sa:5906 blocked for more than 120 seconds. [22635.102469] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message. [22635.102470] streamRT-sa D ffff88405fe2ca88 0 5906 5114 0x00000004 [22635.102473] ffff883f51c2fb28 0000000000000082 0000000000000000 ffff8840667f00c0 [22635.102476] 0000000000000000 0000000000000000 00000000000122c0 00000000000122c0 [22635.102479] ffff883f51c2ffd8 ffff883f51c2e000 00000000000122c0 ffff883f51c2e000 [22635.102482] Call Trace: [22635.102485] [] schedule+0x64/0x66 [22635.102487] [] rwsem_down_failed_common+0xdb/0x10d [22635.102489] [] rwsem_down_write_failed+0x13/0x15 [22635.102491] [] call_rwsem_down_write_failed+0x13/0x20 [22635.102494] [] ? down_write+0x25/0x27 [22635.102499] [] xfs_ilock+0x4f/0xb4 [xfs] [22635.102505] [] xfs_rw_ilock+0x2c/0x33 [xfs] [22635.102507] [] ? _raw_spin_unlock_irq+0x27/0x32 [22635.102512] [] xfs_file_aio_write_checks+0x41/0xfe [xfs] [22635.102518] [] xfs_file_dio_aio_write+0x103/0x1fc [xfs] [22635.102524] [] xfs_file_aio_write+0x152/0x1b5 [xfs] [22635.102529] [] ? xfs_file_buffered_aio_write+0x179/0x179 [xfs] [22635.102532] [] aio_rw_vect_retry+0x85/0x18a [22635.102534] [] ? aio_fsync+0x29/0x29 [22635.102536] [] aio_run_iocb+0x7b/0x149 [22635.102538] [] io_submit_one+0x199/0x1f3 [22635.102541] [] do_io_submit+0xfa/0x271 [22635.102543] [] ? sys_rt_sigprocmask+0x69/0xa1 [22635.102545] [] sys_io_submit+0x10/0x12 [22635.102548] [] system_call_fastpath+0x16/0x1b [22635.102550] INFO: task streamRT-sa:5908 blocked for more than 120 seconds. [22635.102551] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message. [22635.102552] streamRT-sa D ffff88405fe2fac8 0 5908 5114 0x00000004 [22635.102554] ffff883f518b3b28 0000000000000082 000000000000029c ffff884066770040 [22635.102558] 0000000000000006 0000000000000001 00000000000122c0 00000000000122c0 [22635.102561] ffff883f518b3fd8 ffff883f518b2000 00000000000122c0 ffff883f518b2000 [22635.102564] Call Trace: [22635.102566] [] schedule+0x64/0x66 [22635.102569] [] rwsem_down_failed_common+0xdb/0x10d [22635.102571] [] rwsem_down_write_failed+0x13/0x15 [22635.102573] [] call_rwsem_down_write_failed+0x13/0x20 [22635.102575] [] ? down_write+0x25/0x27 [22635.102581] [] xfs_ilock+0x4f/0xb4 [xfs] [22635.102586] [] xfs_rw_ilock+0x2c/0x33 [xfs] [22635.102589] [] ? _raw_spin_unlock_irq+0x27/0x32 [22635.102594] [] xfs_file_aio_write_checks+0x41/0xfe [xfs] [22635.102600] [] xfs_file_dio_aio_write+0x103/0x1fc [xfs] [22635.102620] [] xfs_file_aio_write+0x152/0x1b5 [xfs] [22635.102627] [] ? xfs_file_buffered_aio_write+0x179/0x179 [xfs] [22635.102630] [] aio_rw_vect_retry+0x85/0x18a [22635.102637] [] ? aio_fsync+0x29/0x29 [22635.102641] [] aio_run_iocb+0x7b/0x149 [22635.102651] [] io_submit_one+0x199/0x1f3 [22635.102655] [] do_io_submit+0xfa/0x271 [22635.102661] [] sys_io_submit+0x10/0x12 [22635.102664] [] system_call_fastpath+0x16/0x1b [22635.102669] INFO: task streamRT-sa:5909 blocked for more than 120 seconds. [22635.102675] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message. [22635.102677] streamRT-sa D ffff88405fe2f3c8 0 5909 5114 0x00000004 [22635.102683] ffff883f518b5b28 0000000000000082 00000000000000de ffff88406663a040 [22635.102694] 0000000000000002 0000000000000001 00000000000122c0 00000000000122c0 [22635.102705] ffff883f518b5fd8 ffff883f518b4000 00000000000122c0 ffff883f518b4000 [22635.102719] Call Trace: [22635.102723] [] schedule+0x64/0x66 [22635.102729] [] rwsem_down_failed_common+0xdb/0x10d [22635.102734] [] rwsem_down_write_failed+0x13/0x15 [22635.102739] [] call_rwsem_down_write_failed+0x13/0x20 [22635.102742] [] ? down_write+0x25/0x27 [22635.102751] [] xfs_ilock+0x4f/0xb4 [xfs] [22635.102761] [] xfs_rw_ilock+0x2c/0x33 [xfs] [22635.102765] [] ? _raw_spin_unlock_irq+0x27/0x32 [22635.102773] [] xfs_file_aio_write_checks+0x41/0xfe [xfs] [22635.102781] [] xfs_file_dio_aio_write+0x103/0x1fc [xfs] [22635.102788] [] xfs_file_aio_write+0x152/0x1b5 [xfs] [22635.102798] [] ? xfs_file_buffered_aio_write+0x179/0x179 [xfs] [22635.102801] [] aio_rw_vect_retry+0x85/0x18a [22635.102805] [] ? aio_fsync+0x29/0x29 [22635.102809] [] aio_run_iocb+0x7b/0x149 [22635.102812] [] io_submit_one+0x199/0x1f3 [22635.102815] [] do_io_submit+0xfa/0x271 [22635.102818] [] ? sys_rt_sigprocmask+0x69/0xa1 [22635.102824] [] sys_io_submit+0x10/0x12 [22635.102827] [] system_call_fastpath+0x16/0x1b [22635.102834] INFO: task streamRT-sa:5911 blocked for more than 120 seconds. [22635.102836] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message. [22635.102838] streamRT-sa D ffff883f5372c408 0 5911 5114 0x00000004 [22635.102844] ffff883f5208bb28 0000000000000082 0000000000000000 ffff884066001180 [22635.102850] 0000000000000000 0000000000000000 00000000000122c0 00000000000122c0 [22635.102861] ffff883f5208bfd8 ffff883f5208a000 00000000000122c0 ffff883f5208a000 [22635.102877] Call Trace: [22635.102883] [] schedule+0x64/0x66 [22635.102886] [] rwsem_down_failed_common+0xdb/0x10d [22635.102890] [] rwsem_down_write_failed+0x13/0x15 [22635.102895] [] call_rwsem_down_write_failed+0x13/0x20 [22635.102902] [] ? down_write+0x25/0x27 [22635.102911] [] xfs_ilock+0x4f/0xb4 [xfs] [22635.102918] [] xfs_rw_ilock+0x2c/0x33 [xfs] [22635.102924] [] ? _raw_spin_unlock_irq+0x27/0x32 [22635.102931] [] xfs_file_aio_write_checks+0x41/0xfe [xfs] [22635.102939] [] xfs_file_dio_aio_write+0x103/0x1fc [xfs] [22635.102947] [] xfs_file_aio_write+0x152/0x1b5 [xfs] [22635.102954] [] ? xfs_file_buffered_aio_write+0x179/0x179 [xfs] [22635.102959] [] aio_rw_vect_retry+0x85/0x18a [22635.102962] [] ? aio_fsync+0x29/0x29 [22635.102968] [] aio_run_iocb+0x7b/0x149 [22635.102973] [] io_submit_one+0x199/0x1f3 [22635.102976] [] do_io_submit+0xfa/0x271 [22635.102980] [] ? sys_rt_sigprocmask+0x69/0xa1 [22635.102985] [] sys_io_submit+0x10/0x12 [22635.102989] [] system_call_fastpath+0x16/0x1b [22635.102995] INFO: task streamRT-sa:5918 blocked for more than 120 seconds. [22635.102997] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message. [22635.103001] streamRT-sa D ffff883f53733a48 0 5918 5114 0x00000004 [22635.103007] ffff884063d99b28 0000000000000082 0000000000000000 ffff88406668b1c0 [22635.103017] 0000000000000000 0000000000000000 00000000000122c0 00000000000122c0 [22635.103029] ffff884063d99fd8 ffff884063d98000 00000000000122c0 ffff884063d98000 [22635.103037] Call Trace: [22635.103042] [] schedule+0x64/0x66 [22635.103047] [] rwsem_down_failed_common+0xdb/0x10d [22635.103050] [] rwsem_down_write_failed+0x13/0x15 [22635.103054] [] call_rwsem_down_write_failed+0x13/0x20 [22635.103058] [] ? down_write+0x25/0x27 [22635.103065] [] xfs_ilock+0x4f/0xb4 [xfs] [22635.103072] [] xfs_rw_ilock+0x2c/0x33 [xfs] [22635.103076] [] ? _raw_spin_unlock_irq+0x27/0x32 [22635.103086] [] xfs_file_aio_write_checks+0x41/0xfe [xfs] [22635.103092] [] xfs_file_dio_aio_write+0x103/0x1fc [xfs] [22635.103099] [] xfs_file_aio_write+0x152/0x1b5 [xfs] [22635.103109] [] ? xfs_file_buffered_aio_write+0x179/0x179 [xfs] [22635.103113] [] aio_rw_vect_retry+0x85/0x18a [22635.103120] [] ? aio_fsync+0x29/0x29 [22635.103126] [] aio_run_iocb+0x7b/0x149 [22635.103129] [] io_submit_one+0x199/0x1f3 [22635.103134] [] do_io_submit+0xfa/0x271 [22635.103139] [] ? sys_rt_sigprocmask+0x69/0xa1 [22635.103142] [] sys_io_submit+0x10/0x12 [22635.103146] [] system_call_fastpath+0x16/0x1b # ps -ef UID PID PPID C STIME TTY TIME CMD root 1 0 0 Aug25 ? 00:00:05 init [3] root 2 0 0 Aug25 ? 00:00:00 [kthreadd] root 3 2 0 Aug25 ? 00:00:00 [ksoftirqd/0] root 6 2 0 Aug25 ? 00:00:00 [migration/0] root 7 2 0 Aug25 ? 00:00:00 [rcuc/0] root 8 2 0 Aug25 ? 00:00:00 [rcun/0] root 9 2 0 Aug25 ? 00:00:00 [rcub/0] root 10 2 0 Aug25 ? 00:00:00 [rcun/1] root 11 2 0 Aug25 ? 00:00:00 [rcub/1] root 12 2 0 Aug25 ? 00:00:00 [watchdog/0] root 13 2 0 Aug25 ? 00:00:00 [migration/1] root 15 2 0 Aug25 ? 00:00:00 [rcuc/1] root 16 2 0 Aug25 ? 00:00:00 [ksoftirqd/1] root 18 2 0 Aug25 ? 00:00:00 [watchdog/1] root 19 2 0 Aug25 ? 00:00:00 [migration/2] root 20 2 0 Aug25 ? 00:00:00 [kworker/2:0] root 21 2 0 Aug25 ? 00:00:00 [rcuc/2] root 22 2 0 Aug25 ? 00:00:00 [ksoftirqd/2] root 23 2 0 Aug25 ? 00:00:00 [watchdog/2] root 24 2 0 Aug25 ? 00:00:00 [migration/3] root 26 2 0 Aug25 ? 00:00:00 [rcuc/3] root 27 2 0 Aug25 ? 00:00:00 [ksoftirqd/3] root 28 2 0 Aug25 ? 00:00:00 [watchdog/3] root 29 2 0 Aug25 ? 00:00:00 [migration/4] root 30 2 0 Aug25 ? 00:00:00 [kworker/4:0] root 31 2 0 Aug25 ? 00:00:00 [rcuc/4] root 32 2 0 Aug25 ? 00:00:00 [ksoftirqd/4] root 33 2 0 Aug25 ? 00:00:00 [watchdog/4] root 34 2 0 Aug25 ? 00:00:00 [migration/5] root 36 2 0 Aug25 ? 00:00:00 [rcuc/5] root 37 2 0 Aug25 ? 00:00:00 [ksoftirqd/5] root 38 2 0 Aug25 ? 00:00:00 [watchdog/5] root 39 2 0 Aug25 ? 00:00:00 [migration/6] root 40 2 0 Aug25 ? 00:00:00 [kworker/6:0] root 41 2 0 Aug25 ? 00:00:00 [rcuc/6] root 42 2 0 Aug25 ? 00:00:00 [ksoftirqd/6] root 43 2 0 Aug25 ? 00:00:00 [watchdog/6] root 44 2 0 Aug25 ? 00:00:00 [migration/7] root 45 2 0 Aug25 ? 00:00:00 [kworker/7:0] root 46 2 0 Aug25 ? 00:00:00 [rcuc/7] root 47 2 0 Aug25 ? 00:00:00 [ksoftirqd/7] root 48 2 0 Aug25 ? 00:00:00 [watchdog/7] root 49 2 0 Aug25 ? 00:00:00 [migration/8] root 50 2 0 Aug25 ? 00:00:00 [kworker/8:0] root 51 2 0 Aug25 ? 00:00:00 [rcuc/8] root 52 2 0 Aug25 ? 00:00:00 [ksoftirqd/8] root 53 2 0 Aug25 ? 00:00:00 [watchdog/8] root 54 2 0 Aug25 ? 00:00:00 [migration/9] root 56 2 0 Aug25 ? 00:00:00 [rcuc/9] root 57 2 0 Aug25 ? 00:00:00 [ksoftirqd/9] root 58 2 0 Aug25 ? 00:00:00 [watchdog/9] root 59 2 0 Aug25 ? 00:00:00 [migration/10] root 60 2 0 Aug25 ? 00:00:00 [kworker/10:0] root 61 2 0 Aug25 ? 00:00:00 [rcuc/10] root 62 2 0 Aug25 ? 00:00:00 [ksoftirqd/10] root 63 2 0 Aug25 ? 00:00:00 [watchdog/10] root 64 2 0 Aug25 ? 00:00:00 [migration/11] root 66 2 0 Aug25 ? 00:00:00 [rcuc/11] root 67 2 0 Aug25 ? 00:00:00 [ksoftirqd/11] root 68 2 0 Aug25 ? 00:00:00 [watchdog/11] root 69 2 0 Aug25 ? 00:00:00 [migration/12] root 70 2 0 Aug25 ? 00:00:00 [kworker/12:0] root 71 2 0 Aug25 ? 00:00:00 [rcuc/12] root 72 2 0 Aug25 ? 00:00:00 [ksoftirqd/12] root 73 2 0 Aug25 ? 00:00:00 [watchdog/12] root 74 2 0 Aug25 ? 00:00:00 [migration/13] root 76 2 0 Aug25 ? 00:00:00 [rcuc/13] root 77 2 0 Aug25 ? 00:00:00 [ksoftirqd/13] root 78 2 0 Aug25 ? 00:00:00 [watchdog/13] root 79 2 0 Aug25 ? 00:00:00 [migration/14] root 80 2 0 Aug25 ? 00:00:00 [kworker/14:0] root 81 2 0 Aug25 ? 00:00:00 [rcuc/14] root 82 2 0 Aug25 ? 00:00:00 [ksoftirqd/14] root 83 2 0 Aug25 ? 00:00:00 [watchdog/14] root 84 2 0 Aug25 ? 00:00:00 [migration/15] root 86 2 0 Aug25 ? 00:00:00 [rcuc/15] root 87 2 0 Aug25 ? 00:00:00 [ksoftirqd/15] root 88 2 0 Aug25 ? 00:00:00 [watchdog/15] root 89 2 0 Aug25 ? 00:00:00 [migration/16] root 90 2 0 Aug25 ? 00:00:00 [kworker/16:0] root 91 2 0 Aug25 ? 00:00:00 [rcuc/16] root 92 2 0 Aug25 ? 00:00:00 [rcun/2] root 93 2 0 Aug25 ? 00:00:00 [rcub/2] root 94 2 0 Aug25 ? 00:00:00 [ksoftirqd/16] root 95 2 0 Aug25 ? 00:00:00 [watchdog/16] root 96 2 0 Aug25 ? 00:00:00 [migration/17] root 98 2 0 Aug25 ? 00:00:00 [rcuc/17] root 99 2 0 Aug25 ? 00:00:00 [ksoftirqd/17] root 100 2 0 Aug25 ? 00:00:00 [watchdog/17] root 101 2 0 Aug25 ? 00:00:00 [migration/18] root 102 2 0 Aug25 ? 00:00:00 [kworker/18:0] root 103 2 0 Aug25 ? 00:00:00 [rcuc/18] root 104 2 0 Aug25 ? 00:00:00 [ksoftirqd/18] root 105 2 0 Aug25 ? 00:00:00 [watchdog/18] root 106 2 0 Aug25 ? 00:00:00 [migration/19] root 107 2 0 Aug25 ? 00:00:00 [kworker/19:0] root 108 2 0 Aug25 ? 00:00:00 [rcuc/19] root 109 2 0 Aug25 ? 00:00:00 [ksoftirqd/19] root 110 2 0 Aug25 ? 00:00:00 [watchdog/19] root 111 2 0 Aug25 ? 00:00:00 [migration/20] root 112 2 0 Aug25 ? 00:00:00 [kworker/20:0] root 113 2 0 Aug25 ? 00:00:00 [rcuc/20] root 114 2 0 Aug25 ? 00:00:00 [ksoftirqd/20] root 115 2 0 Aug25 ? 00:00:00 [watchdog/20] root 116 2 0 Aug25 ? 00:00:00 [migration/21] root 117 2 0 Aug25 ? 00:00:00 [kworker/21:0] root 118 2 0 Aug25 ? 00:00:00 [rcuc/21] root 119 2 0 Aug25 ? 00:00:00 [ksoftirqd/21] root 120 2 0 Aug25 ? 00:00:00 [watchdog/21] root 121 2 0 Aug25 ? 00:00:00 [migration/22] root 122 2 0 Aug25 ? 00:00:00 [kworker/22:0] root 123 2 0 Aug25 ? 00:00:00 [rcuc/22] root 124 2 0 Aug25 ? 00:00:00 [ksoftirqd/22] root 125 2 0 Aug25 ? 00:00:00 [watchdog/22] root 126 2 0 Aug25 ? 00:00:00 [migration/23] root 128 2 0 Aug25 ? 00:00:00 [rcuc/23] root 129 2 0 Aug25 ? 00:00:00 [ksoftirqd/23] root 130 2 0 Aug25 ? 00:00:00 [watchdog/23] root 131 2 0 Aug25 ? 00:00:00 [migration/24] root 132 2 0 Aug25 ? 00:00:00 [kworker/24:0] root 133 2 0 Aug25 ? 00:00:00 [rcuc/24] root 134 2 0 Aug25 ? 00:00:00 [ksoftirqd/24] root 135 2 0 Aug25 ? 00:00:00 [watchdog/24] root 136 2 0 Aug25 ? 00:00:00 [migration/25] root 138 2 0 Aug25 ? 00:00:00 [rcuc/25] root 139 2 0 Aug25 ? 00:00:00 [ksoftirqd/25] root 140 2 0 Aug25 ? 00:00:00 [watchdog/25] root 141 2 0 Aug25 ? 00:00:00 [migration/26] root 142 2 0 Aug25 ? 00:00:00 [kworker/26:0] root 143 2 0 Aug25 ? 00:00:00 [rcuc/26] root 144 2 0 Aug25 ? 00:00:00 [ksoftirqd/26] root 145 2 0 Aug25 ? 00:00:00 [watchdog/26] root 146 2 0 Aug25 ? 00:00:00 [migration/27] root 147 2 0 Aug25 ? 00:00:00 [kworker/27:0] root 148 2 0 Aug25 ? 00:00:00 [rcuc/27] root 149 2 0 Aug25 ? 00:00:00 [ksoftirqd/27] root 150 2 0 Aug25 ? 00:00:00 [watchdog/27] root 151 2 0 Aug25 ? 00:00:00 [migration/28] root 152 2 0 Aug25 ? 00:00:00 [kworker/28:0] root 153 2 0 Aug25 ? 00:00:00 [rcuc/28] root 154 2 0 Aug25 ? 00:00:00 [ksoftirqd/28] root 155 2 0 Aug25 ? 00:00:00 [watchdog/28] root 156 2 0 Aug25 ? 00:00:00 [migration/29] root 157 2 0 Aug25 ? 00:00:00 [kworker/29:0] root 158 2 0 Aug25 ? 00:00:00 [rcuc/29] root 159 2 0 Aug25 ? 00:00:00 [ksoftirqd/29] root 160 2 0 Aug25 ? 00:00:00 [watchdog/29] root 161 2 0 Aug25 ? 00:00:00 [migration/30] root 162 2 0 Aug25 ? 00:00:00 [kworker/30:0] root 163 2 0 Aug25 ? 00:00:00 [rcuc/30] root 164 2 0 Aug25 ? 00:00:00 [ksoftirqd/30] root 165 2 0 Aug25 ? 00:00:00 [watchdog/30] root 166 2 0 Aug25 ? 00:00:00 [migration/31] root 167 2 0 Aug25 ? 00:00:00 [kworker/31:0] root 168 2 0 Aug25 ? 00:00:00 [rcuc/31] root 169 2 0 Aug25 ? 00:00:00 [ksoftirqd/31] root 170 2 0 Aug25 ? 00:00:00 [watchdog/31] root 171 2 0 Aug25 ? 00:00:00 [cpuset] root 172 2 0 Aug25 ? 00:00:00 [khelper] root 173 2 0 Aug25 ? 00:00:00 [netns] root 418 2 0 Aug25 ? 00:00:00 [sync_supers] root 420 2 0 Aug25 ? 00:00:00 [bdi-default] root 422 2 0 Aug25 ? 00:00:00 [kblockd] root 714 2 0 Aug25 ? 00:00:00 [ata_sff] root 724 2 0 Aug25 ? 00:00:00 [khubd] root 733 2 0 Aug25 ? 00:00:00 [kworker/30:1] root 735 2 0 Aug25 ? 00:00:00 [kworker/28:1] root 737 2 0 Aug25 ? 00:00:00 [kworker/26:1] root 739 2 0 Aug25 ? 00:00:00 [kworker/24:1] root 741 2 0 Aug25 ? 00:00:00 [kworker/22:1] root 743 2 0 Aug25 ? 00:00:00 [kworker/20:1] root 745 2 0 Aug25 ? 00:00:00 [kworker/18:1] root 747 2 0 Aug25 ? 00:00:00 [kworker/16:1] root 749 2 0 Aug25 ? 00:00:00 [kworker/14:1] root 751 2 0 Aug25 ? 00:00:00 [kworker/12:1] root 757 2 0 Aug25 ? 00:00:00 [kworker/10:1] root 759 2 0 Aug25 ? 00:00:00 [kworker/8:1] root 761 2 0 Aug25 ? 00:00:00 [kworker/6:1] root 763 2 0 Aug25 ? 00:00:00 [kworker/4:1] root 866 2 0 Aug25 ? 00:00:00 [rpciod] root 868 2 0 Aug25 ? 00:00:00 [kworker/2:1] root 975 2 0 Aug25 ? 00:00:00 [khungtaskd] root 981 2 0 Aug25 ? 00:00:00 [kswapd0] root 982 2 0 Aug25 ? 00:00:00 [khugepaged] root 983 2 0 Aug25 ? 00:00:00 [fsnotify_mark] root 984 2 0 Aug25 ? 00:00:00 [nfsiod] root 986 2 0 Aug25 ? 00:00:00 [crypto] root 1151 2 0 Aug25 ? 00:00:00 [kpsmoused] root 1167 2 0 Aug25 ? 00:00:00 [deferwq] root 1913 2 0 Aug25 ? 00:00:00 [bond0] root 2144 1 0 Aug25 ? 00:00:00 udevd --daemon root 2525 2 0 Aug25 ? 00:00:00 [scsi_eh_0] root 2537 2 0 Aug25 ? 00:00:00 [mlx4] root 2540 2 0 Aug25 ? 00:00:00 [scsi_eh_1] root 2541 2 0 Aug25 ? 00:00:00 [fw_event0] root 2595 2 0 Aug25 ? 00:00:00 [scsi_eh_2] root 2596 2 0 Aug25 ? 00:00:00 [scsi_eh_3] root 2597 2 0 Aug25 ? 00:00:00 [scsi_eh_4] root 2598 2 0 Aug25 ? 00:00:00 [scsi_eh_5] root 2599 2 0 Aug25 ? 00:00:00 [scsi_eh_6] root 2600 2 0 Aug25 ? 00:00:00 [scsi_eh_7] root 2667 2 0 Aug25 ? 00:00:00 [mlx4_en] root 2797 2144 0 Aug25 ? 00:00:00 udevd --daemon root 2798 2144 0 Aug25 ? 00:00:00 udevd --daemon root 2800 2 0 Aug25 ? 00:00:00 [mlx4_en] root 2817 2 0 Aug25 ? 00:00:00 [mlx4_en] root 2843 2 0 Aug25 ? 00:00:00 [poll_0_status] root 2844 2 0 Aug25 ? 00:00:00 [scsi_eh_8] root 2846 2 0 Aug25 ? 00:00:00 [fw_event1] root 2860 2 0 Aug25 ? 00:00:00 [poll_1_status] root 2861 2 0 Aug25 ? 00:00:00 [scsi_eh_9] root 2862 2 0 Aug25 ? 00:00:00 [fw_event2] root 2864 2 0 Aug25 ? 00:00:00 [poll_2_status] root 2865 2 0 Aug25 ? 00:00:00 [scsi_eh_10] root 2866 2 0 Aug25 ? 00:00:00 [fw_event3] root 2867 2 0 Aug25 ? 00:00:00 [poll_3_status] root 4059 2 0 Aug25 ? 00:00:00 [bond1] root 4464 2 0 Aug25 ? 00:00:00 [kdmflush] root 4470 2 0 Aug25 ? 00:00:00 [kdmflush] root 4476 2 0 Aug25 ? 00:00:00 [kdmflush] root 4482 2 0 Aug25 ? 00:00:00 [kdmflush] root 4488 2 0 Aug25 ? 00:00:00 [kdmflush] root 4494 2 0 Aug25 ? 00:00:00 [kdmflush] root 4500 2 0 Aug25 ? 00:00:00 [kdmflush] root 4506 2 0 Aug25 ? 00:00:00 [kdmflush] root 4512 2 0 Aug25 ? 00:00:00 [kdmflush] root 4518 2 0 Aug25 ? 00:00:00 [kdmflush] root 4527 2 0 Aug25 ? 00:00:00 [jbd2/dm-4-8] root 4528 2 0 Aug25 ? 00:00:00 [ext4-dio-unwrit] root 4593 1 0 Aug25 ? 00:00:00 /usr/sbin/rsyslogd -c5 root 4627 1 0 Aug25 ? 00:00:00 /usr/sbin/sshd root 4645 1 0 Aug25 ? 00:00:00 /usr/sbin/acpid root 4683 1 0 Aug25 ? 00:00:00 /usr/sbin/cron ntp 4713 1 0 Aug25 ? 00:00:00 /usr/sbin/ntpd -g -c /etc/ntp.conf -p /var/run/ntpd.pid -u ntp:ntp daemon 4747 1 0 Aug25 ? 00:00:00 /sbin/portmap root 4773 1 0 Aug25 ? 00:00:00 /sbin/rpc.statd root 4796 1 0 Aug25 ttyS0 00:00:00 /sbin/getty -L 115200 ttyS0 vt100 root 4797 1 0 Aug25 ? 00:00:22 initBC root 4908 2 0 Aug25 ? 00:00:00 [xfsalloc] root 4909 2 0 Aug25 ? 00:00:00 [xfs_mru_cache] root 4910 2 0 Aug25 ? 00:00:00 [xfslogd] root 4930 2 0 Aug25 ? 00:00:00 [xfsbufd/sdc] root 4931 2 0 Aug25 ? 00:00:00 [xfs-data/sdc] root 4932 2 0 Aug25 ? 00:00:00 [xfs-conv/sdc] root 4933 2 0 Aug25 ? 00:00:01 [xfsaild/sdc] root 4935 2 0 Aug25 ? 00:00:00 [xfsbufd/sdd] root 4936 2 0 Aug25 ? 00:00:00 [xfs-data/sdd] root 4937 2 0 Aug25 ? 00:00:00 [xfs-conv/sdd] root 4938 2 0 Aug25 ? 00:00:01 [xfsaild/sdd] root 5115 1 6 Aug25 ? 00:11:28 [streamRT-sa] root 6582 2 0 Aug25 ? 00:00:00 [kworker/1:2] root 6633 2 0 Aug25 ? 00:00:00 [kworker/23:1] root 6636 2 0 Aug25 ? 00:00:00 [kworker/15:0] root 6640 2 0 Aug25 ? 00:00:00 [kworker/29:2] root 6647 2 0 Aug25 ? 00:00:00 [kworker/3:1] root 6649 2 0 Aug25 ? 00:00:00 [kworker/25:2] root 6654 2 0 Aug25 ? 00:00:00 [kworker/1:0] root 6658 2 0 Aug25 ? 00:00:00 [kworker/19:1] root 6659 2 0 Aug25 ? 00:00:00 [kworker/21:1] root 6661 2 0 Aug25 ? 00:00:00 [kworker/27:2] root 6662 2 0 Aug25 ? 00:00:00 [kworker/15:2] root 6663 2 0 Aug25 ? 00:00:00 [kworker/5:2] root 6666 2 0 Aug25 ? 00:00:00 [kworker/31:2] root 6671 2 0 Aug25 ? 00:00:00 [kworker/0:4] root 6673 2 0 Aug25 ? 00:00:00 [kworker/7:3] root 6677 2 0 Aug25 ? 00:00:00 [kworker/0:6] root 6678 2 0 Aug25 ? 00:00:00 [kworker/0:7] root 6681 2 0 Aug25 ? 00:00:00 [kworker/0:10] root 6684 2 0 Aug25 ? 00:00:00 [kworker/13:5] root 6690 2 0 Aug25 ? 00:00:00 [kworker/9:4] root 6695 2 0 Aug25 ? 00:00:00 [kworker/7:5] root 6696 2 0 Aug25 ? 00:00:00 [kworker/13:7] root 6697 2 0 Aug25 ? 00:00:00 [kworker/9:6] root 6702 2 0 Aug25 ? 00:00:00 [kworker/0:11] root 6705 2 0 Aug25 ? 00:00:00 [kworker/0:14] root 6707 2 0 Aug25 ? 00:00:00 [kworker/0:16] root 6719 2 0 Aug25 ? 00:00:00 [kworker/0:24] root 6721 2 0 Aug25 ? 00:00:00 [kworker/0:26] root 6723 2 0 Aug25 ? 00:00:00 [kworker/9:8] root 6726 2 0 Aug25 ? 00:00:00 [kworker/31:5] root 6731 2 0 Aug25 ? 00:00:00 [kworker/1:7] root 6734 2 0 Aug25 ? 00:00:00 [kworker/11:6] root 6736 2 0 Aug25 ? 00:00:00 [kworker/13:10] root 6740 2 0 Aug25 ? 00:00:00 [kworker/0:30] root 6741 2 0 Aug25 ? 00:00:00 [kworker/0:31] root 6745 2 0 Aug25 ? 00:00:00 [kworker/9:9] root 6748 2 0 Aug25 ? 00:00:00 [kworker/0:36] root 6749 2 0 Aug25 ? 00:00:00 [kworker/19:3] root 6753 2 0 Aug25 ? 00:00:00 [kworker/23:3] root 6757 2 0 Aug25 ? 00:00:00 [kworker/13:12] root 6758 2 0 Aug25 ? 00:00:00 [kworker/7:6] root 6761 2 0 Aug25 ? 00:00:00 [kworker/0:41] root 6767 2 0 Aug25 ? 00:00:00 [kworker/0:44] root 6768 2 0 Aug25 ? 00:00:00 [kworker/5:7] root 6769 2 0 Aug25 ? 00:00:00 [kworker/1:9] root 6770 2 0 Aug25 ? 00:00:00 [kworker/0:45] root 6774 2 0 Aug25 ? 00:00:00 [kworker/17:7] root 6776 2 0 Aug25 ? 00:00:00 [kworker/3:4] root 6779 2 0 Aug25 ? 00:00:00 [kworker/11:9] root 6781 2 0 Aug25 ? 00:00:00 [kworker/0:50] root 6787 2 0 Aug25 ? 00:00:00 [kworker/0:53] root 6788 2 0 Aug25 ? 00:00:00 [kworker/25:1] root 6793 2 0 Aug25 ? 00:00:00 [kworker/1:10] root 6795 2 0 Aug25 ? 00:00:00 [kworker/27:4] root 6797 2 0 Aug25 ? 00:00:00 [kworker/0:57] root 6798 2 0 Aug25 ? 00:00:00 [kworker/0:58] root 6806 2 0 Aug25 ? 00:00:00 [kworker/15:5] root 6807 2 0 Aug25 ? 00:00:00 [kworker/0:62] root 6808 2 0 Aug25 ? 00:00:00 [kworker/0:63] root 6809 2 0 Aug25 ? 00:00:00 [kworker/17:8] root 6814 2 0 Aug25 ? 00:00:00 [kworker/0:66] root 6815 2 0 Aug25 ? 00:00:01 [kworker/0:67] root 6819 2 0 Aug25 ? 00:00:00 [kworker/0:69] root 6824 2 0 Aug25 ? 00:00:00 [kworker/25:3] root 6895 2 0 00:20 ? 00:00:00 [kworker/u:0] root 6900 2 0 00:26 ? 00:00:00 [kworker/u:1] root 6904 2 0 00:57 ? 00:00:00 [flush-0:20] root 6933 2 0 01:00 ? 00:00:00 [kworker/u:2] root 6934 4627 0 01:02 ? 00:00:00 sshd: iris [priv] iris 6936 6934 0 01:02 ? 00:00:00 sshd: iris@pts/1 iris 6937 6936 0 01:02 pts/1 00:00:00 -bash root 6967 6937 0 01:02 pts/1 00:00:00 sudo su root 6968 6967 0 01:02 pts/1 00:00:00 su root 6969 6968 0 01:02 pts/1 00:00:00 bash root 6976 6969 0 01:04 pts/1 00:00:00 ps -ef # lsof|grep stream lsof: WARNING: can't stat() xfs file system /mnt/VOL1 Output information may be incomplete. bash 6937 iris cwd DIR 0,20 4096 2113547 /iris/home/adrian/streamRT (mbc:/iris) sudo 6967 root cwd DIR 0,20 4096 2113547 /iris/home/adrian/streamRT (mbc:/iris) su 6968 root cwd DIR 0,20 4096 2113547 /iris/home/adrian/streamRT (mbc:/iris) bash 6969 root cwd DIR 0,20 4096 2113547 /iris/home/adrian/streamRT (mbc:/iris) -- Stan From stan@hardwarefreak.com Tue Aug 26 01:26: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 (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id CA9C17F3F for ; Tue, 26 Aug 2014 01:26:05 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 7075F8F8037 for ; Mon, 25 Aug 2014 23:26:02 -0700 (PDT) X-ASG-Debug-ID: 1409034360-04bdf0109a500d10001-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 Lc03Q6opbIlPUPBR for ; Mon, 25 Aug 2014 23:26: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: by greer.hardwarefreak.com (Postfix, from userid 33) id 0AAC56C192; Tue, 26 Aug 2014 01:25:59 -0500 (CDT) To: Stan Hoeppner Subject: Re: storage, libaio, or XFS =?UTF-8?Q?problem=3F=20=20=33=2E=34=2E=32=36?= X-PHP-Originating-Script: 0:func.inc X-ASG-Orig-Subj: Re: storage, libaio, or XFS =?UTF-8?Q?problem=3F=20=20=33=2E=34=2E=32=36?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Date: Tue, 26 Aug 2014 01:25:59 -0500 From: Stan Hoeppner Cc: In-Reply-To: <3fe8c34c0ccbbd720015d273fa2b8b30@localhost> References: <3fe8c34c0ccbbd720015d273fa2b8b30@localhost> Message-ID: <75371e88cb16c05079ea5211fe7378e6@localhost> X-Sender: stan@hardwarefreak.com User-Agent: RoundCube Webmail/0.3.1 X-Barracuda-Connect: mo-65-41-216-221.sta.embarqhsd.net[65.41.216.221] X-Barracuda-Start-Time: 1409034360 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 Forgot to mention: load average: 171.00, 171.00, 170.95 And that's with all processes idle for over 30 minutes. So I'm thinking bug. Probably has been fixed between .26 and .103 but they're stubborn about sticking with this 3.4.26 kernel, not because they have an affinity for it, but because of their slow process. On Tue, 26 Aug 2014 01:18:50 -0500, Stan Hoeppner wrote: > Had some controller issues but believe we had those ironed out before this > recent breakage. I had reformatted both 48TB LUNs on this test box with -f > and defaults, and fired up the test app again. Throughput was fantastic > with no dropped application buffers for ~30 minutes, and IO times were 1.x > ms max, suggesting all the writes were acked by controller cache. The app > was running perfectly. Then it hanged and spit out an internal error msg: > > > Failed to reopen file /mnt/VOL1/sg-04/str-0015/f-0000000005 > > I have many call traces in dmesg, most are XFS, pasted below. I found no > SCSI I/O errors in dmesg. Application is submitting writes via libaio and > using O_DIRECT, writing to preallocated files. I don't see any errors in > the storage controller log and everything seems to check out there. Using > noop elevator, mpt2sas, no multipathing. The application process is hung > in d state and kill -9 won't get rid of it. I can't unmount the hosed up > filesystem. Any ideas? > > # ls -la /mnt/VOL1 > ls: cannot access /mnt/VOL1: Input/output error > > # dd if=/mnt/VOL1 of=/dev/null bs=1M count=16 > dd: opening `/mnt/VOL1': Input/output error > > # dd if=/dev/sdd of=/dev/null bs=1M count=16 > 16+0 records in > 16+0 records out > 16777216 bytes (17 MB) copied, 1.10989 s, 15.1 MB/s > > # ls -la /mnt/ > ls: cannot access /mnt/VOL1: Input/output error > total 8 > drwxrwxrwt 6 root root 120 Aug 25 17:59 . > drwxr-xr-x 21 root root 4096 Jul 15 09:39 .. > drwxrwxrwt 3 root root 80 Aug 25 16:52 initramfs > drwxr-xr-x 3 root root 4096 Apr 24 04:57 scratch > drwxrwxrwx 5 root root 58 Aug 25 22:06 VOL0 > d????????? ? ? ? ? ? VOL1 > > # umount /mnt/VOL1 > umount: /mnt/VOL1: device is busy. > (In some cases useful info about processes that use > the device is found by lsof(8) or fuser(1)) > > > > Kernel 3.4.26 > xfs_repair version 3.1.4 > 2 socket, 20 core Xeon(R) CPU E5-2650 v2 @ 2.60GHz > > MemTotal: 264573184 kB > MemFree: 246519624 kB > Buffers: 16820 kB > Cached: 78120 kB > SwapCached: 0 kB > Active: 13130040 kB > Inactive: 75352 kB > Active(anon): 13110512 kB > Inactive(anon): 276 kB > Active(file): 19528 kB > Inactive(file): 75076 kB > Unevictable: 0 kB > Mlocked: 0 kB > SwapTotal: 0 kB > SwapFree: 0 kB > Dirty: 0 kB > Writeback: 0 kB > AnonPages: 13126968 kB > Mapped: 11848 kB > Shmem: 340 kB > Slab: 208476 kB > SReclaimable: 118240 kB > SUnreclaim: 90236 kB > KernelStack: 3976 kB > PageTables: 32840 kB > NFS_Unstable: 0 kB > Bounce: 0 kB > WritebackTmp: 0 kB > CommitLimit: 132286592 kB > Committed_AS: 25044716 kB > VmallocTotal: 34359738367 kB > VmallocUsed: 1050608 kB > VmallocChunk: 34358680400 kB > AnonHugePages: 13078528 kB > HugePages_Total: 0 > HugePages_Free: 0 > HugePages_Rsvd: 0 > HugePages_Surp: 0 > Hugepagesize: 2048 kB > DirectMap4k: 5056 kB > DirectMap2M: 2045952 kB > DirectMap1G: 266338304 kB > > /dev/sdc /mnt/VOL0 xfs > rw,noatime,nodiratime,attr2,nobarrier,inode64,noquota 0 0 > /dev/sdd /mnt/VOL1 xfs > rw,noatime,nodiratime,attr2,nobarrier,inode64,noquota 0 0 > > major minor #blocks name > 8 32 46837141504 sdc > 8 48 46837141504 sdd > > 2x hardware RAID5 LUNs - 64KB su, 768KB sw > 2 controllers, one per LUN, 3GB cache each, write back, FPGA RAID engine > No LVM. LUNs directly formatted with XFS > 26 Seagate SAS 3.5" 7.2K drives, 13 per RAID5, drive caches disabled > My counterpart had what I'd guess is this same problem on the full test > rig, > which has 16 of these LUNS, 208 drives total. He was also testing with > libaio. > I have not dug into the logs on that host as of yet. Its config is > identical > to this box but for the number of LUNs, drives. > > > [22635.102013] INFO: task kworker/7:0:45 blocked for more than 120 > seconds. > [22635.102016] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables > this message. > [22635.102018] kworker/7:0 D ffff8840666c0b08 0 45 2 > 0x00000000 > [22635.102021] ffff8840666e7bd0 0000000000000046 ffff883f7c02d000 > ffff8840666f5180 > [22635.102026] ffff8840666e7b80 0000000000000206 00000000000122c0 > 00000000000122c0 > [22635.102030] ffff8840666e7fd8 ffff8840666e6000 00000000000122c0 > ffff8840666e6000 > [22635.102033] Call Trace: > [22635.102041] [] schedule+0x64/0x66 > [22635.102044] [] rwsem_down_failed_common+0xdb/0x10d > [22635.102047] [] rwsem_down_write_failed+0x13/0x15 > [22635.102051] [] > call_rwsem_down_write_failed+0x13/0x20 > [22635.102055] [] ? > _raw_spin_unlock_irqrestore+0x30/0x3d > [22635.102058] [] ? down_write+0x25/0x27 > [22635.102070] [] xfs_ilock+0x4f/0xb4 [xfs] > [22635.102077] [] xfs_iomap_write_unwritten+0x1b3/0x32e > [xfs] > [22635.102080] [] ? > _raw_spin_unlock_irqrestore+0x30/0x3d > [22635.102084] [] ? xfs_setfilesize+0x128/0x128 [xfs] > [22635.102088] [] ? mempool_free+0x73/0x78 > [22635.102093] [] ? xfs_setfilesize+0x128/0x128 [xfs] > [22635.102098] [] xfs_end_io+0x89/0xb4 [xfs] > [22635.102102] [] process_one_work+0x204/0x327 > [22635.102105] [] worker_thread+0x13b/0x25a > [22635.102108] [] ? process_one_work+0x327/0x327 > [22635.102111] [] kthread+0x89/0x91 > [22635.102115] [] kernel_thread_helper+0x4/0x10 > [22635.102118] [] ? __init_kthread_worker+0x3c/0x3c > [22635.102120] [] ? gs_change+0xb/0xb > [22635.102131] INFO: task streamRT-sa:5891 blocked for more than 120 > seconds. > [22635.102132] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables > this message. > [22635.102134] streamRT-sa D ffff883f52850348 0 5891 5114 > 0x00000004 > [22635.102136] ffff884063af5b28 0000000000000082 000000000000029c > ffff884066679100 > [22635.102140] 0000000000000006 0000000000000001 00000000000122c0 > 00000000000122c0 > [22635.102143] ffff884063af5fd8 ffff884063af4000 00000000000122c0 > ffff884063af4000 > [22635.102146] Call Trace: > [22635.102149] [] schedule+0x64/0x66 > [22635.102151] [] rwsem_down_failed_common+0xdb/0x10d > [22635.102154] [] rwsem_down_write_failed+0x13/0x15 > [22635.102156] [] > call_rwsem_down_write_failed+0x13/0x20 > [22635.102158] [] ? down_write+0x25/0x27 > [22635.102164] [] xfs_ilock+0x4f/0xb4 [xfs] > [22635.102170] [] xfs_rw_ilock+0x2c/0x33 [xfs] > [22635.102172] [] ? _raw_spin_unlock_irq+0x27/0x32 > [22635.102178] [] xfs_file_aio_write_checks+0x41/0xfe > [xfs] > [22635.102184] [] xfs_file_dio_aio_write+0x103/0x1fc > [xfs] > [22635.102189] [] xfs_file_aio_write+0x152/0x1b5 [xfs] > [22635.102195] [] ? > xfs_file_buffered_aio_write+0x179/0x179 [xfs] > [22635.102199] [] aio_rw_vect_retry+0x85/0x18a > [22635.102202] [] ? aio_fsync+0x29/0x29 > [22635.102204] [] aio_run_iocb+0x7b/0x149 > [22635.102207] [] io_submit_one+0x199/0x1f3 > [22635.102209] [] do_io_submit+0xfa/0x271 > [22635.102212] [] sys_io_submit+0x10/0x12 > [22635.102215] [] system_call_fastpath+0x16/0x1b > [22635.102217] INFO: task streamRT-sa:5895 blocked for more than 120 > seconds. > [22635.102218] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables > this message. > [22635.102219] streamRT-sa D ffff883f537fa3c8 0 5895 5114 > 0x00000004 > [22635.102222] ffff883f7d057b28 0000000000000082 0000000000000000 > ffff884066227100 > [22635.102225] ffff883f7d057ad8 0000000000000002 00000000000122c0 > 00000000000122c0 > [22635.102228] ffff883f7d057fd8 ffff883f7d056000 00000000000122c0 > ffff883f7d056000 > [22635.102232] Call Trace: > [22635.102234] [] schedule+0x64/0x66 > [22635.102236] [] rwsem_down_failed_common+0xdb/0x10d > [22635.102239] [] rwsem_down_write_failed+0x13/0x15 > [22635.102241] [] > call_rwsem_down_write_failed+0x13/0x20 > [22635.102243] [] ? down_write+0x25/0x27 > [22635.102249] [] xfs_ilock+0x4f/0xb4 [xfs] > [22635.102254] [] xfs_rw_ilock+0x2c/0x33 [xfs] > [22635.102257] [] ? > _raw_spin_unlock_irqrestore+0x30/0x3d > [22635.102262] [] xfs_file_aio_write_checks+0x41/0xfe > [xfs] > [22635.102268] [] xfs_file_dio_aio_write+0x103/0x1fc > [xfs] > [22635.102274] [] xfs_file_aio_write+0x152/0x1b5 [xfs] > [22635.102279] [] ? > xfs_file_buffered_aio_write+0x179/0x179 [xfs] > [22635.102282] [] aio_rw_vect_retry+0x85/0x18a > [22635.102284] [] ? aio_fsync+0x29/0x29 > [22635.102286] [] aio_run_iocb+0x7b/0x149 > [22635.102288] [] io_submit_one+0x199/0x1f3 > [22635.102291] [] do_io_submit+0xfa/0x271 > [22635.102294] [] ? sys_rt_sigprocmask+0x69/0xa1 > [22635.102297] [] sys_io_submit+0x10/0x12 > [22635.102299] [] system_call_fastpath+0x16/0x1b > [22635.102301] INFO: task streamRT-sa:5900 blocked for more than 120 > seconds. > [22635.102302] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables > this message. > [22635.102303] streamRT-sa D ffff883f53003b88 0 5900 5114 > 0x00000004 > [22635.102305] ffff883f7d109b28 0000000000000082 0000000000000000 > ffff884066679100 > [22635.102309] ffff883f7d109ad8 0000000000000002 00000000000122c0 > 00000000000122c0 > [22635.102312] ffff883f7d109fd8 ffff883f7d108000 00000000000122c0 > ffff883f7d108000 > [22635.102315] Call Trace: > [22635.102318] [] schedule+0x64/0x66 > [22635.102320] [] rwsem_down_failed_common+0xdb/0x10d > [22635.102322] [] rwsem_down_write_failed+0x13/0x15 > [22635.102324] [] > call_rwsem_down_write_failed+0x13/0x20 > [22635.102327] [] ? down_write+0x25/0x27 > [22635.102332] [] xfs_ilock+0x4f/0xb4 [xfs] > [22635.102338] [] xfs_rw_ilock+0x2c/0x33 [xfs] > [22635.102340] [] ? > _raw_spin_unlock_irqrestore+0x30/0x3d > [22635.102346] [] xfs_file_aio_write_checks+0x41/0xfe > [xfs] > [22635.102351] [] xfs_file_dio_aio_write+0x103/0x1fc > [xfs] > [22635.102357] [] xfs_file_aio_write+0x152/0x1b5 [xfs] > [22635.102362] [] ? resched_task+0x3e/0x75 > [22635.102367] [] ? > xfs_file_buffered_aio_write+0x179/0x179 [xfs] > [22635.102369] [] aio_rw_vect_retry+0x85/0x18a > [22635.102372] [] ? aio_fsync+0x29/0x29 > [22635.102374] [] aio_run_iocb+0x7b/0x149 > [22635.102376] [] io_submit_one+0x199/0x1f3 > [22635.102379] [] do_io_submit+0xfa/0x271 > [22635.102382] [] sys_io_submit+0x10/0x12 > [22635.102384] [] system_call_fastpath+0x16/0x1b > [22635.102386] INFO: task streamRT-sa:5904 blocked for more than 120 > seconds. > [22635.102387] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables > this message. > [22635.102388] streamRT-sa D ffff88405fd50a48 0 5904 5114 > 0x00000004 > [22635.102390] ffff883f51c2bb28 0000000000000082 0000000000000000 > ffff8840662d0080 > [22635.102394] ffff883f51c2bad8 0000000000000002 00000000000122c0 > 00000000000122c0 > [22635.102397] ffff883f51c2bfd8 ffff883f51c2a000 00000000000122c0 > ffff883f51c2a000 > [22635.102400] Call Trace: > [22635.102402] [] schedule+0x64/0x66 > [22635.102405] [] rwsem_down_failed_common+0xdb/0x10d > [22635.102407] [] rwsem_down_write_failed+0x13/0x15 > [22635.102409] [] > call_rwsem_down_write_failed+0x13/0x20 > [22635.102412] [] ? down_write+0x25/0x27 > [22635.102417] [] xfs_ilock+0x4f/0xb4 [xfs] > [22635.102423] [] xfs_rw_ilock+0x2c/0x33 [xfs] > [22635.102425] [] ? > _raw_spin_unlock_irqrestore+0x30/0x3d > [22635.102430] [] xfs_file_aio_write_checks+0x41/0xfe > [xfs] > [22635.102436] [] xfs_file_dio_aio_write+0x103/0x1fc > [xfs] > [22635.102442] [] xfs_file_aio_write+0x152/0x1b5 [xfs] > [22635.102447] [] ? > xfs_file_buffered_aio_write+0x179/0x179 [xfs] > [22635.102450] [] aio_rw_vect_retry+0x85/0x18a > [22635.102452] [] ? aio_fsync+0x29/0x29 > [22635.102454] [] aio_run_iocb+0x7b/0x149 > [22635.102457] [] io_submit_one+0x199/0x1f3 > [22635.102459] [] do_io_submit+0xfa/0x271 > [22635.102461] [] ? sys_rt_sigprocmask+0x69/0xa1 > [22635.102464] [] sys_io_submit+0x10/0x12 > [22635.102466] [] system_call_fastpath+0x16/0x1b > [22635.102468] INFO: task streamRT-sa:5906 blocked for more than 120 > seconds. > [22635.102469] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables > this message. > [22635.102470] streamRT-sa D ffff88405fe2ca88 0 5906 5114 > 0x00000004 > [22635.102473] ffff883f51c2fb28 0000000000000082 0000000000000000 > ffff8840667f00c0 > [22635.102476] 0000000000000000 0000000000000000 00000000000122c0 > 00000000000122c0 > [22635.102479] ffff883f51c2ffd8 ffff883f51c2e000 00000000000122c0 > ffff883f51c2e000 > [22635.102482] Call Trace: > [22635.102485] [] schedule+0x64/0x66 > [22635.102487] [] rwsem_down_failed_common+0xdb/0x10d > [22635.102489] [] rwsem_down_write_failed+0x13/0x15 > [22635.102491] [] > call_rwsem_down_write_failed+0x13/0x20 > [22635.102494] [] ? down_write+0x25/0x27 > [22635.102499] [] xfs_ilock+0x4f/0xb4 [xfs] > [22635.102505] [] xfs_rw_ilock+0x2c/0x33 [xfs] > [22635.102507] [] ? _raw_spin_unlock_irq+0x27/0x32 > [22635.102512] [] xfs_file_aio_write_checks+0x41/0xfe > [xfs] > [22635.102518] [] xfs_file_dio_aio_write+0x103/0x1fc > [xfs] > [22635.102524] [] xfs_file_aio_write+0x152/0x1b5 [xfs] > [22635.102529] [] ? > xfs_file_buffered_aio_write+0x179/0x179 [xfs] > [22635.102532] [] aio_rw_vect_retry+0x85/0x18a > [22635.102534] [] ? aio_fsync+0x29/0x29 > [22635.102536] [] aio_run_iocb+0x7b/0x149 > [22635.102538] [] io_submit_one+0x199/0x1f3 > [22635.102541] [] do_io_submit+0xfa/0x271 > [22635.102543] [] ? sys_rt_sigprocmask+0x69/0xa1 > [22635.102545] [] sys_io_submit+0x10/0x12 > [22635.102548] [] system_call_fastpath+0x16/0x1b > [22635.102550] INFO: task streamRT-sa:5908 blocked for more than 120 > seconds. > [22635.102551] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables > this message. > [22635.102552] streamRT-sa D ffff88405fe2fac8 0 5908 5114 > 0x00000004 > [22635.102554] ffff883f518b3b28 0000000000000082 000000000000029c > ffff884066770040 > [22635.102558] 0000000000000006 0000000000000001 00000000000122c0 > 00000000000122c0 > [22635.102561] ffff883f518b3fd8 ffff883f518b2000 00000000000122c0 > ffff883f518b2000 > [22635.102564] Call Trace: > [22635.102566] [] schedule+0x64/0x66 > [22635.102569] [] rwsem_down_failed_common+0xdb/0x10d > [22635.102571] [] rwsem_down_write_failed+0x13/0x15 > [22635.102573] [] > call_rwsem_down_write_failed+0x13/0x20 > [22635.102575] [] ? down_write+0x25/0x27 > [22635.102581] [] xfs_ilock+0x4f/0xb4 [xfs] > [22635.102586] [] xfs_rw_ilock+0x2c/0x33 [xfs] > [22635.102589] [] ? _raw_spin_unlock_irq+0x27/0x32 > [22635.102594] [] xfs_file_aio_write_checks+0x41/0xfe > [xfs] > [22635.102600] [] xfs_file_dio_aio_write+0x103/0x1fc > [xfs] > [22635.102620] [] xfs_file_aio_write+0x152/0x1b5 [xfs] > [22635.102627] [] ? > xfs_file_buffered_aio_write+0x179/0x179 [xfs] > [22635.102630] [] aio_rw_vect_retry+0x85/0x18a > [22635.102637] [] ? aio_fsync+0x29/0x29 > [22635.102641] [] aio_run_iocb+0x7b/0x149 > [22635.102651] [] io_submit_one+0x199/0x1f3 > [22635.102655] [] do_io_submit+0xfa/0x271 > [22635.102661] [] sys_io_submit+0x10/0x12 > [22635.102664] [] system_call_fastpath+0x16/0x1b > [22635.102669] INFO: task streamRT-sa:5909 blocked for more than 120 > seconds. > [22635.102675] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables > this message. > [22635.102677] streamRT-sa D ffff88405fe2f3c8 0 5909 5114 > 0x00000004 > [22635.102683] ffff883f518b5b28 0000000000000082 00000000000000de > ffff88406663a040 > [22635.102694] 0000000000000002 0000000000000001 00000000000122c0 > 00000000000122c0 > [22635.102705] ffff883f518b5fd8 ffff883f518b4000 00000000000122c0 > ffff883f518b4000 > [22635.102719] Call Trace: > [22635.102723] [] schedule+0x64/0x66 > [22635.102729] [] rwsem_down_failed_common+0xdb/0x10d > [22635.102734] [] rwsem_down_write_failed+0x13/0x15 > [22635.102739] [] > call_rwsem_down_write_failed+0x13/0x20 > [22635.102742] [] ? down_write+0x25/0x27 > [22635.102751] [] xfs_ilock+0x4f/0xb4 [xfs] > [22635.102761] [] xfs_rw_ilock+0x2c/0x33 [xfs] > [22635.102765] [] ? _raw_spin_unlock_irq+0x27/0x32 > [22635.102773] [] xfs_file_aio_write_checks+0x41/0xfe > [xfs] > [22635.102781] [] xfs_file_dio_aio_write+0x103/0x1fc > [xfs] > [22635.102788] [] xfs_file_aio_write+0x152/0x1b5 [xfs] > [22635.102798] [] ? > xfs_file_buffered_aio_write+0x179/0x179 [xfs] > [22635.102801] [] aio_rw_vect_retry+0x85/0x18a > [22635.102805] [] ? aio_fsync+0x29/0x29 > [22635.102809] [] aio_run_iocb+0x7b/0x149 > [22635.102812] [] io_submit_one+0x199/0x1f3 > [22635.102815] [] do_io_submit+0xfa/0x271 > [22635.102818] [] ? sys_rt_sigprocmask+0x69/0xa1 > [22635.102824] [] sys_io_submit+0x10/0x12 > [22635.102827] [] system_call_fastpath+0x16/0x1b > [22635.102834] INFO: task streamRT-sa:5911 blocked for more than 120 > seconds. > [22635.102836] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables > this message. > [22635.102838] streamRT-sa D ffff883f5372c408 0 5911 5114 > 0x00000004 > [22635.102844] ffff883f5208bb28 0000000000000082 0000000000000000 > ffff884066001180 > [22635.102850] 0000000000000000 0000000000000000 00000000000122c0 > 00000000000122c0 > [22635.102861] ffff883f5208bfd8 ffff883f5208a000 00000000000122c0 > ffff883f5208a000 > [22635.102877] Call Trace: > [22635.102883] [] schedule+0x64/0x66 > [22635.102886] [] rwsem_down_failed_common+0xdb/0x10d > [22635.102890] [] rwsem_down_write_failed+0x13/0x15 > [22635.102895] [] > call_rwsem_down_write_failed+0x13/0x20 > [22635.102902] [] ? down_write+0x25/0x27 > [22635.102911] [] xfs_ilock+0x4f/0xb4 [xfs] > [22635.102918] [] xfs_rw_ilock+0x2c/0x33 [xfs] > [22635.102924] [] ? _raw_spin_unlock_irq+0x27/0x32 > [22635.102931] [] xfs_file_aio_write_checks+0x41/0xfe > [xfs] > [22635.102939] [] xfs_file_dio_aio_write+0x103/0x1fc > [xfs] > [22635.102947] [] xfs_file_aio_write+0x152/0x1b5 [xfs] > [22635.102954] [] ? > xfs_file_buffered_aio_write+0x179/0x179 [xfs] > [22635.102959] [] aio_rw_vect_retry+0x85/0x18a > [22635.102962] [] ? aio_fsync+0x29/0x29 > [22635.102968] [] aio_run_iocb+0x7b/0x149 > [22635.102973] [] io_submit_one+0x199/0x1f3 > [22635.102976] [] do_io_submit+0xfa/0x271 > [22635.102980] [] ? sys_rt_sigprocmask+0x69/0xa1 > [22635.102985] [] sys_io_submit+0x10/0x12 > [22635.102989] [] system_call_fastpath+0x16/0x1b > [22635.102995] INFO: task streamRT-sa:5918 blocked for more than 120 > seconds. > [22635.102997] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables > this message. > [22635.103001] streamRT-sa D ffff883f53733a48 0 5918 5114 > 0x00000004 > [22635.103007] ffff884063d99b28 0000000000000082 0000000000000000 > ffff88406668b1c0 > [22635.103017] 0000000000000000 0000000000000000 00000000000122c0 > 00000000000122c0 > [22635.103029] ffff884063d99fd8 ffff884063d98000 00000000000122c0 > ffff884063d98000 > [22635.103037] Call Trace: > [22635.103042] [] schedule+0x64/0x66 > [22635.103047] [] rwsem_down_failed_common+0xdb/0x10d > [22635.103050] [] rwsem_down_write_failed+0x13/0x15 > [22635.103054] [] > call_rwsem_down_write_failed+0x13/0x20 > [22635.103058] [] ? down_write+0x25/0x27 > [22635.103065] [] xfs_ilock+0x4f/0xb4 [xfs] > [22635.103072] [] xfs_rw_ilock+0x2c/0x33 [xfs] > [22635.103076] [] ? _raw_spin_unlock_irq+0x27/0x32 > [22635.103086] [] xfs_file_aio_write_checks+0x41/0xfe > [xfs] > [22635.103092] [] xfs_file_dio_aio_write+0x103/0x1fc > [xfs] > [22635.103099] [] xfs_file_aio_write+0x152/0x1b5 [xfs] > [22635.103109] [] ? > xfs_file_buffered_aio_write+0x179/0x179 [xfs] > [22635.103113] [] aio_rw_vect_retry+0x85/0x18a > [22635.103120] [] ? aio_fsync+0x29/0x29 > [22635.103126] [] aio_run_iocb+0x7b/0x149 > [22635.103129] [] io_submit_one+0x199/0x1f3 > [22635.103134] [] do_io_submit+0xfa/0x271 > [22635.103139] [] ? sys_rt_sigprocmask+0x69/0xa1 > [22635.103142] [] sys_io_submit+0x10/0x12 > [22635.103146] [] system_call_fastpath+0x16/0x1b > > # ps -ef > UID PID PPID C STIME TTY TIME CMD > root 1 0 0 Aug25 ? 00:00:05 init [3] > root 2 0 0 Aug25 ? 00:00:00 [kthreadd] > root 3 2 0 Aug25 ? 00:00:00 [ksoftirqd/0] > root 6 2 0 Aug25 ? 00:00:00 [migration/0] > root 7 2 0 Aug25 ? 00:00:00 [rcuc/0] > root 8 2 0 Aug25 ? 00:00:00 [rcun/0] > root 9 2 0 Aug25 ? 00:00:00 [rcub/0] > root 10 2 0 Aug25 ? 00:00:00 [rcun/1] > root 11 2 0 Aug25 ? 00:00:00 [rcub/1] > root 12 2 0 Aug25 ? 00:00:00 [watchdog/0] > root 13 2 0 Aug25 ? 00:00:00 [migration/1] > root 15 2 0 Aug25 ? 00:00:00 [rcuc/1] > root 16 2 0 Aug25 ? 00:00:00 [ksoftirqd/1] > root 18 2 0 Aug25 ? 00:00:00 [watchdog/1] > root 19 2 0 Aug25 ? 00:00:00 [migration/2] > root 20 2 0 Aug25 ? 00:00:00 [kworker/2:0] > root 21 2 0 Aug25 ? 00:00:00 [rcuc/2] > root 22 2 0 Aug25 ? 00:00:00 [ksoftirqd/2] > root 23 2 0 Aug25 ? 00:00:00 [watchdog/2] > root 24 2 0 Aug25 ? 00:00:00 [migration/3] > root 26 2 0 Aug25 ? 00:00:00 [rcuc/3] > root 27 2 0 Aug25 ? 00:00:00 [ksoftirqd/3] > root 28 2 0 Aug25 ? 00:00:00 [watchdog/3] > root 29 2 0 Aug25 ? 00:00:00 [migration/4] > root 30 2 0 Aug25 ? 00:00:00 [kworker/4:0] > root 31 2 0 Aug25 ? 00:00:00 [rcuc/4] > root 32 2 0 Aug25 ? 00:00:00 [ksoftirqd/4] > root 33 2 0 Aug25 ? 00:00:00 [watchdog/4] > root 34 2 0 Aug25 ? 00:00:00 [migration/5] > root 36 2 0 Aug25 ? 00:00:00 [rcuc/5] > root 37 2 0 Aug25 ? 00:00:00 [ksoftirqd/5] > root 38 2 0 Aug25 ? 00:00:00 [watchdog/5] > root 39 2 0 Aug25 ? 00:00:00 [migration/6] > root 40 2 0 Aug25 ? 00:00:00 [kworker/6:0] > root 41 2 0 Aug25 ? 00:00:00 [rcuc/6] > root 42 2 0 Aug25 ? 00:00:00 [ksoftirqd/6] > root 43 2 0 Aug25 ? 00:00:00 [watchdog/6] > root 44 2 0 Aug25 ? 00:00:00 [migration/7] > root 45 2 0 Aug25 ? 00:00:00 [kworker/7:0] > root 46 2 0 Aug25 ? 00:00:00 [rcuc/7] > root 47 2 0 Aug25 ? 00:00:00 [ksoftirqd/7] > root 48 2 0 Aug25 ? 00:00:00 [watchdog/7] > root 49 2 0 Aug25 ? 00:00:00 [migration/8] > root 50 2 0 Aug25 ? 00:00:00 [kworker/8:0] > root 51 2 0 Aug25 ? 00:00:00 [rcuc/8] > root 52 2 0 Aug25 ? 00:00:00 [ksoftirqd/8] > root 53 2 0 Aug25 ? 00:00:00 [watchdog/8] > root 54 2 0 Aug25 ? 00:00:00 [migration/9] > root 56 2 0 Aug25 ? 00:00:00 [rcuc/9] > root 57 2 0 Aug25 ? 00:00:00 [ksoftirqd/9] > root 58 2 0 Aug25 ? 00:00:00 [watchdog/9] > root 59 2 0 Aug25 ? 00:00:00 [migration/10] > root 60 2 0 Aug25 ? 00:00:00 [kworker/10:0] > root 61 2 0 Aug25 ? 00:00:00 [rcuc/10] > root 62 2 0 Aug25 ? 00:00:00 [ksoftirqd/10] > root 63 2 0 Aug25 ? 00:00:00 [watchdog/10] > root 64 2 0 Aug25 ? 00:00:00 [migration/11] > root 66 2 0 Aug25 ? 00:00:00 [rcuc/11] > root 67 2 0 Aug25 ? 00:00:00 [ksoftirqd/11] > root 68 2 0 Aug25 ? 00:00:00 [watchdog/11] > root 69 2 0 Aug25 ? 00:00:00 [migration/12] > root 70 2 0 Aug25 ? 00:00:00 [kworker/12:0] > root 71 2 0 Aug25 ? 00:00:00 [rcuc/12] > root 72 2 0 Aug25 ? 00:00:00 [ksoftirqd/12] > root 73 2 0 Aug25 ? 00:00:00 [watchdog/12] > root 74 2 0 Aug25 ? 00:00:00 [migration/13] > root 76 2 0 Aug25 ? 00:00:00 [rcuc/13] > root 77 2 0 Aug25 ? 00:00:00 [ksoftirqd/13] > root 78 2 0 Aug25 ? 00:00:00 [watchdog/13] > root 79 2 0 Aug25 ? 00:00:00 [migration/14] > root 80 2 0 Aug25 ? 00:00:00 [kworker/14:0] > root 81 2 0 Aug25 ? 00:00:00 [rcuc/14] > root 82 2 0 Aug25 ? 00:00:00 [ksoftirqd/14] > root 83 2 0 Aug25 ? 00:00:00 [watchdog/14] > root 84 2 0 Aug25 ? 00:00:00 [migration/15] > root 86 2 0 Aug25 ? 00:00:00 [rcuc/15] > root 87 2 0 Aug25 ? 00:00:00 [ksoftirqd/15] > root 88 2 0 Aug25 ? 00:00:00 [watchdog/15] > root 89 2 0 Aug25 ? 00:00:00 [migration/16] > root 90 2 0 Aug25 ? 00:00:00 [kworker/16:0] > root 91 2 0 Aug25 ? 00:00:00 [rcuc/16] > root 92 2 0 Aug25 ? 00:00:00 [rcun/2] > root 93 2 0 Aug25 ? 00:00:00 [rcub/2] > root 94 2 0 Aug25 ? 00:00:00 [ksoftirqd/16] > root 95 2 0 Aug25 ? 00:00:00 [watchdog/16] > root 96 2 0 Aug25 ? 00:00:00 [migration/17] > root 98 2 0 Aug25 ? 00:00:00 [rcuc/17] > root 99 2 0 Aug25 ? 00:00:00 [ksoftirqd/17] > root 100 2 0 Aug25 ? 00:00:00 [watchdog/17] > root 101 2 0 Aug25 ? 00:00:00 [migration/18] > root 102 2 0 Aug25 ? 00:00:00 [kworker/18:0] > root 103 2 0 Aug25 ? 00:00:00 [rcuc/18] > root 104 2 0 Aug25 ? 00:00:00 [ksoftirqd/18] > root 105 2 0 Aug25 ? 00:00:00 [watchdog/18] > root 106 2 0 Aug25 ? 00:00:00 [migration/19] > root 107 2 0 Aug25 ? 00:00:00 [kworker/19:0] > root 108 2 0 Aug25 ? 00:00:00 [rcuc/19] > root 109 2 0 Aug25 ? 00:00:00 [ksoftirqd/19] > root 110 2 0 Aug25 ? 00:00:00 [watchdog/19] > root 111 2 0 Aug25 ? 00:00:00 [migration/20] > root 112 2 0 Aug25 ? 00:00:00 [kworker/20:0] > root 113 2 0 Aug25 ? 00:00:00 [rcuc/20] > root 114 2 0 Aug25 ? 00:00:00 [ksoftirqd/20] > root 115 2 0 Aug25 ? 00:00:00 [watchdog/20] > root 116 2 0 Aug25 ? 00:00:00 [migration/21] > root 117 2 0 Aug25 ? 00:00:00 [kworker/21:0] > root 118 2 0 Aug25 ? 00:00:00 [rcuc/21] > root 119 2 0 Aug25 ? 00:00:00 [ksoftirqd/21] > root 120 2 0 Aug25 ? 00:00:00 [watchdog/21] > root 121 2 0 Aug25 ? 00:00:00 [migration/22] > root 122 2 0 Aug25 ? 00:00:00 [kworker/22:0] > root 123 2 0 Aug25 ? 00:00:00 [rcuc/22] > root 124 2 0 Aug25 ? 00:00:00 [ksoftirqd/22] > root 125 2 0 Aug25 ? 00:00:00 [watchdog/22] > root 126 2 0 Aug25 ? 00:00:00 [migration/23] > root 128 2 0 Aug25 ? 00:00:00 [rcuc/23] > root 129 2 0 Aug25 ? 00:00:00 [ksoftirqd/23] > root 130 2 0 Aug25 ? 00:00:00 [watchdog/23] > root 131 2 0 Aug25 ? 00:00:00 [migration/24] > root 132 2 0 Aug25 ? 00:00:00 [kworker/24:0] > root 133 2 0 Aug25 ? 00:00:00 [rcuc/24] > root 134 2 0 Aug25 ? 00:00:00 [ksoftirqd/24] > root 135 2 0 Aug25 ? 00:00:00 [watchdog/24] > root 136 2 0 Aug25 ? 00:00:00 [migration/25] > root 138 2 0 Aug25 ? 00:00:00 [rcuc/25] > root 139 2 0 Aug25 ? 00:00:00 [ksoftirqd/25] > root 140 2 0 Aug25 ? 00:00:00 [watchdog/25] > root 141 2 0 Aug25 ? 00:00:00 [migration/26] > root 142 2 0 Aug25 ? 00:00:00 [kworker/26:0] > root 143 2 0 Aug25 ? 00:00:00 [rcuc/26] > root 144 2 0 Aug25 ? 00:00:00 [ksoftirqd/26] > root 145 2 0 Aug25 ? 00:00:00 [watchdog/26] > root 146 2 0 Aug25 ? 00:00:00 [migration/27] > root 147 2 0 Aug25 ? 00:00:00 [kworker/27:0] > root 148 2 0 Aug25 ? 00:00:00 [rcuc/27] > root 149 2 0 Aug25 ? 00:00:00 [ksoftirqd/27] > root 150 2 0 Aug25 ? 00:00:00 [watchdog/27] > root 151 2 0 Aug25 ? 00:00:00 [migration/28] > root 152 2 0 Aug25 ? 00:00:00 [kworker/28:0] > root 153 2 0 Aug25 ? 00:00:00 [rcuc/28] > root 154 2 0 Aug25 ? 00:00:00 [ksoftirqd/28] > root 155 2 0 Aug25 ? 00:00:00 [watchdog/28] > root 156 2 0 Aug25 ? 00:00:00 [migration/29] > root 157 2 0 Aug25 ? 00:00:00 [kworker/29:0] > root 158 2 0 Aug25 ? 00:00:00 [rcuc/29] > root 159 2 0 Aug25 ? 00:00:00 [ksoftirqd/29] > root 160 2 0 Aug25 ? 00:00:00 [watchdog/29] > root 161 2 0 Aug25 ? 00:00:00 [migration/30] > root 162 2 0 Aug25 ? 00:00:00 [kworker/30:0] > root 163 2 0 Aug25 ? 00:00:00 [rcuc/30] > root 164 2 0 Aug25 ? 00:00:00 [ksoftirqd/30] > root 165 2 0 Aug25 ? 00:00:00 [watchdog/30] > root 166 2 0 Aug25 ? 00:00:00 [migration/31] > root 167 2 0 Aug25 ? 00:00:00 [kworker/31:0] > root 168 2 0 Aug25 ? 00:00:00 [rcuc/31] > root 169 2 0 Aug25 ? 00:00:00 [ksoftirqd/31] > root 170 2 0 Aug25 ? 00:00:00 [watchdog/31] > root 171 2 0 Aug25 ? 00:00:00 [cpuset] > root 172 2 0 Aug25 ? 00:00:00 [khelper] > root 173 2 0 Aug25 ? 00:00:00 [netns] > root 418 2 0 Aug25 ? 00:00:00 [sync_supers] > root 420 2 0 Aug25 ? 00:00:00 [bdi-default] > root 422 2 0 Aug25 ? 00:00:00 [kblockd] > root 714 2 0 Aug25 ? 00:00:00 [ata_sff] > root 724 2 0 Aug25 ? 00:00:00 [khubd] > root 733 2 0 Aug25 ? 00:00:00 [kworker/30:1] > root 735 2 0 Aug25 ? 00:00:00 [kworker/28:1] > root 737 2 0 Aug25 ? 00:00:00 [kworker/26:1] > root 739 2 0 Aug25 ? 00:00:00 [kworker/24:1] > root 741 2 0 Aug25 ? 00:00:00 [kworker/22:1] > root 743 2 0 Aug25 ? 00:00:00 [kworker/20:1] > root 745 2 0 Aug25 ? 00:00:00 [kworker/18:1] > root 747 2 0 Aug25 ? 00:00:00 [kworker/16:1] > root 749 2 0 Aug25 ? 00:00:00 [kworker/14:1] > root 751 2 0 Aug25 ? 00:00:00 [kworker/12:1] > root 757 2 0 Aug25 ? 00:00:00 [kworker/10:1] > root 759 2 0 Aug25 ? 00:00:00 [kworker/8:1] > root 761 2 0 Aug25 ? 00:00:00 [kworker/6:1] > root 763 2 0 Aug25 ? 00:00:00 [kworker/4:1] > root 866 2 0 Aug25 ? 00:00:00 [rpciod] > root 868 2 0 Aug25 ? 00:00:00 [kworker/2:1] > root 975 2 0 Aug25 ? 00:00:00 [khungtaskd] > root 981 2 0 Aug25 ? 00:00:00 [kswapd0] > root 982 2 0 Aug25 ? 00:00:00 [khugepaged] > root 983 2 0 Aug25 ? 00:00:00 [fsnotify_mark] > root 984 2 0 Aug25 ? 00:00:00 [nfsiod] > root 986 2 0 Aug25 ? 00:00:00 [crypto] > root 1151 2 0 Aug25 ? 00:00:00 [kpsmoused] > root 1167 2 0 Aug25 ? 00:00:00 [deferwq] > root 1913 2 0 Aug25 ? 00:00:00 [bond0] > root 2144 1 0 Aug25 ? 00:00:00 udevd --daemon > root 2525 2 0 Aug25 ? 00:00:00 [scsi_eh_0] > root 2537 2 0 Aug25 ? 00:00:00 [mlx4] > root 2540 2 0 Aug25 ? 00:00:00 [scsi_eh_1] > root 2541 2 0 Aug25 ? 00:00:00 [fw_event0] > root 2595 2 0 Aug25 ? 00:00:00 [scsi_eh_2] > root 2596 2 0 Aug25 ? 00:00:00 [scsi_eh_3] > root 2597 2 0 Aug25 ? 00:00:00 [scsi_eh_4] > root 2598 2 0 Aug25 ? 00:00:00 [scsi_eh_5] > root 2599 2 0 Aug25 ? 00:00:00 [scsi_eh_6] > root 2600 2 0 Aug25 ? 00:00:00 [scsi_eh_7] > root 2667 2 0 Aug25 ? 00:00:00 [mlx4_en] > root 2797 2144 0 Aug25 ? 00:00:00 udevd --daemon > root 2798 2144 0 Aug25 ? 00:00:00 udevd --daemon > root 2800 2 0 Aug25 ? 00:00:00 [mlx4_en] > root 2817 2 0 Aug25 ? 00:00:00 [mlx4_en] > root 2843 2 0 Aug25 ? 00:00:00 [poll_0_status] > root 2844 2 0 Aug25 ? 00:00:00 [scsi_eh_8] > root 2846 2 0 Aug25 ? 00:00:00 [fw_event1] > root 2860 2 0 Aug25 ? 00:00:00 [poll_1_status] > root 2861 2 0 Aug25 ? 00:00:00 [scsi_eh_9] > root 2862 2 0 Aug25 ? 00:00:00 [fw_event2] > root 2864 2 0 Aug25 ? 00:00:00 [poll_2_status] > root 2865 2 0 Aug25 ? 00:00:00 [scsi_eh_10] > root 2866 2 0 Aug25 ? 00:00:00 [fw_event3] > root 2867 2 0 Aug25 ? 00:00:00 [poll_3_status] > root 4059 2 0 Aug25 ? 00:00:00 [bond1] > root 4464 2 0 Aug25 ? 00:00:00 [kdmflush] > root 4470 2 0 Aug25 ? 00:00:00 [kdmflush] > root 4476 2 0 Aug25 ? 00:00:00 [kdmflush] > root 4482 2 0 Aug25 ? 00:00:00 [kdmflush] > root 4488 2 0 Aug25 ? 00:00:00 [kdmflush] > root 4494 2 0 Aug25 ? 00:00:00 [kdmflush] > root 4500 2 0 Aug25 ? 00:00:00 [kdmflush] > root 4506 2 0 Aug25 ? 00:00:00 [kdmflush] > root 4512 2 0 Aug25 ? 00:00:00 [kdmflush] > root 4518 2 0 Aug25 ? 00:00:00 [kdmflush] > root 4527 2 0 Aug25 ? 00:00:00 [jbd2/dm-4-8] > root 4528 2 0 Aug25 ? 00:00:00 [ext4-dio-unwrit] > root 4593 1 0 Aug25 ? 00:00:00 /usr/sbin/rsyslogd -c5 > root 4627 1 0 Aug25 ? 00:00:00 /usr/sbin/sshd > root 4645 1 0 Aug25 ? 00:00:00 /usr/sbin/acpid > root 4683 1 0 Aug25 ? 00:00:00 /usr/sbin/cron > ntp 4713 1 0 Aug25 ? 00:00:00 /usr/sbin/ntpd -g -c > /etc/ntp.conf -p /var/run/ntpd.pid -u ntp:ntp > daemon 4747 1 0 Aug25 ? 00:00:00 /sbin/portmap > root 4773 1 0 Aug25 ? 00:00:00 /sbin/rpc.statd > root 4796 1 0 Aug25 ttyS0 00:00:00 /sbin/getty -L 115200 > ttyS0 vt100 > root 4797 1 0 Aug25 ? 00:00:22 initBC > > root 4908 2 0 Aug25 ? 00:00:00 [xfsalloc] > root 4909 2 0 Aug25 ? 00:00:00 [xfs_mru_cache] > root 4910 2 0 Aug25 ? 00:00:00 [xfslogd] > root 4930 2 0 Aug25 ? 00:00:00 [xfsbufd/sdc] > root 4931 2 0 Aug25 ? 00:00:00 [xfs-data/sdc] > root 4932 2 0 Aug25 ? 00:00:00 [xfs-conv/sdc] > root 4933 2 0 Aug25 ? 00:00:01 [xfsaild/sdc] > root 4935 2 0 Aug25 ? 00:00:00 [xfsbufd/sdd] > root 4936 2 0 Aug25 ? 00:00:00 [xfs-data/sdd] > root 4937 2 0 Aug25 ? 00:00:00 [xfs-conv/sdd] > root 4938 2 0 Aug25 ? 00:00:01 [xfsaild/sdd] > root 5115 1 6 Aug25 ? 00:11:28 [streamRT-sa] > root 6582 2 0 Aug25 ? 00:00:00 [kworker/1:2] > root 6633 2 0 Aug25 ? 00:00:00 [kworker/23:1] > root 6636 2 0 Aug25 ? 00:00:00 [kworker/15:0] > root 6640 2 0 Aug25 ? 00:00:00 [kworker/29:2] > root 6647 2 0 Aug25 ? 00:00:00 [kworker/3:1] > root 6649 2 0 Aug25 ? 00:00:00 [kworker/25:2] > root 6654 2 0 Aug25 ? 00:00:00 [kworker/1:0] > root 6658 2 0 Aug25 ? 00:00:00 [kworker/19:1] > root 6659 2 0 Aug25 ? 00:00:00 [kworker/21:1] > root 6661 2 0 Aug25 ? 00:00:00 [kworker/27:2] > root 6662 2 0 Aug25 ? 00:00:00 [kworker/15:2] > root 6663 2 0 Aug25 ? 00:00:00 [kworker/5:2] > root 6666 2 0 Aug25 ? 00:00:00 [kworker/31:2] > root 6671 2 0 Aug25 ? 00:00:00 [kworker/0:4] > root 6673 2 0 Aug25 ? 00:00:00 [kworker/7:3] > root 6677 2 0 Aug25 ? 00:00:00 [kworker/0:6] > root 6678 2 0 Aug25 ? 00:00:00 [kworker/0:7] > root 6681 2 0 Aug25 ? 00:00:00 [kworker/0:10] > root 6684 2 0 Aug25 ? 00:00:00 [kworker/13:5] > root 6690 2 0 Aug25 ? 00:00:00 [kworker/9:4] > root 6695 2 0 Aug25 ? 00:00:00 [kworker/7:5] > root 6696 2 0 Aug25 ? 00:00:00 [kworker/13:7] > root 6697 2 0 Aug25 ? 00:00:00 [kworker/9:6] > root 6702 2 0 Aug25 ? 00:00:00 [kworker/0:11] > root 6705 2 0 Aug25 ? 00:00:00 [kworker/0:14] > root 6707 2 0 Aug25 ? 00:00:00 [kworker/0:16] > root 6719 2 0 Aug25 ? 00:00:00 [kworker/0:24] > root 6721 2 0 Aug25 ? 00:00:00 [kworker/0:26] > root 6723 2 0 Aug25 ? 00:00:00 [kworker/9:8] > root 6726 2 0 Aug25 ? 00:00:00 [kworker/31:5] > root 6731 2 0 Aug25 ? 00:00:00 [kworker/1:7] > root 6734 2 0 Aug25 ? 00:00:00 [kworker/11:6] > root 6736 2 0 Aug25 ? 00:00:00 [kworker/13:10] > root 6740 2 0 Aug25 ? 00:00:00 [kworker/0:30] > root 6741 2 0 Aug25 ? 00:00:00 [kworker/0:31] > root 6745 2 0 Aug25 ? 00:00:00 [kworker/9:9] > root 6748 2 0 Aug25 ? 00:00:00 [kworker/0:36] > root 6749 2 0 Aug25 ? 00:00:00 [kworker/19:3] > root 6753 2 0 Aug25 ? 00:00:00 [kworker/23:3] > root 6757 2 0 Aug25 ? 00:00:00 [kworker/13:12] > root 6758 2 0 Aug25 ? 00:00:00 [kworker/7:6] > root 6761 2 0 Aug25 ? 00:00:00 [kworker/0:41] > root 6767 2 0 Aug25 ? 00:00:00 [kworker/0:44] > root 6768 2 0 Aug25 ? 00:00:00 [kworker/5:7] > root 6769 2 0 Aug25 ? 00:00:00 [kworker/1:9] > root 6770 2 0 Aug25 ? 00:00:00 [kworker/0:45] > root 6774 2 0 Aug25 ? 00:00:00 [kworker/17:7] > root 6776 2 0 Aug25 ? 00:00:00 [kworker/3:4] > root 6779 2 0 Aug25 ? 00:00:00 [kworker/11:9] > root 6781 2 0 Aug25 ? 00:00:00 [kworker/0:50] > root 6787 2 0 Aug25 ? 00:00:00 [kworker/0:53] > root 6788 2 0 Aug25 ? 00:00:00 [kworker/25:1] > root 6793 2 0 Aug25 ? 00:00:00 [kworker/1:10] > root 6795 2 0 Aug25 ? 00:00:00 [kworker/27:4] > root 6797 2 0 Aug25 ? 00:00:00 [kworker/0:57] > root 6798 2 0 Aug25 ? 00:00:00 [kworker/0:58] > root 6806 2 0 Aug25 ? 00:00:00 [kworker/15:5] > root 6807 2 0 Aug25 ? 00:00:00 [kworker/0:62] > root 6808 2 0 Aug25 ? 00:00:00 [kworker/0:63] > root 6809 2 0 Aug25 ? 00:00:00 [kworker/17:8] > root 6814 2 0 Aug25 ? 00:00:00 [kworker/0:66] > root 6815 2 0 Aug25 ? 00:00:01 [kworker/0:67] > root 6819 2 0 Aug25 ? 00:00:00 [kworker/0:69] > root 6824 2 0 Aug25 ? 00:00:00 [kworker/25:3] > root 6895 2 0 00:20 ? 00:00:00 [kworker/u:0] > root 6900 2 0 00:26 ? 00:00:00 [kworker/u:1] > root 6904 2 0 00:57 ? 00:00:00 [flush-0:20] > root 6933 2 0 01:00 ? 00:00:00 [kworker/u:2] > root 6934 4627 0 01:02 ? 00:00:00 sshd: iris [priv] > iris 6936 6934 0 01:02 ? 00:00:00 sshd: iris@pts/1 > iris 6937 6936 0 01:02 pts/1 00:00:00 -bash > root 6967 6937 0 01:02 pts/1 00:00:00 sudo su > root 6968 6967 0 01:02 pts/1 00:00:00 su > root 6969 6968 0 01:02 pts/1 00:00:00 bash > root 6976 6969 0 01:04 pts/1 00:00:00 ps -ef > > # lsof|grep stream > lsof: WARNING: can't stat() xfs file system /mnt/VOL1 > Output information may be incomplete. > bash 6937 iris cwd DIR 0,20 4096 > 2113547 /iris/home/adrian/streamRT (mbc:/iris) > sudo 6967 root cwd DIR 0,20 4096 > 2113547 /iris/home/adrian/streamRT (mbc:/iris) > su 6968 root cwd DIR 0,20 4096 > 2113547 /iris/home/adrian/streamRT (mbc:/iris) > bash 6969 root cwd DIR 0,20 4096 > 2113547 /iris/home/adrian/streamRT (mbc:/iris) -- Stan From david@fromorbit.com Tue Aug 26 02:54: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 C028C7F3F for ; Tue, 26 Aug 2014 02:54:18 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id BC65D304032 for ; Tue, 26 Aug 2014 00:54:08 -0700 (PDT) X-ASG-Debug-ID: 1409039630-04cbb054857ff850001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id PofId8CP0LHWYhqS for ; Tue, 26 Aug 2014 00:53:51 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AmQTADI8/FN5LDJ8PGdsb2JhbABagw2BKoczp3YBAQEBBqRuAYETFwUBAQEBODaEBAEFOhwjEAgDGAklDwUlAwcaE4hBviwXGIVkiQdJB4RMBZxIlnEegW4rL4EHgUgBAQE Received: from ppp121-44-50-124.lns20.syd6.internode.on.net (HELO dastard) ([121.44.50.124]) by ipmail04.adl6.internode.on.net with ESMTP; 26 Aug 2014 17:23:48 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1XMBZZ-0001Cw-Dn; Tue, 26 Aug 2014 17:53:45 +1000 Date: Tue, 26 Aug 2014 17:53:45 +1000 From: Dave Chinner To: Stan Hoeppner Cc: xfs@oss.sgi.com Subject: Re: storage, libaio, or XFS problem? 3.4.26 Message-ID: <20140826075345.GJ20518@dastard> X-ASG-Orig-Subj: Re: storage, libaio, or XFS problem? 3.4.26 References: <3fe8c34c0ccbbd720015d273fa2b8b30@localhost> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <3fe8c34c0ccbbd720015d273fa2b8b30@localhost> 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: 1409039630 X-Barracuda-URL: http://192.48.176.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.8840 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Tue, Aug 26, 2014 at 01:18:50AM -0500, Stan Hoeppner wrote: > Had some controller issues but believe we had those ironed out before this > recent breakage. I had reformatted both 48TB LUNs on this test box with -f > and defaults, and fired up the test app again. Throughput was fantastic > with no dropped application buffers for ~30 minutes, and IO times were 1.x > ms max, suggesting all the writes were acked by controller cache. The app > was running perfectly. Then it hanged and spit out an internal error msg: > > > Failed to reopen file /mnt/VOL1/sg-04/str-0015/f-0000000005 > > I have many call traces in dmesg, most are XFS, pasted below. I found no > SCSI I/O errors in dmesg. Application is submitting writes via libaio and > using O_DIRECT, writing to preallocated files. I don't see any errors in > the storage controller log and everything seems to check out there. Using > noop elevator, mpt2sas, no multipathing. The application process is hung > in d state and kill -9 won't get rid of it. I can't unmount the hosed up > filesystem. Any ideas? > > # ls -la /mnt/VOL1 > ls: cannot access /mnt/VOL1: Input/output error > > # dd if=/mnt/VOL1 of=/dev/null bs=1M count=16 > dd: opening `/mnt/VOL1': Input/output error > > # dd if=/dev/sdd of=/dev/null bs=1M count=16 > 16+0 records in > 16+0 records out > 16777216 bytes (17 MB) copied, 1.10989 s, 15.1 MB/s > > # ls -la /mnt/ > ls: cannot access /mnt/VOL1: Input/output error > total 8 > drwxrwxrwt 6 root root 120 Aug 25 17:59 . > drwxr-xr-x 21 root root 4096 Jul 15 09:39 .. > drwxrwxrwt 3 root root 80 Aug 25 16:52 initramfs > drwxr-xr-x 3 root root 4096 Apr 24 04:57 scratch > drwxrwxrwx 5 root root 58 Aug 25 22:06 VOL0 > d????????? ? ? ? ? ? VOL1 That's an inode we failed to stat() - most likely because of the IO error. Has the filesystem shut down? the IO error shoul dhave had some kind of output in dmesg associated with it from XFS.... > [22635.102013] INFO: task kworker/7:0:45 blocked for more than 120 > seconds. > [22635.102016] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables > this message. > [22635.102018] kworker/7:0 D ffff8840666c0b08 0 45 2 > 0x00000000 > [22635.102021] ffff8840666e7bd0 0000000000000046 ffff883f7c02d000 > ffff8840666f5180 > [22635.102026] ffff8840666e7b80 0000000000000206 00000000000122c0 > 00000000000122c0 > [22635.102030] ffff8840666e7fd8 ffff8840666e6000 00000000000122c0 > ffff8840666e6000 > [22635.102033] Call Trace: > [22635.102041] [] schedule+0x64/0x66 > [22635.102044] [] rwsem_down_failed_common+0xdb/0x10d > [22635.102047] [] rwsem_down_write_failed+0x13/0x15 > [22635.102051] [] > call_rwsem_down_write_failed+0x13/0x20 > [22635.102055] [] ? > _raw_spin_unlock_irqrestore+0x30/0x3d > [22635.102058] [] ? down_write+0x25/0x27 > [22635.102070] [] xfs_ilock+0x4f/0xb4 [xfs] > [22635.102077] [] xfs_iomap_write_unwritten+0x1b3/0x32e > [xfs] > [22635.102080] [] ? > _raw_spin_unlock_irqrestore+0x30/0x3d > [22635.102084] [] ? xfs_setfilesize+0x128/0x128 [xfs] > [22635.102088] [] ? mempool_free+0x73/0x78 > [22635.102093] [] ? xfs_setfilesize+0x128/0x128 [xfs] > [22635.102098] [] xfs_end_io+0x89/0xb4 [xfs] > [22635.102102] [] process_one_work+0x204/0x327 > [22635.102105] [] worker_thread+0x13b/0x25a > [22635.102108] [] ? process_one_work+0x327/0x327 > [22635.102111] [] kthread+0x89/0x91 > [22635.102115] [] kernel_thread_helper+0x4/0x10 > [22635.102118] [] ? __init_kthread_worker+0x3c/0x3c > [22635.102120] [] ? gs_change+0xb/0xb That's stuck on a an inode lock. That reminds of a problem we had in RHEL6 with highly concurrent direct IO. The rwsems were buggy, and XFS was tripping over the bug and hanging just like this. If the filesystem is not shutting down and causing that IO error due to a shutdown state, then it's entirely possible we've got another rwsem issue. Now I've just got to go find the RHEL 6 problem again. Ah: 91af708 rwsem: Test for no active locks in __rwsem_do_wake undo code But that was fixed in 2.6.34 (rhel 6 was based on 2.6.32), so I doubt that is your problem. However, it smells almost exactly the same - it took about an hour of highly concurrent direct IO to SSDs to trigger, and Lachlan ended up finding the right incantation of lock debug code inside the xfs mrlock implementation to prove that it was an rwsem bug and not an XFS locking issue. Are you able to take crash dumps from this machine so you can dig around inside the XFS inode and rwsem states when the system locks up like this? One thing in the RH bug that was suggested as a simply test to determine if there's a problem with the rwsems is to edit the kernel configin arch/x86/Kconfig: Change: config RWSEM_GENERIC_SPINLOCK def_bool !X86_ADD config RWSEM_XCHGADD_ALGORITHM def_bool X86_ADD to: config RWSEM_GENERIC_SPINLOCK def_bool y config RWSEM_XCHGADD_ALGORITHM def_bool n I haven't cheked if this still works on a 3.4 kernel, but it will change the rwsem implementation to the generic, spinlock based implementation rather than the super-special, highly optimised x86 specific implementation. If that makes the problem go away, then we've got another rwsem bug on our hands. If it doesn't, then I can probably get you the mrlock debug code lachlan wrote and we can see if XFS is doing something wrong... Cheers, Dave. -- Dave Chinner david@fromorbit.com From zhangqiang.buaa@gmail.com Tue Aug 26 05:05: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=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 929067F3F for ; Tue, 26 Aug 2014 05:05:00 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 4ABB18F8033 for ; Tue, 26 Aug 2014 03:05:00 -0700 (PDT) X-ASG-Debug-ID: 1409047493-04bdf0109a50b130001-NocioJ Received: from mail-la0-f49.google.com (mail-la0-f49.google.com [209.85.215.49]) by cuda.sgi.com with ESMTP id G22gXskEzwcW8lD0 (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Tue, 26 Aug 2014 03:04:54 -0700 (PDT) X-Barracuda-Envelope-From: zhangqiang.buaa@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.215.49 X-Barracuda-IPDD: Level1 [gmail.com/209.85.215.49] Received: by mail-la0-f49.google.com with SMTP id hz20so14489866lab.22 for ; Tue, 26 Aug 2014 03:04:52 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.215.49] X-Barracuda-IPDD: Level1 [gmail.com/209.85.215.49] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:in-reply-to:references:date:message-id:subject:from:to :cc:content-type; bh=sNpXNANNgntmWdbBTWMb96jF3yCEqMpcLyy5STLa29o=; b=RM4UoqTq/tqInPHUebEVSvIryj6VFnvJ/kx2rF9DF1gp6idVKnGebFJ4D8ySTvns2d 9FsKqdadpJIcXPMo4DATD/e5RgoiEITPXnn53fHt0ISwmcFURccNEX6yrjppTqzlbco2 fSUzWLmIsnPV8aVPcgnVbt0+g1UbIG5Ve+eW3kk/tDliyzQY3jLgR0/LDD9+U8DUCpwu n6P1JwsKf01zGSRS8S4tCFdqFFys0Lc7okxNX4W02yS+1mnn5lIpAyvjwGpqzT6AErYt OgpHZif2ba9tPh8VE6BUIP6GUls9JBAQRfFalAQuNXllO2zIVU8kSX9z9hs2ldQM/aQs 2J3w== MIME-Version: 1.0 X-Received: by 10.153.5.38 with SMTP id cj6mr10880244lad.34.1409047492784; Tue, 26 Aug 2014 03:04:52 -0700 (PDT) Received: by 10.114.161.116 with HTTP; Tue, 26 Aug 2014 03:04:52 -0700 (PDT) In-Reply-To: <20140826023754.GH20518@dastard> References: <20140825051801.GY26465@dastard> <20140825090843.GE20518@dastard> <20140825222657.GF20518@dastard> <20140826023754.GH20518@dastard> Date: Tue, 26 Aug 2014 18:04:52 +0800 Message-ID: Subject: Re: bad performance on touch/cp file on XFS system From: Zhang Qiang X-ASG-Orig-Subj: Re: bad performance on touch/cp file on XFS system To: Dave Chinner Cc: Greg Freemyer , xfs-oss Content-Type: multipart/alternative; boundary=001a1133b07047794b0501856f4a X-Barracuda-Connect: mail-la0-f49.google.com[209.85.215.49] X-Barracuda-Start-Time: 1409047494 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, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.8842 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 BSF_SC0_SA085 Custom Rule SA085 --001a1133b07047794b0501856f4a Content-Type: text/plain; charset=UTF-8 Thanks Dave/Greg for your analysis and suggestions. I can summarize what I should do next: - backup my data using xfsdump - rebuilt filesystem using mkfs with options: agcount=32 for 2T disk - mount filesystem with option inode64,nobarrier - applied patches about adding free list inode on disk structure As we have about ~100 servers need back up, so that will take much effort, do you have any other suggestion? What I am testing (ongoing): - created a new 2T partition filesystem - try to create small files and fill whole spaces then remove some of them randomly - check the performance of touch/cp files - apply patches and verify it. I have got more data from server: 1) flush all cache(echo 3 > /proc/sys/vm/drop_caches), and umount filesystem 2) mount filesystem and testing with touch command * The first touch new file command take about ~23s * second touch command take about ~0.1s. Here's the perf data: First touch command: Events: 435 cycles + 7.51% touch [xfs] [k] xfs_inobt_get_rec + 5.61% touch [xfs] [k] xfs_btree_get_block + 5.38% touch [xfs] [k] xfs_btree_increment + 4.26% touch [xfs] [k] xfs_btree_get_rec + 3.73% touch [kernel.kallsyms] [k] find_busiest_group + 3.43% touch [xfs] [k] _xfs_buf_find + 2.72% touch [xfs] [k] xfs_btree_readahead + 2.38% touch [xfs] [k] xfs_trans_buf_item_match + 2.34% touch [xfs] [k] xfs_dialloc + 2.32% touch [kernel.kallsyms] [k] generic_make_request + 2.09% touch [xfs] [k] xfs_btree_rec_offset + 1.75% touch [kernel.kallsyms] [k] kmem_cache_alloc + 1.63% touch [kernel.kallsyms] [k] cpumask_next_and + 1.41% touch [sd_mod] [k] sd_prep_fn + 1.41% touch [kernel.kallsyms] [k] get_page_from_freelist + 1.38% touch [kernel.kallsyms] [k] __alloc_pages_nodemask + 1.27% touch [kernel.kallsyms] [k] scsi_request_fn + 1.22% touch [kernel.kallsyms] [k] blk_queue_bounce + 1.20% touch [kernel.kallsyms] [k] cfq_should_idle + 1.10% touch [xfs] [k] xfs_btree_rec_addr + 1.03% touch [kernel.kallsyms] [k] cfq_dispatch_requests+ 1.00% touch [kernel.kallsyms] [k] _spin_lock_irqsave+ 0.94% touch [kernel.kallsyms] [k] memcpy+ 0.86% touch [kernel.kallsyms] [k] swiotlb_map_sg_attrs+ 0.84% touch [kernel.kallsyms] [k] alloc_pages_current + 0.82% touch [kernel.kallsyms] [k] submit_bio + 0.81% touch [megaraid_sas] [k] megasas_build_and_issue_cmd_fusion + 0.77% touch [kernel.kallsyms] [k] blk_peek_request + 0.73% touch [xfs] [k] xfs_btree_setbuf + 0.73% touch [megaraid_sas] [k] MR_GetPhyParams + 0.73% touch [kernel.kallsyms] [k] run_timer_softirq + 0.71% touch [kernel.kallsyms] [k] pick_next_task_rt + 0.71% touch [kernel.kallsyms] [k] init_request_from_bio + 0.70% touch [kernel.kallsyms] [k] thread_return + 0.69% touch [kernel.kallsyms] [k] cfq_set_request + 0.67% touch [kernel.kallsyms] [k] mempool_alloc + 0.66% touch [xfs] [k] xfs_buf_hold + 0.66% touch [kernel.kallsyms] [k] find_next_bit + 0.62% touch [kernel.kallsyms] [k] cfq_insert_request + 0.61% touch [kernel.kallsyms] [k] scsi_init_io + 0.60% touch [megaraid_sas] [k] MR_BuildRaidContext + 0.59% touch [kernel.kallsyms] [k] policy_zonelist + 0.59% touch [kernel.kallsyms] [k] elv_insert + 0.58% touch [xfs] [k] xfs_buf_allocate_memory Second perf command: Events: 105 cycles + 20.92% touch [xfs] [k] xfs_inobt_get_rec + 14.27% touch [xfs] [k] xfs_btree_get_rec + 12.21% touch [xfs] [k] xfs_btree_get_block + 12.12% touch [xfs] [k] xfs_btree_increment + 9.86% touch [xfs] [k] xfs_btree_readahead + 7.87% touch [xfs] [k] _xfs_buf_find + 4.93% touch [xfs] [k] xfs_btree_rec_addr + 4.12% touch [xfs] [k] xfs_dialloc + 3.03% touch [kernel.kallsyms] [k] clear_page_c + 2.96% touch [xfs] [k] xfs_btree_rec_offset + 1.31% touch [kernel.kallsyms] [k] kmem_cache_free + 1.03% touch [xfs] [k] xfs_trans_buf_item_match + 0.99% touch [kernel.kallsyms] [k] _atomic_dec_and_lock + 0.99% touch [xfs] [k] xfs_inobt_get_maxrecs + 0.99% touch [xfs] [k] xfs_buf_unlock + 0.99% touch [xfs] [k] kmem_zone_alloc + 0.98% touch [kernel.kallsyms] [k] kmem_cache_alloc + 0.28% touch [kernel.kallsyms] [k] pgd_alloc + 0.17% touch [kernel.kallsyms] [k] page_fault + 0.01% touch [kernel.kallsyms] [k] native_write_msr_safe I have compared the memory used, it seems that xfs try to load inode bmap block for the first time, which take much time, is that the reason to take so much time for the first touch operation? Thanks Qiang 2014-08-26 10:37 GMT+08:00 Dave Chinner : > On Mon, Aug 25, 2014 at 06:46:31PM -0400, Greg Freemyer wrote: > > On Mon, Aug 25, 2014 at 6:26 PM, Dave Chinner > wrote: > > > On Mon, Aug 25, 2014 at 06:31:10PM +0800, Zhang Qiang wrote: > > >> 2014-08-25 17:08 GMT+08:00 Dave Chinner : > > >> > > >> > On Mon, Aug 25, 2014 at 04:47:39PM +0800, Zhang Qiang wrote: > > >> > > I have checked icount and ifree, but I found there are about 11.8 > percent > > >> > > free, so the free inode should not be too few. > > >> > > > > >> > > Here's the detail log, any new clue? > > >> > > > > >> > > # mount /dev/sda4 /data1/ > > >> > > # xfs_info /data1/ > > >> > > meta-data=/dev/sda4 isize=256 agcount=4, > agsize=142272384 > > >> > > > >> > 4 AGs > > >> > > > >> Yes. > > >> > > >> > > > >> > > icount = 220619904 > > >> > > ifree = 26202919 > > >> > > > >> > And 220 million inodes. There's your problem - that's an average > > >> > of 55 million inodes per AGI btree assuming you are using inode64. > > >> > If you are using inode32, then the inodes will be in 2 btrees, or > > >> > maybe even only one. > > >> > > > >> > > >> You are right, all inodes stay on one AG. > > >> > > >> BTW, why i allocate 4 AGs, and all inodes stay in one AG for inode32?, > > > > > > Because the top addresses in the 2nd AG go over 32 bits, hence only > > > AG 0 can be used for inodes. Changing to inode64 will give you some > > > relief, but any time allocation occurs in AG0 is will be slow. i.e. > > > you'll be trading always slow for "unpredictably slow". > > > > > >> > With that many inodes, I'd be considering moving to 32 or 64 AGs to > > >> > keep the btree size down to a more manageable size. The free inode > > >> > > >> btree would also help, but, really, 220M inodes in a 2TB filesystem > > >> > is really pushing the boundaries of sanity..... > > >> > > > >> > > >> So the better inodes size in one AG is about 5M, > > > > > > Not necessarily. But for your storage it's almost certainly going to > > > minimise the problem you are seeing. > > > > > >> is there any documents > > >> about these options I can learn more? > > > > > > http://xfs.org/index.php/XFS_Papers_and_Documentation > > > > Given the apparently huge number of small files would he likely see a > > big performance increase if he replaced that 2TB or rust with SSD. > > Doubt it - the profiles showed the allocation being CPU bound > searching the metadata that indexes all those inodes. Those same > profiles showed all the signs that it was hitting the buffer > cache most of the time, too, which is why it was CPU bound.... > > Cheers, > > Dave. > -- > Dave Chinner > david@fromorbit.com > --001a1133b07047794b0501856f4a Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: quoted-printable
Thanks=C2=A0Dave/Greg for your analysis and suggestions.

I can summarize= what I should do next:

- backup my data using xfs= dump
- rebuilt filesystem using mkfs with options: agcount=3D32 for 2T disk=
- mount filesystem with option inode64,nobarrier
- app= lied patches about adding free list inode on disk structure

As we have about ~100 servers need back up, so that will take mu= ch effort, do you have any other suggestion?

What = I am testing (ongoing):
=C2=A0- created a new 2T partition fi= lesystem
=C2=A0- try to create small files and fill whole spaces then rem= ove some of them randomly
=C2=A0- check the performance of touch/= cp files
=C2=A0- apply patches and verify it.

I have got more data from server:

1) flush all cache(echo 3 > /proc/sys/vm/drop_= caches), and umount filesystem
2) mount filesystem and testing wi= th touch command
=C2=A0 * The first touch new file command take a= bout ~23s
=C2=A0 * second touch command take about ~0.1s.

Here's the perf data:
First touch command:
<= br>
Events: 435 =C2=A0cycles
+ =C2=A0 7.51% =C2=A0= touch =C2=A0[xfs] =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0[k] xfs_i= nobt_get_rec
+ =C2=A0 5.61% =C2=A0touch =C2=A0[xfs] =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0[k] xfs_btree_get_block
+ =C2=A0 5.38% =C2=A0tou= ch =C2=A0[xfs] =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0[k] xfs_btre= e_increment
+ =C2=A0 4.26% =C2=A0touch =C2=A0[xfs] =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0[k] xfs_btree_get_rec
+ =C2=A0 = 3.73% =C2=A0touch =C2=A0[kernel.kallsyms] =C2=A0[k] find_busiest_group
+ =C2=A0 3.43% =C2=A0touch =C2=A0[xfs] =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0[k] _xfs_buf_find
+ =C2=A0 2.72% =C2=A0touch =C2= =A0[xfs] =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0[k] xfs_btree_read= ahead
+ =C2=A0 2.38% =C2=A0touch =C2=A0[xfs] =C2=A0 =C2=A0 =C2=A0= =C2=A0 =C2=A0 =C2=A0 =C2=A0[k] xfs_trans_buf_item_match
+ =C2=A0= 2.34% =C2=A0touch =C2=A0[xfs] =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0[k] xfs_dialloc
+ =C2=A0 2.32% =C2=A0touch =C2=A0[kernel.kallsyms] =C2=A0[k] generic_m= ake_request
+ =C2=A0 2.09% =C2=A0touch =C2=A0[xfs] =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0[k] xfs_btree_rec_offset
+ =C2= =A0 1.75% =C2=A0touch =C2=A0[kernel.kallsyms] =C2=A0[k] kmem_cache_alloc
+ =C2=A0 1.63% =C2=A0touch =C2=A0[kernel.kallsyms] =C2=A0[k] cpumas= k_next_and
+ =C2=A0 1.41% =C2=A0touch =C2=A0[sd_mod] =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 [k] sd_prep_fn
+ =C2=A0 1.41% =C2=A0touch =C2=A0[kernel.ka= llsyms] =C2=A0[k] get_page_from_freelist
+ =C2=A0 1.38% =C2=A0tou= ch =C2=A0[kernel.kallsyms] =C2=A0[k] __alloc_pages_nodemask
+ =C2= =A0 1.27% =C2=A0touch =C2=A0[kernel.kallsyms] =C2=A0[k] scsi_request_fn
+ =C2=A0 1.22% =C2=A0touch =C2=A0[kernel.kallsyms] =C2=A0[k] blk_queue= _bounce
+ =C2=A0 1.20% =C2=A0touch =C2=A0[kernel.kallsyms] =C2=A0= [k] cfq_should_idle
+ =C2=A0 1.10% =C2=A0touch =C2=A0[xfs] =C2=A0= =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0[k] xfs_btree_rec_addr
= + =C2=A0 1.03% =C2=A0touch =C2=A0[kernel.kallsyms] =C2=A0[k] cfq_dispatch_r= equests+ =C2=A0 1.00% =C2=A0touch =C2=A0[kernel.kallsyms] =C2=A0[k] _spin_l= ock_irqsave+ =C2=A0 0.94% =C2=A0touch =C2=A0[kernel.kallsyms] =C2=A0[k] mem= cpy+ =C2=A0 0.86% =C2=A0touch =C2=A0[kernel.kallsyms] =C2=A0[k] swiotlb_map= _sg_attrs+ =C2=A0 0.84% =C2=A0touch =C2=A0[kernel.kallsyms] =C2=A0[k] alloc= _pages_current
+ =C2=A0 0.82% =C2=A0touch =C2=A0[kernel.kallsyms] =C2=A0[k] submit_bi= o
+ =C2=A0 0.81% =C2=A0touch =C2=A0[megaraid_sas] =C2=A0 =C2=A0 [= k] megasas_build_and_issue_cmd_fusion
+ =C2=A0 0.77% =C2=A0touch = =C2=A0[kernel.kallsyms] =C2=A0[k] blk_peek_request
+ =C2=A0 0.73% =C2=A0touch =C2=A0[xfs] =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0[k] xfs_btree_setbuf
+ =C2=A0 0.73% =C2=A0touch =C2= =A0[megaraid_sas] =C2=A0 =C2=A0 [k] MR_GetPhyParams
+ =C2=A0 0.73= % =C2=A0touch =C2=A0[kernel.kallsyms] =C2=A0[k] run_timer_softirq
+ =C2=A0 0.71% =C2=A0touch =C2=A0[kernel.kallsyms] =C2=A0[k] pick_next_tas= k_rt
+ =C2=A0 0.71% =C2=A0touch =C2=A0[kernel.kallsyms] =C2=A0[k] init_requ= est_from_bio
+ =C2=A0 0.70% =C2=A0touch =C2=A0[kernel.kallsyms] = =C2=A0[k] thread_return
+ =C2=A0 0.69% =C2=A0touch =C2=A0[kernel.= kallsyms] =C2=A0[k] cfq_set_request
+ =C2=A0 0.67% =C2=A0touch = =C2=A0[kernel.kallsyms] =C2=A0[k] mempool_alloc
+ =C2=A0 0.66% =C2=A0touch =C2=A0[xfs] =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0[k] xfs_buf_hold
+ =C2=A0 0.66% =C2=A0touch =C2= =A0[kernel.kallsyms] =C2=A0[k] find_next_bit
+ =C2=A0 0.62% =C2= =A0touch =C2=A0[kernel.kallsyms] =C2=A0[k] cfq_insert_request
+ = =C2=A0 0.61% =C2=A0touch =C2=A0[kernel.kallsyms] =C2=A0[k] scsi_init_io
+ =C2=A0 0.60% =C2=A0touch =C2=A0[megaraid_sas] =C2=A0 =C2=A0 [k] MR_B= uildRaidContext
+ =C2=A0 0.59% =C2=A0touch =C2=A0[kernel.kallsyms= ] =C2=A0[k] policy_zonelist
+ =C2=A0 0.59% =C2=A0touch =C2=A0[ker= nel.kallsyms] =C2=A0[k] elv_insert
+ =C2=A0 0.58% =C2=A0touch =C2= =A0[xfs] =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0[k] xfs_buf_alloca= te_memory


Second perf command:

Events: 105 =C2=A0cycles
+ =C2=A0= 20.92% =C2=A0touch =C2=A0[xfs] =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0[k] xfs_inobt_get_rec
+ =C2=A014.27% =C2=A0touch =C2=A0[xfs= ] =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0[k] xfs_btree_get_rec
+ =C2=A012.21% =C2=A0touch =C2=A0[xfs] =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0[k] xfs_btree_get_block
+ =C2=A012.12% =C2=A0tou= ch =C2=A0[xfs] =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0[k] xfs_btre= e_increment
+ =C2=A0 9.86% =C2=A0touch =C2=A0[xfs] =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0[k] xfs_btree_readahead
+ =C2= =A0 7.87% =C2=A0touch =C2=A0[xfs] =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0[k] _xfs_buf_find
+ =C2=A0 4.93% =C2=A0touch =C2=A0[xfs] =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0[k] xfs_btree_rec_addr
+ =C2=A0 4.12% =C2=A0touc= h =C2=A0[xfs] =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0[k] xfs_diall= oc
+ =C2=A0 3.03% =C2=A0touch =C2=A0[kernel.kallsyms] =C2=A0[k] c= lear_page_c
+ =C2=A0 2.96% =C2=A0touch =C2=A0[xfs] =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0[k] xfs_btree_rec_offset
+ =C2=A0 1.31% =C2=A0touch =C2=A0[kernel.kallsyms] =C2=A0[k] kmem_cach= e_free
+ =C2=A0 1.03% =C2=A0touch =C2=A0[xfs] =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0[k] xfs_trans_buf_item_match
+ =C2= =A0 0.99% =C2=A0touch =C2=A0[kernel.kallsyms] =C2=A0[k] _atomic_dec_and_loc= k
+ =C2=A0 0.99% =C2=A0touch =C2=A0[xfs] =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0[k] xfs_inobt_get_maxrecs
+ =C2=A0 0.99% =C2=A0touch =C2=A0[xfs] =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0[k] xfs_buf_unlock
+ =C2=A0 0.99% =C2=A0touch = =C2=A0[xfs] =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0[k] kmem_zone_a= lloc
+ =C2=A0 0.98% =C2=A0touch =C2=A0[kernel.kallsyms] =C2=A0[k]= kmem_cache_alloc
+ =C2=A0 0.28% =C2=A0touch =C2=A0[kernel.kallsy= ms] =C2=A0[k] pgd_alloc
+ =C2=A0 0.17% =C2=A0touch =C2=A0[kernel.kallsyms] =C2=A0[k] page_faul= t
+ =C2=A0 0.01% =C2=A0touch =C2=A0[kernel.kallsyms] =C2=A0[k] na= tive_write_msr_safe

I have compared the memo= ry used, it seems that xfs try to load inode bmap block for the first time,= which take much time, is that the reason to take so much time for the firs= t touch operation?

Thanks
Qiang
2014-08-26 10:37 G= MT+08:00 Dave Chinner <david@fromorbit.com>:
On Mon, Aug 25, 2014 at 06:46:31PM -0400, Greg Freemyer w= rote:
> On Mon, Aug 25, 2014 at 6:26 PM, Dave Chinner <david@fromorbit.com> wrote:
> > On Mon, Aug 25, 2014 at 06:31:10PM +0800, Zhang Qiang wrote:
> >> 2014-08-25 17:08 GMT+08:00 Dave Chinner <david@fromorbit.com>:
> >>
> >> > On Mon, Aug 25, 2014 at 04:47:39PM +0800, Zhang Qiang wr= ote:
> >> > > I have checked icount and ifree, but I found there = are about 11.8 percent
> >> > > free, so the free inode should not be too few.
> >> > >
> >> > > Here's the detail log, any new clue?
> >> > >
> >> > > # mount /dev/sda4 /data1/
> >> > > # xfs_info /data1/
> >> > > meta-data=3D/dev/sda4=C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 isize=3D256=C2=A0 =C2=A0 agcount=3D4, agsize=3D1422723= 84
> >> >
> >> > 4 AGs
> >> >
> >> Yes.
> >>
> >> >
> >> > > icount =3D 220619904
> >> > > ifree =3D 26202919
> >> >
> >> > And 220 million inodes. There's your problem - that&= #39;s an average
> >> > of 55 million inodes per AGI btree assuming you are usin= g inode64.
> >> > If you are using inode32, then the inodes will be in 2 b= trees, or
> >> > maybe even only one.
> >> >
> >>
> >> You are right, all inodes stay on one AG.
> >>
> >> BTW, why i allocate 4 AGs, and all inodes stay in one AG for = inode32?,
> >
> > Because the top addresses in the 2nd AG go over 32 bits, hence on= ly
> > AG 0 can be used for inodes. Changing to inode64 will give you so= me
> > relief, but any time allocation occurs in AG0 is will be slow. i.= e.
> > you'll be trading always slow for "unpredictably slow&qu= ot;.
> >
> >> > With that many inodes, I'd be considering moving to = 32 or 64 AGs to
> >> > keep the btree size down to a more manageable size. The = free inode
> >>
> >> btree would also help, but, really, 220M inodes in a 2TB file= system
> >> > is really pushing the boundaries of sanity.....
> >> >
> >>
> >> So the better inodes size in one AG is about 5M,
> >
> > Not necessarily. But for your storage it's almost certainly g= oing to
> > minimise the problem you are seeing.
> >
> >> is there any documents
> >> about these options I can learn more?
> >
> > http://xfs.org/index.php/XFS_Papers_and_Documentation
>
> Given the apparently huge number of small files would he likely see a<= br> > big performance increase if he replaced that 2TB or rust with SSD.

Doubt it - the profiles showed the allocation being CPU bound searching the metadata that indexes all those inodes. Those same
profiles showed all the signs that it was hitting the buffer
cache most of the time, too, which is why it was CPU bound....

--001a1133b07047794b0501856f4a-- From bfoster@redhat.com Tue Aug 26 07:41: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 B63C47F3F for ; Tue, 26 Aug 2014 07:41:04 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 437BCAC001 for ; Tue, 26 Aug 2014 05:41:01 -0700 (PDT) X-ASG-Debug-ID: 1409056859-04cb6c5500591160001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id g6edWQN5ioFBzd6w (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 26 Aug 2014 05:41: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-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 s7QCevMT004043 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Tue, 26 Aug 2014 08:40:57 -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 s7QCeuj1008523; Tue, 26 Aug 2014 08:40:57 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 0DD8112577F; Tue, 26 Aug 2014 08:40:56 -0400 (EDT) Date: Tue, 26 Aug 2014 08:40:55 -0400 From: Brian Foster To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [RFC, PATCH 0/4] xfs: clean up xlog_recover_process_data Message-ID: <20140826124055.GA52815@bfoster.bfoster> X-ASG-Orig-Subj: Re: [RFC, PATCH 0/4] xfs: clean up xlog_recover_process_data References: <1409016101-9511-1-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1409016101-9511-1-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.23 (2014-03-12) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1409056859 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Tue, Aug 26, 2014 at 11:21:37AM +1000, Dave Chinner wrote: > Hi folks, > > The log recovery use-after-free that Brian posted a patch for has > had several previous attempts sent and none have completed review. > So let's put this one to bed for good. > > This patch set addresses the previous review feedback for fixing > this problem. It factors xlog_recover_process_data() to make it > cleaner and isolate the context of the transaction recvoery > structure that is causing problems. It fixes a leak of the structure > in an error condition that I noticed while factoring, as well as the > double free that Brian and others have identified and tried to fix > in the past. It then re-arranges the recovery item management code > to put it all in one place, rather than in 3 separate parts of the > file separated by several hundred lines of unrelated code. > > Comments? > This looks pretty good to me. I like the cleanups and it fixes the problem. A few minor comments/questions to follow. Brian > -Dave. > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From bfoster@redhat.com Tue Aug 26 07:41: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 727A77F3F for ; Tue, 26 Aug 2014 07:41:21 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 0F977AC001 for ; Tue, 26 Aug 2014 05:41:20 -0700 (PDT) X-ASG-Debug-ID: 1409056876-04bdf010a05222a0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id oHZYNQcFdJwSafLp (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 26 Aug 2014 05:41:16 -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 s7QCfFNG027368 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Tue, 26 Aug 2014 08:41:15 -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 s7QCfEpV022985; Tue, 26 Aug 2014 08:41:14 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id D1D2D12577F; Tue, 26 Aug 2014 08:41:13 -0400 (EDT) Date: Tue, 26 Aug 2014 08:41:13 -0400 From: Brian Foster To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 1/4] xfs: refactor xlog_recover_process_data() Message-ID: <20140826124112.GB52815@bfoster.bfoster> X-ASG-Orig-Subj: Re: [PATCH 1/4] xfs: refactor xlog_recover_process_data() References: <1409016101-9511-1-git-send-email-david@fromorbit.com> <1409016101-9511-2-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1409016101-9511-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.27 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1409056876 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Tue, Aug 26, 2014 at 11:21:38AM +1000, Dave Chinner wrote: > From: Dave Chinner > > Clean up xlog_recover_process_data() structure in preparation for > fixing the allocationa nd freeing context of the transaction being > recovered. > > Signed-off-by: Dave Chinner > --- > fs/xfs/xfs_log_recover.c | 151 ++++++++++++++++++++++++++--------------------- > 1 file changed, 84 insertions(+), 67 deletions(-) > > diff --git a/fs/xfs/xfs_log_recover.c b/fs/xfs/xfs_log_recover.c > index 01becbb..1970732f 100644 > --- a/fs/xfs/xfs_log_recover.c > +++ b/fs/xfs/xfs_log_recover.c > @@ -3531,12 +3531,78 @@ out: > } > > STATIC int > -xlog_recover_unmount_trans( > - struct xlog *log) > +xlog_recovery_process_ophdr( > + struct xlog *log, > + struct hlist_head rhash[], > + struct xlog_rec_header *rhead, > + struct xlog_op_header *ohead, > + xfs_caddr_t dp, > + xfs_caddr_t lp, > + int pass) > { > - /* Do nothing now */ > - xfs_warn(log->l_mp, "%s: Unmount LR", __func__); > - return 0; > + struct xlog_recover *trans; > + xlog_tid_t tid; > + int error; > + unsigned long hash; > + uint flags; > + unsigned int hlen; > + > + hlen = be32_to_cpu(ohead->oh_len); > + tid = be32_to_cpu(ohead->oh_tid); > + hash = XLOG_RHASH(tid); > + trans = xlog_recover_find_tid(&rhash[hash], tid); > + if (!trans) { > + /* add new tid if this is a new transaction */ > + if (ohead->oh_flags & XLOG_START_TRANS) { > + xlog_recover_new_tid(&rhash[hash], tid, > + be64_to_cpu(rhead->h_lsn)); > + } > + return 0; > + } > + Overall this looks pretty good to me. I wonder if we can clean this up to separate state management from error detection while we're at it. I don't see any reason this code to find trans has to be up here. > + error = -EIO; > + if (dp + hlen > lp) { > + xfs_warn(log->l_mp, "%s: bad length 0x%x", __func__, hlen); > + WARN_ON(1); > + goto out_free; > + } > + > + flags = ohead->oh_flags & ~XLOG_END_TRANS; > + if (flags & XLOG_WAS_CONT_TRANS) > + flags &= ~XLOG_CONTINUE_TRANS; > + /* we should find a trans for anything other than a start op */ trans = xlog_recover_find_tid(&rhash[hash], tid); if (((ohead->oh_flags & XLOG_START_TRANS) && trans) || (!(ohead->oh_flags & XLOG_START_TRANS) && !trans)) { xfs_warn(log->l_mp, "%s: bad transaction 0x%x oh_flags 0x%x trans %p", __func__, tid, ohead->oh_flags, trans); ASSERT(0); return -EIO; } Maybe returning error here is not the right thing to do because we want the recovery to proceed. We could still dump a warning and return 0 though. > + switch (flags) { > + /* expected flag values */ > + case 0: > + case XLOG_CONTINUE_TRANS: > + error = xlog_recover_add_to_trans(log, trans, dp, hlen); > + break; > + case XLOG_WAS_CONT_TRANS: > + error = xlog_recover_add_to_cont_trans(log, trans, dp, hlen); > + break; > + case XLOG_COMMIT_TRANS: > + error = xlog_recover_commit_trans(log, trans, pass); > + break; > + > + /* unexpected flag values */ > + case XLOG_UNMOUNT_TRANS: > + xfs_warn(log->l_mp, "%s: Unmount LR", __func__); > + error = 0; > + break; > + case XLOG_START_TRANS: > + xfs_warn(log->l_mp, "%s: bad transaction 0x%x", __func__, tid); > + ASSERT(0); > + break; xlog_recover_new_tid(&rhash[hash], tid, be64_to_cpu(rhead->h_lsn) error = 0; break; Brian > + default: > + xfs_warn(log->l_mp, "%s: bad flag 0x%x", __func__, flags); > + ASSERT(0); > + break; > + } > + > +out_free: > + if (error) > + xlog_recover_free_trans(trans); > + return error; > } > > /* > @@ -3556,14 +3622,10 @@ xlog_recover_process_data( > xfs_caddr_t dp, > int pass) > { > + struct xlog_op_header *ohead; > xfs_caddr_t lp; > int num_logops; > - xlog_op_header_t *ohead; > - xlog_recover_t *trans; > - xlog_tid_t tid; > int error; > - unsigned long hash; > - uint flags; > > lp = dp + be32_to_cpu(rhead->h_len); > num_logops = be32_to_cpu(rhead->h_num_logops); > @@ -3573,69 +3635,24 @@ xlog_recover_process_data( > return -EIO; > > while ((dp < lp) && num_logops) { > - ASSERT(dp + sizeof(xlog_op_header_t) <= lp); > - ohead = (xlog_op_header_t *)dp; > - dp += sizeof(xlog_op_header_t); > + ASSERT(dp + sizeof(struct xlog_op_header) <= lp); > + > + ohead = (struct xlog_op_header *)dp; > + dp += sizeof(*ohead); > + > if (ohead->oh_clientid != XFS_TRANSACTION && > ohead->oh_clientid != XFS_LOG) { > xfs_warn(log->l_mp, "%s: bad clientid 0x%x", > - __func__, ohead->oh_clientid); > + __func__, ohead->oh_clientid); > ASSERT(0); > return -EIO; > } > - tid = be32_to_cpu(ohead->oh_tid); > - hash = XLOG_RHASH(tid); > - trans = xlog_recover_find_tid(&rhash[hash], tid); > - if (trans == NULL) { /* not found; add new tid */ > - if (ohead->oh_flags & XLOG_START_TRANS) > - xlog_recover_new_tid(&rhash[hash], tid, > - be64_to_cpu(rhead->h_lsn)); > - } else { > - if (dp + be32_to_cpu(ohead->oh_len) > lp) { > - xfs_warn(log->l_mp, "%s: bad length 0x%x", > - __func__, be32_to_cpu(ohead->oh_len)); > - WARN_ON(1); > - return -EIO; > - } > - flags = ohead->oh_flags & ~XLOG_END_TRANS; > - if (flags & XLOG_WAS_CONT_TRANS) > - flags &= ~XLOG_CONTINUE_TRANS; > - switch (flags) { > - case XLOG_COMMIT_TRANS: > - error = xlog_recover_commit_trans(log, > - trans, pass); > - break; > - case XLOG_UNMOUNT_TRANS: > - error = xlog_recover_unmount_trans(log); > - break; > - case XLOG_WAS_CONT_TRANS: > - error = xlog_recover_add_to_cont_trans(log, > - trans, dp, > - be32_to_cpu(ohead->oh_len)); > - break; > - case XLOG_START_TRANS: > - xfs_warn(log->l_mp, "%s: bad transaction", > - __func__); > - ASSERT(0); > - error = -EIO; > - break; > - case 0: > - case XLOG_CONTINUE_TRANS: > - error = xlog_recover_add_to_trans(log, trans, > - dp, be32_to_cpu(ohead->oh_len)); > - break; > - default: > - xfs_warn(log->l_mp, "%s: bad flag 0x%x", > - __func__, flags); > - ASSERT(0); > - error = -EIO; > - break; > - } > - if (error) { > - xlog_recover_free_trans(trans); > - return error; > - } > - } > + > + error = xlog_recovery_process_ophdr(log, rhash, rhead, ohead, > + dp, lp, pass); > + if (error) > + return error; > + > dp += be32_to_cpu(ohead->oh_len); > num_logops--; > } > -- > 2.0.0 > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From bfoster@redhat.com Tue Aug 26 07:42: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 F2FFD7F3F for ; Tue, 26 Aug 2014 07:42:03 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id E18C730404E for ; Tue, 26 Aug 2014 05:42:00 -0700 (PDT) X-ASG-Debug-ID: 1409056919-04cb6c55005913d0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id HwuN3GuPgcFXTGuh (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 26 Aug 2014 05:42: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 s7QCfwHT028404 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Tue, 26 Aug 2014 08:41:58 -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 s7QCfwA2023334; Tue, 26 Aug 2014 08:41:58 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 7C61312577F; Tue, 26 Aug 2014 08:41:57 -0400 (EDT) Date: Tue, 26 Aug 2014 08:41:57 -0400 From: Brian Foster To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 2/4] xfs: recovery of XLOG_UNMOUNT_TRANS leaks memory Message-ID: <20140826124156.GC52815@bfoster.bfoster> X-ASG-Orig-Subj: Re: [PATCH 2/4] xfs: recovery of XLOG_UNMOUNT_TRANS leaks memory References: <1409016101-9511-1-git-send-email-david@fromorbit.com> <1409016101-9511-3-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1409016101-9511-3-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.23 (2014-03-12) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.27 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1409056920 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Tue, Aug 26, 2014 at 11:21:39AM +1000, Dave Chinner wrote: > From: Dave Chinner > > It aborts recovery without freeing the current trans structure that > we are decoding. > What do you mean by "aborts recovery?" I don't see anything in the code that reflects that behavior. Do you mean it's an on-disk marker for completion? > Signed-off-by: Dave Chinner > --- > fs/xfs/xfs_log_recover.c | 5 +++-- > 1 file changed, 3 insertions(+), 2 deletions(-) > > diff --git a/fs/xfs/xfs_log_recover.c b/fs/xfs/xfs_log_recover.c > index 1970732f..460cf98 100644 > --- a/fs/xfs/xfs_log_recover.c > +++ b/fs/xfs/xfs_log_recover.c > @@ -3587,8 +3587,9 @@ xlog_recovery_process_ophdr( > /* unexpected flag values */ > case XLOG_UNMOUNT_TRANS: > xfs_warn(log->l_mp, "%s: Unmount LR", __func__); > - error = 0; > - break; > + xlog_recover_free_trans(trans); > + return 0; > + The change to return here seems superfluous. It's fine, but just to check, were you intending to alter behavior in some way (e.g., return from xlog_recover_process_data())? Brian > case XLOG_START_TRANS: > xfs_warn(log->l_mp, "%s: bad transaction 0x%x", __func__, tid); > ASSERT(0); > -- > 2.0.0 > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From bfoster@redhat.com Tue Aug 26 07:42: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 D21A87F3F for ; Tue, 26 Aug 2014 07:42:36 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 6F3DFAC001 for ; Tue, 26 Aug 2014 05:42:36 -0700 (PDT) X-ASG-Debug-ID: 1409056954-04cbb0548581cb00001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id heq32UhIO93t1kSN (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 26 Aug 2014 05:42:35 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-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 s7QCgXnY024944 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Tue, 26 Aug 2014 08:42: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 s7QCgW5H030649; Tue, 26 Aug 2014 08:42:32 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id ECB6412577F; Tue, 26 Aug 2014 08:42:31 -0400 (EDT) Date: Tue, 26 Aug 2014 08:42:31 -0400 From: Brian Foster To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 3/4] xfs: fix double free in xlog_recover_commit_trans Message-ID: <20140826124231.GD52815@bfoster.bfoster> X-ASG-Orig-Subj: Re: [PATCH 3/4] xfs: fix double free in xlog_recover_commit_trans References: <1409016101-9511-1-git-send-email-david@fromorbit.com> <1409016101-9511-4-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1409016101-9511-4-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.23 (2014-03-12) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.24 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1409056955 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Tue, Aug 26, 2014 at 11:21:40AM +1000, Dave Chinner wrote: > From: Dave Chinner > > When an error occurs during buffer submission in > xlog_recover_commit_trans(), we free the trans structure twice. Fix > it by only freeing the structure in the caller regardless of the > success or failure of the function. > > Signed-off-by: Dave Chinner > --- > fs/xfs/xfs_log_recover.c | 10 +++++++--- > 1 file changed, 7 insertions(+), 3 deletions(-) > > diff --git a/fs/xfs/xfs_log_recover.c b/fs/xfs/xfs_log_recover.c > index 460cf98..23895d5 100644 > --- a/fs/xfs/xfs_log_recover.c > +++ b/fs/xfs/xfs_log_recover.c > @@ -3524,8 +3524,6 @@ out: > if (!list_empty(&done_list)) > list_splice_init(&done_list, &trans->r_itemq); > > - xlog_recover_free_trans(trans); > - > error2 = xfs_buf_delwri_submit(&buffer_list); > return error ? error : error2; > } > @@ -3571,6 +3569,11 @@ xlog_recovery_process_ophdr( > if (flags & XLOG_WAS_CONT_TRANS) > flags &= ~XLOG_CONTINUE_TRANS; > > + /* > + * Callees must not free the trans structure. We own it, so we'll decide > + * if we need to free it or not based on the operation being done and > + * it's result. its > + */ > switch (flags) { > /* expected flag values */ > case 0: > @@ -3582,7 +3585,8 @@ xlog_recovery_process_ophdr( > break; > case XLOG_COMMIT_TRANS: > error = xlog_recover_commit_trans(log, trans, pass); > - break; > + xlog_recover_free_trans(trans); > + return error; > > /* unexpected flag values */ > case XLOG_UNMOUNT_TRANS: > -- > 2.0.0 > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From sales@digital-ads.net Tue Aug 26 08:08: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=2.9 required=5.0 tests=HTML_MESSAGE,MONEY_BACK 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 98A387F3F for ; Tue, 26 Aug 2014 08:08:38 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 09980AC003 for ; Tue, 26 Aug 2014 06:08:34 -0700 (PDT) X-ASG-Debug-ID: 1409058511-04cbb05487820f30001-NocioJ Received: from sm1.indianemailmarketers.co.in (gw52.indianemailmarketers.co.in [103.9.223.220]) by cuda.sgi.com with ESMTP id b0lRzyAwZmne6ysc for ; Tue, 26 Aug 2014 06:08:31 -0700 (PDT) X-Barracuda-Envelope-From: sales@Digital-Ads.net X-Barracuda-Apparent-Source-IP: 103.9.223.220 Received: from WS68 (unknown [192.168.0.68]) by host.indianemailmarketers.co.in (Postfix) with ESMTPA id 975811F69D36 for ; Tue, 26 Aug 2014 16:41:35 +0530 (IST) From: "Aimee Jackson" To: Subject: Don't Miss Out,still awaiting for your reply.... Date: Tue, 26 Aug 2014 18:04:13 +0530 X-ASG-Orig-Subj: Don't Miss Out,still awaiting for your reply.... Message-ID: <4a0801cfc12a$201e5640$605b02c0$@Digital-Ads.net> MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="----=_NextPart_000_4A09_01CFC158.39DB7440" X-Mailer: Microsoft Outlook 14.0 Thread-Index: Ac/BKgHvcpeLeqsIQY6OqRTkLtwxig== Content-Language: en-us X-Barracuda-Connect: gw52.indianemailmarketers.co.in[103.9.223.220] X-Barracuda-Start-Time: 1409058511 X-Barracuda-URL: http://192.48.176.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=HTML_MESSAGE, MONEY_BACK, THREAD_INDEX X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.8845 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 MONEY_BACK BODY: Money back guarantee 0.01 THREAD_INDEX thread-index: AcO7Y8iR61tzADqsRmmc5wNiFHEOig== 0.00 HTML_MESSAGE BODY: HTML included in message This is a multipart message in MIME format. ------=_NextPart_000_4A09_01CFC158.39DB7440 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Hope you are doing well. Haven't heard back from you, just wondering if you are interested in our services. I tried to reach you just now but you were not available to speak. Just wanted to reach out about your goals for social media this year. Do let me know if you are interested and I would be happy to share you more details about our past work details, client testimonials and price list. Regards, Aimee Jackson Business Development Manager Email ID: sales@Digital-Ads.net P Please consider the environment before printing this e-mail. ----------__________________________________________________________________ __________ From: Aimee Jackson [mailto: sales@Digital-Ads.net] Sent: Tue, 15th July, 2013 4:43 PM To: xfs@oss.sgi.com Subject: Pay After Your Best Performance: Improve Your Site Visitors With Alexa Rank Just in 30 Days By Our Digital Marketing Services. Hi, Was just wondering if you could help me out? We just came across your Company We are running a Results Based SEO Program. This is a unique performance based marketing program wherein you pay us on per-Selected & Top keywords for all the targeted audience, we generate your Targeted Traffic, Sales And Branding. Your company has been shortlisted for this campaign. Therefore, I would be very grateful if you could get back to me with the contact details of your marketing person so that we can get started on this. Who we are? We are #1 for India SEO Services & SEO Research and Analysis Services We are also developing highly effective corporate websites, flash designs, E- Commerce/Online Web Stores to name a few. Shopping Cart - Magneto, Open Cart, Zen Cart, oscommerce, Big Commerce. Framework - Zend Framework, Code igniter, Cake Php CMS - Wordpress, Joomla Portal - Travel Portal, Matrimonial Sites, Job Portal etc. Application - CRM (vTiger), School Management System, HRMS (orange hrm) Mobile Apps - Android If you are interested, Please send us your exact requirement details so that we can provide you the amazing services as per your requirement. ---------------------------------------------------------------------------- ------------------------------------------ Thanks so much! Aimee Jackson Internet Marketing Consultant sales@Digital-Ads.net P Please consider the environment before printing this e-mail. ------------------------------------------------------------------ PS1: To Unsubscribe, Please reply with" remove" in the subject line PS2: We operate 24 x7. I will be happy to send you links to price list, money back guarantee, client testimonials, "How we are different from others?", and "Why should you choose us?" on receiving a response from you. ------=_NextPart_000_4A09_01CFC158.39DB7440 Content-Type: text/html; charset="us-ascii" Content-Transfer-Encoding: quoted-printable

Hope you are doing = well.

 

Haven't heard back from you, just wondering if you = are interested in our services.

I tried to = reach you just now but you were not available to speak. Just wanted to = reach out about your goals for social media this year.

Do let me know if you are interested and I would be = happy to share you more details about our past work details, client = testimonials and price list.

 

 

Regards,

Aimee Jackson

Business Development = Manager

Email ID:  = sales@Digital-Ads.net

P<= span style=3D'font-size:10.0pt;color:#1F497D'> Please = consider the environment before printing this e-mail.

­­­­­­­­­­_____= _______________________________________________________________________

From: Aimee Jackson [mailto: = sales@Digital-Ads.net]
Sent: Tue, 15th July, 2013 4:43 = PM
To: xfs@oss.sgi.com
Subject: Pay After Your Best = Performance: Improve Your Site Visitors With Alexa Rank Just in 30 Days = By Our Digital Marketing Services.

Hi,

Was just = wondering if you could help me out?

 

We just = came across your Company

We are running a Results = Based SEO Program. This is a unique performance based marketing = program wherein you pay us on per-Selected & Top keywords for all = the targeted audience, we generate your Targeted Traffic, Sales = And Branding. Your company has been shortlisted for this = campaign.

 

Therefore, I would be very = grateful if you could get back to me with the contact details of your = marketing person so that we can get started on this.

 

 

Who we = are?

 

 

We = are #1 for India SEO Services & SEO Research and Analysis = Services

 

 

We = are also developing highly effective corporate websites, flash designs, = E- Commerce/Online Web Stores to name a few.

 

Shopping Cart – Magneto, = Open Cart, Zen Cart, oscommerce, Big = Commerce.

 

<= p class=3DMsoNoSpacing>Framework - Zend Framework, Code = igniter, Cake Php

 

<= p class=3DMsoNoSpacing>CMS – Wordpress, = Joomla

 

<= p class=3DMsoNoSpacing>Portal – Travel Portal, = Matrimonial Sites, Job Portal etc.

 

<= p class=3DMsoNoSpacing>Application - CRM (vTiger), = School Management System, HRMS (orange hrm)

 

<= p class=3DMsoNoSpacing>Mobile Apps – = Android

 

=

If you are interested, Please = send us your exact requirement details so that we can provide you the = amazing services as per your requirement.

 

---------------------------------= -------------------------------------------------------------------------= ------------

 

Thanks so = much!

Aimee = Jackson

Internet = Marketing Consultant

sales@Digital-Ad= s.net

P<= span = style=3D'font-size:10.0pt;font-family:"Calibri","sans-serif";color:#1F497= D'> Please consider the environment before printing this = e-mail.

 

----------------= --------------------------------------------------

<= p class=3DMsoPlainText>PS1: To = Unsubscribe, Please reply with” remove” in the subject = line

 

PS2: We operate 24 x7. I will be happy to send you links to price list, = money back guarantee, client testimonials, “How we are different = from others?”, and “Why should you choose us?” on = receiving a response from you.

------=_NextPart_000_4A09_01CFC158.39DB7440-- From david@fromorbit.com Tue Aug 26 08:14: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 EBC287F3F for ; Tue, 26 Aug 2014 08: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 BE057304059 for ; Tue, 26 Aug 2014 06:14:00 -0700 (PDT) X-ASG-Debug-ID: 1409058837-04bdf0109a527910001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id nsyDhEQBAUZiFFiU for ; Tue, 26 Aug 2014 06:13:57 -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: AmQTAG+H/FN5LDJ8PGdsb2JhbABagw2BKoczp3cBAQEBBqRuAYEUFwUBAQEBODaEAwEBBAE6HCMFCwgDGAklDwUlAwcaE4g6B757FxiFZIhlaweETAWPE401mH0rL4JPAQEB Received: from ppp121-44-50-124.lns20.syd6.internode.on.net (HELO dastard) ([121.44.50.124]) by ipmail06.adl6.internode.on.net with ESMTP; 26 Aug 2014 22:43:56 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1XMGZO-00025i-Bi; Tue, 26 Aug 2014 23:13:54 +1000 Date: Tue, 26 Aug 2014 23:13:54 +1000 From: Dave Chinner To: Zhang Qiang Cc: Greg Freemyer , xfs-oss Subject: Re: bad performance on touch/cp file on XFS system Message-ID: <20140826131354.GK20518@dastard> X-ASG-Orig-Subj: Re: bad performance on touch/cp file on XFS system References: <20140825051801.GY26465@dastard> <20140825090843.GE20518@dastard> <20140825222657.GF20518@dastard> <20140826023754.GH20518@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1409058837 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.8845 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Tue, Aug 26, 2014 at 06:04:52PM +0800, Zhang Qiang wrote: > Thanks Dave/Greg for your analysis and suggestions. > > I can summarize what I should do next: > > - backup my data using xfsdump > - rebuilt filesystem using mkfs with options: agcount=32 for 2T disk > - mount filesystem with option inode64,nobarrier Ok up to here. > - applied patches about adding free list inode on disk structure No, don't do that. You're almost certain to get it wrong and corrupt your filesysetms and lose data. > As we have about ~100 servers need back up, so that will take much effort, > do you have any other suggestion? Just remount them with inode64. Nothing else. Over time as you add and remove files the inodes will redistribute across all 4 AGs. > What I am testing (ongoing): > - created a new 2T partition filesystem > - try to create small files and fill whole spaces then remove some of them > randomly > - check the performance of touch/cp files > - apply patches and verify it. > > I have got more data from server: > > 1) flush all cache(echo 3 > /proc/sys/vm/drop_caches), and umount filesystem > 2) mount filesystem and testing with touch command > * The first touch new file command take about ~23s > * second touch command take about ~0.1s. So it's cache population that is your issue. You didn't say that first time around, which means the diagnosis was wrong. Again, it's having to search a btree with 220 million inodes in it to find the first free inode, and that btree has to be pulled in from disk and searched. Once it's cached, then each subsequent allocation will be much faster becaue the majority of the tree being searched will already be in cache... > I have compared the memory used, it seems that xfs try to load inode bmap > block for the first time, which take much time, is that the reason to take > so much time for the first touch operation? No. reading the AGI btree to find the first free inode to allocate is what is taking the time. If you spread the inodes out over 4 AGs (using inode64) then the overhead of the first read will go down proportionally. Indeed, that is one of the reasons for using more AGs than 4 for filesystems lik ethis. Still, I can't help but wonder why you are using a filesystem to store hundreds of millions of tiny files, when a database is far better suited to storing and indexing this type and quantity of data.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From jack@suse.cz Tue Aug 26 11:06: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 77AFB7F3F for ; Tue, 26 Aug 2014 11:06:39 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 49A878F8068 for ; Tue, 26 Aug 2014 09:06:36 -0700 (PDT) X-ASG-Debug-ID: 1409069192-04bdf0109a543800001-NocioJ Received: from mx2.suse.de (cantor2.suse.de [195.135.220.15]) by cuda.sgi.com with ESMTP id LOEkmgRj6VsebVCC (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 26 Aug 2014 09:06:33 -0700 (PDT) X-Barracuda-Envelope-From: jack@suse.cz 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 5098EAB43; Tue, 26 Aug 2014 16:06:32 +0000 (UTC) Received: by quack.suse.cz (Postfix, from userid 1000) id 8776681C68; Tue, 26 Aug 2014 18:06:30 +0200 (CEST) Date: Tue, 26 Aug 2014 18:06:30 +0200 From: Jan Kara To: Dave Chinner Cc: Jan Kara , xfs@oss.sgi.com, clm@fb.com Subject: Re: [PATCH 1/6] xfs: mmap write/read leaves bad state on pages Message-ID: <20140826160630.GA9341@quack.suse.cz> X-ASG-Orig-Subj: Re: [PATCH 1/6] xfs: mmap write/read leaves bad state on pages References: <1408597754-13526-1-git-send-email-david@fromorbit.com> <1408597754-13526-2-git-send-email-david@fromorbit.com> <20140821195632.GA10335@quack.suse.cz> <20140821223332.GO26465@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140821223332.GO26465@dastard> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: cantor2.suse.de[195.135.220.15] X-Barracuda-Start-Time: 1409069193 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.8848 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Fri 22-08-14 08:33:32, Dave Chinner wrote: > On Thu, Aug 21, 2014 at 09:56:32PM +0200, Jan Kara wrote: > > On Thu 21-08-14 15:09:09, Dave Chinner wrote: > > > From: Dave Chinner > > > > > > generic/263 is failing fsx at this point with a page spanning > > > EOF that cannot be invalidated. The operations are: > > > > > > 1190 mapwrite 0x52c00 thru 0x5e569 (0xb96a bytes) > > > 1191 mapread 0x5c000 thru 0x5d636 (0x1637 bytes) > > > 1192 write 0x5b600 thru 0x771ff (0x1bc00 bytes) > > > > > > where 1190 extents EOF from 0x54000 to 0x5e569. When the direct IO > > > write attempts to invalidate the cached page over this range, it > > > fails with -EBUSY and so we fire this assert: > > > > > > XFS: Assertion failed: ret < 0 || ret == count, file: fs/xfs/xfs_file.c, line: 676 > > > > > > because the kernel is trying to fall back to buffered IO on the > > > direct IO path (which XFS does not do). > > > > > > The real question is this: Why can't that page be invalidated after > > > it has been written to disk an cleaned? > > > > > > Well, there's data on the first two buffers in the page (1k block > > > size, 4k page), but the third buffer on the page (i.e. beyond EOF) > > > is failing drop_buffers because it's bh->b_state == 0x3, which is > > > BH_Uptodate | BH_Dirty. IOWs, there's dirty buffers beyond EOF. Say > > > what? > > > > > > OK, set_buffer_dirty() is called on all buffers from > > > __set_page_buffers_dirty(), regardless of whether the buffer is > > > beyond EOF or not, which means that when we get to ->writepage, > > > we have buffers marked dirty beyond EOF that we need to clean. > > > So, we need to implement our own .set_page_dirty method that > > > doesn't dirty buffers beyond EOF. > > > > > > This is messy because the buffer code is not meant to be shared > > > and it has interesting locking issues on the buffer dirty bits. > > > So just copy and paste it and then modify it to suit what we need. > > Well, I'm not sure this is the cleanest way to fix your problem. The > > thing is that inode size can change (decrease) after set_page_dirty() has > > run and writeback can find the page before truncate_inode_pages() calls > > do_invalidatepage() on the last partial page. Now I agree that given > > truncate and direct IO are both synchronized using IOLOCK, this change > > still fixes your problem. I just wanted to point out that your change > > doesn't really make sure won't see dirty buffers in a tail page beyond > > i_size. > > Truncate is not the problem. The issue is that we can't > *invalidate* pages that have dirty buffers, and I soon realised that > we don't see this problem with truncate because *truncate ignores > invalidation failures*. So now I went looking for how other code > handled this. > > > As Anton has pointed out other filesystems solve the same issue by clearing > > the dirty bits beyond EOF in their writepage() function. Also since we > > zero-out the tail of the page in writepage() (even in XFS as I checked), > > this kind of makes sense to me and has smaller overhead than special > > set_page_dirty()... > > Yes, and that's where I started - block_write_full_page and so > I ended up with this first: > > diff --git a/fs/xfs/xfs_aops.c b/fs/xfs/xfs_aops.c > index 2a316ad..a9d6afc 100644 > --- a/fs/xfs/xfs_aops.c > +++ b/fs/xfs/xfs_aops.c > @@ -1057,8 +1073,24 @@ xfs_vm_writepage( > do { > int new_ioend = 0; > > - if (offset >= end_offset) > + /* > + * If the buffer is fully beyond EOF, we need to mark it clean > + * otherwise we'll leave stale dirty buffers in memory. See the > + * comment above in the EOF handling about Charlie Foxtrots. > + */ > + if (offset >= end_offset) { > + clear_buffer_dirty(bh); > + ASSERT(!buffer_delay(bh)); > + ASSERT(!buffer_mapped(bh)); > + > + /* > + * Page is not uptodate until buffers under IO have been > + * fully processed. > + */ > + uptodate = 0; > + continue; > - break; > + } > + > if (!buffer_uptodate(bh)) > uptodate = 0; > > > But this doesn't solve the invalidation failures - it merely covers > up a symptom of the underlying problem. i.e. fsx went from > failing invalidate on the EOF page at operation #1192 to failing > invalidate on the EOF page at operation #9378. > > The I realised that flush/wait/invalidate is actually racy against > mmap, so writepage clearing dirty buffer flags on buffers beyond EOF > is not a solution to the problem - it can still occur. So I added Hum, I have to say I don't quite understand this. I agree with you that clearing dirty bits in .writepage() is racy wrt mmap. However I don't see how fsx can ever trigger this. For flush/wait/invalidate to fail, someone would have to write to the mapping somewhere between flush and invalidate. However fsx is singlethreaded so I don't see how that can happen. > this check to releasepage() to catch stale dirty buffers beyond EOF > preventing invalidation from succeeding: > > @@ -1209,9 +1245,16 @@ xfs_vm_writepages( > > /* > * Called to move a page into cleanable state - and from there > - * to be released. The page should already be clean. We always > + * to be released. We always > * have buffer heads in this call. > * > + * The page should already be clean, except in the case where EOF falls within > + * the page and then we can have dirty buffers beyond EOF that nobody can > + * actually clean. These dirty buffers will cause invalidation failures, but > + * because they can't be written the should not prevent us from tossing the page > + * out of cache. Hence if we span EOF, walk the buffers on the page and make > + * sure they are in a state where try_to_free_buffers() will succeed. > + * > * Returns 1 if the page is ok to release, 0 otherwise. > */ > STATIC int > @@ -1219,7 +1262,10 @@ xfs_vm_releasepage( > struct page *page, > gfp_t gfp_mask) > { > + struct inode *inode = page->mapping->host; > int delalloc, unwritten; > + loff_t end_offset, offset; > + pgoff_t end_index; > > trace_xfs_releasepage(page->mapping->host, page, 0, 0); > > @@ -1230,5 +1276,21 @@ xfs_vm_releasepage( > if (WARN_ON_ONCE(unwritten)) > return 0; > > + end_offset = i_size_read(inode); > + end_index = end_offset >> PAGE_CACHE_SHIFT; > + if (page->index >= end_index) { > + struct buffer_head *head = page_buffers(page); > + struct buffer_head *bh; > + > + offset = end_index << PAGE_CACHE_SHIFT; Here should be page->index instead of end_index I suppose. However it shouldn't make a difference wrt your experiment. > + bh = head; > + do { > + if (offset > end_offset) > + clear_buffer_dirty(bh); > + bh = bh->b_this_page; > + offset += 1 << inode->i_blkbits; > + } while (bh != head); > + } > + > return try_to_free_buffers(page); > } > > Which then moved the fsx invalidation failure out to somewhere > around 105,000 operations. > > At which point I realised that I'm playing whack-a-mole with a > fundamental problem: buffers beyond EOF cannot be written, so > dirtying them in the first place is just fundamentally wrong. In XFS we'll > zero them on disk during an extend operation (either in write, > truncate or prealloc), so we're not going to leaak stale data by not > marking them dirty. They may not even be allocated, so we can't > assume that we can write them. So, rather than trying to handle this > dirty-buffers-beyond-EOF case in every situation where we might trip > over it, let's just prevent it from happening in the first place. Sure I understand that. I'm now trying to understand why noone else sees the problem (we do run xfstests for ext4 and blocksize < page size) and whether there's something we might want to do for other filesystems as well. I wonder if there isn't something special going on with XFS redirtying the page because xfs_imap_valid() returned EAGAIN but looking into the code I don't see how that could happen. > That's where the .set_page_dirty() method came about. The "mmap > dirties buffers beyond the EOF" problem is gone. Now, truncate might > have a similar problem with leaving dirty buffers beyond EOF as you > suggest, but I just can't seem to trip over that problem and it > hasn't shown up in the ~500 million fsx ops and ~30 hours of > fsstress that I've run in the past few days. So without being able > to reproduce a problem, I'm extremely wary of trying to "fix" it. So truncate is introducing dirty pages beyond EOF only temporarily - between the moment i_size is set and the moment page is invalidated. Since direct IO is synchronized with truncate, it cannot see them and you are fine. Only stuff like writeback or page reclaim can see pages in such state... Honza -- Jan Kara SUSE Labs, CR From stan@hardwarefreak.com Tue Aug 26 12:19: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 (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 273917F4E for ; Tue, 26 Aug 2014 12:19:50 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id DDF638F806F for ; Tue, 26 Aug 2014 10:19:46 -0700 (PDT) X-ASG-Debug-ID: 1409073584-04bdf0109754e030001-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 oFnSB9q2IXwHIVTq for ; Tue, 26 Aug 2014 10:19:44 -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: by greer.hardwarefreak.com (Postfix, from userid 33) id 916626C192; Tue, 26 Aug 2014 12:19:43 -0500 (CDT) To: Dave Chinner Subject: Re: storage, libaio, or XFS =?UTF-8?Q?problem=3F=20=20=33=2E=34=2E=32=36?= X-PHP-Originating-Script: 0:func.inc X-ASG-Orig-Subj: Re: storage, libaio, or XFS =?UTF-8?Q?problem=3F=20=20=33=2E=34=2E=32=36?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Date: Tue, 26 Aug 2014 12:19:43 -0500 From: Stan Hoeppner Cc: In-Reply-To: <20140826075345.GJ20518@dastard> References: <3fe8c34c0ccbbd720015d273fa2b8b30@localhost> <20140826075345.GJ20518@dastard> Message-ID: <8c29baf987467a84f0b7c1d09c863662@localhost> X-Sender: stan@hardwarefreak.com User-Agent: RoundCube Webmail/0.3.1 X-Barracuda-Connect: mo-65-41-216-221.sta.embarqhsd.net[65.41.216.221] X-Barracuda-Start-Time: 1409073584 X-Barracuda-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, 26 Aug 2014 17:53:45 +1000, Dave Chinner wrote: > On Tue, Aug 26, 2014 at 01:18:50AM -0500, Stan Hoeppner wrote: >> Had some controller issues but believe we had those ironed out before >> this >> recent breakage. I had reformatted both 48TB LUNs on this test box with >> -f >> and defaults, and fired up the test app again. Throughput was fantastic >> with no dropped application buffers for ~30 minutes, and IO times were >> 1.x >> ms max, suggesting all the writes were acked by controller cache. The >> app >> was running perfectly. Then it hanged and spit out an internal error >> msg: >> >> >> Failed to reopen file /mnt/VOL1/sg-04/str-0015/f-0000000005 >> >> I have many call traces in dmesg, most are XFS, pasted below. I found no >> SCSI I/O errors in dmesg. Application is submitting writes via libaio >> and >> using O_DIRECT, writing to preallocated files. I don't see any errors in >> the storage controller log and everything seems to check out there. >> Using >> noop elevator, mpt2sas, no multipathing. The application process is hung >> in d state and kill -9 won't get rid of it. I can't unmount the hosed up >> filesystem. Any ideas? >> >> # ls -la /mnt/VOL1 >> ls: cannot access /mnt/VOL1: Input/output error >> >> # dd if=/mnt/VOL1 of=/dev/null bs=1M count=16 >> dd: opening `/mnt/VOL1': Input/output error >> >> # dd if=/dev/sdd of=/dev/null bs=1M count=16 >> 16+0 records in >> 16+0 records out >> 16777216 bytes (17 MB) copied, 1.10989 s, 15.1 MB/s >> >> # ls -la /mnt/ >> ls: cannot access /mnt/VOL1: Input/output error >> total 8 >> drwxrwxrwt 6 root root 120 Aug 25 17:59 . >> drwxr-xr-x 21 root root 4096 Jul 15 09:39 .. >> drwxrwxrwt 3 root root 80 Aug 25 16:52 initramfs >> drwxr-xr-x 3 root root 4096 Apr 24 04:57 scratch >> drwxrwxrwx 5 root root 58 Aug 25 22:06 VOL0 >> d????????? ? ? ? ? ? VOL1 > > That's an inode we failed to stat() - most likely because of the IO > error. Has the filesystem shut down? the IO error shoul dhave had > some kind of output in dmesg associated with it from XFS.... Sorry, I omitted the XFS logging preceding the first call trace: Aug 25 18:02:50 Anguish-ssu-1 kernel: [ 4280.310304] SGI XFS with security attributes, large block/inode numbers, no debug enabled Aug 25 18:02:50 Anguish-ssu-1 kernel: [ 4280.311101] XFS (sdc): Mounting Filesystem Aug 25 18:02:51 Anguish-ssu-1 kernel: [ 4280.501405] XFS (sdc): Starting recovery (logdev: internal) Aug 25 18:02:53 Anguish-ssu-1 kernel: [ 4282.766547] XFS (sdc): Failed to recover EFIs Aug 25 18:02:53 Anguish-ssu-1 kernel: [ 4282.766549] XFS (sdc): log mount finish failed Aug 25 18:04:50 Anguish-ssu-1 kernel: [ 4399.471829] XFS (sdc): Mounting Filesystem Aug 25 18:04:50 Anguish-ssu-1 kernel: [ 4399.620805] XFS (sdc): Ending clean mount Aug 25 18:04:56 Anguish-ssu-1 kernel: [ 4405.613778] XFS (sdd): Mounting Filesystem Aug 25 18:04:56 Anguish-ssu-1 kernel: [ 4405.835412] XFS (sdd): Ending clean mount Aug 25 23:05:39 Anguish-ssu-1 kernel: [22409.328839] XFS (sdd): xfs_do_force_shutdown(0x8) called from line 3732 of file fs/xfs/xfs_bmap.c. Return address = 0xffffffffa01cc9a6 Aug 25 23:05:49 Anguish-ssu-1 kernel: [22419.307128] XFS (sdd): failed to update timestamps for inode 0x2a000000a4 Aug 25 23:05:49 Anguish-ssu-1 kernel: [22419.307484] XFS (sdd): failed to update timestamps for inode 0x29000000a4 Aug 25 23:05:49 Anguish-ssu-1 kernel: [22419.307487] XFS (sdd): failed to update timestamps for inode 0x20000009f Aug 25 23:05:49 Anguish-ssu-1 kernel: [22419.307499] XFS (sdd): failed to update timestamps for inode 0x29000000a4 Aug 25 23:05:49 Anguish-ssu-1 kernel: [22419.307693] XFS (sdd): failed to update timestamps for inode 0x20000009f Aug 25 23:05:49 Anguish-ssu-1 kernel: [22419.368106] XFS (sdd): failed to update timestamps for inode 0xf000000a4 Aug 25 23:05:49 Anguish-ssu-1 kernel: [22419.369785] XFS (sdd): failed to update timestamps for inode 0xf000000a4 Aug 25 23:05:49 Anguish-ssu-1 kernel: [22419.605835] XFS (sdd): failed to update timestamps for inode 0x2810f413c Aug 25 23:05:49 Anguish-ssu-1 kernel: [22419.606169] XFS (sdd): failed to update timestamps for inode 0x60000009f Again, when the app locked up I was assuming we had more controller issues, and I expected to find SCSI I/O errors preceding the XFS errors. But there are none. The controllers check out, no errors logged on them. Diags pass, etc. When NOT using AIO for submission, just parallel O_DIRECT, the big rig is sustaining ~2.5GB/s write throughput across 14 arrays at the application level with ~4200 write threads submitting IOs concurrently, with no problems, no errors. ~1/3rd of these write threads are slow writers, each submitting a 32KB IO to a file every few seconds. Fast and medium rate streams fill the cache, thus these slow writer streams generate RMWs. This is why the throughput is relatively low for 168 effective spindles which are capable of streaming writes in the ~16GB/s neighborhood. My little test rig is submitting from 602 threads in parallel, 301 threads each to one of two filesystems each on a 12+1 RAID5 LUN. Both boxes have the same problem described here, but only when submitting with AIO. I don't have logs for the big box, but I did see some of the same collateral damage on it, specifically the garbage when doing an 'ls -la' on the mount points. This obviously due to the XFS forced shutdown. >> [22635.102013] INFO: task kworker/7:0:45 blocked for more than 120 >> seconds. >> [22635.102016] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" >> disables >> this message. >> [22635.102018] kworker/7:0 D ffff8840666c0b08 0 45 2 >> 0x00000000 >> [22635.102021] ffff8840666e7bd0 0000000000000046 ffff883f7c02d000 >> ffff8840666f5180 >> [22635.102026] ffff8840666e7b80 0000000000000206 00000000000122c0 >> 00000000000122c0 >> [22635.102030] ffff8840666e7fd8 ffff8840666e6000 00000000000122c0 >> ffff8840666e6000 >> [22635.102033] Call Trace: >> [22635.102041] [] schedule+0x64/0x66 >> [22635.102044] [] rwsem_down_failed_common+0xdb/0x10d >> [22635.102047] [] rwsem_down_write_failed+0x13/0x15 >> [22635.102051] [] >> call_rwsem_down_write_failed+0x13/0x20 >> [22635.102055] [] ? >> _raw_spin_unlock_irqrestore+0x30/0x3d >> [22635.102058] [] ? down_write+0x25/0x27 >> [22635.102070] [] xfs_ilock+0x4f/0xb4 [xfs] >> [22635.102077] [] >> xfs_iomap_write_unwritten+0x1b3/0x32e >> [xfs] >> [22635.102080] [] ? >> _raw_spin_unlock_irqrestore+0x30/0x3d >> [22635.102084] [] ? xfs_setfilesize+0x128/0x128 [xfs] >> [22635.102088] [] ? mempool_free+0x73/0x78 >> [22635.102093] [] ? xfs_setfilesize+0x128/0x128 [xfs] >> [22635.102098] [] xfs_end_io+0x89/0xb4 [xfs] >> [22635.102102] [] process_one_work+0x204/0x327 >> [22635.102105] [] worker_thread+0x13b/0x25a >> [22635.102108] [] ? process_one_work+0x327/0x327 >> [22635.102111] [] kthread+0x89/0x91 >> [22635.102115] [] kernel_thread_helper+0x4/0x10 >> [22635.102118] [] ? __init_kthread_worker+0x3c/0x3c >> [22635.102120] [] ? gs_change+0xb/0xb > > That's stuck on a an inode lock. That reminds of a problem we had in > RHEL6 with highly concurrent direct IO. The rwsems were buggy, and > XFS was tripping over the bug and hanging just like this. If the > filesystem is not shutting down and causing that IO error due to a > shutdown state, then it's entirely possible we've got another rwsem > issue. Now I've just got to go find the RHEL 6 problem again. Ah: Definitely highly concurrent direct io here. Filesystem *is* shutting down. Again, this only happens when submitting via AIO. > 91af708 rwsem: Test for no active locks in __rwsem_do_wake undo code > > But that was fixed in 2.6.34 (rhel 6 was based on 2.6.32), so I > doubt that is your problem. However, it smells almost exactly the > same - it took about an hour of highly concurrent direct IO to SSDs > to trigger, and Lachlan ended up finding the right incantation of > lock debug code inside the xfs mrlock implementation to prove that > it was an rwsem bug and not an XFS locking issue. FWIW I'm seeing it after about ~30 minutes on the small box. I don't know how quickly it occurred on the big rig. > Are you able to take crash dumps from this machine so you can dig > around inside the XFS inode and rwsem states when the system locks > up like this? The kernel isn't completely crashing. I am able to CTRL+Z out of the hung application back to a prompt, and open additional SSH shells. But when these errors occur, something in the kernel does become goofy, as the load average spikes to the stratosphere, even though there is no CPU burn nor IO wait. Once the app crashes the box is 100% idle. Do keep in mind as we troubleshoot this that the boxen are in a machine room 520 miles from my location. So I can't push magic key sequences on the console. I don't have KVM access. Through I might be able to get it if needed, haven't asked. > One thing in the RH bug that was suggested as a simply test to > determine if there's a problem with the rwsems is to edit the kernel > configin arch/x86/Kconfig: > > Change: > > config RWSEM_GENERIC_SPINLOCK > def_bool !X86_ADD > > config RWSEM_XCHGADD_ALGORITHM > def_bool X86_ADD > > to: > > config RWSEM_GENERIC_SPINLOCK > def_bool y > > config RWSEM_XCHGADD_ALGORITHM > def_bool n These aren't truly lab systems in all respects. I don't have the permission/access to change the kernel config and recompile. There is a "process" for that and a different group owns that process. If this is necessary to troubleshoot this then I'll see if I can push it through. > I haven't cheked if this still works on a 3.4 kernel, but it will > change the rwsem implementation to the generic, spinlock based > implementation rather than the super-special, highly optimised > x86 specific implementation. If that makes the problem go away, > then we've got another rwsem bug on our hands. If it doesn't, then I > can probably get you the mrlock debug code lachlan wrote and we can > see if XFS is doing something wrong... Thanks for the detailed explanation. Given the new information I've provided, what is my next step? Thanks, Stan From david@fromorbit.com Tue Aug 26 16:38: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 5EB8E7F51 for ; Tue, 26 Aug 2014 16:38:29 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 4D3448F8054 for ; Tue, 26 Aug 2014 14:38:25 -0700 (PDT) X-ASG-Debug-ID: 1409089102-04cb6c54fd5c77b0001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id l8sfu2DaWxAEAU2u for ; Tue, 26 Aug 2014 14:38:23 -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: AkwOAMr9/FN5LDJ8/2dsb2JhbABbgw2BKoIsrQcBAQEGpG4BgRkXd4QDAQEEATocIwULCAMOBwMJJQ8FJQMhExuIHwe/XBcYhWSJUAeETAWcU5UVgWQegW4rL4JPAQEB Received: from ppp121-44-50-124.lns20.syd6.internode.on.net (HELO dastard) ([121.44.50.124]) by ipmail07.adl2.internode.on.net with ESMTP; 27 Aug 2014 07:08:21 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1XMORM-0003MW-6y; Wed, 27 Aug 2014 07:38:08 +1000 Date: Wed, 27 Aug 2014 07:38:08 +1000 From: Dave Chinner To: Jan Kara Cc: xfs@oss.sgi.com, clm@fb.com Subject: Re: [PATCH 1/6] xfs: mmap write/read leaves bad state on pages Message-ID: <20140826213808.GL20518@dastard> X-ASG-Orig-Subj: Re: [PATCH 1/6] xfs: mmap write/read leaves bad state on pages References: <1408597754-13526-1-git-send-email-david@fromorbit.com> <1408597754-13526-2-git-send-email-david@fromorbit.com> <20140821195632.GA10335@quack.suse.cz> <20140821223332.GO26465@dastard> <20140826160630.GA9341@quack.suse.cz> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140826160630.GA9341@quack.suse.cz> 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: 1409089102 X-Barracuda-URL: http://192.48.176.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.8856 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Tue, Aug 26, 2014 at 06:06:30PM +0200, Jan Kara wrote: > On Fri 22-08-14 08:33:32, Dave Chinner wrote: > > On Thu, Aug 21, 2014 at 09:56:32PM +0200, Jan Kara wrote: > > > On Thu 21-08-14 15:09:09, Dave Chinner wrote: > > > > From: Dave Chinner > > > > > > > > generic/263 is failing fsx at this point with a page spanning > > > > EOF that cannot be invalidated. The operations are: > > > > > > > > 1190 mapwrite 0x52c00 thru 0x5e569 (0xb96a bytes) > > > > 1191 mapread 0x5c000 thru 0x5d636 (0x1637 bytes) > > > > 1192 write 0x5b600 thru 0x771ff (0x1bc00 bytes) > > > > > > > > where 1190 extents EOF from 0x54000 to 0x5e569. When the direct IO > > > > write attempts to invalidate the cached page over this range, it > > > > fails with -EBUSY and so we fire this assert: > > > > > > > > XFS: Assertion failed: ret < 0 || ret == count, file: fs/xfs/xfs_file.c, line: 676 > > > > > > > > because the kernel is trying to fall back to buffered IO on the > > > > direct IO path (which XFS does not do). > > > > > > > > The real question is this: Why can't that page be invalidated after > > > > it has been written to disk an cleaned? .... > > > As Anton has pointed out other filesystems solve the same issue by clearing > > > the dirty bits beyond EOF in their writepage() function. Also since we > > > zero-out the tail of the page in writepage() (even in XFS as I checked), > > > this kind of makes sense to me and has smaller overhead than special > > > set_page_dirty()... > > > > Yes, and that's where I started - block_write_full_page and so > > I ended up with this first: > > > > diff --git a/fs/xfs/xfs_aops.c b/fs/xfs/xfs_aops.c > > index 2a316ad..a9d6afc 100644 > > --- a/fs/xfs/xfs_aops.c > > +++ b/fs/xfs/xfs_aops.c > > @@ -1057,8 +1073,24 @@ xfs_vm_writepage( > > do { > > int new_ioend = 0; > > > > - if (offset >= end_offset) > > + /* > > + * If the buffer is fully beyond EOF, we need to mark it clean > > + * otherwise we'll leave stale dirty buffers in memory. See the > > + * comment above in the EOF handling about Charlie Foxtrots. > > + */ > > + if (offset >= end_offset) { > > + clear_buffer_dirty(bh); > > + ASSERT(!buffer_delay(bh)); > > + ASSERT(!buffer_mapped(bh)); > > + > > + /* > > + * Page is not uptodate until buffers under IO have been > > + * fully processed. > > + */ > > + uptodate = 0; > > + continue; > > - break; > > + } > > + > > if (!buffer_uptodate(bh)) > > uptodate = 0; > > > > > > But this doesn't solve the invalidation failures - it merely covers > > up a symptom of the underlying problem. i.e. fsx went from > > failing invalidate on the EOF page at operation #1192 to failing > > invalidate on the EOF page at operation #9378. > > > > The I realised that flush/wait/invalidate is actually racy against > > mmap, so writepage clearing dirty buffer flags on buffers beyond EOF > > is not a solution to the problem - it can still occur. So I added > Hum, I have to say I don't quite understand this. I agree with you that > clearing dirty bits in .writepage() is racy wrt mmap. However I don't see > how fsx can ever trigger this. For flush/wait/invalidate to fail, someone > would have to write to the mapping somewhere between flush and invalidate. > However fsx is singlethreaded so I don't see how that can happen. Right, I was talking about the general problem, not necessarily the specific fsx problem I was seeing. i.e. clearing dirty buffers beyond EOF in writepage is not a robust solution, so regardless of whatever other problems there are, it's not a solution we can rely on. .... > > At which point I realised that I'm playing whack-a-mole with a > > fundamental problem: buffers beyond EOF cannot be written, so > > dirtying them in the first place is just fundamentally wrong. In XFS we'll > > zero them on disk during an extend operation (either in write, > > truncate or prealloc), so we're not going to leaak stale data by not > > marking them dirty. They may not even be allocated, so we can't > > assume that we can write them. So, rather than trying to handle this > > dirty-buffers-beyond-EOF case in every situation where we might trip > > over it, let's just prevent it from happening in the first place. > Sure I understand that. I'm now trying to understand why noone else sees > the problem (we do run xfstests for ext4 and blocksize < page size) and > whether there's something we might want to do for other filesystems as > well. Right, I don't understand where it's coming from, either. I know there are still problems with stray delalloc blocks even after making this change because xfs/297 is still tripping over delayed allocation blocks where there should be none during direct IO. i.e. this avoids the EOF issues that the direct IO invalidation changes expose, but I still haven't been able to find the underlying cause that is still triggering problems within EOF. This is the disadvantage of smart people writing smart code - most people (me included) are simply too dumb to be able to debug it. And so when shit goes wrong, we're left to wonder where the paddle was hidden... > I wonder if there isn't something special going on with XFS > redirtying the page because xfs_imap_valid() returned EAGAIN but looking > into the code I don't see how that could happen. To tell the truth, I'm fed up with having to deal repeatedly with bufferhead coherency problems and not being able to find the root cause. We just keep finding problem after problem after problem and there's no end in sight. So I'm much more inclined to spend time removing bufferheads from XFS than I am to try to find a needle in a very large haystack.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Tue Aug 26 17:34: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.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 9D3FF7F51 for ; Tue, 26 Aug 2014 17:34:27 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 7A4788F8065 for ; Tue, 26 Aug 2014 15:34:27 -0700 (PDT) X-ASG-Debug-ID: 1409092461-04cbb054878577f0001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id D1mQNfU5ExfCccLP for ; Tue, 26 Aug 2014 15:34:22 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.131 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AksOALwK/VN5LDJ8/2dsb2JhbABbgw2BKoIsrQcBAQEGpG4BgREXd4QDAQEFJxMcIxAIAw4HAwklDwUlAyETiEG/VBcYhWSJUAeETAWGE5ZAjBaIf4FmHIFuKy+CTwEBAQ Received: from ppp121-44-50-124.lns20.syd6.internode.on.net (HELO dastard) ([121.44.50.124]) by ipmail07.adl2.internode.on.net with ESMTP; 27 Aug 2014 08:04:20 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1XMPJX-0003U7-4b; Wed, 27 Aug 2014 08:34:07 +1000 Date: Wed, 27 Aug 2014 08:34:07 +1000 From: Dave Chinner To: Brian Foster Cc: xfs@oss.sgi.com Subject: Re: [PATCH 1/4] xfs: refactor xlog_recover_process_data() Message-ID: <20140826223407.GM20518@dastard> X-ASG-Orig-Subj: Re: [PATCH 1/4] xfs: refactor xlog_recover_process_data() References: <1409016101-9511-1-git-send-email-david@fromorbit.com> <1409016101-9511-2-git-send-email-david@fromorbit.com> <20140826124112.GB52815@bfoster.bfoster> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140826124112.GB52815@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: 1409092461 X-Barracuda-URL: http://192.48.176.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.8858 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Tue, Aug 26, 2014 at 08:41:13AM -0400, Brian Foster wrote: > On Tue, Aug 26, 2014 at 11:21:38AM +1000, Dave Chinner wrote: > > From: Dave Chinner > > > > Clean up xlog_recover_process_data() structure in preparation for > > fixing the allocationa nd freeing context of the transaction being > > recovered. > > > > Signed-off-by: Dave Chinner > > --- > > fs/xfs/xfs_log_recover.c | 151 ++++++++++++++++++++++++++--------------------- > > 1 file changed, 84 insertions(+), 67 deletions(-) > > > > diff --git a/fs/xfs/xfs_log_recover.c b/fs/xfs/xfs_log_recover.c > > index 01becbb..1970732f 100644 > > --- a/fs/xfs/xfs_log_recover.c > > +++ b/fs/xfs/xfs_log_recover.c > > @@ -3531,12 +3531,78 @@ out: > > } > > > > STATIC int > > -xlog_recover_unmount_trans( > > - struct xlog *log) > > +xlog_recovery_process_ophdr( > > + struct xlog *log, > > + struct hlist_head rhash[], > > + struct xlog_rec_header *rhead, > > + struct xlog_op_header *ohead, > > + xfs_caddr_t dp, > > + xfs_caddr_t lp, > > + int pass) > > { > > - /* Do nothing now */ > > - xfs_warn(log->l_mp, "%s: Unmount LR", __func__); > > - return 0; > > + struct xlog_recover *trans; > > + xlog_tid_t tid; > > + int error; > > + unsigned long hash; > > + uint flags; > > + unsigned int hlen; > > + > > + hlen = be32_to_cpu(ohead->oh_len); > > + tid = be32_to_cpu(ohead->oh_tid); > > + hash = XLOG_RHASH(tid); > > + trans = xlog_recover_find_tid(&rhash[hash], tid); > > + if (!trans) { > > + /* add new tid if this is a new transaction */ > > + if (ohead->oh_flags & XLOG_START_TRANS) { > > + xlog_recover_new_tid(&rhash[hash], tid, > > + be64_to_cpu(rhead->h_lsn)); > > + } > > + return 0; > > + } > > + > > Overall this looks pretty good to me. I wonder if we can clean this up > to separate state management from error detection while we're at it. I > don't see any reason this code to find trans has to be up here. > > > + error = -EIO; > > + if (dp + hlen > lp) { > > + xfs_warn(log->l_mp, "%s: bad length 0x%x", __func__, hlen); > > + WARN_ON(1); > > + goto out_free; > > + } > > + > > + flags = ohead->oh_flags & ~XLOG_END_TRANS; > > + if (flags & XLOG_WAS_CONT_TRANS) > > + flags &= ~XLOG_CONTINUE_TRANS; > > + > > /* we should find a trans for anything other than a start op */ > trans = xlog_recover_find_tid(&rhash[hash], tid); > if (((ohead->oh_flags & XLOG_START_TRANS) && trans) || > (!(ohead->oh_flags & XLOG_START_TRANS) && !trans)) { > xfs_warn(log->l_mp, "%s: bad transaction 0x%x oh_flags 0x%x trans %p", > __func__, tid, ohead->oh_flags, trans); > ASSERT(0); > return -EIO; > } > > Maybe returning error here is not the right thing to do because we want > the recovery to proceed. We could still dump a warning and return 0 > though. Urk. Try understanding why that logic exists in a couple of years time when you've forgetten all the context. :/ > > + switch (flags) { > > + /* expected flag values */ > > + case 0: > > + case XLOG_CONTINUE_TRANS: > > + error = xlog_recover_add_to_trans(log, trans, dp, hlen); > > + break; > > + case XLOG_WAS_CONT_TRANS: > > + error = xlog_recover_add_to_cont_trans(log, trans, dp, hlen); > > + break; > > + case XLOG_COMMIT_TRANS: > > + error = xlog_recover_commit_trans(log, trans, pass); > > + break; > > + > > + /* unexpected flag values */ > > + case XLOG_UNMOUNT_TRANS: > > + xfs_warn(log->l_mp, "%s: Unmount LR", __func__); > > + error = 0; > > + break; > > + case XLOG_START_TRANS: > > + xfs_warn(log->l_mp, "%s: bad transaction 0x%x", __func__, tid); > > + ASSERT(0); > > + break; > > xlog_recover_new_tid(&rhash[hash], tid, be64_to_cpu(rhead->h_lsn) > error = 0; > break; > I like the idea, but I don't like the suggested implementation. I was in two minds as to whether I should factor xlog_recover_find_tid() further. There's only one caller of it and only one caller of xlog_recover_new_tid() and the happen within three lines of each other. Hence I'm thinking that it makes more sense to wrap the "find or allocate trans" code in a single helper and lift all that logic clean out of this function. That helper can handle all the XLOG_START_TRANS logic more cleanly, I think.... Actually, that makes the factoring I've already done a little inconsistent. Let me rework this a bit. Cheers, Dave. -- Dave Chinner david@fromorbit.com From webmaster@dev103.magizz.com Tue Aug 26 20:14: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=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 8DCFA7F3F for ; Tue, 26 Aug 2014 20:14:40 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 6DBB4304051 for ; Tue, 26 Aug 2014 18:14:37 -0700 (PDT) X-ASG-Debug-ID: 1409102073-04cbb0548585bec0001-NocioJ Received: from vps.magizz.com (vps.magizz.com [162.251.83.157]) by cuda.sgi.com with ESMTP id rkwGMWnA8qPMJ54n (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 26 Aug 2014 18:14:34 -0700 (PDT) X-Barracuda-Envelope-From: webmaster@dev103.magizz.com X-Barracuda-Apparent-Source-IP: 162.251.83.157 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=dev103.magizz.com; s=default; h=Content-Type:Content-Transfer-Encoding:MIME-Version:List-Unsubscribe:Message-ID:Reply-To:From:Date:Subject:To; bh=vdvUR47Hj9QJeV+I4hO9vbQExRMpEuj+NHP641YsaSM=; b=kEVJdSVCzty3/N10T7f/awYYhJWC3Cd3HloRN9H+wtlc+KRtF1gAsk8G4Z4kC2F4Verxz1JBsBopBI5CMPDVASLXEBvNMS+jrRswkGaoxzcDFJ/IR1yKowUyzourZ8za2KYa91VYSK4M+Cjzcdk6PF12LUn1sUYIBqHaY6a6624=; Received: from dev103magizz by vps.magizz.com with local (Exim 4.82) (envelope-from ) id 1XMRon-0005pG-4y for xfs@oss.sgi.com; Wed, 27 Aug 2014 05:14:33 +0400 To: xfs@oss.sgi.com Subject: Goodbye from our newsletter X-PHP-Script: dev103.magizz.com/mailz/index.php for 66.249.64.186 X-ASG-Orig-Subj: Goodbye from our newsletter Received: from crawl-66-249-64-186.googlebot.com [66.249.64.186] by dev103.magizz.com with HTTP; Wed, 27 Aug 2014 01:14:32 +0000 Date: Wed, 27 Aug 2014 01:14:33 +0000 From: Webmaster Reply-To: Webmaster Message-ID: X-Priority: 3 X-Mailer: PHPMailer 5.2.5 (https://github.com/Synchro/PHPMailer/) X-phpList-version: 3.0.6 X-MessageID: systemmessage X-ListMember: xfs@oss.sgi.com Precedence: bulk Bounces-To: webmaster@dev103.magizz.com List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Content-Type: text/plain; charset=UTF-8 X-AntiAbuse: This header was added to track abuse, please include it with any abuse report X-AntiAbuse: Primary Hostname - vps.magizz.com X-AntiAbuse: Original Domain - oss.sgi.com X-AntiAbuse: Originator/Caller UID/GID - [506 517] / [47 12] X-AntiAbuse: Sender Address Domain - dev103.magizz.com X-Get-Message-Sender-Via: vps.magizz.com: authenticated_id: dev103magizz/from_h X-Barracuda-Connect: vps.magizz.com[162.251.83.157] X-Barracuda-Start-Time: 1409102073 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 X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.8862 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature Goodbye from our Newsletter, sorry to see you go. You have been unsubscribed from our newsletters. This is the last email you will receive from us. Our newsletter system, phpList, will refuse to send you any further messages, without manual intervention by our administrator. If there is an error in this information, you can re-subscribe: please go to http://dev103.magizz.com/mailz/?p=subscribe and follow the steps. Thank you From zhangqiang.buaa@gmail.com Wed Aug 27 03:53: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.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 A3B787F3F for ; Wed, 27 Aug 2014 03:53:27 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 0F827AC001 for ; Wed, 27 Aug 2014 01:53:23 -0700 (PDT) X-ASG-Debug-ID: 1409129597-04cb6c55005e3250001-NocioJ Received: from mail-lb0-f177.google.com (mail-lb0-f177.google.com [209.85.217.177]) by cuda.sgi.com with ESMTP id LIKknPUY4B806h8X (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Wed, 27 Aug 2014 01:53:18 -0700 (PDT) X-Barracuda-Envelope-From: zhangqiang.buaa@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.217.177 X-Barracuda-IPDD: Level1 [gmail.com/209.85.217.177] Received: by mail-lb0-f177.google.com with SMTP id l4so2712143lbv.22 for ; Wed, 27 Aug 2014 01:53:17 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.217.177] X-Barracuda-IPDD: Level1 [gmail.com/209.85.217.177] 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=1R3FjxzDCmWAKFygncMrfQBUXq0gXJRz37C660++KNo=; b=rrNVvHp6HNDGgozUTDDIFATUI4kP5PJvoGyt84Vh9XYhYZQsuOjBwzG/5E6CP3hGam D1O9WSqSkV+kjt9ct18MVc+e5Ldc/jXjTbg0sdJeiPHeNApxS13GH7DKkrENr1maIPKf YxTvrDIkb4e35ekBr7Ki3+2YkNwG71ZA/oBvaHNLXcvoo/HbcBU26U9bNcgFg/zPaedM qFZSvOl/xdUgsU7x14MiDbet1RfkQMi0H4HAgQsDQ/JayG5gtI/yqADTXo2eNx4KeUdx N83MYimnqbzfV1lfF1OMrRridVMfTA5+CVI5dgJLnzWNEHDzF8I511o2C4+DtyLIJm0r HnUg== MIME-Version: 1.0 X-Received: by 10.112.41.193 with SMTP id h1mr1277020lbl.95.1409129597291; Wed, 27 Aug 2014 01:53:17 -0700 (PDT) Received: by 10.114.161.116 with HTTP; Wed, 27 Aug 2014 01:53:17 -0700 (PDT) In-Reply-To: <20140826131354.GK20518@dastard> References: <20140825051801.GY26465@dastard> <20140825090843.GE20518@dastard> <20140825222657.GF20518@dastard> <20140826023754.GH20518@dastard> <20140826131354.GK20518@dastard> Date: Wed, 27 Aug 2014 16:53:17 +0800 Message-ID: Subject: Re: bad performance on touch/cp file on XFS system From: Zhang Qiang X-ASG-Orig-Subj: Re: bad performance on touch/cp file on XFS system To: Dave Chinner Cc: Greg Freemyer , xfs-oss Content-Type: multipart/alternative; boundary=001a1134615216d3a70501988d40 X-Barracuda-Connect: mail-lb0-f177.google.com[209.85.217.177] X-Barracuda-Start-Time: 1409129598 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.75 X-Barracuda-Spam-Status: No, SCORE=0.75 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_RULE_7580G, DKIM_SIGNED, DKIM_VERIFIED, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.8872 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.75 BSF_RULE_7580G Custom Rule 7580G --001a1134615216d3a70501988d40 Content-Type: text/plain; charset=UTF-8 2014-08-26 21:13 GMT+08:00 Dave Chinner : > On Tue, Aug 26, 2014 at 06:04:52PM +0800, Zhang Qiang wrote: > > Thanks Dave/Greg for your analysis and suggestions. > > > > I can summarize what I should do next: > > > > - backup my data using xfsdump > > - rebuilt filesystem using mkfs with options: agcount=32 for 2T disk > > - mount filesystem with option inode64,nobarrier > > Ok up to here. > > > - applied patches about adding free list inode on disk structure > > No, don't do that. You're almost certain to get it wrong and corrupt > your filesysetms and lose data. > > > As we have about ~100 servers need back up, so that will take much > effort, > > do you have any other suggestion? > > Just remount them with inode64. Nothing else. Over time as you add > and remove files the inodes will redistribute across all 4 AGs. > OK. How I can see the layout number of inodes on each AGs? Here's my checking steps: 1) Check unmounted file system first: [root@fstest data1]# xfs_db -c "sb 0" -c "p" /dev/sdb1 |egrep 'icount|ifree' icount = 421793920 ifree = 41 [root@fstest data1]# xfs_db -c "sb 1" -c "p" /dev/sdb1 |egrep 'icount|ifree' icount = 0 ifree = 0 [root@fstest data1]# xfs_db -c "sb 2" -c "p" /dev/sdb1 |egrep 'icount|ifree' icount = 0 ifree = 0 [root@fstest data1]# xfs_db -c "sb 3" -c "p" /dev/sdb1 |egrep 'icount|ifree' icount = 0 ifree = 0 2) mount it with inode64 and create many files: [root@fstest /]# mount -o inode64,nobarrier /dev/sdb1 /data [root@fstest /]# cd /data/tmp/ [root@fstest tmp]# fdtree.bash -d 16 -l 2 -f 100 -s 1 [root@fstest /]# umount /data 3) Check with xfs_db again: [root@fstest data1]# xfs_db -f -c "sb 0" -c "p" /dev/sdb1 |egrep 'icount|ifree' icount = 421821504 ifree = 52 [root@fstest data1]# xfs_db -f -c "sb 1" -c "p" /dev/sdb1 |egrep 'icount|ifree' icount = 0 ifree = 0 So, it seems that inodes only on first AG. Or icount/ifree is not the correct value to check, and how should I check how many inodes on each AGs? I am finding a way to improve the performance based on current filesystem and kernel just remounting with inode64, I am trying how to make all inodes redistribute on all AGs averagely. Is there any good way?, for example backup half of data to another device and remove it, then copy back it. > > What I am testing (ongoing): > > - created a new 2T partition filesystem > > - try to create small files and fill whole spaces then remove some of > them > > randomly > > - check the performance of touch/cp files > > - apply patches and verify it. > > > > I have got more data from server: > > > > 1) flush all cache(echo 3 > /proc/sys/vm/drop_caches), and umount > filesystem > > 2) mount filesystem and testing with touch command > > * The first touch new file command take about ~23s > > * second touch command take about ~0.1s. > > So it's cache population that is your issue. You didn't say that > first time around, which means the diagnosis was wrong. Again, it's having > to > search a btree with 220 million inodes in it to find the first free > inode, and that btree has to be pulled in from disk and searched. > Once it's cached, then each subsequent allocation will be much > faster becaue the majority of the tree being searched will already > be in cache... > > > I have compared the memory used, it seems that xfs try to load inode bmap > > block for the first time, which take much time, is that the reason to > take > > so much time for the first touch operation? > > No. reading the AGI btree to find the first free inode to allocate > is what is taking the time. If you spread the inodes out over 4 AGs > (using inode64) then the overhead of the first read will go down > proportionally. Indeed, that is one of the reasons for using more > AGs than 4 for filesystems lik ethis. > OK, I see. > Still, I can't help but wonder why you are using a filesystem to > store hundreds of millions of tiny files, when a database is far > better suited to storing and indexing this type and quantity of > data.... > OK, this is a social networking website back end servers, actually the CDN infrastructure, and different server located different cities. We have a global sync script to make all these 100 servers have the same data. For each server we use RAID10 and XFS (CentOS6.3). There are about 3M files (50K in size) generated every day, and we track the path of each files in database. Do you have any suggestions to improve our solution? > Cheers, > > Dave. > -- > Dave Chinner > david@fromorbit.com > --001a1134615216d3a70501988d40 Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: quoted-printable



2014-08-26 21:13 GMT+08:00 Dave Chinner <david@fromorbit.com= >:
On Tue, Aug 26, 2014 at 06:04:52PM +0800, Zhang Qiang= wrote:
> Thanks Dave/Greg for your analysis and suggestions.
>
> I can summarize what I should do next:
>
> - backup my data using xfsdump
> - rebuilt filesystem using mkfs with options: agcount=3D32 for 2T disk=
> - mount filesystem with option inode64,nobarrier

Ok up to here.

> - applied patches about adding free list inode on disk structure

No, don't do that. You're almost certain to get it wrong and = corrupt
your filesysetms and lose data.

> As we have about ~100 servers need back up, so that will take much eff= ort,
> do you have any other suggestion?

Just remount them with inode64. Nothing else. Over time as you add and remove files the inodes will redistribute across all 4 AGs.
OK.

How I can see =C2=A0the layout numbe= r of inodes on each AGs? Here's my checking steps:

1) Check unmounted file system first:
[root@fstest data= 1]# xfs_db -c "sb 0" =C2=A0-c "p" /dev/sdb1 |egrep '= ;icount|ifree'
icount =3D 421793920
ifree =3D 41
[root@fstest data1]# xfs_db -c "sb 1" =C2=A0-c "p" /dev= /sdb1 |egrep 'icount|ifree'
icount =3D 0
ifree = =3D 0
[root@fstest data1]# xfs_db -c "sb 2" =C2=A0-c &q= uot;p" /dev/sdb1 |egrep 'icount|ifree'
icount =3D 0
ifree =3D 0
[root@fstest data1]# xfs_= db -c "sb 3" =C2=A0-c "p" /dev/sdb1 |egrep 'icount|= ifree'
icount =3D 0
ifree =3D 0
2) = mount it with inode64 and create many files:

[root@fstest /]# mount -o inode64,nobarrier /dev/s= db1 /data
[root@fstest /]# cd /data/tmp/
[root@fstest t= mp]# fdtree.bash -d 16 -l 2 -f 100 -s 1
[root@fstest /]# um= ount /data

3) Check with xfs_db again:

[root@fstest data1]# xfs_db -f -c "sb 0" =C2=A0-c "p"= /dev/sdb1 |egrep 'icount|ifree'
icount =3D 421821504
ifree =3D 52
[root@fstest data1]# xfs_db -f -c "sb 1" = =C2=A0-c "p" /dev/sdb1 |egrep 'icount|ifree'
ic= ount =3D 0
ifree =3D 0

So, it seem= s that inodes only on first AG. Or icount/ifree is not the correct value to= check, and how should I check how many inodes on each AGs?


I am finding =C2=A0a way to improve the = performance based on current filesystem and kernel just remounting with ino= de64, I am trying how to make all inodes redistribute on all AGs averagely.=

Is there any good way?, for example backup half of data= to another device and remove it, then copy back it.


> What I am testing (ongoing):
>=C2=A0 - created a new 2T partition filesystem
>=C2=A0 - try to create small files and fill whole spaces then remove so= me of them
> randomly
>=C2=A0 - check the performance of touch/cp files
>=C2=A0 - apply patches and verify it.
>
> I have got more data from server:
>
> 1) flush all cache(echo 3 > /proc/sys/vm/drop_caches), and umount f= ilesystem
> 2) mount filesystem and testing with touch command
>=C2=A0 =C2=A0* The first touch new file command take about ~23s
>=C2=A0 =C2=A0* second touch command take about ~0.1s.

So it's cache population that is your issue. You didn't say t= hat
first time around, which means the diagnosis was wrong. Again, it's hav= ing to
search a btree with 220 million inodes in it to find the first free
inode, and that btree has to be pulled in from disk and searched.
Once it's cached, then each subsequent allocation will be much
faster becaue the majority of the tree being searched will already
be in cache...

> I have compared the memory used, it seems that xfs try to load inode b= map
> block for the first time, which take much time, is that the reason to = take
> so much time for the first touch operation?

No. reading the AGI btree to find the first free inode to allocate is what is taking the time. If you spread the inodes out over 4 AGs
(using inode64) then the overhead of the first read will go down
proportionally. Indeed, that is one of the reasons for using more
AGs than 4 for filesystems lik ethis.
OK, I see.=C2=A0=


Still, I can't help but wonder why you are using a filesystem to
store hundreds of millions of tiny files, when a database is far
better suited to storing and indexing this type and quantity of
data....

OK, this is a social networkin= g website back end servers, actually the CDN infrastructure, and different = server located different cities.
We have a global sync script to = make all these 100 servers have the same data.

For each server we use RAID10 and XFS (CentOS6.3)= .

There are about 3M files (50K in size) generated= every day, and we track the path of each files in database.

Do you have any suggestions to improve our solution?



Cheers,

Dave.
--
Dave Chinner
david@fromorbit.co= m

--001a1134615216d3a70501988d40-- From weber@zbfmail.de Wed Aug 27 05:14: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=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 B66697F3F for ; Wed, 27 Aug 2014 05:14:29 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 38C14AC001 for ; Wed, 27 Aug 2014 03:14:28 -0700 (PDT) X-ASG-Debug-ID: 1409134466-04cbb054878728d0001-NocioJ Received: from mail.zbfmail.de (mail.zbfmail.de [176.9.84.12]) by cuda.sgi.com with ESMTP id 8xNYmeF4XX5KWFht (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 27 Aug 2014 03:14:26 -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 512DAA3436 for ; Wed, 27 Aug 2014 12:14:21 +0200 (CEST) DKIM-Filter: OpenDKIM Filter v2.9.2 mail.zbfmail.de 512DAA3436 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=zbfmail.de; s=dkim; t=1409134465; bh=yCB4C+fghVCBE4xqTNeBVrf3ul+PrsPky2F4FoRgcWk=; h=Date:From:To:Subject:Reply-To; b=cpJ0M7zRNt+O7KscNOWPKvgK/yxy3Gaqo2alA6yAoT6NKMaOPtJR4esrIVQoJ09AQ HgudaNMMA7C7fCnEfRFBPrrdCVcSUfGpU/HwoVw3WTplljNh9MdIbZz73nA1HM22J2 7ybmivOj43HD/9EuKRb3ggGxHQu1jVMyu7UgBVjw= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: quoted-printable Date: Wed, 27 Aug 2014 12:14:21 +0200 From: Marko Weber|8000 To: Xfs Subject: mount options question Organization: zbf mail X-ASG-Orig-Subj: mount options question Reply-To: weber@zbfmail.de Mail-Reply-To: weber@zbfmail.de Message-ID: <3dc9caf6f9b415f6e4c0ebac1f1626d3@zbfmail.de> X-Sender: weber@zbfmail.de User-Agent: Roundcube zbfmail Webmail X-DCC--Metrics: mailserver 1102; Body=1 Fuz1=1 Fuz2=1 X-Barracuda-Connect: mail.zbfmail.de[176.9.84.12] X-Barracuda-Start-Time: 1409134466 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.8874 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 sorry dave and all other, can you guys recommend me the most stable / best mount options for my new server with ssd=C2=B4s and XFS filesystem? at moment i would set: defaults,nobarrier,discard,logbsize=3D256k,noikeep or is just "default" the best solution and xfs detect itself whats best. can you guide me a bit? as eleavtor i set elevator=3Dnoop i setup disks with linux softraid raid1. On top of the raid is LVM (for=20 some data partations). would be nice to hear some tipps from you best regards marko --=20 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 felipemonteiro.carvalho@gmail.com Wed Aug 27 05:20: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=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 027C47F47 for ; Wed, 27 Aug 2014 05:20:23 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id D62968F8070 for ; Wed, 27 Aug 2014 03:20:19 -0700 (PDT) X-ASG-Debug-ID: 1409134818-04bdf010a05798e0001-NocioJ Received: from mail-pd0-f178.google.com (mail-pd0-f178.google.com [209.85.192.178]) by cuda.sgi.com with ESMTP id XSX57ekKuweoNixi (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Wed, 27 Aug 2014 03:20:18 -0700 (PDT) X-Barracuda-Envelope-From: felipemonteiro.carvalho@gmail.com X-Barracuda-RBL-Trusted-Forwarder: 209.85.192.178 Received: by mail-pd0-f178.google.com with SMTP id w10so24528751pde.9 for ; Wed, 27 Aug 2014 03:20:15 -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=xDTguc5Vn/gZWeYndlx2HiYqk4EEBWuuFaWlQyrIyL4=; b=VIDrbTdm5ZyBPtRJ3YYdKY0hIRxeqWbS9i+FNzzYHUSmGUzhnRfToJiCx7bVDaK77K nt1JZAy7i1FoIzkK2sQGl4OHO2/dkXz19xMwiepJe0h2EB1RCFNW1RJnqCb3taRB4FqL ppLPRn7aJ6npdcj3oAzYG23ezFTybwSy3mnz018CmdZ/G5Gaw/K5SmV4RqsMAyoz4c3m 48ggDi7SVLbp78fo8Mv1dJvbmVYvq1E8vcZGOXjkhQo20cRpJ5ZRDANPNVTZMdZtqzcd yut094KRzn6+JTnb8pLOJuZOX8xDLIxETE63vkuW6usmKDBDc8Dg0ZFQUZN7fKerw/6R CenA== X-Barracuda-BBL-IP: nil MIME-Version: 1.0 X-Received: by 10.70.96.102 with SMTP id dr6mr44453275pdb.86.1409134814109; Wed, 27 Aug 2014 03:20:14 -0700 (PDT) Received: by 10.66.164.69 with HTTP; Wed, 27 Aug 2014 03:20:14 -0700 (PDT) Date: Wed, 27 Aug 2014 12:20:14 +0200 Message-ID: Subject: Ghost items in the end of a dir listing From: Felipe Monteiro de Carvalho X-ASG-Orig-Subj: Ghost items in the end of a dir listing To: xfs@oss.sgi.com Content-Type: text/plain; charset=UTF-8 X-Barracuda-Connect: mail-pd0-f178.google.com[209.85.192.178] X-Barracuda-Start-Time: 1409134818 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.8875 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 a program that reads XFS partitions and I am having trouble with some dir listings. In some directories in the block that starts with XD2B there is first the list of all directory items, which I read without problems, and then there is a free item, for example: xfs_dir2_data_unused freetag -> XFS_DIR2_DATA_FREE_TAG */ length -> 9A0 tag -> zero But after this free item there is still room in the block, so my program will try to read the next item. I cannot stop the reading because it is possible to have valid items, then a free item and then more valid items. The next item start might be something like: 00 00 00 2E 00 00 00 02 16 So it is not a free item, as it doesn't start with FF = XFS_DIR2_DATA_FREE_TAG But it isn't valid either, as its name is a bunch of trash =( So my questions are: 1> What are those ghost items in the end of the block? 2> Which criteria should be utilized to differentiate them from valid items? I tried some guesses but nothing really works so far... Here are screenshots of the actual data involved, here showing the item with XFS_DIR2_DATA_FREE_TAG: http://magnifier.sourceforge.net/temp/xfs/xfs_dir_listing_XD2B_FREE_item.png And here showing the area in the end of the block with wierd items: http://magnifier.sourceforge.net/temp/xfs/xfs_dir_listing_XD2B_after_FREE.png thanks for any tips =) -- Felipe Monteiro de Carvalho From bfoster@redhat.com Wed Aug 27 06:19: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 (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 51A807F50 for ; Wed, 27 Aug 2014 06:19:19 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id D5001AC002 for ; Wed, 27 Aug 2014 04:19:18 -0700 (PDT) X-ASG-Debug-ID: 1409138353-04cbb054878745a0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id gw5q6CKHAVyToM2V (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 27 Aug 2014 04:19:14 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-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 s7RBJCUW021579 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 27 Aug 2014 07:19:12 -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 s7RBJBxZ013048; Wed, 27 Aug 2014 07:19:12 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id CFAD812577F; Wed, 27 Aug 2014 07:19:10 -0400 (EDT) Date: Wed, 27 Aug 2014 07:19:10 -0400 From: Brian Foster To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 1/4] xfs: refactor xlog_recover_process_data() Message-ID: <20140827111910.GB7431@bfoster.bfoster> X-ASG-Orig-Subj: Re: [PATCH 1/4] xfs: refactor xlog_recover_process_data() References: <1409016101-9511-1-git-send-email-david@fromorbit.com> <1409016101-9511-2-git-send-email-david@fromorbit.com> <20140826124112.GB52815@bfoster.bfoster> <20140826223407.GM20518@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140826223407.GM20518@dastard> 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: 1409138354 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Wed, Aug 27, 2014 at 08:34:07AM +1000, Dave Chinner wrote: > On Tue, Aug 26, 2014 at 08:41:13AM -0400, Brian Foster wrote: > > On Tue, Aug 26, 2014 at 11:21:38AM +1000, Dave Chinner wrote: > > > From: Dave Chinner > > > > > > Clean up xlog_recover_process_data() structure in preparation for > > > fixing the allocationa nd freeing context of the transaction being > > > recovered. > > > > > > Signed-off-by: Dave Chinner > > > --- > > > fs/xfs/xfs_log_recover.c | 151 ++++++++++++++++++++++++++--------------------- > > > 1 file changed, 84 insertions(+), 67 deletions(-) > > > > > > diff --git a/fs/xfs/xfs_log_recover.c b/fs/xfs/xfs_log_recover.c > > > index 01becbb..1970732f 100644 > > > --- a/fs/xfs/xfs_log_recover.c > > > +++ b/fs/xfs/xfs_log_recover.c > > > @@ -3531,12 +3531,78 @@ out: > > > } > > > > > > STATIC int > > > -xlog_recover_unmount_trans( > > > - struct xlog *log) > > > +xlog_recovery_process_ophdr( > > > + struct xlog *log, > > > + struct hlist_head rhash[], > > > + struct xlog_rec_header *rhead, > > > + struct xlog_op_header *ohead, > > > + xfs_caddr_t dp, > > > + xfs_caddr_t lp, > > > + int pass) > > > { > > > - /* Do nothing now */ > > > - xfs_warn(log->l_mp, "%s: Unmount LR", __func__); > > > - return 0; > > > + struct xlog_recover *trans; > > > + xlog_tid_t tid; > > > + int error; > > > + unsigned long hash; > > > + uint flags; > > > + unsigned int hlen; > > > + > > > + hlen = be32_to_cpu(ohead->oh_len); > > > + tid = be32_to_cpu(ohead->oh_tid); > > > + hash = XLOG_RHASH(tid); > > > + trans = xlog_recover_find_tid(&rhash[hash], tid); > > > + if (!trans) { > > > + /* add new tid if this is a new transaction */ > > > + if (ohead->oh_flags & XLOG_START_TRANS) { > > > + xlog_recover_new_tid(&rhash[hash], tid, > > > + be64_to_cpu(rhead->h_lsn)); > > > + } > > > + return 0; > > > + } > > > + > > > > Overall this looks pretty good to me. I wonder if we can clean this up > > to separate state management from error detection while we're at it. I > > don't see any reason this code to find trans has to be up here. > > > > > + error = -EIO; > > > + if (dp + hlen > lp) { > > > + xfs_warn(log->l_mp, "%s: bad length 0x%x", __func__, hlen); > > > + WARN_ON(1); > > > + goto out_free; > > > + } > > > + > > > + flags = ohead->oh_flags & ~XLOG_END_TRANS; > > > + if (flags & XLOG_WAS_CONT_TRANS) > > > + flags &= ~XLOG_CONTINUE_TRANS; > > > + > > > > /* we should find a trans for anything other than a start op */ > > trans = xlog_recover_find_tid(&rhash[hash], tid); > > if (((ohead->oh_flags & XLOG_START_TRANS) && trans) || > > (!(ohead->oh_flags & XLOG_START_TRANS) && !trans)) { > > xfs_warn(log->l_mp, "%s: bad transaction 0x%x oh_flags 0x%x trans %p", > > __func__, tid, ohead->oh_flags, trans); > > ASSERT(0); > > return -EIO; > > } > > > > Maybe returning error here is not the right thing to do because we want > > the recovery to proceed. We could still dump a warning and return 0 > > though. > > Urk. Try understanding why that logic exists in a couple of years > time when you've forgetten all the context. :/ > Heh, that's the problem I had with the current code. The error checking and state machine management is split between here and below. The above is just an error check, and fwiw, it adds an extra check that doesn't exist in the current code. Hide the flag busy-ness and effectively the logic is: /* verify a tx is in progress or we're starting a new one */ if (trans && is_start_header(ohead) || !trans && !is_start_header(ohead)) return -EIO; ... which seems straightforward to me, but I'm sure there are other ways to refactor things as well. > > > + switch (flags) { > > > + /* expected flag values */ > > > + case 0: > > > + case XLOG_CONTINUE_TRANS: > > > + error = xlog_recover_add_to_trans(log, trans, dp, hlen); > > > + break; > > > + case XLOG_WAS_CONT_TRANS: > > > + error = xlog_recover_add_to_cont_trans(log, trans, dp, hlen); > > > + break; > > > + case XLOG_COMMIT_TRANS: > > > + error = xlog_recover_commit_trans(log, trans, pass); > > > + break; > > > + > > > + /* unexpected flag values */ > > > + case XLOG_UNMOUNT_TRANS: > > > + xfs_warn(log->l_mp, "%s: Unmount LR", __func__); > > > + error = 0; > > > + break; > > > + case XLOG_START_TRANS: > > > + xfs_warn(log->l_mp, "%s: bad transaction 0x%x", __func__, tid); > > > + ASSERT(0); > > > + break; > > > > xlog_recover_new_tid(&rhash[hash], tid, be64_to_cpu(rhead->h_lsn) > > error = 0; > > break; > > > > I like the idea, but I don't like the suggested implementation. I > was in two minds as to whether I should factor > xlog_recover_find_tid() further. There's only one caller of it and > only one caller of xlog_recover_new_tid() and the happen within > three lines of each other. Hence I'm thinking that it makes more > sense to wrap the "find or allocate trans" code in a single helper > and lift all that logic clean out of this function. That helper can > handle all the XLOG_START_TRANS logic more cleanly, I think.... > Fair enough, that sounds reasonable so long as it isn't pulling the core state management off into disparate functions. What I like about the above (combined with the result of the rest of this series) is that the lifecycle is obvious and contained in a single block of code. Brian > Actually, that makes the factoring I've already done a little > inconsistent. Let me rework this a bit. > > Cheers, > > Dave. > -- > Dave Chinner > david@fromorbit.com From david@fromorbit.com Wed Aug 27 18:08: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 522037F3F for ; Wed, 27 Aug 2014 18:08:13 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id E32ACAC001 for ; Wed, 27 Aug 2014 16:08:09 -0700 (PDT) X-ASG-Debug-ID: 1409180854-04cb6c54fe60a420001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id YVZz4CpEKEn7VNyg for ; Wed, 27 Aug 2014 16:07:35 -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: AgghAHFj/lN5LDJ8PGdsb2JhbABBGoMNU1eNV6EhAQEBAQIGnSaBW4VoBQMCAYESFwUBAQEBODaEBAEFMgEjIxAIAxgJJQ8FJQMHLRuIJg42v0kYhWSJUAcWhDYFlVyGe5kLKy8BAYJNAQEB Received: from ppp121-44-50-124.lns20.syd6.internode.on.net (HELO dastard) ([121.44.50.124]) by ipmail04.adl6.internode.on.net with ESMTP; 28 Aug 2014 08:37:34 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1XMmJQ-0006yb-EK; Thu, 28 Aug 2014 09:07:32 +1000 Date: Thu, 28 Aug 2014 09:07:32 +1000 From: Dave Chinner To: weber@zbfmail.de Cc: Xfs Subject: Re: mount options question Message-ID: <20140827230732.GN20518@dastard> X-ASG-Orig-Subj: Re: mount options question References: <3dc9caf6f9b415f6e4c0ebac1f1626d3@zbfmail.de> MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <3dc9caf6f9b415f6e4c0ebac1f1626d3@zbfmail.de> 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: 1409180854 X-Barracuda-URL: http://192.48.176.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_MISMATCH_TO, BSF_SC0_SA085 X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.8893 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 BSF_SC0_SA085 Custom Rule SA085 On Wed, Aug 27, 2014 at 12:14:21PM +0200, Marko Weber|8000 wrote: > > sorry dave and all other, > > can you guys recommend me the most stable / best mount options for > my new server with ssd´s and XFS filesystem? > > at moment i would set: defaults,nobarrier,discard,logbsize=256k,noikeep > or is just "default" the best solution and xfs detect itself whats best. > > can you guide me a bit? > > as eleavtor i set elevator=noop > > i setup disks with linux softraid raid1. On top of the raid is LVM > (for some data partations). > > > would be nice to hear some tipps from you Unless you have specific requirements or have the knowledge to understand how the different options affect behaviour, then just use the defaults. http://xfs.org/index.php/XFS_FAQ#Q:_I_want_to_tune_my_XFS_filesystems_for_.3Csomething.3E Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Wed Aug 27 19:35: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 (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 0EBC07F3F for ; Wed, 27 Aug 2014 19:35:25 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id F18BE304048 for ; Wed, 27 Aug 2014 17:35:21 -0700 (PDT) X-ASG-Debug-ID: 1409186118-04cb6c54fd60cf10001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id 3UUVLLQOh9EKYz5g for ; Wed, 27 Aug 2014 17:35:18 -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: ApQWAJZ4/lN5LDJ8PGdsb2JhbABTCIMNgSqHM6dFAQEBAQIGnwGFcgGBExcFAQEBATg2hAMBAQQBOhwjBQsIAxgJJQ8FJQMHGhOIOge/ZBcYhWSEA4R3DUkHhEwFnFeWfx6BbisvgQcBHgaBIwEBAQ Received: from ppp121-44-50-124.lns20.syd6.internode.on.net (HELO dastard) ([121.44.50.124]) by ipmail04.adl6.internode.on.net with ESMTP; 28 Aug 2014 10:02:29 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1XMndb-0007AB-2g; Thu, 28 Aug 2014 10:32:27 +1000 Date: Thu, 28 Aug 2014 10:32:27 +1000 From: Dave Chinner To: Stan Hoeppner Cc: xfs@oss.sgi.com Subject: Re: storage, libaio, or XFS problem? 3.4.26 Message-ID: <20140828003226.GO20518@dastard> X-ASG-Orig-Subj: Re: storage, libaio, or XFS problem? 3.4.26 References: <3fe8c34c0ccbbd720015d273fa2b8b30@localhost> <20140826075345.GJ20518@dastard> <8c29baf987467a84f0b7c1d09c863662@localhost> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <8c29baf987467a84f0b7c1d09c863662@localhost> 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: 1409186118 X-Barracuda-URL: http://192.48.176.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.8895 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Tue, Aug 26, 2014 at 12:19:43PM -0500, Stan Hoeppner wrote: > On Tue, 26 Aug 2014 17:53:45 +1000, Dave Chinner > wrote: > > On Tue, Aug 26, 2014 at 01:18:50AM -0500, Stan Hoeppner wrote: > >> Had some controller issues but believe we had those ironed out before > >> this > >> recent breakage. I had reformatted both 48TB LUNs on this test box > with > >> -f > >> and defaults, and fired up the test app again. Throughput was > fantastic > >> with no dropped application buffers for ~30 minutes, and IO times were > >> 1.x > >> ms max, suggesting all the writes were acked by controller cache. The > >> app > >> was running perfectly. Then it hanged and spit out an internal error > >> msg: > >> > >> > >> Failed to reopen file /mnt/VOL1/sg-04/str-0015/f-0000000005 > >> > >> I have many call traces in dmesg, most are XFS, pasted below. I found > no > >> SCSI I/O errors in dmesg. Application is submitting writes via libaio > >> and > >> using O_DIRECT, writing to preallocated files. I don't see any errors > in > >> the storage controller log and everything seems to check out there. > >> Using > >> noop elevator, mpt2sas, no multipathing. The application process is > hung > >> in d state and kill -9 won't get rid of it. I can't unmount the hosed > up > >> filesystem. Any ideas? > >> > >> # ls -la /mnt/VOL1 > >> ls: cannot access /mnt/VOL1: Input/output error > >> > >> # dd if=/mnt/VOL1 of=/dev/null bs=1M count=16 > >> dd: opening `/mnt/VOL1': Input/output error > >> > >> # dd if=/dev/sdd of=/dev/null bs=1M count=16 > >> 16+0 records in > >> 16+0 records out > >> 16777216 bytes (17 MB) copied, 1.10989 s, 15.1 MB/s > >> > >> # ls -la /mnt/ > >> ls: cannot access /mnt/VOL1: Input/output error > >> total 8 > >> drwxrwxrwt 6 root root 120 Aug 25 17:59 . > >> drwxr-xr-x 21 root root 4096 Jul 15 09:39 .. > >> drwxrwxrwt 3 root root 80 Aug 25 16:52 initramfs > >> drwxr-xr-x 3 root root 4096 Apr 24 04:57 scratch > >> drwxrwxrwx 5 root root 58 Aug 25 22:06 VOL0 > >> d????????? ? ? ? ? ? VOL1 > > > > That's an inode we failed to stat() - most likely because of the IO > > error. Has the filesystem shut down? the IO error shoul dhave had > > some kind of output in dmesg associated with it from XFS.... > > Sorry, I omitted the XFS logging preceding the first call trace: > > Aug 25 18:02:50 Anguish-ssu-1 kernel: [ 4280.310304] SGI XFS with security > attributes, large block/inode numbers, no debug enabled > Aug 25 18:02:50 Anguish-ssu-1 kernel: [ 4280.311101] XFS (sdc): Mounting > Filesystem > Aug 25 18:02:51 Anguish-ssu-1 kernel: [ 4280.501405] XFS (sdc): Starting > recovery (logdev: internal) > Aug 25 18:02:53 Anguish-ssu-1 kernel: [ 4282.766547] XFS (sdc): Failed to > recover EFIs > Aug 25 18:02:53 Anguish-ssu-1 kernel: [ 4282.766549] XFS (sdc): log mount > finish failed That's indicative of corrupted free space btrees. > Aug 25 18:04:50 Anguish-ssu-1 kernel: [ 4399.471829] XFS (sdc): Mounting > Filesystem > Aug 25 18:04:50 Anguish-ssu-1 kernel: [ 4399.620805] XFS (sdc): Ending > clean mount > Aug 25 18:04:56 Anguish-ssu-1 kernel: [ 4405.613778] XFS (sdd): Mounting > Filesystem > Aug 25 18:04:56 Anguish-ssu-1 kernel: [ 4405.835412] XFS (sdd): Ending > clean mount > Aug 25 23:05:39 Anguish-ssu-1 kernel: [22409.328839] XFS (sdd): > xfs_do_force_shutdown(0x8) called from line 3732 of file fs/xfs/xfs_bmap.c. > Return address = 0xffffffffa01cc9a6 Yup, that's kinda important. That's from xfs_bmap_finish(), and freeing an extent has failed and triggered SHUTDOWN_CORRUPT_INCORE which it's found some kind of inconsistency in the free space btrees. So, likely the same problem that caused EFI recovery to fail on the other volume. Are the tests being run on newly made filesystems? If not, have these filesystems had xfs_repair run on them after a failure? If so, what is the error that is fixed? If not, does repairing the filesystem make the problem go away? > Aug 25 23:05:49 Anguish-ssu-1 kernel: [22419.307128] XFS (sdd): failed to > update timestamps for inode 0x2a000000a4 > Aug 25 23:05:49 Anguish-ssu-1 kernel: [22419.307484] XFS (sdd): failed to > update timestamps for inode 0x29000000a4 > Aug 25 23:05:49 Anguish-ssu-1 kernel: [22419.307487] XFS (sdd): failed to > update timestamps for inode 0x20000009f > Aug 25 23:05:49 Anguish-ssu-1 kernel: [22419.307499] XFS (sdd): failed to > update timestamps for inode 0x29000000a4 > Aug 25 23:05:49 Anguish-ssu-1 kernel: [22419.307693] XFS (sdd): failed to > update timestamps for inode 0x20000009f > Aug 25 23:05:49 Anguish-ssu-1 kernel: [22419.368106] XFS (sdd): failed to > update timestamps for inode 0xf000000a4 > Aug 25 23:05:49 Anguish-ssu-1 kernel: [22419.369785] XFS (sdd): failed to > update timestamps for inode 0xf000000a4 > Aug 25 23:05:49 Anguish-ssu-1 kernel: [22419.605835] XFS (sdd): failed to > update timestamps for inode 0x2810f413c > Aug 25 23:05:49 Anguish-ssu-1 kernel: [22419.606169] XFS (sdd): failed to > update timestamps for inode 0x60000009f And that is interesting. Makes me wonder if the inode is getting unlocked on transaction commit failure, or whether there's some other path in the shutdown code that is not unlocking the inode correctly. > Again, when the app locked up I was assuming we had more controller > issues, and I expected to find SCSI I/O errors preceding the XFS errors. > But there are none. XFs has had some kind of internal error in extent or freespace management. The lack of output when the error has triggered makes it impossible to determine what might have gone wrong. Seeing what xfs_repair -n says about the filesystem woul dbe interesting. Probably best to use an xfs-repair from the current 3.2.1 release, because older 3.1.x versions (i think 3.1.10 and prior) didn't validate the freespace btrees - they just got rebuilt. > These aren't truly lab systems in all respects. I don't have the > permission/access to change the kernel config and recompile. There is a > "process" for that and a different group owns that process. If this is > necessary to troubleshoot this then I'll see if I can push it through. Good luck, it sounds like you might have a few stories for the Daily WTF if the "processes" at that so entrenched it's impossible to test fixes. > > I haven't cheked if this still works on a 3.4 kernel, but it will > > change the rwsem implementation to the generic, spinlock based > > implementation rather than the super-special, highly optimised > > x86 specific implementation. If that makes the problem go away, > > then we've got another rwsem bug on our hands. If it doesn't, then I > > can probably get you the mrlock debug code lachlan wrote and we can > > see if XFS is doing something wrong... > > Thanks for the detailed explanation. Given the new information I've > provided, what is my next step? xfs_repair output, turn /proc/sys/fs/xfs/error_level up to 11, maybe run a test with a CONFIG_XFS_DEBUG=y kernel, or even a current 3.15/3.16 kernel to see if the problem still exists... But if you can't get new kernels or xfsprogs binaries onto the machine, then there is very little that we can do. Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Wed Aug 27 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=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 35B8E7F3F for ; Wed, 27 Aug 2014 19:47:25 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id E829E8F8071 for ; Wed, 27 Aug 2014 17:47:24 -0700 (PDT) X-ASG-Debug-ID: 1409186841-04bdf0109759ea20001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id ptmX44xODoLk8SfP for ; Wed, 27 Aug 2014 17:47:22 -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: ApQWAO56/lN5LDJ8PGdsb2JhbABbgw2BKoczp0UBAQEBAgafAYVyAYETFwUBAQEBODaEBAEFJxMcIxAIAw4KCSUPBSUDBxoTiEG/ZBcYhWSJUAeETAWcV4waimccgW4rL4JPAQEB Received: from ppp121-44-50-124.lns20.syd6.internode.on.net (HELO dastard) ([121.44.50.124]) by ipmail04.adl6.internode.on.net with ESMTP; 28 Aug 2014 10:17:19 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1XMnrx-0007Bs-Sr; Thu, 28 Aug 2014 10:47:17 +1000 Date: Thu, 28 Aug 2014 10:47:17 +1000 From: Dave Chinner To: Brian Foster Cc: xfs@oss.sgi.com Subject: Re: [PATCH 1/4] xfs: refactor xlog_recover_process_data() Message-ID: <20140828004717.GP20518@dastard> X-ASG-Orig-Subj: Re: [PATCH 1/4] xfs: refactor xlog_recover_process_data() References: <1409016101-9511-1-git-send-email-david@fromorbit.com> <1409016101-9511-2-git-send-email-david@fromorbit.com> <20140826124112.GB52815@bfoster.bfoster> <20140826223407.GM20518@dastard> <20140827111910.GB7431@bfoster.bfoster> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140827111910.GB7431@bfoster.bfoster> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1409186841 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.8895 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Wed, Aug 27, 2014 at 07:19:10AM -0400, Brian Foster wrote: > On Wed, Aug 27, 2014 at 08:34:07AM +1000, Dave Chinner wrote: > > > > + switch (flags) { > > > > + /* expected flag values */ > > > > + case 0: > > > > + case XLOG_CONTINUE_TRANS: > > > > + error = xlog_recover_add_to_trans(log, trans, dp, hlen); > > > > + break; > > > > + case XLOG_WAS_CONT_TRANS: > > > > + error = xlog_recover_add_to_cont_trans(log, trans, dp, hlen); > > > > + break; > > > > + case XLOG_COMMIT_TRANS: > > > > + error = xlog_recover_commit_trans(log, trans, pass); > > > > + break; > > > > + > > > > + /* unexpected flag values */ > > > > + case XLOG_UNMOUNT_TRANS: > > > > + xfs_warn(log->l_mp, "%s: Unmount LR", __func__); > > > > + error = 0; > > > > + break; > > > > + case XLOG_START_TRANS: > > > > + xfs_warn(log->l_mp, "%s: bad transaction 0x%x", __func__, tid); > > > > + ASSERT(0); > > > > + break; > > > > > > xlog_recover_new_tid(&rhash[hash], tid, be64_to_cpu(rhead->h_lsn) > > > error = 0; > > > break; > > > > > > > I like the idea, but I don't like the suggested implementation. I > > was in two minds as to whether I should factor > > xlog_recover_find_tid() further. There's only one caller of it and > > only one caller of xlog_recover_new_tid() and the happen within > > three lines of each other. Hence I'm thinking that it makes more > > sense to wrap the "find or allocate trans" code in a single helper > > and lift all that logic clean out of this function. That helper can > > handle all the XLOG_START_TRANS logic more cleanly, I think.... > > > > Fair enough, that sounds reasonable so long as it isn't pulling the core > state management off into disparate functions. What I like about the > above (combined with the result of the rest of this series) is that the > lifecycle is obvious and contained in a single block of code. Well, it's not "state" as in "state machine". What we are doing is decoding ophdrs, not walking through a state machine, and so I think that the "start" ophdrs need to be treated differently because all the other types of ophdrs have a dependency on the trans structure existing. Indeed, I suspect the correct thing to do is check for the start flag *first*, before we do the lookup to find the trans structure, because the start flag implies that we should not find an existing trans structure for that tid. And once we've done that, we're completely finished processing that ophdr, and hence should return and not run any of the other code we run for all the remaining ophdrs. Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Wed Aug 27 21:09: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 (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id BAA1C7F3F for ; Wed, 27 Aug 2014 21:09:15 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id A8D7B304053 for ; Wed, 27 Aug 2014 19:09:15 -0700 (PDT) X-ASG-Debug-ID: 1409191749-04cb6c54fe60f7d0001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id ofcXLaG9Ar92eNxo for ; Wed, 27 Aug 2014 19:09:10 -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: AtUUAAeP/lN5LDJ8PGdsb2JhbABbgw2BKoIshQenRwEFBp8BhXIBgRYXBQEBAQE4NoQDAQEEATocIwULCAMYCSUPBSUDBxoTG4gfB79ZFxiFZIhlaweETAWPG4h7hEGZCysvgk8BAQE Received: from ppp121-44-50-124.lns20.syd6.internode.on.net (HELO dastard) ([121.44.50.124]) by ipmail04.adl6.internode.on.net with ESMTP; 28 Aug 2014 11:38:21 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1XMp8N-0007Mq-Az; Thu, 28 Aug 2014 12:08:19 +1000 Date: Thu, 28 Aug 2014 12:08:19 +1000 From: Dave Chinner To: Zhang Qiang Cc: Greg Freemyer , xfs-oss Subject: Re: bad performance on touch/cp file on XFS system Message-ID: <20140828020819.GQ20518@dastard> X-ASG-Orig-Subj: Re: bad performance on touch/cp file on XFS system References: <20140825051801.GY26465@dastard> <20140825090843.GE20518@dastard> <20140825222657.GF20518@dastard> <20140826023754.GH20518@dastard> <20140826131354.GK20518@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: 1409191749 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.75 X-Barracuda-Spam-Status: No, SCORE=0.75 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_RULE_7580G X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.8897 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.75 BSF_RULE_7580G Custom Rule 7580G On Wed, Aug 27, 2014 at 04:53:17PM +0800, Zhang Qiang wrote: > 2014-08-26 21:13 GMT+08:00 Dave Chinner : > > > On Tue, Aug 26, 2014 at 06:04:52PM +0800, Zhang Qiang wrote: > > > Thanks Dave/Greg for your analysis and suggestions. > > > > > > I can summarize what I should do next: > > > > > > - backup my data using xfsdump > > > - rebuilt filesystem using mkfs with options: agcount=32 for 2T disk > > > - mount filesystem with option inode64,nobarrier > > > > Ok up to here. > > > > > - applied patches about adding free list inode on disk structure > > > > No, don't do that. You're almost certain to get it wrong and corrupt > > your filesysetms and lose data. > > > > > As we have about ~100 servers need back up, so that will take much > > effort, > > > do you have any other suggestion? > > > > Just remount them with inode64. Nothing else. Over time as you add > > and remove files the inodes will redistribute across all 4 AGs. > > > OK. > > How I can see the layout number of inodes on each AGs? Here's my checking > steps: > > 1) Check unmounted file system first: > [root@fstest data1]# xfs_db -c "sb 0" -c "p" /dev/sdb1 |egrep > 'icount|ifree' > icount = 421793920 > ifree = 41 > [root@fstest data1]# xfs_db -c "sb 1" -c "p" /dev/sdb1 |egrep > 'icount|ifree' > icount = 0 > ifree = 0 That's wrong. You need to check the AGI headers, not the superblock. Only the primary superblock gets updated, and it's the aggregated of all the AGI values, not the per AG values. And, BTW, that's *421 million* inodes in that filesystem. Almost twice as many as the filesystem you started showing problems on... > OK, this is a social networking website back end servers, actually the CDN > infrastructure, and different server located different cities. > We have a global sync script to make all these 100 servers have the same > data. > > For each server we use RAID10 and XFS (CentOS6.3). > > There are about 3M files (50K in size) generated every day, and we track > the path of each files in database. I'd suggest you are overestimating the size of the files being storedi by an order of magnitude: 200M files at 50k in size is 10TB, not 1.5TB. But you've confirmed exactly what I thought - you're using the filesystem as an anonymous object store for hundreds of millions of small objects and that's exactly the situation I'd expect to see these problems.... > Do you have any suggestions to improve our solution? TANSTAAFL. I've given you some stuff to try, worst case is reformating and recopying all the data around. I don't really have much time to do much more than that - talk to Red Hat (because you are using CentOS) if you want help with a more targeted solution to your problem... Cheers, Dave. -- Dave Chinner david@fromorbit.com From iusty@k1024.org Wed Aug 27 23:23: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 741527F3F for ; Wed, 27 Aug 2014 23:23:13 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id E655EAC006 for ; Wed, 27 Aug 2014 21:23:12 -0700 (PDT) X-ASG-Debug-ID: 1409199789-04cbb0548789df20001-NocioJ Received: from mail-we0-f181.google.com (mail-we0-f181.google.com [74.125.82.181]) by cuda.sgi.com with ESMTP id WE5F0qkHvzMHwGq7 (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Wed, 27 Aug 2014 21:23:10 -0700 (PDT) X-Barracuda-Envelope-From: iusty@k1024.org X-Barracuda-Apparent-Source-IP: 74.125.82.181 Received: by mail-we0-f181.google.com with SMTP id x48so181764wes.12 for ; Wed, 27 Aug 2014 21:23: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:from:to:cc:subject:date:message-id:in-reply-to :references; bh=1pDVAvpQb2+cP7mG2DyItOurOJ4MnxOPclxCNUiV5iA=; b=gLlZ+lH6qiHUbOcBlChLs1KXFs+X/+TRxzEHohYsf5Le8Dds/rBPP83lptbNc3HgMl XeKhTwJ3g4hvGdjllu8Gg0z96rPu7orzDIr8IGAds1HurbF9Qt2ded4z98Tbfwa1/gYA 0w2QYCbUNkGzw9LM85D1bgArLQGhXsuzo+wupi2dVryJAJ+sMy+/d6cqVEQo+i1TBrki 0DRXCq6Ur8eWIK4mqjVK7xIe+uTQ96wZ6YDcfUJgyi8hPA0UccLxzgKRwQbo8eIzoxHr +AGB8Y5iWLVIlFDRWwtAbK1ii7CliMGx6oHbKHdnb+tZlmybw13haxYyQm0zfZrFONPA dzHQ== X-Gm-Message-State: ALoCoQkhtBOy2rHUGVkknEkZa1vkrXjSu2r4p9d97pzR52PCkSob6iYlrwPrlsg3blSUflIqgC9m X-Received: by 10.180.86.8 with SMTP id l8mr33432569wiz.18.1409199789449; Wed, 27 Aug 2014 21:23:09 -0700 (PDT) Received: from teal.hq.k1024.org (178-83-234-80.dynamic.hispeed.ch. [178.83.234.80]) by mx.google.com with ESMTPSA id cj2sm30968549wid.23.2014.08.27.21.23.08 for (version=TLSv1 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Wed, 27 Aug 2014 21:23:08 -0700 (PDT) Received: from teal.hq.k1024.org (localhost.localdomain [127.0.0.1]) by teal.hq.k1024.org (Postfix) with ESMTP id B0573205C79; Thu, 28 Aug 2014 06:23:07 +0200 (CEST) From: Iustin Pop To: xfs@oss.sgi.com Cc: hch@infradead.org, Iustin Pop Subject: [PATCH] xfs: fix behaviour of XFS_IOC_FSSETXATTR on directories Date: Wed, 27 Aug 2014 21:22:53 -0700 X-ASG-Orig-Subj: [PATCH] xfs: fix behaviour of XFS_IOC_FSSETXATTR on directories Message-Id: <1409199773-16802-1-git-send-email-iusty@k1024.org> X-Mailer: git-send-email 2.1.0.rc1 In-Reply-To: <20140718191314.GB27801@teal.hq.k1024.org> References: <20140718191314.GB27801@teal.hq.k1024.org> X-Barracuda-Connect: mail-we0-f181.google.com[74.125.82.181] X-Barracuda-Start-Time: 1409199790 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.8901 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Currently, the ioctl handling code for XFS_IOC_FSSETXATTR treats all targets as regular files: it refuses to change the extent size if extents are allocated. This is wrong for directories, as there the extent size is only used as a default for children. The patch fixes this by only checking for allocated extents for regular files; it leaves undefined what it means to set an extent size on a non-regular, non-directory inode. Additionally, when setting a non-zero extent size, the appropriate flags (EXTSIZE, respectively EXTSZINHERIT) are enforced for regular files and directories. Signed-off-by: Iustin Pop --- A patch against xfstests to test for the fixed behaviour will follow shortly. fs/xfs/xfs_ioctl.c | 34 ++++++++++++++++++++++++++-------- 1 file changed, 26 insertions(+), 8 deletions(-) diff --git a/fs/xfs/xfs_ioctl.c b/fs/xfs/xfs_ioctl.c index 8bc1bbc..5b9acd2 100644 --- a/fs/xfs/xfs_ioctl.c +++ b/fs/xfs/xfs_ioctl.c @@ -1116,14 +1116,32 @@ xfs_ioctl_setattr( } if (mask & FSX_EXTSIZE) { - /* - * Can't change extent size if any extents are allocated. - */ - if (ip->i_d.di_nextents && - ((ip->i_d.di_extsize << mp->m_sb.sb_blocklog) != - fa->fsx_extsize)) { - code = XFS_ERROR(EINVAL); /* EFBIG? */ - goto error_return; + if (S_ISDIR(ip->i_d.di_mode)) { + /* + * Enforce setting the EXTSZINHERIT flag when + * a non-zero extent size has been specified. + */ + if (fa->fsx_extsize) { + fa->fsx_xflags |= XFS_XFLAG_EXTSZINHERIT; + } + } else if (S_ISREG(ip->i_d.di_mode)) { + /* + * For a regular file, we can't change extent + * size if any extents are allocated. + */ + if (ip->i_d.di_nextents && + ((ip->i_d.di_extsize << mp->m_sb.sb_blocklog) != + fa->fsx_extsize)) { + code = XFS_ERROR(EINVAL); /* EFBIG? */ + goto error_return; + } + /* + * Enforce setting the EXTSIZE flag when + * a non-zero extent size has been specified. + */ + if (fa->fsx_extsize) { + fa->fsx_xflags |= XFS_XFLAG_EXTSIZE; + } } /* -- 2.1.0 From iusty@k1024.org Wed Aug 27 23:24: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 (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 943C97F3F for ; Wed, 27 Aug 2014 23:24:06 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 228BEAC005 for ; Wed, 27 Aug 2014 21:24:06 -0700 (PDT) X-ASG-Debug-ID: 1409199843-04cb6c54ff613cb0001-NocioJ Received: from mail-wi0-f176.google.com (mail-wi0-f176.google.com [209.85.212.176]) by cuda.sgi.com with ESMTP id JplefIzonbOlFJj8 (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Wed, 27 Aug 2014 21:24:04 -0700 (PDT) X-Barracuda-Envelope-From: iusty@k1024.org X-Barracuda-Apparent-Source-IP: 209.85.212.176 Received: by mail-wi0-f176.google.com with SMTP id bs8so6806787wib.3 for ; Wed, 27 Aug 2014 21:24:03 -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=fQkEkjPOL8csJdxauRSOct0K2/kXqxfKsxitVKLdz5Q=; b=JD7viEG/vxUHFigboqTFCf/3urXAEPVFJzFDViGRjLWy3eeps6SbskEFcv5KoHfaex 1UAZQCyPAyq6Uul1s8xWUcIUjY7ihHeBzqLTMeEIU4ZeTBJVfhpnzRcjehhNvuxapPjx SLpFDj5OtxSNfIWZZGUo9/hINAUCjs8xF+3YCtABLmWg36VnhCtZjyf/vFjxI+YB5qOC kGuewE4/YU3dkDCDVQTfMtELh5aNQlOyIlQyjiPjdc2r/U0WqOWf0oQ8Qs54iNpM9il8 LFBAQgkxaWGLhjyWR8VmlRPQ0kn/fv7fheINZV1z3dPf2GIGMHAIsHOazsC/cC/awZh5 A2VQ== X-Gm-Message-State: ALoCoQlVAWrRMgK1+fCh1Lr/DQOhhL7AbrhMB5yCvNqXr82D2SaEW28Aj7O+UbJoxnkabXfd+8px X-Received: by 10.194.59.18 with SMTP id v18mr1938195wjq.64.1409199843061; Wed, 27 Aug 2014 21:24:03 -0700 (PDT) Received: from teal.hq.k1024.org (178-83-234-80.dynamic.hispeed.ch. [178.83.234.80]) by mx.google.com with ESMTPSA id dc9sm31123482wib.5.2014.08.27.21.24.02 for (version=TLSv1 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Wed, 27 Aug 2014 21:24:02 -0700 (PDT) Received: from teal.hq.k1024.org (localhost.localdomain [127.0.0.1]) by teal.hq.k1024.org (Postfix) with ESMTP id B9FC3205C79; Thu, 28 Aug 2014 06:24:01 +0200 (CEST) From: Iustin Pop To: xfs@oss.sgi.com Cc: hch@infradead.org, Iustin Pop Subject: [PATCH xfstests] xfs: add tests for XFS_IOC_FSSETXATTR behaviour Date: Wed, 27 Aug 2014 21:24:00 -0700 X-ASG-Orig-Subj: [PATCH xfstests] xfs: add tests for XFS_IOC_FSSETXATTR behaviour Message-Id: <1409199840-16907-1-git-send-email-iusty@k1024.org> X-Mailer: git-send-email 2.1.0.rc1 In-Reply-To: <20140718191314.GB27801@teal.hq.k1024.org> References: <20140718191314.GB27801@teal.hq.k1024.org> X-Barracuda-Connect: mail-wi0-f176.google.com[209.85.212.176] X-Barracuda-Start-Time: 1409199843 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.8900 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Add two tests that check for correct behaviour of XFS_IOC_FSSETXATTR: - 307: check that extent size can always be set on a directory - 308: check that setting a non-zero extent size directly via the ioctl sets the expected flags (EXTSIZE and EXTSZINHERIT) Signed-off-by: Iustin Pop --- tests/xfs/307 | 87 ++++++++++++++++++++++++++++++++++++++++++++++++ tests/xfs/307.out | 3 ++ tests/xfs/308 | 98 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ tests/xfs/308.out | 3 ++ tests/xfs/group | 2 ++ 5 files changed, 193 insertions(+) create mode 100755 tests/xfs/307 create mode 100644 tests/xfs/307.out create mode 100755 tests/xfs/308 create mode 100644 tests/xfs/308.out diff --git a/tests/xfs/307 b/tests/xfs/307 new file mode 100755 index 0000000..e8f3576 --- /dev/null +++ b/tests/xfs/307 @@ -0,0 +1,87 @@ +#! /bin/bash +# FS QA Test No. 307 +# +# Test that setting extent size on directories work even for large +# directories. +# +#----------------------------------------------------------------------- +# Copyright (c) 2014 Google Inc. All Rights Reserved. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it would be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +#----------------------------------------------------------------------- +# + +seq=`basename $0` +seqres=$RESULT_DIR/$seq +echo "QA output created by $seq" + +here=`pwd` +tmp=/tmp/$$ +status=1 # failure is the default! +trap "_cleanup; exit \$status" 0 1 2 3 15 + +_cleanup() +{ + cd / + rm -f $tmp.* +} + +# get standard environment, filters and checks +. ./common/rc +. ./common/filter + +# real QA test starts here + +# Modify as appropriate. +_supported_fs xfs +_supported_os Linux +_require_test +_require_scratch + +_scratch_mkfs_xfs >/dev/null 2>&1 +_scratch_mount + +small=$SCRATCH_MNT/small +big=$SCRATCH_MNT/big + +# sanity check on a small directory +mkdir $small +# expect that an empty directory has no extents +xfs_bmap $small | grep -q "no extents" +# and that we can set an extent size on it +xfs_io -c 'extsize 8m' $small +# and finally check that the extent size update has taken place +(cd $SCRATCH_MNT; xfs_io -c 'extsize' small) + +# now create a 'big' (with extents) directory +mkdir $big +idx=1 +while xfs_bmap $big | grep -q "no extents"; do + touch $big/$idx + idx=$((idx+1)) + if [ "$idx" -gt 1048576 ]; then + # still no extents? giving up + echo "Can't make a directory to have extents even after 1M files" 1>&2 + exit + fi +done + +# expect that we can set the extent size on $big as well +xfs_io -c 'extsize 8m' $big +# and that it took effect +(cd $SCRATCH_MNT; xfs_io -c 'extsize' big) + +# success, all done +status=0 +exit diff --git a/tests/xfs/307.out b/tests/xfs/307.out new file mode 100644 index 0000000..f825525 --- /dev/null +++ b/tests/xfs/307.out @@ -0,0 +1,3 @@ +QA output created by 307 +[8388608] small +[8388608] big diff --git a/tests/xfs/308 b/tests/xfs/308 new file mode 100755 index 0000000..7b43836 --- /dev/null +++ b/tests/xfs/308 @@ -0,0 +1,98 @@ +#! /bin/bash +# FS QA Test No. 308 +# +# Test that setting extent size on files and directories (directly via +# ioctl and not via xfs_io) sets the correct flags. +# +#----------------------------------------------------------------------- +# Copyright (c) 2014 Google Inc. All Rights Reserved. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it would be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +#----------------------------------------------------------------------- +# + +seq=`basename $0` +seqres=$RESULT_DIR/$seq +echo "QA output created by $seq" + +here=`pwd` +tmp=/tmp/$$ +status=1 # failure is the default! +trap "_cleanup; exit \$status" 0 1 2 3 15 + +_cleanup() +{ + cd / + rm -f $tmp.* +} + +# get standard environment, filters and checks +. ./common/rc +. ./common/filter + +# real QA test starts here + +# Modify as appropriate. +_supported_fs xfs +_supported_os Linux +_require_test +_require_scratch + +_scratch_mkfs_xfs >/dev/null 2>&1 +_scratch_mount + +file=$SCRATCH_MNT/file +dir=$SCRATCH_MNT/dir +cprog=$tmp.get_structs.c +oprog=$tmp.get_structs + +touch $file +mkdir $dir + +cat > $cprog << EOF +#include +#include + +int main(int argc, char **argv) { + struct fsxattr fa; + int fd = open(argv[1], O_RDONLY); + if (fd < 0) { + perror("open"); + return 1; + } + fa.fsx_xflags = 0; + fa.fsx_extsize = 1048576 * 8; + int r = xfsctl(argv[1], fd, XFS_IOC_FSSETXATTR, &fa); + if (r < 0) { + perror("xfsctl"); + return 1; + } + return 0; +} +EOF +cc -o $oprog $cprog >> $seqres.full 2>&1 || \ + _notrun "Could not compile test program (see end of $seqres.full)" + +$oprog $file +$oprog $dir +(cd $SCRATCH_MNT; + xfs_io -c 'lsattr' file; + xfs_io -c 'lsattr' dir) + +rm $file +rmdir $dir + +# success, all done +status=0 +exit diff --git a/tests/xfs/308.out b/tests/xfs/308.out new file mode 100644 index 0000000..ef2d5fd --- /dev/null +++ b/tests/xfs/308.out @@ -0,0 +1,3 @@ +QA output created by 308 +----------e--- file +-----------E-- dir diff --git a/tests/xfs/group b/tests/xfs/group index 4d35df5..35f1e6a 100644 --- a/tests/xfs/group +++ b/tests/xfs/group @@ -197,3 +197,5 @@ 304 auto quick quota 305 auto quota 306 auto stress log metadata repair +307 ioctl quick +308 ioctl quick -- 2.1.0 From shengyehong@mdesafe.com Thu Aug 28 04:29: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=2.0 required=5.0 tests=DEAR_SOMETHING,HTML_MESSAGE, MIME_QP_LONG_LINE,UNPARSEABLE_RELAY autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 0163F7F3F for ; Thu, 28 Aug 2014 04:29:08 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id E417A304039 for ; Thu, 28 Aug 2014 02:29:04 -0700 (PDT) X-ASG-Debug-ID: 1409218141-04cb6c54ff61e130001-NocioJ Received: from us-alimail-mta2.hst.scl.en.alidc.net (out113-248.biz.mail.alibaba.com [205.204.113.248]) by cuda.sgi.com with ESMTP id sLHVQYGmWQ0wHiaQ for ; Thu, 28 Aug 2014 02:29:02 -0700 (PDT) X-Barracuda-Envelope-From: shengyehong@mdesafe.com X-Barracuda-Apparent-Source-IP: 205.204.113.248 Received: from WS-web by r41g03013.xy2.aliyun.com at Thu, 28 Aug 2014 17:27:20 +0800 Date: Thu, 28 Aug 2014 17:27:17 +0800 From: Sender: To: Message-ID: Subject: =?UTF-8?B?UkU6IFNhZmUgQm94?= X-Priority: 1 X-ASG-Orig-Subj: =?UTF-8?B?UkU6IFNhZmUgQm94?= X-Mailer: Alimail-Mailagent MIME-Version: 1.0 X-Priority: 1 X-Mailer: Alimail-Mailagent revision 2652425 Sender: Content-Type: multipart/alternative; boundary="----=ALIBOUNDARY_6990_4c716940_53fef5f8_3f45" X-Barracuda-Connect: out113-248.biz.mail.alibaba.com[205.204.113.248] X-Barracuda-Start-Time: 1409218141 X-Barracuda-URL: http://192.48.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.02 X-Barracuda-Spam-Status: No, SCORE=1.02 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_SA038b, HTML_MESSAGE, MIME_QP_LONG_LINE, MIME_QP_LONG_LINE_2, NO_REAL_NAME, UNPARSEABLE_RELAY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.8907 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 NO_REAL_NAME From: does not include a real name 0.00 UNPARSEABLE_RELAY Informational: message has unparseable relay lines 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.20 BSF_SC0_SA038b Custom Rule SA038b ------=ALIBOUNDARY_6990_4c716940_53fef5f8_3f45 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable Dear Sir hello,=0D=0A=0D=0A=0D=0AGlad to learn that you're looking for Hotel s= afe! =0D=0A=0D=0A=0D=0AWe supply Hotel Safes/ Deposit Safes / Minibar/ Finance= safes/ Fire safe and other safes with high quality and good price. Hope to be= a partner of your company! =0D=0A=0D=0A=0D=0AE-catalog will be provided if ne= eded. =0D=0A=0D=0A=0D=0AEmail me or just call me directly. Thank you! =0D=0A=0D= =0A=0D=0A=0D=0ABest regards, =0D=0A=0D=0A=0D=0A=0D=0AEmily Zhang|Trade Manager= =0D=0ASuzhou Metal Safe Equipment Manufacturing Co., Ltd.=0D=0AMob:86-159016= 23106 Skype:emily6985=0D=0ATel:(+86)21 60672003 FAX:(+86)2160672001-8= 18=0D=0AMail:emily@mdesafe.com ------=ALIBOUNDARY_6990_4c716940_53fef5f8_3f45 Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: quoted-printable
=0D=0A

= Dear Sir hello,

=0D=0A=0D=0A

Glad to learn that you're looking for Hotel safe! = =0D=0A

=0D=0A

=0D=0A


We supply Safes/ Deposit&nbs= p;Safes / Minibar/ Finance safes/ Fire safe and other s= afes with high quality and 
good price.&= nbsp;Hope to be a partner of your company!<= /SPAN> =0D=0A

=0D=0A

=0D=0A


E-catalog will&nbs= p;be provided if needed. = =0D=0A

=0D=0A

=0D=0A


Email me&nbs= p;or just call me directly. Thank you! =0D=0A

=0D=0A

Best=  regards, =0D=0A

=0D=0A=

Emily Zhang|Trade = Manager  =0D=0A

=0D=0A

Suzhou Metal Safe Equipment = Manufacturing Co., Ltd.

=0D=0A

Mob:86-15901623106     Skype:emily6985

=0D=0A

Tel:(+86)= 21 60672003      FAX:(+86)2160672001-818

=0D=0A

M= ail:emily@mdesafe.com 

=0D=0A

------=ALIBOUNDARY_6990_4c716940_53fef5f8_3f45-- From david@fromorbit.com Thu Aug 28 04:32: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 DF4FC7F4E for ; Thu, 28 Aug 2014 04:32:04 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 7858BAC005 for ; Thu, 28 Aug 2014 02:32:04 -0700 (PDT) X-ASG-Debug-ID: 1409218321-04bdf0109a5b15c0001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id 36BvM4Fcl3lqlqp3 for ; Thu, 28 Aug 2014 02:32:02 -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: AtQUAGX2/lN5LDJ8PGdsb2JhbABbgw2BKoIshQenRwEFBp8BhXIBgRoXBQEBAQE4NoQEAQUnExwjEAgDDgoJJQ8FJQMHGhOIQb8nFxiFZIlQB4RMBZxXjBqMcSsvgQgkgSMBAQE Received: from ppp121-44-50-124.lns20.syd6.internode.on.net (HELO dastard) ([121.44.50.124]) by ipmail06.adl6.internode.on.net with ESMTP; 28 Aug 2014 19:02:01 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1XMw3i-0008Gb-BC; Thu, 28 Aug 2014 19:31:58 +1000 Date: Thu, 28 Aug 2014 19:31:58 +1000 From: Dave Chinner To: Iustin Pop Cc: xfs@oss.sgi.com, hch@infradead.org Subject: Re: [PATCH] xfs: fix behaviour of XFS_IOC_FSSETXATTR on directories Message-ID: <20140828093158.GR20518@dastard> X-ASG-Orig-Subj: Re: [PATCH] xfs: fix behaviour of XFS_IOC_FSSETXATTR on directories References: <20140718191314.GB27801@teal.hq.k1024.org> <1409199773-16802-1-git-send-email-iusty@k1024.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1409199773-16802-1-git-send-email-iusty@k1024.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: 1409218322 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.8907 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Wed, Aug 27, 2014 at 09:22:53PM -0700, Iustin Pop wrote: > Currently, the ioctl handling code for XFS_IOC_FSSETXATTR treats all > targets as regular files: it refuses to change the extent size if > extents are allocated. This is wrong for directories, as there the > extent size is only used as a default for children. > > The patch fixes this by only checking for allocated extents for regular > files; it leaves undefined what it means to set an extent size on a > non-regular, non-directory inode. Additionally, when setting a non-zero > extent size, the appropriate flags (EXTSIZE, respectively EXTSZINHERIT) > are enforced for regular files and directories. > > Signed-off-by: Iustin Pop > --- > A patch against xfstests to test for the fixed behaviour will follow > shortly. > > fs/xfs/xfs_ioctl.c | 34 ++++++++++++++++++++++++++-------- > 1 file changed, 26 insertions(+), 8 deletions(-) > > diff --git a/fs/xfs/xfs_ioctl.c b/fs/xfs/xfs_ioctl.c > index 8bc1bbc..5b9acd2 100644 > --- a/fs/xfs/xfs_ioctl.c > +++ b/fs/xfs/xfs_ioctl.c > @@ -1116,14 +1116,32 @@ xfs_ioctl_setattr( > } > > if (mask & FSX_EXTSIZE) { > - /* > - * Can't change extent size if any extents are allocated. > - */ > - if (ip->i_d.di_nextents && > - ((ip->i_d.di_extsize << mp->m_sb.sb_blocklog) != > - fa->fsx_extsize)) { > - code = XFS_ERROR(EINVAL); /* EFBIG? */ > - goto error_return; Doesn't apply to a current 3.17-rc1 tree. Can you update the patch? > + if (S_ISDIR(ip->i_d.di_mode)) { > + /* > + * Enforce setting the EXTSZINHERIT flag when > + * a non-zero extent size has been specified. > + */ > + if (fa->fsx_extsize) { > + fa->fsx_xflags |= XFS_XFLAG_EXTSZINHERIT; > + } > + } else if (S_ISREG(ip->i_d.di_mode)) { > + /* > + * For a regular file, we can't change extent > + * size if any extents are allocated. > + */ > + if (ip->i_d.di_nextents && > + ((ip->i_d.di_extsize << mp->m_sb.sb_blocklog) != > + fa->fsx_extsize)) { > + code = XFS_ERROR(EINVAL); /* EFBIG? */ > + goto error_return; > + } > + /* > + * Enforce setting the EXTSIZE flag when > + * a non-zero extent size has been specified. > + */ > + if (fa->fsx_extsize) { > + fa->fsx_xflags |= XFS_XFLAG_EXTSIZE; > + } > } Hmmmm. That's not validating/enforcing the correct use of XFS_XFLAG_EXTSIZE or XFS_XFLAG_EXTSZINHERIT, that's setting it implicitly based on the type of inode. If we are going to enforce this properly, then XFS_XFLAG_EXTSIZE is only valid for a regular file, and XFS_XFLAG_EXTSZINHERIT is only valid on a directory, and the flags on th einode should only be set if the hint is not zero. i.e: if (mask & FSX_EXTSIZE) { error = -EINVAL; /* validate the flags are set appropriately */ if ((fa->fsx_xflags & XFS_XFLAG_EXTSIZE) && !S_ISREG(ip->i_d.di_mode)) goto error_return; if ((fa->fsx_xflags & XFS_XFLAG_EXTSZINHERIT) && !S_ISDIR(ip->i_d.di_mode)) goto error_return; /* Can't change extent size on regular files with allocated extents */ if (S_ISREG(ip->i_d.di_mode) && ip->i_d.di_nextents && ((ip->i_d.di_extsize << mp->m_sb.sb_blocklog) != fa->fsx_extsize)) goto error_return; /* if the extent size is zero, clear the inode flags */ if (fs->fsx_extsize == 0) fa->fsx_xflags &= ~(XFS_XFLAG_EXTSIZE | XFS_XFLAG_EXTSZINHERIT); } else { /* existing size check code */ .... } } Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Thu Aug 28 05:16: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 DA30E7F3F for ; Thu, 28 Aug 2014 05:16:37 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id C82728F8054 for ; Thu, 28 Aug 2014 03:16:34 -0700 (PDT) X-ASG-Debug-ID: 1409220991-04cb6c54ff61fd00001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id 8HGckVHsqhAZWEqC for ; Thu, 28 Aug 2014 03:16:32 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.145 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AvQUAC0B/1N5LDJ8PGdsb2JhbABbgw1TV4IshQenOwwBBQaFVJdIgWWFcgGBHBcFAQEBATg2hAMBAQQBOhwjBQsIAw4KCSUPBSUDBxoTiDoHv1UYhWSIbhEBUAeETAWFBAKBDY9JhnuBXIo+jHErL4EPgUABAQE Received: from ppp121-44-50-124.lns20.syd6.internode.on.net (HELO dastard) ([121.44.50.124]) by ipmail06.adl6.internode.on.net with ESMTP; 28 Aug 2014 19:46:30 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1XMwkm-0008Nd-7j; Thu, 28 Aug 2014 20:16:28 +1000 Date: Thu, 28 Aug 2014 20:16:28 +1000 From: Dave Chinner To: Iustin Pop Cc: xfs@oss.sgi.com, hch@infradead.org, fstests@vger.kernel.org Subject: Re: [PATCH xfstests] xfs: add tests for XFS_IOC_FSSETXATTR behaviour Message-ID: <20140828101628.GS20518@dastard> X-ASG-Orig-Subj: Re: [PATCH xfstests] xfs: add tests for XFS_IOC_FSSETXATTR behaviour References: <20140718191314.GB27801@teal.hq.k1024.org> <1409199840-16907-1-git-send-email-iusty@k1024.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1409199840-16907-1-git-send-email-iusty@k1024.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: 1409220991 X-Barracuda-URL: http://192.48.176.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.8908 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- [cc fstests@vger.kernel.org] On Wed, Aug 27, 2014 at 09:24:00PM -0700, Iustin Pop wrote: > Add two tests that check for correct behaviour of XFS_IOC_FSSETXATTR: > > - 307: check that extent size can always be set on a directory > - 308: check that setting a non-zero extent size directly via the ioctl > sets the expected flags (EXTSIZE and EXTSZINHERIT) > > Signed-off-by: Iustin Pop Minor stuff first: - xfstests patches should be sent to fstests@vger.kernel.org now. - can you pick the first unused numbers in the sequence for new tests (xfs/032, xfs/051) so I don't have to renumber them before applying them? - a patch per new test - it makes it easier to review and apply as i don't have to split patches into multiple commits... > diff --git a/tests/xfs/307 b/tests/xfs/307 > new file mode 100755 > index 0000000..e8f3576 > --- /dev/null > +++ b/tests/xfs/307 > @@ -0,0 +1,87 @@ > +#! /bin/bash > +# FS QA Test No. 307 > +# > +# Test that setting extent size on directories work even for large > +# directories. What is a "large directory"? Wouldn't it be better to describe the test as "Determine whether the extent size hint can be set on directories with allocated extents correctly"? > +# > +#----------------------------------------------------------------------- > +# Copyright (c) 2014 Google Inc. All Rights Reserved. Is that correct? It doesn't match the email address you sent this from and I've never seen you post from a @google.com address. I always like to check that the copyright assignment is correct in situations like this... > +# real QA test starts here > + > +# Modify as appropriate. > +_supported_fs xfs > +_supported_os Linux > +_require_test Not needed, doesn't use the test device. > +_require_scratch > + > +_scratch_mkfs_xfs >/dev/null 2>&1 > +_scratch_mount > + > +small=$SCRATCH_MNT/small > +big=$SCRATCH_MNT/big > + > +# sanity check on a small directory > +mkdir $small > +# expect that an empty directory has no extents > +xfs_bmap $small | grep -q "no extents" Better to use xfs_io directly and filter out $SCRATCH_MNT into the golden output file like so: $XFS_IO_PROG -c "bmap" $small | _filter_scratch which will give: SCRATCH_MNT/small: no extents > +# and that we can set an extent size on it > +xfs_io -c 'extsize 8m' $small $XFS_IO_PROG > +# and finally check that the extent size update has taken place > +(cd $SCRATCH_MNT; xfs_io -c 'extsize' small) $XFS_IO_PROG -c 'extsize' $small | _filter_scratch > +# now create a 'big' (with extents) directory > +mkdir $big > +idx=1 > +while xfs_bmap $big | grep -q "no extents"; do > + touch $big/$idx > + idx=$((idx+1)) > + if [ "$idx" -gt 1048576 ]; then > + # still no extents? giving up > + echo "Can't make a directory to have extents even after 1M files" 1>&2 > + exit > + fi > +done urk. largest inode size is 2kb, which means at most it can fit less than 100 dirents in the inode before spilling to extent form. So just do a loop that creates 1000 files - there's no need to overengineer the test code. > +# expect that we can set the extent size on $big as well > +xfs_io -c 'extsize 8m' $big $XFS_IO_PROG > +# and that it took effect > +(cd $SCRATCH_MNT; xfs_io -c 'extsize' big) $XFS_IO_PROG -c 'extsize' $big | _filter_scratch > + > +# success, all done > +status=0 > +exit > diff --git a/tests/xfs/307.out b/tests/xfs/307.out > new file mode 100644 > index 0000000..f825525 > --- /dev/null > +++ b/tests/xfs/307.out > @@ -0,0 +1,3 @@ > +QA output created by 307 > +[8388608] small > +[8388608] big > diff --git a/tests/xfs/308 b/tests/xfs/308 > new file mode 100755 > index 0000000..7b43836 > --- /dev/null > +++ b/tests/xfs/308 > @@ -0,0 +1,98 @@ > +#! /bin/bash > +# FS QA Test No. 308 > +# > +# Test that setting extent size on files and directories (directly via > +# ioctl and not via xfs_io) sets the correct flags. xfs_io uses the ioctl directly - there's no need to write a special c program to do this, especially as.... > +touch $file > +mkdir $dir > + > +cat > $cprog << EOF > +#include > +#include > + > +int main(int argc, char **argv) { > + struct fsxattr fa; > + int fd = open(argv[1], O_RDONLY); > + if (fd < 0) { > + perror("open"); > + return 1; > + } > + fa.fsx_xflags = 0; > + fa.fsx_extsize = 1048576 * 8; > + int r = xfsctl(argv[1], fd, XFS_IOC_FSSETXATTR, &fa); .... that code is quite broken. Yes, it would work to set the appropriate extent size flags with the kernel changes you made, but that's not how this ioctl works. i.e. it will cause any flag bits that are set on the inode to be cleared and it's likely to fail on old kernels beacuse they have very different behaviour to what your patch does. IOWs, setting fsx_extsize without setting either XFS_XFLAG_EXTSIZE or XFS_XFLAG_EXTSZINHERIT is bad practice. The kernel is left to guess what you actually wanted to be done - the flags are supposed to tell the kernel that the fsx_extsize value is meaningful, not the other way around. FWIW, the xfs_io code is *exactly* what applications should be doing to set the extent size or any other inode flag. i.e: 1. stat the fd to determine the type. 2. populate the fsxattr structure with the existing inode flags 3. change the flags/fields of the fsxattr structure appropriately 4. set the new values to the inode. i.e, from io/open.c: static int set_extsize(const char *path, int fd, long extsz) { struct fsxattr fsx; struct stat64 stat; if (fstat64(fd, &stat) < 0) { perror("fstat64"); return 0; } if ((xfsctl(path, fd, XFS_IOC_FSGETXATTR, &fsx)) < 0) { printf("%s: XFS_IOC_FSGETXATTR %s: %s\n", progname, path, strerror(errno)); return 0; } if (S_ISREG(stat.st_mode)) { fsx.fsx_xflags |= XFS_XFLAG_EXTSIZE; } else if (S_ISDIR(stat.st_mode)) { fsx.fsx_xflags |= XFS_XFLAG_EXTSZINHERIT; } else { printf(_("invalid target file type - file %s\n"), path); return 0; } fsx.fsx_extsize = extsz; if ((xfsctl(path, fd, XFS_IOC_FSSETXATTR, &fsx)) < 0) { printf("%s: XFS_IOC_FSSETXATTR %s: %s\n", progname, path, strerror(errno)); return 0; } return 0; } We have xfs_io precisely so that we don't have to maintain random test code like this throughout xfstests - do it once, do it right, use it everywhere. Cheers, Dave. -- Dave Chinner david@fromorbit.com From dgc@oss.sgi.com Thu Aug 28 06:04: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=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 86C3D7F47; Thu, 28 Aug 2014 06:04:11 -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.17-rc1-13176-g52addcf X-Git-Refname: refs/heads/master X-Git-Reftype: branch X-Git-Oldrev: a497c3ba1d97fc69c1e78e7b96435ba8c2cb42ee X-Git-Newrev: 52addcf9d6669fa439387610bc65c92fa0980cef Message-Id: <20140828110411.86C3D7F47@oss.sgi.com> Date: Thu, 28 Aug 2014 06:04:10 -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 645f985 Merge branch 'xfs-misc-fixes-3.17-2' into for-next b076d87 Merge branch 'xfs-bulkstat-refactor' into for-next 4d7eece Merge branch 'xfs-misc-fixes-3.17-1' into for-next e0ac6d4 Merge branch 'xfs-quota-eofblocks-scan' into for-next 6eee897 xfs: fix coccinelle warnings 4ef897a xfs: flush both inodes in xfs_swap_extents 8121768 xfs: fix swapext ilock deadlock b92cc59 xfs: kill xfs_vnode.h dd8c38b xfs: kill VN_MAPPED 2667c6f xfs: kill VN_CACHED eac152b xfs: kill VN_DIRTY() ad3714b xfs: dquot recovery needs verifiers 5fd364f xfs: quotacheck leaves dquot buffers without verifiers 67dc288 xfs: ensure verifiers are attached to recovered buffers 400b9d8 xfs: catch buffers written without verifiers attached 5ef828c xfs: avoid false quotacheck after unclean shutdown eedf32b xfs: fix rounding error of fiemap length parameter 1e773c4 xfs: introduce xfs_bulkstat_ag_ichunk d5cf09b xfs: require 64-bit sector_t 74dc93a xfs: fix uflags detection at xfs_fs_rm_xquota 7b409a7 xfs: remove XFS_IS_OQUOTA_ON macros 54aa61f xfs: tidy up xfs_set_inode32 9de67c3 xfs: allow inode allocations in post-growfs disk space eb866bb xfs: mark xfs_qm_quotacheck as static 5c18717 xfs: fix cil push sequence after log recovery f074051 xfs: squash prealloc while over quota free space as well dc06f398 xfs: run an eofblocks scan on ENOSPC/EDQUOT f452639 xfs: support a union-based filter for eofblocks scans 5400da7 xfs: add scan owner field to xfs_eofblocks f3d1e58 xfs: introduce xfs_bulkstat_grab_ichunk 4b8fdfe xfs: introduce xfs_bulkstat_ichunk_ra d4c2734 xfs: fix error handling at xfs_bulkstat 296dfd7 xfs: remove redundant user buffer count checks at xfs_bulkstat c7cb51d xfs: fix error handling at xfs_inumbers 549fa00 xfs: consolidate xfs_inumbers d716f8e xfs: remove xfs_bulkstat_single 8fe6577 xfs: remove redundant stat assignment in xfs_bulkstat_one_int 80d6d69 xfs: add log attributes for log lsn and grant head data baff4e4 xfs: add xlog sysfs kobject and attribute handlers a31b1d3 xfs: add xfs_mount sysfs kobject 3d87122 xfs: add a sysfs kset a70a4fa xfs: fix a couple error sequence jumps in xfs_mountfs() 7f8a058 Merge branch 'xfs-libxfs-restructure' into for-next 03e0134 xfs: null unused quota inodes when quota is on cf11da9 xfs: refine the allocation stack switch aa182e6 Revert "xfs: block allocation work needs to be kswapd aware" 2451337 xfs: global error sign conversion 30f712c libxfs: move source files 84be0ff libxfs: move header files 69116a1 xfs: create libxfs infrastructure b474c7a xfs: Nuke XFS_ERROR macro d99831f xfs: return is not a function from a497c3ba1d97fc69c1e78e7b96435ba8c2cb42ee (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 ----------------------------------------------------------------- ----------------------------------------------------------------------- Summary of changes: fs/xfs/Kconfig | 1 + fs/xfs/Makefile | 71 ++-- fs/xfs/{ => libxfs}/xfs_ag.h | 0 fs/xfs/{ => libxfs}/xfs_alloc.c | 20 +- fs/xfs/{ => libxfs}/xfs_alloc.h | 0 fs/xfs/{ => libxfs}/xfs_alloc_btree.c | 6 +- fs/xfs/{ => libxfs}/xfs_alloc_btree.h | 0 fs/xfs/{ => libxfs}/xfs_attr.c | 92 ++--- fs/xfs/{ => libxfs}/xfs_attr_leaf.c | 78 ++--- fs/xfs/{ => libxfs}/xfs_attr_leaf.h | 0 fs/xfs/{ => libxfs}/xfs_attr_remote.c | 22 +- fs/xfs/{ => libxfs}/xfs_attr_remote.h | 0 fs/xfs/{ => libxfs}/xfs_attr_sf.h | 0 fs/xfs/{ => libxfs}/xfs_bit.h | 0 fs/xfs/{ => libxfs}/xfs_bmap.c | 67 ++-- fs/xfs/{ => libxfs}/xfs_bmap.h | 4 +- fs/xfs/{ => libxfs}/xfs_bmap_btree.c | 99 +----- fs/xfs/{ => libxfs}/xfs_bmap_btree.h | 0 fs/xfs/{ => libxfs}/xfs_btree.c | 128 +++++-- fs/xfs/{ => libxfs}/xfs_btree.h | 2 +- fs/xfs/{ => libxfs}/xfs_cksum.h | 0 fs/xfs/{ => libxfs}/xfs_da_btree.c | 112 +++--- fs/xfs/{ => libxfs}/xfs_da_btree.h | 0 fs/xfs/{ => libxfs}/xfs_da_format.c | 0 fs/xfs/{ => libxfs}/xfs_da_format.h | 0 fs/xfs/{ => libxfs}/xfs_dinode.h | 0 fs/xfs/{ => libxfs}/xfs_dir2.c | 24 +- fs/xfs/{ => libxfs}/xfs_dir2.h | 0 fs/xfs/{ => libxfs}/xfs_dir2_block.c | 18 +- fs/xfs/{ => libxfs}/xfs_dir2_data.c | 10 +- fs/xfs/{ => libxfs}/xfs_dir2_leaf.c | 24 +- fs/xfs/{ => libxfs}/xfs_dir2_node.c | 40 +-- fs/xfs/{ => libxfs}/xfs_dir2_priv.h | 0 fs/xfs/{ => libxfs}/xfs_dir2_sf.c | 75 ++-- fs/xfs/{ => libxfs}/xfs_dquot_buf.c | 6 +- fs/xfs/{ => libxfs}/xfs_format.h | 14 +- fs/xfs/{ => libxfs}/xfs_ialloc.c | 34 +- fs/xfs/{ => libxfs}/xfs_ialloc.h | 0 fs/xfs/{ => libxfs}/xfs_ialloc_btree.c | 6 +- fs/xfs/{ => libxfs}/xfs_ialloc_btree.h | 0 fs/xfs/{ => libxfs}/xfs_inode_buf.c | 10 +- fs/xfs/{ => libxfs}/xfs_inode_buf.h | 0 fs/xfs/{ => libxfs}/xfs_inode_fork.c | 36 +- fs/xfs/{ => libxfs}/xfs_inode_fork.h | 0 fs/xfs/{ => libxfs}/xfs_inum.h | 4 - fs/xfs/{ => libxfs}/xfs_log_format.h | 4 +- fs/xfs/{ => libxfs}/xfs_log_recover.h | 0 fs/xfs/{ => libxfs}/xfs_log_rlimit.c | 0 fs/xfs/{ => libxfs}/xfs_quota_defs.h | 2 - fs/xfs/{ => libxfs}/xfs_rtbitmap.c | 0 fs/xfs/{ => libxfs}/xfs_sb.c | 81 +++-- fs/xfs/{ => libxfs}/xfs_sb.h | 8 +- fs/xfs/{ => libxfs}/xfs_shared.h | 0 fs/xfs/{ => libxfs}/xfs_symlink_remote.c | 6 +- fs/xfs/{ => libxfs}/xfs_trans_resv.c | 0 fs/xfs/{ => libxfs}/xfs_trans_resv.h | 0 fs/xfs/{ => libxfs}/xfs_trans_space.h | 0 fs/xfs/xfs_acl.c | 8 +- fs/xfs/xfs_aops.c | 18 +- fs/xfs/xfs_attr_inactive.c | 22 +- fs/xfs/xfs_attr_list.c | 38 +- fs/xfs/xfs_bmap_util.c | 227 +++++------- fs/xfs/xfs_bmap_util.h | 4 - fs/xfs/xfs_buf.c | 40 ++- fs/xfs/xfs_buf.h | 2 +- fs/xfs/xfs_buf_item.c | 4 +- fs/xfs/xfs_dir2_readdir.c | 4 +- fs/xfs/xfs_discard.c | 18 +- fs/xfs/xfs_dquot.c | 41 +-- fs/xfs/xfs_dquot.h | 15 + fs/xfs/xfs_error.c | 25 +- fs/xfs/xfs_error.h | 13 +- fs/xfs/xfs_export.c | 10 +- fs/xfs/xfs_extfree_item.c | 2 +- fs/xfs/xfs_file.c | 75 ++-- fs/xfs/xfs_filestream.c | 4 +- fs/xfs/xfs_fs.h | 7 +- fs/xfs/xfs_fsops.c | 42 +-- fs/xfs/xfs_icache.c | 148 ++++++-- fs/xfs/xfs_icache.h | 13 +- fs/xfs/xfs_inode.c | 68 ++-- fs/xfs/xfs_inode.h | 10 + fs/xfs/xfs_inode_item.c | 2 +- fs/xfs/xfs_ioctl.c | 266 +++++++------- fs/xfs/xfs_ioctl32.c | 111 +++--- fs/xfs/xfs_iomap.c | 57 +-- fs/xfs/xfs_iops.c | 72 ++-- fs/xfs/xfs_itable.c | 579 ++++++++++++++----------------- fs/xfs/xfs_itable.h | 23 +- fs/xfs/xfs_linux.h | 27 +- fs/xfs/xfs_log.c | 69 ++-- fs/xfs/xfs_log_cil.c | 8 +- fs/xfs/xfs_log_priv.h | 2 + fs/xfs/xfs_log_recover.c | 284 ++++++++------- fs/xfs/xfs_mount.c | 97 +++--- fs/xfs/xfs_mount.h | 1 + fs/xfs/xfs_mru_cache.c | 14 +- fs/xfs/xfs_qm.c | 229 ++++++------ fs/xfs/xfs_qm.h | 1 - fs/xfs/xfs_qm_bhv.c | 2 +- fs/xfs/xfs_qm_syscalls.c | 46 +-- fs/xfs/xfs_quotaops.c | 20 +- fs/xfs/xfs_rtalloc.c | 24 +- fs/xfs/xfs_rtalloc.h | 2 +- fs/xfs/xfs_super.c | 132 +++---- fs/xfs/xfs_super.h | 15 +- fs/xfs/xfs_symlink.c | 30 +- fs/xfs/xfs_sysfs.c | 165 +++++++++ fs/xfs/xfs_sysfs.h | 59 ++++ fs/xfs/xfs_trans.c | 10 +- fs/xfs/xfs_trans_ail.c | 4 +- fs/xfs/xfs_trans_buf.c | 37 +- fs/xfs/xfs_trans_dquot.c | 4 +- fs/xfs/xfs_types.h | 29 +- fs/xfs/xfs_vnode.h | 46 --- fs/xfs/xfs_xattr.c | 6 +- 116 files changed, 2319 insertions(+), 2116 deletions(-) rename fs/xfs/{ => libxfs}/xfs_ag.h (100%) rename fs/xfs/{ => libxfs}/xfs_alloc.c (99%) rename fs/xfs/{ => libxfs}/xfs_alloc.h (100%) rename fs/xfs/{ => libxfs}/xfs_alloc_btree.c (99%) rename fs/xfs/{ => libxfs}/xfs_alloc_btree.h (100%) rename fs/xfs/{ => libxfs}/xfs_attr.c (97%) rename fs/xfs/{ => libxfs}/xfs_attr_leaf.c (98%) rename fs/xfs/{ => libxfs}/xfs_attr_leaf.h (100%) rename fs/xfs/{ => libxfs}/xfs_attr_remote.c (98%) rename fs/xfs/{ => libxfs}/xfs_attr_remote.h (100%) rename fs/xfs/{ => libxfs}/xfs_attr_sf.h (100%) rename fs/xfs/{ => libxfs}/xfs_bit.h (100%) rename fs/xfs/{ => libxfs}/xfs_bmap.c (99%) rename fs/xfs/{ => libxfs}/xfs_bmap.h (98%) rename fs/xfs/{ => libxfs}/xfs_bmap_btree.c (88%) rename fs/xfs/{ => libxfs}/xfs_bmap_btree.h (100%) rename fs/xfs/{ => libxfs}/xfs_btree.c (97%) rename fs/xfs/{ => libxfs}/xfs_btree.h (99%) rename fs/xfs/{ => libxfs}/xfs_cksum.h (100%) rename fs/xfs/{ => libxfs}/xfs_da_btree.c (97%) rename fs/xfs/{ => libxfs}/xfs_da_btree.h (100%) rename fs/xfs/{ => libxfs}/xfs_da_format.c (100%) rename fs/xfs/{ => libxfs}/xfs_da_format.h (100%) rename fs/xfs/{ => libxfs}/xfs_dinode.h (100%) rename fs/xfs/{ => libxfs}/xfs_dir2.c (98%) rename fs/xfs/{ => libxfs}/xfs_dir2.h (100%) rename fs/xfs/{ => libxfs}/xfs_dir2_block.c (99%) rename fs/xfs/{ => libxfs}/xfs_dir2_data.c (99%) rename fs/xfs/{ => libxfs}/xfs_dir2_leaf.c (99%) rename fs/xfs/{ => libxfs}/xfs_dir2_node.c (98%) rename fs/xfs/{ => libxfs}/xfs_dir2_priv.h (100%) rename fs/xfs/{ => libxfs}/xfs_dir2_sf.c (97%) rename fs/xfs/{ => libxfs}/xfs_dquot_buf.c (98%) rename fs/xfs/{ => libxfs}/xfs_format.h (97%) rename fs/xfs/{ => libxfs}/xfs_ialloc.c (99%) rename fs/xfs/{ => libxfs}/xfs_ialloc.h (100%) rename fs/xfs/{ => libxfs}/xfs_ialloc_btree.c (98%) rename fs/xfs/{ => libxfs}/xfs_ialloc_btree.h (100%) rename fs/xfs/{ => libxfs}/xfs_inode_buf.c (98%) rename fs/xfs/{ => libxfs}/xfs_inode_buf.h (100%) rename fs/xfs/{ => libxfs}/xfs_inode_fork.c (98%) rename fs/xfs/{ => libxfs}/xfs_inode_fork.h (100%) rename fs/xfs/{ => libxfs}/xfs_inum.h (96%) rename fs/xfs/{ => libxfs}/xfs_log_format.h (99%) rename fs/xfs/{ => libxfs}/xfs_log_recover.h (100%) rename fs/xfs/{ => libxfs}/xfs_log_rlimit.c (100%) rename fs/xfs/{ => libxfs}/xfs_quota_defs.h (98%) rename fs/xfs/{ => libxfs}/xfs_rtbitmap.c (100%) rename fs/xfs/{ => libxfs}/xfs_sb.c (93%) rename fs/xfs/{ => libxfs}/xfs_sb.h (98%) rename fs/xfs/{ => libxfs}/xfs_shared.h (100%) rename fs/xfs/{ => libxfs}/xfs_symlink_remote.c (97%) rename fs/xfs/{ => libxfs}/xfs_trans_resv.c (100%) rename fs/xfs/{ => libxfs}/xfs_trans_resv.h (100%) rename fs/xfs/{ => libxfs}/xfs_trans_space.h (100%) create mode 100644 fs/xfs/xfs_sysfs.c create mode 100644 fs/xfs/xfs_sysfs.h delete mode 100644 fs/xfs/xfs_vnode.h hooks/post-receive -- XFS development tree From dgc@oss.sgi.com Thu Aug 28 06:05: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=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 D57207F47; Thu, 28 Aug 2014 06:05:10 -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.17-rc1-13176-g52addcf X-Git-Refname: refs/heads/for-next X-Git-Reftype: branch X-Git-Oldrev: 645f9857213476407d8ed1b59619fdff7128d3e6 X-Git-Newrev: 52addcf9d6669fa439387610bc65c92fa0980cef Message-Id: <20140828110510.D57207F47@oss.sgi.com> Date: Thu, 28 Aug 2014 06:05:10 -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 from 645f9857213476407d8ed1b59619fdff7128d3e6 (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 ----------------------------------------------------------------- ----------------------------------------------------------------------- Summary of changes: hooks/post-receive -- XFS development tree From dave@fromorbit.com Thu Aug 28 06:49: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 8829F7F3F for ; Thu, 28 Aug 2014 06:49:20 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 186F0AC002 for ; Thu, 28 Aug 2014 04:49:20 -0700 (PDT) X-ASG-Debug-ID: 1409226556-04cbb054868aef60002-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id wFprHl71RD6qfhbK for ; Thu, 28 Aug 2014 04:49:18 -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: AocZAB4W/1N5LDJ8PGdsb2JhbABbgw2IXadNBqYRFwUBAQEBODaEYDuBAgMHiG6bJqQAhXyJbYQ2BbVnK4J+AQEB Received: from ppp121-44-50-124.lns20.syd6.internode.on.net (HELO dastard) ([121.44.50.124]) by ipmail06.adl6.internode.on.net with ESMTP; 28 Aug 2014 21:19:15 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1XMyCX-0000FK-Ed for xfs@oss.sgi.com; Thu, 28 Aug 2014 21:49:13 +1000 Received: from dave by disappointment with local (Exim 4.82_1-5b7a7c0-XX) (envelope-from ) id 1XMyCX-0004KY-DV for xfs@oss.sgi.com; Thu, 28 Aug 2014 21:49:13 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH v2 0/7] xfs: invalidation and related fixes for v3.17-rc3 Date: Thu, 28 Aug 2014 21:49:04 +1000 X-ASG-Orig-Subj: [PATCH v2 0/7] xfs: invalidation and related fixes for v3.17-rc3 Message-Id: <1409226551-16570-1-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 2.0.0 X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1409226557 X-Barracuda-URL: http://192.48.176.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.8911 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Hi folks, These are the patches that I'm planning to send to Linus for 3.17-rc3. I've been testing them all week, an dI'll push them out into a topic branch tomorrow morning for a linux-next build before pushing them to Linus. Only the first patch doesn't have a review; there was a bit of discussion about the problem that the patch fixes but no changes have really been suggested from that discussion. I've fixed the one problem that was pointed out, so please have a look over it... I also added Brian's eofblocks trimming for collapse range fix to the set as it fixed another problem I was tripping over in testing and it's simple enough to consider a valid -rc fix. Cheers, Dave. From dave@fromorbit.com Thu Aug 28 06:49: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 (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 101B07F47 for ; Thu, 28 Aug 2014 06:49:21 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id E9A57304053 for ; Thu, 28 Aug 2014 04:49:20 -0700 (PDT) X-ASG-Debug-ID: 1409226556-04cbb054868aef60003-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id bQpyg5kRWlP8nNKa for ; Thu, 28 Aug 2014 04:49:19 -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: AqwZAB4W/1N5LDJ8PGdsb2JhbABbgw2BKoczp00GpHSBHRcFAQEBATg2hAQBBScvMwgYMTkDBxQZiEG/JoV8iUUohDYFtWcrL4JPAQEB Received: from ppp121-44-50-124.lns20.syd6.internode.on.net (HELO dastard) ([121.44.50.124]) by ipmail06.adl6.internode.on.net with ESMTP; 28 Aug 2014 21:19:15 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1XMyCX-0000FO-Gl for xfs@oss.sgi.com; Thu, 28 Aug 2014 21:49:13 +1000 Received: from dave by disappointment with local (Exim 4.82_1-5b7a7c0-XX) (envelope-from ) id 1XMyCX-0004Kq-Ft for xfs@oss.sgi.com; Thu, 28 Aug 2014 21:49:13 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 4/7] xfs: use ranged writeback and invalidation for direct IO Date: Thu, 28 Aug 2014 21:49:08 +1000 X-ASG-Orig-Subj: [PATCH 4/7] xfs: use ranged writeback and invalidation for direct IO Message-Id: <1409226551-16570-5-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 2.0.0 In-Reply-To: <1409226551-16570-1-git-send-email-david@fromorbit.com> References: <1409226551-16570-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1409226559 X-Barracuda-URL: http://192.48.176.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.8911 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner Now we are not doing silly things with dirtying buffers beyond EOF and using invalidation correctly, we can finally reduce the ranges of writeback and invalidation used by direct IO to match that of the IO being issued. Bring the writeback and invalidation ranges back to match the generic direct IO code - this will greatly reduce the perturbation of cached data when direct IO and buffered IO are mixed, but still provide the same buffered vs direct IO coherency behaviour we currently have. Signed-off-by: Dave Chinner --- fs/xfs/xfs_file.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/fs/xfs/xfs_file.c b/fs/xfs/xfs_file.c index 19917fa..de5368c 100644 --- a/fs/xfs/xfs_file.c +++ b/fs/xfs/xfs_file.c @@ -291,7 +291,7 @@ xfs_file_read_iter( if (inode->i_mapping->nrpages) { ret = filemap_write_and_wait_range( VFS_I(ip)->i_mapping, - pos, -1); + pos, pos + size - 1); if (ret) { xfs_rw_iunlock(ip, XFS_IOLOCK_EXCL); return ret; @@ -303,7 +303,8 @@ xfs_file_read_iter( * happen on XFS. Warn if it does fail. */ ret = invalidate_inode_pages2_range(VFS_I(ip)->i_mapping, - pos >> PAGE_CACHE_SHIFT, -1); + pos >> PAGE_CACHE_SHIFT, + (pos + size - 1) >> PAGE_CACHE_SHIFT); WARN_ON_ONCE(ret); ret = 0; } @@ -641,7 +642,7 @@ xfs_file_dio_aio_write( if (mapping->nrpages) { ret = filemap_write_and_wait_range(VFS_I(ip)->i_mapping, - pos, -1); + pos, pos + count - 1); if (ret) goto out; /* @@ -650,7 +651,8 @@ xfs_file_dio_aio_write( * happen on XFS. Warn if it does fail. */ ret = invalidate_inode_pages2_range(VFS_I(ip)->i_mapping, - pos >> PAGE_CACHE_SHIFT, -1); + pos >> PAGE_CACHE_SHIFT, + (pos + count - 1) >> PAGE_CACHE_SHIFT); WARN_ON_ONCE(ret); ret = 0; } -- 2.0.0 From dave@fromorbit.com Thu Aug 28 06:49: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 B51AF7F3F for ; Thu, 28 Aug 2014 06:49:21 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 52FF6AC004 for ; Thu, 28 Aug 2014 04:49:21 -0700 (PDT) X-ASG-Debug-ID: 1409226558-04bdf010a05b68a0002-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id IEThrQS62nqW2lFM for ; Thu, 28 Aug 2014 04:49:19 -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: AqcZAB4W/1N5LDJ8PGdsb2JhbABbgw2BKoczp00GphEXBQEBAQE4NoQEAQUnLzMIGDE5AwcUGYhBvyaFfI4jBbVnKy+BCCSBIwEBAQ Received: from ppp121-44-50-124.lns20.syd6.internode.on.net (HELO dastard) ([121.44.50.124]) by ipmail06.adl6.internode.on.net with ESMTP; 28 Aug 2014 21:19:15 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1XMyCX-0000FP-HO for xfs@oss.sgi.com; Thu, 28 Aug 2014 21:49:13 +1000 Received: from dave by disappointment with local (Exim 4.82_1-5b7a7c0-XX) (envelope-from ) id 1XMyCX-0004Kv-GR for xfs@oss.sgi.com; Thu, 28 Aug 2014 21:49:13 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 5/7] xfs: don't log inode unless extent shift makes extent modifications Date: Thu, 28 Aug 2014 21:49:09 +1000 X-ASG-Orig-Subj: [PATCH 5/7] xfs: don't log inode unless extent shift makes extent modifications Message-Id: <1409226551-16570-6-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 2.0.0 In-Reply-To: <1409226551-16570-1-git-send-email-david@fromorbit.com> References: <1409226551-16570-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1409226559 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.8910 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Brian Foster The file collapse mechanism uses xfs_bmap_shift_extents() to collapse all subsequent extents down into the specified, previously punched out, region. This function performs some validation, such as whether a sufficient hole exists in the target region of the collapse, then shifts the remaining exents downward. The exit path of the function currently logs the inode unconditionally. While we must log the inode (and abort) if an error occurs and the transaction is dirty, the initial validation paths can generate errors before the transaction has been dirtied. This creates an unnecessary filesystem shutdown scenario, as the caller will cancel a transaction that has been marked dirty. Modify xfs_bmap_shift_extents() to OR the logflags bits as modifications are made to the inode bmap. Only log the inode in the exit path if logflags has been set. This ensures we only have to cancel a dirty transaction if modifications have been made and prevents an unnecessary filesystem shutdown otherwise. Signed-off-by: Brian Foster Reviewed-by: Dave Chinner --- fs/xfs/libxfs/xfs_bmap.c | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/fs/xfs/libxfs/xfs_bmap.c b/fs/xfs/libxfs/xfs_bmap.c index 3a6a700..e5c2518 100644 --- a/fs/xfs/libxfs/xfs_bmap.c +++ b/fs/xfs/libxfs/xfs_bmap.c @@ -5422,7 +5422,7 @@ xfs_bmap_shift_extents( struct xfs_bmap_free *flist, int num_exts) { - struct xfs_btree_cur *cur; + struct xfs_btree_cur *cur = NULL; struct xfs_bmbt_rec_host *gotp; struct xfs_bmbt_irec got; struct xfs_bmbt_irec left; @@ -5433,7 +5433,7 @@ xfs_bmap_shift_extents( int error = 0; int i; int whichfork = XFS_DATA_FORK; - int logflags; + int logflags = 0; xfs_filblks_t blockcount = 0; int total_extents; @@ -5476,16 +5476,11 @@ xfs_bmap_shift_extents( } } - /* 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 = *firstblock; cur->bc_private.b.flist = flist; cur->bc_private.b.flags = 0; - } else { - cur = NULL; - logflags |= XFS_ILOG_DEXT; } /* @@ -5543,11 +5538,14 @@ xfs_bmap_shift_extents( blockcount = left.br_blockcount + got.br_blockcount; xfs_iext_remove(ip, *current_ext, 1, 0); + logflags |= XFS_ILOG_CORE; if (cur) { error = xfs_btree_delete(cur, &i); if (error) goto del_cursor; XFS_WANT_CORRUPTED_GOTO(i == 1, del_cursor); + } else { + logflags |= XFS_ILOG_DEXT; } XFS_IFORK_NEXT_SET(ip, whichfork, XFS_IFORK_NEXTENTS(ip, whichfork) - 1); @@ -5573,6 +5571,7 @@ xfs_bmap_shift_extents( got.br_startoff = startoff; } + logflags |= XFS_ILOG_CORE; if (cur) { error = xfs_bmbt_update(cur, got.br_startoff, got.br_startblock, @@ -5580,6 +5579,8 @@ xfs_bmap_shift_extents( got.br_state); if (error) goto del_cursor; + } else { + logflags |= XFS_ILOG_DEXT; } (*current_ext)++; @@ -5595,6 +5596,7 @@ del_cursor: xfs_btree_del_cursor(cur, error ? XFS_BTREE_ERROR : XFS_BTREE_NOERROR); - xfs_trans_log_inode(tp, ip, logflags); + if (logflags) + xfs_trans_log_inode(tp, ip, logflags); return error; } -- 2.0.0 From dave@fromorbit.com Thu Aug 28 06:49: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 (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 0C0F57F47 for ; Thu, 28 Aug 2014 06:49:22 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id EED4A304048 for ; Thu, 28 Aug 2014 04:49:21 -0700 (PDT) X-ASG-Debug-ID: 1409226559-04cb6c54fd623a20001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id GiYo4kvab5M0yjw9 for ; Thu, 28 Aug 2014 04:49:20 -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: AqwZAB4W/1N5LDJ8PGdsb2JhbABbgw2BKoczp00GpHSBHRcFAQEBATg2hAQBBScvMwgYMTkDBxQZiEG/JoV8iGxZKIQ2Bah2jHErL4EGgUkBAQE Received: from ppp121-44-50-124.lns20.syd6.internode.on.net (HELO dastard) ([121.44.50.124]) by ipmail06.adl6.internode.on.net with ESMTP; 28 Aug 2014 21:19:15 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1XMyCX-0000FM-Fh for xfs@oss.sgi.com; Thu, 28 Aug 2014 21:49:13 +1000 Received: from dave by disappointment with local (Exim 4.82_1-5b7a7c0-XX) (envelope-from ) id 1XMyCX-0004Kg-Er for xfs@oss.sgi.com; Thu, 28 Aug 2014 21:49:13 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 2/7] xfs: don't zero partial page cache pages during O_DIRECT writes Date: Thu, 28 Aug 2014 21:49:06 +1000 X-ASG-Orig-Subj: [PATCH 2/7] xfs: don't zero partial page cache pages during O_DIRECT writes Message-Id: <1409226551-16570-3-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 2.0.0 In-Reply-To: <1409226551-16570-1-git-send-email-david@fromorbit.com> References: <1409226551-16570-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1409226559 X-Barracuda-URL: http://192.48.176.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.8910 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Chris Mason xfs is using truncate_pagecache_range to invalidate the page cache during DIO reads. This is different from the other filesystems who only invalidate pages during DIO writes. truncate_pagecache_range is meant to be used when we are freeing the underlying data structs from disk, so it will zero any partial ranges in the page. This means a DIO read can zero out part of the page cache page, and it is possible the page will stay in cache. buffered reads will find an up to date page with zeros instead of the data actually on disk. This patch fixes things by using invalidate_inode_pages2_range instead. It preserves the page cache invalidation, but won't zero any pages. [dchinner: catch error and warn if it fails. Comment.] cc: stable@vger.kernel.org Signed-off-by: Chris Mason Reviewed-by: Dave Chinner Reviewed-by: Brian Foster Signed-off-by: Dave Chinner --- fs/xfs/xfs_file.c | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/fs/xfs/xfs_file.c b/fs/xfs/xfs_file.c index 076b170..827cfb2 100644 --- a/fs/xfs/xfs_file.c +++ b/fs/xfs/xfs_file.c @@ -296,7 +296,16 @@ xfs_file_read_iter( xfs_rw_iunlock(ip, XFS_IOLOCK_EXCL); return ret; } - truncate_pagecache_range(VFS_I(ip), pos, -1); + + /* + * Invalidate whole pages. This can return an error if + * we fail to invalidate a page, but this should never + * happen on XFS. Warn if it does fail. + */ + ret = invalidate_inode_pages2_range(VFS_I(ip)->i_mapping, + pos >> PAGE_CACHE_SHIFT, -1); + WARN_ON_ONCE(ret); + ret = 0; } xfs_rw_ilock_demote(ip, XFS_IOLOCK_EXCL); } -- 2.0.0 From dave@fromorbit.com Thu Aug 28 06:49: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 666C37F51 for ; Thu, 28 Aug 2014 06:49:22 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 44CA58F8050 for ; Thu, 28 Aug 2014 04:49:22 -0700 (PDT) X-ASG-Debug-ID: 1409226556-04cbb054868aef60004-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id MKwUGLsGcnZjNLRt for ; Thu, 28 Aug 2014 04:49:20 -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: AqwZAB4W/1N5LDJ8PGdsb2JhbABbgw2BKoczp00GpHSBHRcFAQEBATg2hAQBBScvMwgYMTkDBxQZiEG/JoV8iUUohDYFtWcrL4EGJIElAQEB Received: from ppp121-44-50-124.lns20.syd6.internode.on.net (HELO dastard) ([121.44.50.124]) by ipmail06.adl6.internode.on.net with ESMTP; 28 Aug 2014 21:19:15 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1XMyCX-0000FR-Iv for xfs@oss.sgi.com; Thu, 28 Aug 2014 21:49:13 +1000 Received: from dave by disappointment with local (Exim 4.82_1-5b7a7c0-XX) (envelope-from ) id 1XMyCX-0004L5-He for xfs@oss.sgi.com; Thu, 28 Aug 2014 21:49:13 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 7/7] xfs: trim eofblocks before collapse range Date: Thu, 28 Aug 2014 21:49:11 +1000 X-ASG-Orig-Subj: [PATCH 7/7] xfs: trim eofblocks before collapse range Message-Id: <1409226551-16570-8-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 2.0.0 In-Reply-To: <1409226551-16570-1-git-send-email-david@fromorbit.com> References: <1409226551-16570-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1409226560 X-Barracuda-URL: http://192.48.176.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.8911 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Brian Foster xfs_collapse_file_space() currently writes back the entire file undergoing collapse range to settle things down for the extent shift algorithm. While this prevents changes to the extent list during the collapse operation, the writeback itself is not enough to prevent unnecessary collapse failures. The current shift algorithm uses the extent index to iterate the in-core extent list. If a post-eof delalloc extent persists after the writeback (e.g., a prior zero range op where the end of the range aligns with eof can separate the post-eof blocks such that they are not written back and converted), xfs_bmap_shift_extents() becomes confused over the encoded br_startblock value and fails the collapse. As with the full writeback, this is a temporary fix until the algorithm is improved to cope with a volatile extent list and avoid attempts to shift post-eof extents. Signed-off-by: Brian Foster Reviewed-by: Dave Chinner --- fs/xfs/xfs_bmap_util.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/fs/xfs/xfs_bmap_util.c b/fs/xfs/xfs_bmap_util.c index 283e20c..c692260 100644 --- a/fs/xfs/xfs_bmap_util.c +++ b/fs/xfs/xfs_bmap_util.c @@ -1445,8 +1445,10 @@ xfs_collapse_file_space( shift_fsb = XFS_B_TO_FSB(mp, len); /* - * writeback the entire file to prevent concurrent writeback of ranges - * outside the collapsing region from changing the extent list. + * Writeback the entire file and force remove any post-eof blocks. The + * writeback prevents changes to the extent list via concurrent + * writeback and the eofblocks trim prevents the extent shift algorithm + * from running into a post-eof delalloc extent. * * XXX: This is a temporary fix until the extent shift loop below is * converted to use offsets and lookups within the ILOCK rather than @@ -1456,6 +1458,11 @@ xfs_collapse_file_space( error = filemap_write_and_wait(VFS_I(ip)->i_mapping); if (error) return error; + if (xfs_can_free_eofblocks(ip, true)) { + error = xfs_free_eofblocks(mp, ip, false); + if (error) + return error; + } error = xfs_free_file_space(ip, offset, len); if (error) -- 2.0.0 From dave@fromorbit.com Thu Aug 28 06:49: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 7D6137F55 for ; Thu, 28 Aug 2014 06:49:22 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id F0B3EAC002 for ; Thu, 28 Aug 2014 04:49:18 -0700 (PDT) X-ASG-Debug-ID: 1409226556-04cbb054868aef60001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id GDxo5L8hxR1k3gia for ; Thu, 28 Aug 2014 04:49:16 -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: AqwZAB4W/1N5LDJ8PGdsb2JhbABbgw2BKoczp00GpHSBHRcFAQEBATg2hAQBBScvMwgYMTkDBxQZiEG/JoV8iGxZKIQ2Bah2jHErL4EGgUkBAQE Received: from ppp121-44-50-124.lns20.syd6.internode.on.net (HELO dastard) ([121.44.50.124]) by ipmail06.adl6.internode.on.net with ESMTP; 28 Aug 2014 21:19:15 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1XMyCX-0000FN-GD for xfs@oss.sgi.com; Thu, 28 Aug 2014 21:49:13 +1000 Received: from dave by disappointment with local (Exim 4.82_1-5b7a7c0-XX) (envelope-from ) id 1XMyCX-0004Kl-FK for xfs@oss.sgi.com; Thu, 28 Aug 2014 21:49:13 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 3/7] xfs: don't zero partial page cache pages during O_DIRECT writes Date: Thu, 28 Aug 2014 21:49:07 +1000 X-ASG-Orig-Subj: [PATCH 3/7] xfs: don't zero partial page cache pages during O_DIRECT writes Message-Id: <1409226551-16570-4-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 2.0.0 In-Reply-To: <1409226551-16570-1-git-send-email-david@fromorbit.com> References: <1409226551-16570-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1409226556 X-Barracuda-URL: http://192.48.176.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.8911 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner Similar to direct IO reads, direct IO writes are using truncate_pagecache_range to invalidate the page cache. This is incorrect due to the sub-block zeroing in the page cache that truncate_pagecache_range() triggers. This patch fixes things by using invalidate_inode_pages2_range instead. It preserves the page cache invalidation, but won't zero any pages. cc: stable@vger.kernel.org Signed-off-by: Dave Chinner Reviewed-by: Brian Foster --- fs/xfs/xfs_file.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/fs/xfs/xfs_file.c b/fs/xfs/xfs_file.c index 827cfb2..19917fa 100644 --- a/fs/xfs/xfs_file.c +++ b/fs/xfs/xfs_file.c @@ -644,7 +644,15 @@ xfs_file_dio_aio_write( pos, -1); if (ret) goto out; - truncate_pagecache_range(VFS_I(ip), pos, -1); + /* + * Invalidate whole pages. This can return an error if + * we fail to invalidate a page, but this should never + * happen on XFS. Warn if it does fail. + */ + ret = invalidate_inode_pages2_range(VFS_I(ip)->i_mapping, + pos >> PAGE_CACHE_SHIFT, -1); + WARN_ON_ONCE(ret); + ret = 0; } /* -- 2.0.0 From dave@fromorbit.com Thu Aug 28 06:49: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 8D0D47F57 for ; Thu, 28 Aug 2014 06:49:22 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 2226CAC008 for ; Thu, 28 Aug 2014 04:49:22 -0700 (PDT) X-ASG-Debug-ID: 1409226558-04bdf010a05b68a0003-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id QHdMUWN0i82uWwcA for ; Thu, 28 Aug 2014 04:49:20 -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: AqwZAB4W/1N5LDJ8PGdsb2JhbABbgw2BKoczp00GpHSBHRcFAQEBATg2hAQBBScvMwgYMTkDBxQZiEGsQpJkhXyJRSiENgWodoxxKy+BBiSBJQEBAQ Received: from ppp121-44-50-124.lns20.syd6.internode.on.net (HELO dastard) ([121.44.50.124]) by ipmail06.adl6.internode.on.net with ESMTP; 28 Aug 2014 21:19:15 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1XMyCX-0000FQ-Hz for xfs@oss.sgi.com; Thu, 28 Aug 2014 21:49:13 +1000 Received: from dave by disappointment with local (Exim 4.82_1-5b7a7c0-XX) (envelope-from ) id 1XMyCX-0004L0-HA for xfs@oss.sgi.com; Thu, 28 Aug 2014 21:49:13 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 6/7] xfs: xfs_file_collapse_range is delalloc challenged Date: Thu, 28 Aug 2014 21:49:10 +1000 X-ASG-Orig-Subj: [PATCH 6/7] xfs: xfs_file_collapse_range is delalloc challenged Message-Id: <1409226551-16570-7-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 2.0.0 In-Reply-To: <1409226551-16570-1-git-send-email-david@fromorbit.com> References: <1409226551-16570-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1409226560 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.8910 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner If we have delalloc extents on a file before we run a collapse range opertaion, we sync the range that we are going to collapse to convert delalloc extents in that region to real extents to simplify the shift operation. However, the shift operation then assumes that the extent list is not going to change as it iterates over the extent list moving things about. Unfortunately, this isn't true because we can't hold the ILOCK over all the operations. We can prevent new IO from modifying the extent list by holding the IOLOCK, but that doesn't prevent writeback from running.... And when writeback runs, it can convert delalloc extents is the range of the file prior to the region being collapsed, and this changes the indexes of all the extents in the file. That causes the collapse range operation to Go Bad. The right fix is to rewrite the extent shift operation not to be dependent on the extent list not changing across the entire operation, but this is a fairly significant piece of work to do. Hence, as a short-term workaround for the problem, sync the entire file before starting a collapse operation to remove all delalloc ranges from the file and so avoid the problem of concurrent writeback changing the extent list. Diagnosed-and-Reported-by: Brian Foster Signed-off-by: Dave Chinner Reviewed-by: Brian Foster --- fs/xfs/xfs_bmap_util.c | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/fs/xfs/xfs_bmap_util.c b/fs/xfs/xfs_bmap_util.c index aa70620..283e20c 100644 --- a/fs/xfs/xfs_bmap_util.c +++ b/fs/xfs/xfs_bmap_util.c @@ -1444,6 +1444,19 @@ xfs_collapse_file_space( start_fsb = XFS_B_TO_FSB(mp, offset + len); shift_fsb = XFS_B_TO_FSB(mp, len); + /* + * writeback the entire file to prevent concurrent writeback of ranges + * outside the collapsing region from changing the extent list. + * + * XXX: This is a temporary fix until the extent shift loop below is + * converted to use offsets and lookups within the ILOCK rather than + * carrying around the index into the extent list for the next + * iteration. + */ + error = filemap_write_and_wait(VFS_I(ip)->i_mapping); + if (error) + return error; + error = xfs_free_file_space(ip, offset, len); if (error) return error; -- 2.0.0 From dave@fromorbit.com Thu Aug 28 06:49: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 E94477F60 for ; Thu, 28 Aug 2014 06:49:23 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id BAD978F8050 for ; Thu, 28 Aug 2014 04:49:20 -0700 (PDT) X-ASG-Debug-ID: 1409226558-04bdf010a05b68a0001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id 0t49dOIBE9bgHghC for ; Thu, 28 Aug 2014 04:49:18 -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: AqgZAB4W/1N5LDJ8PGdsb2JhbABbgw2BKoczp00GphEXBQEBAQE4NoQEAQUnLzMIGDE5AwcUGRuIJr8mhXyOIwWocoppHoFuKy+CTwEBAQ Received: from ppp121-44-50-124.lns20.syd6.internode.on.net (HELO dastard) ([121.44.50.124]) by ipmail06.adl6.internode.on.net with ESMTP; 28 Aug 2014 21:19:15 +0930 Received: from disappointment.disaster.area ([192.168.1.110] helo=disappointment) by dastard with esmtp (Exim 4.80) (envelope-from ) id 1XMyCX-0000FL-FD for xfs@oss.sgi.com; Thu, 28 Aug 2014 21:49:13 +1000 Received: from dave by disappointment with local (Exim 4.82_1-5b7a7c0-XX) (envelope-from ) id 1XMyCX-0004Kb-EG for xfs@oss.sgi.com; Thu, 28 Aug 2014 21:49:13 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 1/7] xfs: don't dirty buffers beyond EOF Date: Thu, 28 Aug 2014 21:49:05 +1000 X-ASG-Orig-Subj: [PATCH 1/7] xfs: don't dirty buffers beyond EOF Message-Id: <1409226551-16570-2-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 2.0.0 In-Reply-To: <1409226551-16570-1-git-send-email-david@fromorbit.com> References: <1409226551-16570-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1409226558 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.8910 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner generic/263 is failing fsx at this point with a page spanning EOF that cannot be invalidated. The operations are: 1190 mapwrite 0x52c00 thru 0x5e569 (0xb96a bytes) 1191 mapread 0x5c000 thru 0x5d636 (0x1637 bytes) 1192 write 0x5b600 thru 0x771ff (0x1bc00 bytes) where 1190 extents EOF from 0x54000 to 0x5e569. When the direct IO write attempts to invalidate the cached page over this range, it fails with -EBUSY and so any attempt to do page invalidation fails. The real question is this: Why can't that page be invalidated after it has been written to disk and cleaned? Well, there's data on the first two buffers in the page (1k block size, 4k page), but the third buffer on the page (i.e. beyond EOF) is failing drop_buffers because it's bh->b_state == 0x3, which is BH_Uptodate | BH_Dirty. IOWs, there's dirty buffers beyond EOF. Say what? OK, set_buffer_dirty() is called on all buffers from __set_page_buffers_dirty(), regardless of whether the buffer is beyond EOF or not, which means that when we get to ->writepage, we have buffers marked dirty beyond EOF that we need to clean. So, we need to implement our own .set_page_dirty method that doesn't dirty buffers beyond EOF. This is messy because the buffer code is not meant to be shared and it has interesting locking issues on the buffer dirty bits. So just copy and paste it and then modify it to suit what we need. Note: the solutions the other filesystems and generic block code use of marking the buffers clean in ->writepage does not work for XFS. It still leaves dirty buffers beyond EOF and invalidations still fail. Hence rather than play whack-a-mole, this patch simply prevents those buffers from being dirtied in the first place. cc: Signed-off-by: Dave Chinner --- fs/xfs/xfs_aops.c | 58 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) diff --git a/fs/xfs/xfs_aops.c b/fs/xfs/xfs_aops.c index 11e9b4c..4c79f90 100644 --- a/fs/xfs/xfs_aops.c +++ b/fs/xfs/xfs_aops.c @@ -1753,11 +1753,69 @@ xfs_vm_readpages( return mpage_readpages(mapping, pages, nr_pages, xfs_get_blocks); } +/* + * This is basically a copy of __set_page_dirty_buffers() with one + * small tweak: buffers beyond EOF do not get marked dirty. If we mark them + * dirty, we'll never be able to clean them because we don't write buffers + * beyond EOF, and that means we can't invalidate pages that span EOF + * that have been marked dirty. Further, the dirty state can leak into + * the file interior if the file is extended, resulting in all sorts of + * bad things happening as the state does not match the unerlying data. + */ +STATIC int +xfs_vm_set_page_dirty( + struct page *page) +{ + struct address_space *mapping = page->mapping; + struct inode *inode = mapping->host; + loff_t end_offset; + loff_t offset; + int newly_dirty; + + if (unlikely(!mapping)) + return !TestSetPageDirty(page); + + end_offset = i_size_read(inode); + offset = end_offset & PAGE_CACHE_MASK; + + spin_lock(&mapping->private_lock); + if (page_has_buffers(page)) { + struct buffer_head *head = page_buffers(page); + struct buffer_head *bh = head; + + do { + if (offset < end_offset) + set_buffer_dirty(bh); + bh = bh->b_this_page; + offset += 1 << inode->i_blkbits; + } while (bh != head); + } + newly_dirty = !TestSetPageDirty(page); + spin_unlock(&mapping->private_lock); + + if (newly_dirty) { + /* sigh - __set_page_dirty() is static, so copy it here, too */ + unsigned long flags; + + spin_lock_irqsave(&mapping->tree_lock, flags); + if (page->mapping) { /* Race with truncate? */ + WARN_ON_ONCE(!PageUptodate(page)); + account_page_dirtied(page, mapping); + radix_tree_tag_set(&mapping->page_tree, + page_index(page), PAGECACHE_TAG_DIRTY); + } + spin_unlock_irqrestore(&mapping->tree_lock, flags); + __mark_inode_dirty(mapping->host, I_DIRTY_PAGES); + } + return newly_dirty; +} + const struct address_space_operations xfs_address_space_operations = { .readpage = xfs_vm_readpage, .readpages = xfs_vm_readpages, .writepage = xfs_vm_writepage, .writepages = xfs_vm_writepages, + .set_page_dirty = xfs_vm_set_page_dirty, .releasepage = xfs_vm_releasepage, .invalidatepage = xfs_vm_invalidatepage, .write_begin = xfs_vm_write_begin, -- 2.0.0 From bfoster@redhat.com Thu Aug 28 08:35: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 D0CA97F3F for ; Thu, 28 Aug 2014 08:35:19 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id A2D748F8040 for ; Thu, 28 Aug 2014 06:35:16 -0700 (PDT) X-ASG-Debug-ID: 1409232912-04bdf010975bbd70001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id mUHyG3KKym8rO7zk (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 28 Aug 2014 06:35:12 -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 s7SDYxex016383 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL); Thu, 28 Aug 2014 09:34:59 -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 s7SDYwRm010163; Thu, 28 Aug 2014 09:34:59 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id E771912577F; Thu, 28 Aug 2014 09:34:57 -0400 (EDT) Date: Thu, 28 Aug 2014 09:34:57 -0400 From: Brian Foster To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 1/7] xfs: don't dirty buffers beyond EOF Message-ID: <20140828133457.GA35386@bfoster.bfoster> X-ASG-Orig-Subj: Re: [PATCH 1/7] xfs: don't dirty buffers beyond EOF References: <1409226551-16570-1-git-send-email-david@fromorbit.com> <1409226551-16570-2-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1409226551-16570-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.27 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1409232912 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Thu, Aug 28, 2014 at 09:49:05PM +1000, Dave Chinner wrote: > From: Dave Chinner > > generic/263 is failing fsx at this point with a page spanning > EOF that cannot be invalidated. The operations are: > > 1190 mapwrite 0x52c00 thru 0x5e569 (0xb96a bytes) > 1191 mapread 0x5c000 thru 0x5d636 (0x1637 bytes) > 1192 write 0x5b600 thru 0x771ff (0x1bc00 bytes) > > where 1190 extents EOF from 0x54000 to 0x5e569. When the direct IO > write attempts to invalidate the cached page over this range, it > fails with -EBUSY and so any attempt to do page invalidation fails. > > The real question is this: Why can't that page be invalidated after > it has been written to disk and cleaned? > > Well, there's data on the first two buffers in the page (1k block > size, 4k page), but the third buffer on the page (i.e. beyond EOF) > is failing drop_buffers because it's bh->b_state == 0x3, which is > BH_Uptodate | BH_Dirty. IOWs, there's dirty buffers beyond EOF. Say > what? > > OK, set_buffer_dirty() is called on all buffers from > __set_page_buffers_dirty(), regardless of whether the buffer is > beyond EOF or not, which means that when we get to ->writepage, > we have buffers marked dirty beyond EOF that we need to clean. > So, we need to implement our own .set_page_dirty method that > doesn't dirty buffers beyond EOF. > > This is messy because the buffer code is not meant to be shared > and it has interesting locking issues on the buffer dirty bits. > So just copy and paste it and then modify it to suit what we need. > > Note: the solutions the other filesystems and generic block code use > of marking the buffers clean in ->writepage does not work for XFS. > It still leaves dirty buffers beyond EOF and invalidations still > fail. Hence rather than play whack-a-mole, this patch simply > prevents those buffers from being dirtied in the first place. > > cc: > Signed-off-by: Dave Chinner > --- > fs/xfs/xfs_aops.c | 58 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ > 1 file changed, 58 insertions(+) > > diff --git a/fs/xfs/xfs_aops.c b/fs/xfs/xfs_aops.c > index 11e9b4c..4c79f90 100644 > --- a/fs/xfs/xfs_aops.c > +++ b/fs/xfs/xfs_aops.c > @@ -1753,11 +1753,69 @@ xfs_vm_readpages( > return mpage_readpages(mapping, pages, nr_pages, xfs_get_blocks); > } > > +/* > + * This is basically a copy of __set_page_dirty_buffers() with one > + * small tweak: buffers beyond EOF do not get marked dirty. If we mark them > + * dirty, we'll never be able to clean them because we don't write buffers > + * beyond EOF, and that means we can't invalidate pages that span EOF > + * that have been marked dirty. Further, the dirty state can leak into > + * the file interior if the file is extended, resulting in all sorts of > + * bad things happening as the state does not match the unerlying data. > + */ > +STATIC int > +xfs_vm_set_page_dirty( > + struct page *page) > +{ > + struct address_space *mapping = page->mapping; > + struct inode *inode = mapping->host; > + loff_t end_offset; > + loff_t offset; > + int newly_dirty; > + > + if (unlikely(!mapping)) > + return !TestSetPageDirty(page); > + > + end_offset = i_size_read(inode); > + offset = end_offset & PAGE_CACHE_MASK; Is this what you intended to do here? offset = page_offset(page); Brian > + > + spin_lock(&mapping->private_lock); > + if (page_has_buffers(page)) { > + struct buffer_head *head = page_buffers(page); > + struct buffer_head *bh = head; > + > + do { > + if (offset < end_offset) > + set_buffer_dirty(bh); > + bh = bh->b_this_page; > + offset += 1 << inode->i_blkbits; > + } while (bh != head); > + } > + newly_dirty = !TestSetPageDirty(page); > + spin_unlock(&mapping->private_lock); > + > + if (newly_dirty) { > + /* sigh - __set_page_dirty() is static, so copy it here, too */ > + unsigned long flags; > + > + spin_lock_irqsave(&mapping->tree_lock, flags); > + if (page->mapping) { /* Race with truncate? */ > + WARN_ON_ONCE(!PageUptodate(page)); > + account_page_dirtied(page, mapping); > + radix_tree_tag_set(&mapping->page_tree, > + page_index(page), PAGECACHE_TAG_DIRTY); > + } > + spin_unlock_irqrestore(&mapping->tree_lock, flags); > + __mark_inode_dirty(mapping->host, I_DIRTY_PAGES); > + } > + return newly_dirty; > +} > + > const struct address_space_operations xfs_address_space_operations = { > .readpage = xfs_vm_readpage, > .readpages = xfs_vm_readpages, > .writepage = xfs_vm_writepage, > .writepages = xfs_vm_writepages, > + .set_page_dirty = xfs_vm_set_page_dirty, > .releasepage = xfs_vm_releasepage, > .invalidatepage = xfs_vm_invalidatepage, > .write_begin = xfs_vm_write_begin, > -- > 2.0.0 > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From iustin@google.com Thu Aug 28 17:29: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=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 9B2BC7F3F for ; Thu, 28 Aug 2014 17:29:05 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 7B1CD304039 for ; Thu, 28 Aug 2014 15:29:02 -0700 (PDT) X-ASG-Debug-ID: 1409264937-04cbb054878d1be0001-NocioJ Received: from mail-ie0-f179.google.com (mail-ie0-f179.google.com [209.85.223.179]) by cuda.sgi.com with ESMTP id ampxFvk3diivjXCE (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Thu, 28 Aug 2014 15:28:57 -0700 (PDT) X-Barracuda-Envelope-From: iustin@google.com X-Barracuda-Apparent-Source-IP: 209.85.223.179 X-Barracuda-IPDD: Level1 [google.com/209.85.223.179] Received: by mail-ie0-f179.google.com with SMTP id tr6so1811617ieb.38 for ; Thu, 28 Aug 2014 15:28:57 -0700 (PDT) X-Barracuda-IPDD: Level1 [google.com/209.85.223.179] X-Barracuda-IPDD: Level1 [google.com/209.85.223.179] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20120113; h=date:from:to:cc:subject:message-id:references:mime-version :content-type:content-disposition:content-transfer-encoding :in-reply-to:user-agent; bh=26Gh1KhspyqkMXYgXdUMqfQvsw8Plk3xViezUj1bieA=; b=Ic4Em6/5Atkjkck3zDndn2UXWiHXHPlpybjqIS5VffLUPgQmuVHFUN5H95ntFe+jxU v6Br+4JqNs37IH8o12sqZMS/z2vZqwy4Upym0koKh9LqrmnRocODTIO4SBGxf/bpPDgf jF7v9T6wbhw4sC8V5STR6YfTFe0wO+rH3lzj25b9D93F9nqOfcen1cVdxkqKolUNL3T1 GYwFfQYsUjjNAszBYgD8L7KZljj5q2uo0zotzXOPVqGnA2EewQT59ws0fQBfWo2W4L+f vcbgPwTgDKAavdQc0qsm4IbR2wJ929nwciqW/VQgCFuCiT6CHdhl2KIyy7WCi8tBFe9I 3YaA== 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:references :mime-version:content-type:content-disposition :content-transfer-encoding:in-reply-to:user-agent; bh=26Gh1KhspyqkMXYgXdUMqfQvsw8Plk3xViezUj1bieA=; b=ATFCd83sGLzMF4yDw3AyuHRbHcCuSM9UnrgRtvYQr8CALKUgHEakuVgRyX/fSUT0TV jtCa4Q0JdJJUME9JlPyf7UgdRB5moeSDykETNIW16J3ksxG31ttjpgPc5lUmYlIrygu9 Myo+mJ2FRHiI57rlI3ovlZWI19CRKfV89SYdOzQojMEJs3F1voslRg/67dnxvbOpVdaK iQQssnPRpGv7ky+SVZ7GaP+NQP3Aq5/y2Lwygfnhei0W1Yiv9y3YgHCxZxXbRW2rKBpi jLoKNxbWPuYh2Fukkdr0vxt5zq5eFjklkwrpwvcqtkCeN8Xbp3bRbiQCu5MDmp9h0tUT DLnQ== X-Gm-Message-State: ALoCoQmt26ywm6o3kZTvldwjmw5JL8lWiNbGSFZWxNdZjOIPUFNaVIIe79pAJDSbRiBPXZAZm0Cy X-Received: by 10.50.33.16 with SMTP id n16mr40935854igi.15.1409264936943; Thu, 28 Aug 2014 15:28:56 -0700 (PDT) Received: from google.com ([2620:0:1009:a:64ad:58d0:8abd:1cc]) by mx.google.com with ESMTPSA id w8sm21640620igl.13.2014.08.28.15.28.55 for (version=TLSv1.2 cipher=RC4-SHA bits=128/128); Thu, 28 Aug 2014 15:28:55 -0700 (PDT) Date: Thu, 28 Aug 2014 15:28:54 -0700 From: Iustin Pop To: Dave Chinner Cc: Iustin Pop , xfs@oss.sgi.com, hch@infradead.org, fstests@vger.kernel.org Subject: Re: [PATCH xfstests] xfs: add tests for XFS_IOC_FSSETXATTR behaviour Message-ID: <20140828222854.GB29940@google.com> X-ASG-Orig-Subj: Re: [PATCH xfstests] xfs: add tests for XFS_IOC_FSSETXATTR behaviour References: <20140718191314.GB27801@teal.hq.k1024.org> <1409199840-16907-1-git-send-email-iusty@k1024.org> <20140828101628.GS20518@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <20140828101628.GS20518@dastard> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: mail-ie0-f179.google.com[209.85.223.179] X-Barracuda-Start-Time: 1409264937 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Barracuda-BRTS-Status: 1 X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-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.8931 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 Don, Aug 28, 2014 at 08:16:28 +1000, Dave Chinner wrote: > [cc fstests@vger.kernel.org] > > On Wed, Aug 27, 2014 at 09:24:00PM -0700, Iustin Pop wrote: > > Add two tests that check for correct behaviour of XFS_IOC_FSSETXATTR: > > > > - 307: check that extent size can always be set on a directory > > - 308: check that setting a non-zero extent size directly via the ioctl > > sets the expected flags (EXTSIZE and EXTSZINHERIT) > > > > Signed-off-by: Iustin Pop > > Minor stuff first: > > - xfstests patches should be sent to fstests@vger.kernel.org now. OK, will do. There was nothing written in the git repository's README, hence I chose what I thought best. > - can you pick the first unused numbers in the sequence for new > tests (xfs/032, xfs/051) so I don't have to renumber them before > applying them? Will do - this is what the 'new' script did (or tried to do, as it doesn't seem to work reliably). > - a patch per new test - it makes it easier to review and apply as i > don't have to split patches into multiple commits... Will do so when resending. > > diff --git a/tests/xfs/307 b/tests/xfs/307 > > new file mode 100755 > > index 0000000..e8f3576 > > --- /dev/null > > +++ b/tests/xfs/307 > > @@ -0,0 +1,87 @@ > > +#! /bin/bash > > +# FS QA Test No. 307 > > +# > > +# Test that setting extent size on directories work even for large > > +# directories. > > What is a "large directory"? Wouldn't it be better to describe the > test as "Determine whether the extent size hint can be set on > directories with allocated extents correctly"? Indeed that's better, I'll update. > > +# > > +#----------------------------------------------------------------------- > > +# Copyright (c) 2014 Google Inc. All Rights Reserved. > > Is that correct? It doesn't match the email address you sent this > from and I've never seen you post from a @google.com address. I > always like to check that the copyright assignment is correct in > situations like this... It is correct indeed (and thanks for double-checking). I prefer to send my interactions/contributions done not as part of my job using my personal address (hence I always wrote to xfs@ from the same address), but even in that case, the copyright remains with my employer. Just as a confirmation, sending this email from my @google.com address. > > +# real QA test starts here > > + > > +# Modify as appropriate. > > +_supported_fs xfs > > +_supported_os Linux > > +_require_test > > Not needed, doesn't use the test device. Ack. > > +_require_scratch > > + > > +_scratch_mkfs_xfs >/dev/null 2>&1 > > +_scratch_mount > > + > > +small=$SCRATCH_MNT/small > > +big=$SCRATCH_MNT/big > > + > > +# sanity check on a small directory > > +mkdir $small > > +# expect that an empty directory has no extents > > +xfs_bmap $small | grep -q "no extents" > > Better to use xfs_io directly and filter out $SCRATCH_MNT into the > golden output file like so: > > $XFS_IO_PROG -c "bmap" $small | _filter_scratch > > which will give: > > SCRATCH_MNT/small: no extents Oh, nice, thanks! > > +# and that we can set an extent size on it > > +xfs_io -c 'extsize 8m' $small > > $XFS_IO_PROG Ack. > > +# and finally check that the extent size update has taken place > > +(cd $SCRATCH_MNT; xfs_io -c 'extsize' small) > > $XFS_IO_PROG -c 'extsize' $small | _filter_scratch Ack. > > +# now create a 'big' (with extents) directory > > +mkdir $big > > +idx=1 > > +while xfs_bmap $big | grep -q "no extents"; do > > + touch $big/$idx > > + idx=$((idx+1)) > > + if [ "$idx" -gt 1048576 ]; then > > + # still no extents? giving up > > + echo "Can't make a directory to have extents even after 1M files" 1>&2 > > + exit > > + fi > > +done > > urk. largest inode size is 2kb, which means at most it can fit less > than 100 dirents in the inode before spilling to extent form. So > just do a loop that creates 1000 files - there's no need to > overengineer the test code. Will do. It's fine to still check that the directory does have extents, I hope? > > +# expect that we can set the extent size on $big as well > > +xfs_io -c 'extsize 8m' $big > > $XFS_IO_PROG Ack. > > +# and that it took effect > > +(cd $SCRATCH_MNT; xfs_io -c 'extsize' big) > > $XFS_IO_PROG -c 'extsize' $big | _filter_scratch Ack. > > +# success, all done > > +status=0 > > +exit > > diff --git a/tests/xfs/307.out b/tests/xfs/307.out > > new file mode 100644 > > index 0000000..f825525 > > --- /dev/null > > +++ b/tests/xfs/307.out > > @@ -0,0 +1,3 @@ > > +QA output created by 307 > > +[8388608] small > > +[8388608] big > > diff --git a/tests/xfs/308 b/tests/xfs/308 > > new file mode 100755 > > index 0000000..7b43836 > > --- /dev/null > > +++ b/tests/xfs/308 > > @@ -0,0 +1,98 @@ > > +#! /bin/bash > > +# FS QA Test No. 308 > > +# > > +# Test that setting extent size on files and directories (directly via > > +# ioctl and not via xfs_io) sets the correct flags. > > xfs_io uses the ioctl directly - there's no need to write a special > c program to do this, especially as.... > > > +touch $file > > +mkdir $dir > > + > > +cat > $cprog << EOF > > +#include > > +#include > > + > > +int main(int argc, char **argv) { > > + struct fsxattr fa; > > + int fd = open(argv[1], O_RDONLY); > > + if (fd < 0) { > > + perror("open"); > > + return 1; > > + } > > + fa.fsx_xflags = 0; > > + fa.fsx_extsize = 1048576 * 8; > > + int r = xfsctl(argv[1], fd, XFS_IOC_FSSETXATTR, &fa); > > .... that code is quite broken. Yes, it would work to set the > appropriate extent size flags with the kernel > changes you made, but that's not how this ioctl works. > > i.e. it will cause any flag bits that are set on the inode to be > cleared Good point… > and it's likely to fail on old kernels beacuse they have > very different behaviour to what your patch does. OK, that I didn't know. (Would you mind quickly explaining?) > IOWs, setting fsx_extsize without setting either XFS_XFLAG_EXTSIZE > or XFS_XFLAG_EXTSZINHERIT is bad practice. The kernel is left to > guess what you actually wanted to be done - the flags are supposed > to tell the kernel that the fsx_extsize value is meaningful, not the > other way around. See below. > FWIW, the xfs_io code is *exactly* what applications should be > doing to set the extent size or any other inode flag. i.e: > > 1. stat the fd to determine the type. > 2. populate the fsxattr structure with the existing inode flags > 3. change the flags/fields of the fsxattr structure appropriately > 4. set the new values to the inode. > > i.e, from io/open.c: > > static int > set_extsize(const char *path, int fd, long extsz) > { > struct fsxattr fsx; > struct stat64 stat; > > if (fstat64(fd, &stat) < 0) { > perror("fstat64"); > return 0; > } > if ((xfsctl(path, fd, XFS_IOC_FSGETXATTR, &fsx)) < 0) { > printf("%s: XFS_IOC_FSGETXATTR %s: %s\n", > progname, path, strerror(errno)); > return 0; > } > > if (S_ISREG(stat.st_mode)) { > fsx.fsx_xflags |= XFS_XFLAG_EXTSIZE; > } else if (S_ISDIR(stat.st_mode)) { > fsx.fsx_xflags |= XFS_XFLAG_EXTSZINHERIT; > } else { > printf(_("invalid target file type - file %s\n"), path); > return 0; > } > fsx.fsx_extsize = extsz; > > if ((xfsctl(path, fd, XFS_IOC_FSSETXATTR, &fsx)) < 0) { > printf("%s: XFS_IOC_FSSETXATTR %s: %s\n", > progname, path, strerror(errno)); > return 0; > } > > return 0; > } > > We have xfs_io precisely so that we don't have to maintain random > test code like this throughout xfstests - do it once, do it right, > use it everywhere. I totally agree that xfs_io is what people should use, but I disagree on the use of xfs_io in this particular test, let me explain why. With 3.16-rc1 at least, it is possible to set fsx_extsize to a non-zero value, without setting the flags (if you call the ioctl directly). Such an inode will be (unless I'm mistaken) flagged with a warning by xfs_repair, which means that it's an invalid inode state. So in my view, there's a kernel bug, in that it allows a user land application to put an inode into a "wrong" state. This particular test is designed to reproduce this kernel bug, so that the kernel fix can be verified that is indeed a fix. I can't use xfs_io here, because it will do the "right" thing - set the EXTSIZE/EXTSZINHERIT flags correctly; but this is a test that the kernel protects the inode invariants, not that xfs_io does so. Alternatively, you could say that it's perfectly fine to have a non-zero fsx_extsize, and that only when the flag is set it should be taken into account; but I don't think that is what the rest of the code expects today. So, I'm fine either way, but I would to fix this so that all the code agrees what the correct states for an inode are, and that the kernel prevents user space from violating this assumption via a (documented) ioctl. Just let me know which are the correct states. Thanks for the feedback, and for such a quick reply. iustin From stan@hardwarefreak.com Thu Aug 28 17:31: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 214CB7F3F for ; Thu, 28 Aug 2014 17:31:39 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 957CBAC001 for ; Thu, 28 Aug 2014 15:31:35 -0700 (PDT) X-ASG-Debug-ID: 1409265093-04cb6c54fd647100001-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 tjQ8d6FaPIdKMWvp for ; Thu, 28 Aug 2014 15:31:34 -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: by greer.hardwarefreak.com (Postfix, from userid 33) id 8F64A6C192; Thu, 28 Aug 2014 17:31:33 -0500 (CDT) To: Dave Chinner Subject: Re: storage, libaio, or XFS =?UTF-8?Q?problem=3F=20=20=33=2E=34=2E=32=36?= X-PHP-Originating-Script: 0:func.inc X-ASG-Orig-Subj: Re: storage, libaio, or XFS =?UTF-8?Q?problem=3F=20=20=33=2E=34=2E=32=36?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Date: Thu, 28 Aug 2014 17:31:33 -0500 From: Stan Hoeppner Cc: In-Reply-To: <20140828003226.GO20518@dastard> References: <3fe8c34c0ccbbd720015d273fa2b8b30@localhost> <20140826075345.GJ20518@dastard> <8c29baf987467a84f0b7c1d09c863662@localhost> <20140828003226.GO20518@dastard> Message-ID: <7f9e5aef187b44e899077467aeb0809d@localhost> X-Sender: stan@hardwarefreak.com User-Agent: RoundCube Webmail/0.3.1 X-Barracuda-Connect: mo-65-41-216-221.sta.embarqhsd.net[65.41.216.221] X-Barracuda-Start-Time: 1409265094 X-Barracuda-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, 28 Aug 2014 10:32:27 +1000, Dave Chinner wrote: > On Tue, Aug 26, 2014 at 12:19:43PM -0500, Stan Hoeppner wrote: >> On Tue, 26 Aug 2014 17:53:45 +1000, Dave Chinner >> wrote: >> > On Tue, Aug 26, 2014 at 01:18:50AM -0500, Stan Hoeppner wrote: >> >> Had some controller issues but believe we had those ironed out before >> >> this >> >> recent breakage. I had reformatted both 48TB LUNs on this test box >> with >> >> -f >> >> and defaults, and fired up the test app again. Throughput was >> fantastic >> >> with no dropped application buffers for ~30 minutes, and IO times were >> >> 1.x >> >> ms max, suggesting all the writes were acked by controller cache. The >> >> app >> >> was running perfectly. Then it hanged and spit out an internal error >> >> msg: >> >> >> >> >> >> Failed to reopen file /mnt/VOL1/sg-04/str-0015/f-0000000005 >> >> >> >> I have many call traces in dmesg, most are XFS, pasted below. I found >> no >> >> SCSI I/O errors in dmesg. Application is submitting writes via libaio >> >> and >> >> using O_DIRECT, writing to preallocated files. I don't see any errors >> in >> >> the storage controller log and everything seems to check out there. >> >> Using >> >> noop elevator, mpt2sas, no multipathing. The application process is >> hung >> >> in d state and kill -9 won't get rid of it. I can't unmount the hosed >> up >> >> filesystem. Any ideas? >> >> >> >> # ls -la /mnt/VOL1 >> >> ls: cannot access /mnt/VOL1: Input/output error >> >> >> >> # dd if=/mnt/VOL1 of=/dev/null bs=1M count=16 >> >> dd: opening `/mnt/VOL1': Input/output error >> >> >> >> # dd if=/dev/sdd of=/dev/null bs=1M count=16 >> >> 16+0 records in >> >> 16+0 records out >> >> 16777216 bytes (17 MB) copied, 1.10989 s, 15.1 MB/s >> >> >> >> # ls -la /mnt/ >> >> ls: cannot access /mnt/VOL1: Input/output error >> >> total 8 >> >> drwxrwxrwt 6 root root 120 Aug 25 17:59 . >> >> drwxr-xr-x 21 root root 4096 Jul 15 09:39 .. >> >> drwxrwxrwt 3 root root 80 Aug 25 16:52 initramfs >> >> drwxr-xr-x 3 root root 4096 Apr 24 04:57 scratch >> >> drwxrwxrwx 5 root root 58 Aug 25 22:06 VOL0 >> >> d????????? ? ? ? ? ? VOL1 >> > >> > That's an inode we failed to stat() - most likely because of the IO >> > error. Has the filesystem shut down? the IO error shoul dhave had >> > some kind of output in dmesg associated with it from XFS.... >> >> Sorry, I omitted the XFS logging preceding the first call trace: >> >> Aug 25 18:02:50 Anguish-ssu-1 kernel: [ 4280.310304] SGI XFS with >> security >> attributes, large block/inode numbers, no debug enabled >> Aug 25 18:02:50 Anguish-ssu-1 kernel: [ 4280.311101] XFS (sdc): Mounting >> Filesystem >> Aug 25 18:02:51 Anguish-ssu-1 kernel: [ 4280.501405] XFS (sdc): Starting >> recovery (logdev: internal) >> Aug 25 18:02:53 Anguish-ssu-1 kernel: [ 4282.766547] XFS (sdc): Failed to >> recover EFIs >> Aug 25 18:02:53 Anguish-ssu-1 kernel: [ 4282.766549] XFS (sdc): log mount >> finish failed > > That's indicative of corrupted free space btrees. I did mkfs on both LUNs after this mount failure. >> Aug 25 18:04:50 Anguish-ssu-1 kernel: [ 4399.471829] XFS (sdc): Mounting >> Filesystem >> Aug 25 18:04:50 Anguish-ssu-1 kernel: [ 4399.620805] XFS (sdc): Ending >> clean mount >> Aug 25 18:04:56 Anguish-ssu-1 kernel: [ 4405.613778] XFS (sdd): Mounting >> Filesystem >> Aug 25 18:04:56 Anguish-ssu-1 kernel: [ 4405.835412] XFS (sdd): Ending >> clean mount The back-to-back mounts here were me testing my storage prep automation script - creates the mount points, sets permission, mounts the filesystems, sets the elevator to noop, etc. (their kernel defaults to CFQ...) >> Aug 25 23:05:39 Anguish-ssu-1 kernel: [22409.328839] XFS (sdd): >> xfs_do_force_shutdown(0x8) called from line 3732 of file >> fs/xfs/xfs_bmap.c. >> Return address = 0xffffffffa01cc9a6 > > Yup, that's kinda important. That's from xfs_bmap_finish(), and > freeing an extent has failed and triggered SHUTDOWN_CORRUPT_INCORE > which it's found some kind of inconsistency in the free space > btrees. So, likely the same problem that caused EFI recovery to fail > on the other volume. > > Are the tests being run on newly made filesystems? If not, have > these filesystems had xfs_repair run on them after a failure? If > so, what is the error that is fixed? If not, does repairing the > filesystem make the problem go away? Newly made after every error of any kind, whether app, XFS shutdown, call trace, etc. I've not attempted xfs_repair. Part of the problem is the storage hardware is a moving target. They're swapping modules and upgrading firmware every few days. And I don't have a view into that. So it's difficult to know when IO problems are due to hardware or buggy code. However, I can state with certainty that we only run into the XFS problems when using AIO. And it has occurred on both test rigs, each of which have their own RAID controllers and disks. >> Aug 25 23:05:49 Anguish-ssu-1 kernel: [22419.307128] XFS (sdd): failed to >> update timestamps for inode 0x2a000000a4 >> Aug 25 23:05:49 Anguish-ssu-1 kernel: [22419.307484] XFS (sdd): failed to >> update timestamps for inode 0x29000000a4 >> Aug 25 23:05:49 Anguish-ssu-1 kernel: [22419.307487] XFS (sdd): failed to >> update timestamps for inode 0x20000009f >> Aug 25 23:05:49 Anguish-ssu-1 kernel: [22419.307499] XFS (sdd): failed to >> update timestamps for inode 0x29000000a4 >> Aug 25 23:05:49 Anguish-ssu-1 kernel: [22419.307693] XFS (sdd): failed to >> update timestamps for inode 0x20000009f >> Aug 25 23:05:49 Anguish-ssu-1 kernel: [22419.368106] XFS (sdd): failed to >> update timestamps for inode 0xf000000a4 >> Aug 25 23:05:49 Anguish-ssu-1 kernel: [22419.369785] XFS (sdd): failed to >> update timestamps for inode 0xf000000a4 >> Aug 25 23:05:49 Anguish-ssu-1 kernel: [22419.605835] XFS (sdd): failed to >> update timestamps for inode 0x2810f413c >> Aug 25 23:05:49 Anguish-ssu-1 kernel: [22419.606169] XFS (sdd): failed to >> update timestamps for inode 0x60000009f > > And that is interesting. Makes me wonder if the inode is getting > unlocked on transaction commit failure, or whether there's some > other path in the shutdown code that is not unlocking the inode > correctly. Is this a separate time stamp from that which noatime disables? We're mounting with noatime, nodiratime. >> Again, when the app locked up I was assuming we had more controller >> issues, and I expected to find SCSI I/O errors preceding the XFS errors. >> But there are none. > > XFs has had some kind of internal error in extent or freespace > management. The lack of output when the error has triggered makes it > impossible to determine what might have gone wrong. Seeing what > xfs_repair -n says about the filesystem woul dbe interesting. > Probably best to use an xfs-repair from the current 3.2.1 release, > because older 3.1.x versions (i think 3.1.10 and prior) didn't > validate the freespace btrees - they just got rebuilt. I'm hoping to be able to get kernel 3.12.26 onto the smaller rig soon so I can test bcache. I'll enable xfs_debug on it. WRT newer user space tools, that's like pulling teeth. It's all like like pulling teeth actually, WRT the platform software. WRT the app we can do whatever we want. >> These aren't truly lab systems in all respects. I don't have the >> permission/access to change the kernel config and recompile. There is a >> "process" for that and a different group owns that process. If this is >> necessary to troubleshoot this then I'll see if I can push it through. > > Good luck, it sounds like you might have a few stories for the > Daily WTF if the "processes" at that so entrenched it's impossible > to test fixes. Yes, it's difficult. I won't be able to test patches as things stand. That will require much time, many meetings, my project manager throwing chairs, that kinda thing. And he's very mild mannered. >> > I haven't cheked if this still works on a 3.4 kernel, but it will >> > change the rwsem implementation to the generic, spinlock based >> > implementation rather than the super-special, highly optimised >> > x86 specific implementation. If that makes the problem go away, >> > then we've got another rwsem bug on our hands. If it doesn't, then I >> > can probably get you the mrlock debug code lachlan wrote and we can >> > see if XFS is doing something wrong... >> >> Thanks for the detailed explanation. Given the new information I've >> provided, what is my next step? > > xfs_repair output, turn /proc/sys/fs/xfs/error_level up to 11, > maybe run a test with a CONFIG_XFS_DEBUG=y kernel, or even a > current 3.15/3.16 kernel to see if the problem still exists... > > But if you can't get new kernels or xfsprogs binaries onto the > machine, then there is very little that we can do. One would think such a thing would be easy, a no brainer. But this is a large corporation after all, so I shouldn't be surprised by red tape. The fact it took them over 3 months from contact to getting me in the door was a bit of a clue up front. I think the way this is seen is that AIO would be nice to have, but it's not a necessity. Not with the red tape to cut through to get newer system software... > Cheers, > > Dave. -- Stan From iustin@google.com Thu Aug 28 17:34: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 (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 1BFFE7F3F for ; Thu, 28 Aug 2014 17:34:19 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id D60128F8050 for ; Thu, 28 Aug 2014 15:34:18 -0700 (PDT) X-ASG-Debug-ID: 1409265256-04bdf010975da720001-NocioJ Received: from mail-ie0-f182.google.com (mail-ie0-f182.google.com [209.85.223.182]) by cuda.sgi.com with ESMTP id hBeUYaUox3h5cNoA (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Thu, 28 Aug 2014 15:34:17 -0700 (PDT) X-Barracuda-Envelope-From: iustin@google.com X-Barracuda-Apparent-Source-IP: 209.85.223.182 X-Barracuda-IPDD: Level1 [google.com/209.85.223.182] Received: by mail-ie0-f182.google.com with SMTP id rd18so1845133iec.13 for ; Thu, 28 Aug 2014 15:34:16 -0700 (PDT) X-Barracuda-IPDD: Level1 [google.com/209.85.223.182] X-Barracuda-IPDD: Level1 [google.com/209.85.223.182] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20120113; h=date:from:to:cc:subject:message-id:references:mime-version :content-type:content-disposition:in-reply-to:user-agent; bh=a7us+giFBJZr8RxGy+FSsTo46eZ+FWnokQouek8BuJU=; b=ALR7w4Yzz2Tq8j0tmsZ9njLC/yAa7Bm3S5sR1hpIznX5TIZ9m70Xyweh7mnB3g8uFm M9xkiOeNV8KfJLqTW+ZkHyqbxLgDBGRAGNEsEYp79RursSBcGx/zZWfKDlAVMQptRiPr bYbSe/jWV8oLn3Hsv7nvON2qM7YLzAKglUZLwWt74m0IXzW2TS4cHi7u+rzL0c6mfLZB qOuhKfYpnomH5sTc3RYtnUVRoa5NtkoV8MwPHJw/xjc7SHHiQ5OBrUE0YBA4nV79r4tv 1Vz803e1J+WDj8aWDRPQI8CfAnFVcyz1J5SoifKWATRb4CzwKxL4SzvVITKlr84gVvrp K//g== 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:references :mime-version:content-type:content-disposition:in-reply-to :user-agent; bh=a7us+giFBJZr8RxGy+FSsTo46eZ+FWnokQouek8BuJU=; b=jKX/EEXajdOrS9vJxiia6gSp7xLTvUxVt1yVoN/wPp5FzQ9JT+HRgylLnCOagyOxDX aYsQx4Q9nG4VzVooWSviglEHtU6dmscfKeqlIZeDidvbtQvceVWtvHz4J6PWZC/fLsr9 2p2CZUzScHbPi/sS5RtAcBRws2slifgYdSkfQ5OE+HOovQcHCxF+vPcNs1cnaeV3UOOw a747QgLBPyxfoYGqcKGceaSPPkwowZJrp/faR50rQiedzGxxS76qCw3cHRpAwvT5c+ee qTUcYgCFq0lD4LyVucVPPrQ/c4mffRifqn3GKNo7DM668q9TASYVY09AWJeYeeVR0JAC YQpg== X-Gm-Message-State: ALoCoQlBmPwWnTZlDKjagZeO8ioUbaxXOhCdBNPLIeytDV3H/9yCO9Ol+23PSctvD6UQklKGYP6i X-Received: by 10.50.112.67 with SMTP id io3mr8992582igb.37.1409265256606; Thu, 28 Aug 2014 15:34:16 -0700 (PDT) Received: from google.com ([2620:0:1009:a:64ad:58d0:8abd:1cc]) by mx.google.com with ESMTPSA id dx10sm21744805igb.4.2014.08.28.15.34.15 for (version=TLSv1.2 cipher=RC4-SHA bits=128/128); Thu, 28 Aug 2014 15:34:15 -0700 (PDT) Date: Thu, 28 Aug 2014 15:34:14 -0700 From: Iustin Pop To: Dave Chinner Cc: Iustin Pop , xfs@oss.sgi.com, hch@infradead.org Subject: Re: [PATCH] xfs: fix behaviour of XFS_IOC_FSSETXATTR on directories Message-ID: <20140828223414.GC29940@google.com> X-ASG-Orig-Subj: Re: [PATCH] xfs: fix behaviour of XFS_IOC_FSSETXATTR on directories References: <20140718191314.GB27801@teal.hq.k1024.org> <1409199773-16802-1-git-send-email-iusty@k1024.org> <20140828093158.GR20518@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140828093158.GR20518@dastard> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: mail-ie0-f182.google.com[209.85.223.182] X-Barracuda-Start-Time: 1409265257 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.8931 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 Don, Aug 28, 2014 at 07:31:58 +1000, Dave Chinner wrote: > On Wed, Aug 27, 2014 at 09:22:53PM -0700, Iustin Pop wrote: > > Currently, the ioctl handling code for XFS_IOC_FSSETXATTR treats all > > targets as regular files: it refuses to change the extent size if > > extents are allocated. This is wrong for directories, as there the > > extent size is only used as a default for children. > > > > The patch fixes this by only checking for allocated extents for regular > > files; it leaves undefined what it means to set an extent size on a > > non-regular, non-directory inode. Additionally, when setting a non-zero > > extent size, the appropriate flags (EXTSIZE, respectively EXTSZINHERIT) > > are enforced for regular files and directories. > > > > Signed-off-by: Iustin Pop > > --- > > A patch against xfstests to test for the fixed behaviour will follow > > shortly. > > > > fs/xfs/xfs_ioctl.c | 34 ++++++++++++++++++++++++++-------- > > 1 file changed, 26 insertions(+), 8 deletions(-) > > > > diff --git a/fs/xfs/xfs_ioctl.c b/fs/xfs/xfs_ioctl.c > > index 8bc1bbc..5b9acd2 100644 > > --- a/fs/xfs/xfs_ioctl.c > > +++ b/fs/xfs/xfs_ioctl.c > > @@ -1116,14 +1116,32 @@ xfs_ioctl_setattr( > > } > > > > if (mask & FSX_EXTSIZE) { > > - /* > > - * Can't change extent size if any extents are allocated. > > - */ > > - if (ip->i_d.di_nextents && > > - ((ip->i_d.di_extsize << mp->m_sb.sb_blocklog) != > > - fa->fsx_extsize)) { > > - code = XFS_ERROR(EINVAL); /* EFBIG? */ > > - goto error_return; > > Doesn't apply to a current 3.17-rc1 tree. Can you update the patch? Will do, thanks. Is it correct to use git://oss.sgi.com/xfs/xfs, master branch as what I should rebase it on top of? > > + if (S_ISDIR(ip->i_d.di_mode)) { > > + /* > > + * Enforce setting the EXTSZINHERIT flag when > > + * a non-zero extent size has been specified. > > + */ > > + if (fa->fsx_extsize) { > > + fa->fsx_xflags |= XFS_XFLAG_EXTSZINHERIT; > > + } > > + } else if (S_ISREG(ip->i_d.di_mode)) { > > + /* > > + * For a regular file, we can't change extent > > + * size if any extents are allocated. > > + */ > > + if (ip->i_d.di_nextents && > > + ((ip->i_d.di_extsize << mp->m_sb.sb_blocklog) != > > + fa->fsx_extsize)) { > > + code = XFS_ERROR(EINVAL); /* EFBIG? */ > > + goto error_return; > > + } > > + /* > > + * Enforce setting the EXTSIZE flag when > > + * a non-zero extent size has been specified. > > + */ > > + if (fa->fsx_extsize) { > > + fa->fsx_xflags |= XFS_XFLAG_EXTSIZE; > > + } > > } > > Hmmmm. That's not validating/enforcing the correct use of > XFS_XFLAG_EXTSIZE or XFS_XFLAG_EXTSZINHERIT, that's setting it > implicitly based on the type of inode. > > If we are going to enforce this properly, then XFS_XFLAG_EXTSIZE is > only valid for a regular file, and XFS_XFLAG_EXTSZINHERIT is only > valid on a directory, and the flags on th einode should only be set > if the hint is not zero. i.e: > > if (mask & FSX_EXTSIZE) { > error = -EINVAL; > > /* validate the flags are set appropriately */ > if ((fa->fsx_xflags & XFS_XFLAG_EXTSIZE) && > !S_ISREG(ip->i_d.di_mode)) > goto error_return; > if ((fa->fsx_xflags & XFS_XFLAG_EXTSZINHERIT) && > !S_ISDIR(ip->i_d.di_mode)) > goto error_return; This only prevents invalid flags, but doesn't prevent setting a non-zero extent_size without the appropriate flag. We already are having this discussion in the other patch, so I'll defer this to that. But aside from that, the current code that actually applies the flag changes (xfs_set_diflags) implicitly drops invalid flags - that's why I didn't bother to validate the flags here. If we want to do validation, maybe we should validate (with error, not silently) in that function, instead of here? thanks, iustin From david@fromorbit.com Thu Aug 28 17:37: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 A74777F3F for ; Thu, 28 Aug 2014 17:37:11 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 7DD468F8050 for ; Thu, 28 Aug 2014 15:37:11 -0700 (PDT) X-ASG-Debug-ID: 1409265429-04bdf010a15daa00001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id ArJgpXHTN4FBNSWM for ; Thu, 28 Aug 2014 15:37:09 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.145 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AisaAOut/1N5LDJ8PGdsb2JhbABbgw2BKoIshQenTQYGmjmFcgGBHBcFAQEBATg2hAQBBScTHCMQCAMOCgklDwUlAwcaE4hBv3EXGIVkiVAHhEwBBJxZiy5rjHUrL4JPAQEB Received: from ppp121-44-50-124.lns20.syd6.internode.on.net (HELO dastard) ([121.44.50.124]) by ipmail06.adl6.internode.on.net with ESMTP; 29 Aug 2014 08:07:08 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1XN8JW-0001wl-7Y; Fri, 29 Aug 2014 08:37:06 +1000 Date: Fri, 29 Aug 2014 08:37:06 +1000 From: Dave Chinner To: Brian Foster Cc: xfs@oss.sgi.com Subject: Re: [PATCH 1/7] xfs: don't dirty buffers beyond EOF Message-ID: <20140828223706.GT20518@dastard> X-ASG-Orig-Subj: Re: [PATCH 1/7] xfs: don't dirty buffers beyond EOF References: <1409226551-16570-1-git-send-email-david@fromorbit.com> <1409226551-16570-2-git-send-email-david@fromorbit.com> <20140828133457.GA35386@bfoster.bfoster> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140828133457.GA35386@bfoster.bfoster> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1409265429 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.8931 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Thu, Aug 28, 2014 at 09:34:57AM -0400, Brian Foster wrote: > On Thu, Aug 28, 2014 at 09:49:05PM +1000, Dave Chinner wrote: > > +/* > > + * This is basically a copy of __set_page_dirty_buffers() with one > > + * small tweak: buffers beyond EOF do not get marked dirty. If we mark them > > + * dirty, we'll never be able to clean them because we don't write buffers > > + * beyond EOF, and that means we can't invalidate pages that span EOF > > + * that have been marked dirty. Further, the dirty state can leak into > > + * the file interior if the file is extended, resulting in all sorts of > > + * bad things happening as the state does not match the unerlying data. > > + */ > > +STATIC int > > +xfs_vm_set_page_dirty( > > + struct page *page) > > +{ > > + struct address_space *mapping = page->mapping; > > + struct inode *inode = mapping->host; > > + loff_t end_offset; > > + loff_t offset; > > + int newly_dirty; > > + > > + if (unlikely(!mapping)) > > + return !TestSetPageDirty(page); > > + > > + end_offset = i_size_read(inode); > > + offset = end_offset & PAGE_CACHE_MASK; > > Is this what you intended to do here? > > offset = page_offset(page); Yup, that's a bug. Which points out just how important the buffer dirty flag is (not) to XFS, doesn't it? I'll post a fixed patch in a few minutes after it's run a few tens of millions fsx ops... Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Thu Aug 28 18:10: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 (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 166247F3F for ; Thu, 28 Aug 2014 18:10:40 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 055028F8054 for ; Thu, 28 Aug 2014 16:10:36 -0700 (PDT) X-ASG-Debug-ID: 1409267434-04cbb054858d3eb0001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id vFPHRZX4u6cAcH2U for ; Thu, 28 Aug 2014 16:10:34 -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: AiwaAF+2/1N5LDJ8PGdsb2JhbABbgw2BKoIshQenTQYGmjmFcgGBFBcFAQEBATg2hAMBAQQBOhwjBQsIAxgJJQ8FJQMHGhOIOge/bxcYhWSIeQ4HQgeETAWPG40+iy6NYCsvgQcBHoEpAQEB Received: from ppp121-44-50-124.lns20.syd6.internode.on.net (HELO dastard) ([121.44.50.124]) by ipmail06.adl6.internode.on.net with ESMTP; 29 Aug 2014 08:38:19 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1XN8ni-00021C-0x; Fri, 29 Aug 2014 09:08:18 +1000 Date: Fri, 29 Aug 2014 09:08:17 +1000 From: Dave Chinner To: Stan Hoeppner Cc: xfs@oss.sgi.com Subject: Re: storage, libaio, or XFS problem? 3.4.26 Message-ID: <20140828230817.GU20518@dastard> X-ASG-Orig-Subj: Re: storage, libaio, or XFS problem? 3.4.26 References: <3fe8c34c0ccbbd720015d273fa2b8b30@localhost> <20140826075345.GJ20518@dastard> <8c29baf987467a84f0b7c1d09c863662@localhost> <20140828003226.GO20518@dastard> <7f9e5aef187b44e899077467aeb0809d@localhost> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <7f9e5aef187b44e899077467aeb0809d@localhost> 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: 1409267434 X-Barracuda-URL: http://192.48.176.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.8931 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Thu, Aug 28, 2014 at 05:31:33PM -0500, Stan Hoeppner wrote: > On Thu, 28 Aug 2014 10:32:27 +1000, Dave Chinner wrote: > > On Tue, Aug 26, 2014 at 12:19:43PM -0500, Stan Hoeppner wrote: > >> Aug 25 23:05:39 Anguish-ssu-1 kernel: [22409.328839] XFS (sdd): > >> xfs_do_force_shutdown(0x8) called from line 3732 of file > >> fs/xfs/xfs_bmap.c. > >> Return address = 0xffffffffa01cc9a6 > > > > Yup, that's kinda important. That's from xfs_bmap_finish(), and > > freeing an extent has failed and triggered SHUTDOWN_CORRUPT_INCORE > > which it's found some kind of inconsistency in the free space > > btrees. So, likely the same problem that caused EFI recovery to fail > > on the other volume. > > > > Are the tests being run on newly made filesystems? If not, have > > these filesystems had xfs_repair run on them after a failure? If > > so, what is the error that is fixed? If not, does repairing the > > filesystem make the problem go away? > > Newly made after every error of any kind, whether app, XFS shutdown, call > trace, etc. I've not attempted xfs_repair. Please do. > Part of the problem is the storage hardware is a moving target. > They're swapping modules and upgrading firmware every few days. > And I don't have a view into that. So it's difficult to know when > IO problems are due to hardware or buggy code. However, I can > state with certainty that we only run into the XFS problems when > using AIO. And it has occurred on both test rigs, each of which > have their own RAID controllers and disks. Which, in and of itself doesn't point at AIO or XFS being the problem. What is says is that something goes wrong under the extremely high IO load that can be generated with AIO+DIO. That "something" might be a race in XFS, a bug in AIO, or could be a load related storage problem. For example, I've been on the wrong end of hard to track down problems on beta/early access storage before. For example there was an incident years ago that took 3 more than 3 months to isolate a filesystem corruption that occurred under high load. It took that long to isolate a test case, reproduce it in house on identical hardware, firmware, software, etc and then *capture it with a FC analyser*. The bug? The bleeding edge storage arrays being used had had a firmware bug in it. When the number of outstanding IOs hit the *array controller* command tag queue depth limit (some several thousand simultaneous IOs in flight) it would occasionally misdirect a single write IO to the *wrong lun*. i.e. it would misdirect a write. It was only under *extreme* loads that this would happen, and it's this sort of load that AIO+DIO can easily generate - you can have several thousand IOs in flight without too much hassle, and that will hit limits in the storage arrays that aren't often hit. Array controller CTQ depth limits are a good example of a limit that normal IO won't go near to stressing. > >> update timestamps for inode 0xf000000a4 > >> Aug 25 23:05:49 Anguish-ssu-1 kernel: [22419.605835] XFS (sdd): failed > to > >> update timestamps for inode 0x2810f413c > >> Aug 25 23:05:49 Anguish-ssu-1 kernel: [22419.606169] XFS (sdd): failed > to > >> update timestamps for inode 0x60000009f > > > > And that is interesting. Makes me wonder if the inode is getting > > unlocked on transaction commit failure, or whether there's some > > other path in the shutdown code that is not unlocking the inode > > correctly. > > Is this a separate time stamp from that which noatime disables? We're > mounting with noatime, nodiratime. Yes. mtime/ctime updates go through this on the write path. Cheers, Dave. -- Dave Chinner david@fromorbit.com From xfactor973@gmail.com Thu Aug 28 18:14: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.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 A51197F47 for ; Thu, 28 Aug 2014 18: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 846CF30405F for ; Thu, 28 Aug 2014 16:14:27 -0700 (PDT) X-ASG-Debug-ID: 1409267665-04bdf0109a5dc660001-NocioJ Received: from mail-ie0-f171.google.com (mail-ie0-f171.google.com [209.85.223.171]) by cuda.sgi.com with ESMTP id tO1yRPzEmOGN1KoL (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Thu, 28 Aug 2014 16:14:25 -0700 (PDT) X-Barracuda-Envelope-From: xfactor973@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.223.171 X-Barracuda-IPDD: Level1 [gmail.com/209.85.223.171] Received: by mail-ie0-f171.google.com with SMTP id rp18so1866688iec.2 for ; Thu, 28 Aug 2014 16:14:25 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.223.171] X-Barracuda-IPDD: Level1 [gmail.com/209.85.223.171] 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=REfcMvhPZviciAid4CbVIx+F6+PKA4eqyAUfwd11nmk=; b=gFeVD7D9fZpadxGiMvy5F4TVPH5H3ev1Qi2wmEVD7HR2YrvDbDrMNXyaTqvSygU5Xy Bt/viNZAhEFYY1qtcsSCSzPoLjNBiRSOrysgJpvl1b85+cz6xpS5nXjiencHxSjovluv zkGnfx29VI7vp3Q8ICugblf4RBWudyLdEiBXzmOP8bWtWEtpEjyj9VYAqfhXK+0nWJx0 DLIeNEfeCFyG+Qhe400VU78UB1ki1x/oL3SaopN2+7NfGm22KXm3QzFPJats9lXeliEu FDOCjUlvI96W2X+HmVQrQipxz/T7V/+NDLE4TDXtMpwM2fh93ZWsiteICWESPO+n88WI BDFA== MIME-Version: 1.0 X-Received: by 10.50.93.74 with SMTP id cs10mr78517igb.46.1409267665131; Thu, 28 Aug 2014 16:14:25 -0700 (PDT) Received: by 10.50.132.41 with HTTP; Thu, 28 Aug 2014 16:14:25 -0700 (PDT) Date: Thu, 28 Aug 2014 16:14:25 -0700 Message-ID: Subject: Find hardlinks to a file From: Chris Holcombe X-ASG-Orig-Subj: Find hardlinks to a file To: xfs@oss.sgi.com Content-Type: text/plain; charset=UTF-8 X-Barracuda-Connect: mail-ie0-f171.google.com[209.85.223.171] X-Barracuda-Start-Time: 1409267665 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.8931 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 My apologies if this has already been asked. I feel that I've done a sufficient amount of Google search homework. I'm working with Gluster (http://www.gluster.org/) and they have a directory called xattrop where they store links to files that need to be healed. When I stat the file I can see that there's 2 or 3 hard links to the file. I can't seem to find a way in code or with an xfs_* utility to find the path of those hard links. Does anyone know how to do this or if it's even possible? From looking through the XFS documentation I don't really see a way to do it without a find /mount_point -num brute force method. btrfs has a utility called: btrfs inspect-internal inode-resolve [-v] Resolves an in subvolume to all filesystem paths. I'd like to build an equivalent tool in C for XFS if it's possible. Thanks, Chris From david@fromorbit.com Thu Aug 28 18:29: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 (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id C66F17F3F for ; Thu, 28 Aug 2014 18:29:24 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 52517AC001 for ; Thu, 28 Aug 2014 16:29:21 -0700 (PDT) X-ASG-Debug-ID: 1409268557-04cb6c5500649e40001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id 752iW49yFYcS868T for ; Thu, 28 Aug 2014 16:29:17 -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: ArQrAOq5/1N5LDJ8PGdsb2JhbABbgw1TV4IsiyyhKAYGmFyBXYVtAwIBgRUXBQEBAQE4NoQEAQUnExwjEAgDDgoJJQ8FJQMHGhMJiDgOv18XGIVkiVAHhEwFhQQCkFeGfIFciVKNYCsvAQEBAYJLAQEB Received: from ppp121-44-50-124.lns20.syd6.internode.on.net (HELO dastard) ([121.44.50.124]) by ipmail06.adl6.internode.on.net with ESMTP; 29 Aug 2014 08:59:16 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1XN97z-00023R-6B; Fri, 29 Aug 2014 09:29:15 +1000 Date: Fri, 29 Aug 2014 09:29:15 +1000 From: Dave Chinner To: Chris Holcombe Cc: xfs@oss.sgi.com Subject: Re: Find hardlinks to a file Message-ID: <20140828232915.GV20518@dastard> X-ASG-Orig-Subj: Re: Find hardlinks to a file References: MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1409268557 X-Barracuda-URL: http://192.48.176.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.8932 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Thu, Aug 28, 2014 at 04:14:25PM -0700, Chris Holcombe wrote: > My apologies if this has already been asked. I feel that I've done a > sufficient amount of Google search homework. I'm working with Gluster > (http://www.gluster.org/) and they have a directory called xattrop > where they store links to files that need to be healed. When I stat > the file I can see that there's 2 or 3 hard links to the file. I > can't seem to find a way in code or with an xfs_* utility to find the > path of those hard links. Does anyone know how to do this or if it's > even possible? From looking through the XFS documentation I don't > really see a way to do it without a find /mount_point -num > brute force method. btrfs has a utility called: > > btrfs inspect-internal inode-resolve [-v] > Resolves an in subvolume to all filesystem > paths. > > I'd like to build an equivalent tool in C for XFS if it's possible. You need help from the filesystem, both in terms of the on-disk format and the kernel code needed to push that information back out to userspace. Indeed, this is the functionality we need for reverse inode->path lookups: http://thread.gmane.org/gmane.comp.file-systems.xfs.general/27772 (parent pointers, for those that don't want to follow the link) Right now it's state is in limbo. We have a more recent design, but since SGI has dropped off the edge of the world, nobody is working on it. It's on my radar along with reverse mapping btrees for filesystem block to inode lookups so that we can do all of this sort of stuff easily without needing to walk the entire filesystem to find the forward pointers to objects.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Thu Aug 28 18:50: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 8C3E47F4E for ; Thu, 28 Aug 2014 18:50:39 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 08B63AC003 for ; Thu, 28 Aug 2014 16:50:38 -0700 (PDT) X-ASG-Debug-ID: 1409269836-04cb6c54fe64ad90001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id J5wUKdI7Er6KTMjd for ; Thu, 28 Aug 2014 16:50: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: AisaAPS//1N5LDJ8PGdsb2JhbABbgw2BKoIshQenTgYGmjmFcgGBFRcFAQEBATg2hAQBBScTHCMQCBEHDCUPBSUDBxoTG4gmv3EXGIVkiVAHhEwFnFmLLmuKaR6Bbisvgk8BAQE Received: from ppp121-44-50-124.lns20.syd6.internode.on.net (HELO dastard) ([121.44.50.124]) by ipmail06.adl6.internode.on.net with ESMTP; 29 Aug 2014 09:20:01 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1XN9Rc-00026r-M2; Fri, 29 Aug 2014 09:49:32 +1000 Date: Fri, 29 Aug 2014 09:49:32 +1000 From: Dave Chinner To: Brian Foster Cc: xfs@oss.sgi.com Subject: [PATCH 1/7 v2] xfs: don't dirty buffers beyond EOF Message-ID: <20140828234932.GW20518@dastard> X-ASG-Orig-Subj: [PATCH 1/7 v2] xfs: don't dirty buffers beyond EOF References: <1409226551-16570-1-git-send-email-david@fromorbit.com> <1409226551-16570-2-git-send-email-david@fromorbit.com> <20140828133457.GA35386@bfoster.bfoster> <20140828223706.GT20518@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140828223706.GT20518@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: 1409269836 X-Barracuda-URL: http://192.48.176.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.8932 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner generic/263 is failing fsx at this point with a page spanning EOF that cannot be invalidated. The operations are: 1190 mapwrite 0x52c00 thru 0x5e569 (0xb96a bytes) 1191 mapread 0x5c000 thru 0x5d636 (0x1637 bytes) 1192 write 0x5b600 thru 0x771ff (0x1bc00 bytes) where 1190 extents EOF from 0x54000 to 0x5e569. When the direct IO write attempts to invalidate the cached page over this range, it fails with -EBUSY and so any attempt to do page invalidation fails. The real question is this: Why can't that page be invalidated after it has been written to disk and cleaned? Well, there's data on the first two buffers in the page (1k block size, 4k page), but the third buffer on the page (i.e. beyond EOF) is failing drop_buffers because it's bh->b_state == 0x3, which is BH_Uptodate | BH_Dirty. IOWs, there's dirty buffers beyond EOF. Say what? OK, set_buffer_dirty() is called on all buffers from __set_page_buffers_dirty(), regardless of whether the buffer is beyond EOF or not, which means that when we get to ->writepage, we have buffers marked dirty beyond EOF that we need to clean. So, we need to implement our own .set_page_dirty method that doesn't dirty buffers beyond EOF. This is messy because the buffer code is not meant to be shared and it has interesting locking issues on the buffer dirty bits. So just copy and paste it and then modify it to suit what we need. Note: the solutions the other filesystems and generic block code use of marking the buffers clean in ->writepage does not work for XFS. It still leaves dirty buffers beyond EOF and invalidations still fail. Hence rather than play whack-a-mole, this patch simply prevents those buffers from being dirtied in the first place. cc: Signed-off-by: Dave Chinner --- v2: fix page offset calculation. passed 61 million fsx ops before hitting an unrelated problem in xfs_zero_file_space(), so no difference to the result with this updated patch. fs/xfs/xfs_aops.c | 58 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) diff --git a/fs/xfs/xfs_aops.c b/fs/xfs/xfs_aops.c index 11e9b4c..9bd2f53 100644 --- a/fs/xfs/xfs_aops.c +++ b/fs/xfs/xfs_aops.c @@ -1753,11 +1753,69 @@ xfs_vm_readpages( return mpage_readpages(mapping, pages, nr_pages, xfs_get_blocks); } +/* + * This is basically a copy of __set_page_dirty_buffers() with one + * small tweak: buffers beyond EOF do not get marked dirty. If we mark them + * dirty, we'll never be able to clean them because we don't write buffers + * beyond EOF, and that means we can't invalidate pages that span EOF + * that have been marked dirty. Further, the dirty state can leak into + * the file interior if the file is extended, resulting in all sorts of + * bad things happening as the state does not match the unerlying data. + */ +STATIC int +xfs_vm_set_page_dirty( + struct page *page) +{ + struct address_space *mapping = page->mapping; + struct inode *inode = mapping->host; + loff_t end_offset; + loff_t offset; + int newly_dirty; + + if (unlikely(!mapping)) + return !TestSetPageDirty(page); + + end_offset = i_size_read(inode); + offset = page_offset(page); + + spin_lock(&mapping->private_lock); + if (page_has_buffers(page)) { + struct buffer_head *head = page_buffers(page); + struct buffer_head *bh = head; + + do { + if (offset < end_offset) + set_buffer_dirty(bh); + bh = bh->b_this_page; + offset += 1 << inode->i_blkbits; + } while (bh != head); + } + newly_dirty = !TestSetPageDirty(page); + spin_unlock(&mapping->private_lock); + + if (newly_dirty) { + /* sigh - __set_page_dirty() is static, so copy it here, too */ + unsigned long flags; + + spin_lock_irqsave(&mapping->tree_lock, flags); + if (page->mapping) { /* Race with truncate? */ + WARN_ON_ONCE(!PageUptodate(page)); + account_page_dirtied(page, mapping); + radix_tree_tag_set(&mapping->page_tree, + page_index(page), PAGECACHE_TAG_DIRTY); + } + spin_unlock_irqrestore(&mapping->tree_lock, flags); + __mark_inode_dirty(mapping->host, I_DIRTY_PAGES); + } + return newly_dirty; +} + const struct address_space_operations xfs_address_space_operations = { .readpage = xfs_vm_readpage, .readpages = xfs_vm_readpages, .writepage = xfs_vm_writepage, .writepages = xfs_vm_writepages, + .set_page_dirty = xfs_vm_set_page_dirty, .releasepage = xfs_vm_releasepage, .invalidatepage = xfs_vm_invalidatepage, .write_begin = xfs_vm_write_begin, From BATV+a70b89fbbf3a21f374f9+4023+infradead.org+hch@bombadil.srs.infradead.org Thu Aug 28 19:18: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 (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id A3D677F51 for ; Thu, 28 Aug 2014 19:18:59 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 83D2E304048 for ; Thu, 28 Aug 2014 17:18:55 -0700 (PDT) X-ASG-Debug-ID: 1409271533-04cbb054858d72d0001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id UIFYfmHbyptg5gXA (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 28 Aug 2014 17:18:54 -0700 (PDT) X-Barracuda-Envelope-From: BATV+a70b89fbbf3a21f374f9+4023+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 1XN9u1-0004dY-Ji; Fri, 29 Aug 2014 00:18:53 +0000 Date: Thu, 28 Aug 2014 17:18:53 -0700 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 1/9] xfs: synchronous buffer IO needs a reference Message-ID: <20140829001853.GA17502@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 1/9] xfs: synchronous buffer IO needs a reference References: <1408084747-4540-1-git-send-email-david@fromorbit.com> <1408084747-4540-2-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1408084747-4540-2-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.23 (2014-03-12) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1409271534 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-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.8934 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS Looks good, Reviewed-by: Christoph Hellwig From BATV+a70b89fbbf3a21f374f9+4023+infradead.org+hch@bombadil.srs.infradead.org Thu Aug 28 19:22: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 (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 89D347F54 for ; Thu, 28 Aug 2014 19:22:14 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 2457EAC002 for ; Thu, 28 Aug 2014 17:22:10 -0700 (PDT) X-ASG-Debug-ID: 1409271729-04cb6c54ff64c790001-NocioJ Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.9]) by cuda.sgi.com with ESMTP id 5F3MiaEsV5RR2VkB (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 28 Aug 2014 17:22:10 -0700 (PDT) X-Barracuda-Envelope-From: BATV+a70b89fbbf3a21f374f9+4023+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 1XN9xB-0005rq-Fa; Fri, 29 Aug 2014 00:22:09 +0000 Date: Thu, 28 Aug 2014 17:22:09 -0700 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 2/9] xfs: xfs_buf_ioend and xfs_buf_iodone_work duplicate functionality Message-ID: <20140829002209.GB17502@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 2/9] xfs: xfs_buf_ioend and xfs_buf_iodone_work duplicate functionality References: <1408084747-4540-1-git-send-email-david@fromorbit.com> <1408084747-4540-3-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1408084747-4540-3-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.23 (2014-03-12) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: bombadil.infradead.org[198.137.202.9] X-Barracuda-Start-Time: 1409271729 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.8933 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- > STATIC void needs the static removed as pointed out by Brian. > - bool read = !!(bp->b_flags & XBF_READ); > + bool read = !!(bp->b_flags & XBF_READ); We don't really need the double negation here. Otherwise this looks reasonable to me. From BATV+a70b89fbbf3a21f374f9+4023+infradead.org+hch@bombadil.srs.infradead.org Thu Aug 28 19:23: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 377A57F56 for ; Thu, 28 Aug 2014 19:23:58 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 23B3D304039 for ; Thu, 28 Aug 2014 17:23:58 -0700 (PDT) X-ASG-Debug-ID: 1409271836-04cbb054858d75a0001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id wFgZyw6wCZuNkZrn (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 28 Aug 2014 17:23:57 -0700 (PDT) X-Barracuda-Envelope-From: BATV+a70b89fbbf3a21f374f9+4023+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 1XN9yu-0005yB-KC; Fri, 29 Aug 2014 00:23:56 +0000 Date: Thu, 28 Aug 2014 17:23:56 -0700 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 3/9] xfs: rework xfs_buf_bio_endio error handling Message-ID: <20140829002356.GC17502@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 3/9] xfs: rework xfs_buf_bio_endio error handling References: <1408084747-4540-1-git-send-email-david@fromorbit.com> <1408084747-4540-4-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1408084747-4540-4-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.23 (2014-03-12) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1409271837 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.8934 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Fri, Aug 15, 2014 at 04:39:01PM +1000, Dave Chinner wrote: > In doing so, allow xfs_buf_iorequest to return an error. That way, > the caller can check for submission errors safely if required, and > easily distinguish them from completion errors that come from > xfs_buf_iowait(). While this looks correct to me it also looks confusing. Why can't we simply propagat the submission errors through error returns and use ->b_error for completion errors instead? From BATV+a70b89fbbf3a21f374f9+4023+infradead.org+hch@bombadil.srs.infradead.org Thu Aug 28 19:24: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 4EC2D7F5A for ; Thu, 28 Aug 2014 19:24:38 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 2C92E304039 for ; Thu, 28 Aug 2014 17:24:38 -0700 (PDT) X-ASG-Debug-ID: 1409271877-04bdf010a15df8f0001-NocioJ Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.9]) by cuda.sgi.com with ESMTP id 5qAxGklIBljrE8BH (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 28 Aug 2014 17:24:37 -0700 (PDT) X-Barracuda-Envelope-From: BATV+a70b89fbbf3a21f374f9+4023+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 1XN9zY-000622-VR; Fri, 29 Aug 2014 00:24:36 +0000 Date: Thu, 28 Aug 2014 17:24:36 -0700 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 4/9] xfs: kill xfs_bdstrat_cb Message-ID: <20140829002436.GD17502@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 4/9] xfs: kill xfs_bdstrat_cb References: <1408084747-4540-1-git-send-email-david@fromorbit.com> <1408084747-4540-5-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1408084747-4540-5-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.23 (2014-03-12) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: bombadil.infradead.org[198.137.202.9] X-Barracuda-Start-Time: 1409271877 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.8934 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Fri, Aug 15, 2014 at 04:39:02PM +1000, Dave Chinner wrote: > From: Dave Chinner > > Only has two callers, and is just a shutdown check and error handler > around xfs_buf_iorequest. However, the error handling is a mess of > read and write semantics, and both internal callers only call it for > writes. Hence kill the wrapper, and follow up with a patch to > sanitise the error handling. > > Signed-off-by: Dave Chinner Looks good, Reviewed-by: Christoph Hellwig From BATV+a70b89fbbf3a21f374f9+4023+infradead.org+hch@bombadil.srs.infradead.org Thu Aug 28 19:28: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 B35AC7F58 for ; Thu, 28 Aug 2014 19:28:29 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id A1DB88F8050 for ; Thu, 28 Aug 2014 17:28:26 -0700 (PDT) X-ASG-Debug-ID: 1409272105-04cbb054858d78e0001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id OADylS16aNAkC9r9 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 28 Aug 2014 17:28:25 -0700 (PDT) X-Barracuda-Envelope-From: BATV+a70b89fbbf3a21f374f9+4023+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 1XNA3F-0003PQ-BV; Fri, 29 Aug 2014 00:28:25 +0000 Date: Thu, 28 Aug 2014 17:28:25 -0700 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 5/9] xfs: xfs_bioerror can die. Message-ID: <20140829002825.GE17502@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 5/9] xfs: xfs_bioerror can die. References: <1408084747-4540-1-git-send-email-david@fromorbit.com> <1408084747-4540-6-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1408084747-4540-6-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.23 (2014-03-12) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1409272105 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.8934 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Fri, Aug 15, 2014 at 04:39:03PM +1000, Dave Chinner wrote: > Internal buffer write error handling is a mess due to the unnatural > split between xfs_bioerror and xfs_bioerror_relse(). The buffer > reference counting is also wrong for the xfs_bioerror path for > xfs_bwrite - it uses sync IO and so xfs_buf_ioend will release a > hold count that was never taken. Which seems to be cause by patch 1 in the series, and thus the additional hold for the error case should be introduced there. Otherwise this looks good to me. From BATV+a70b89fbbf3a21f374f9+4023+infradead.org+hch@bombadil.srs.infradead.org Thu Aug 28 19:33: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 E6A817F5E for ; Thu, 28 Aug 2014 19:33:06 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 63DD3AC002 for ; Thu, 28 Aug 2014 17:33:06 -0700 (PDT) X-ASG-Debug-ID: 1409272377-04cb6c550064cee0001-NocioJ Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.9]) by cuda.sgi.com with ESMTP id y3qeVsHvBX67wrAL (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 28 Aug 2014 17:32:58 -0700 (PDT) X-Barracuda-Envelope-From: BATV+a70b89fbbf3a21f374f9+4023+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 1XNA7d-0004jy-CI; Fri, 29 Aug 2014 00:32:57 +0000 Date: Thu, 28 Aug 2014 17:32:57 -0700 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 6/9] xfs: kill xfs_bioerror_relse Message-ID: <20140829003257.GF17502@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 6/9] xfs: kill xfs_bioerror_relse References: <1408084747-4540-1-git-send-email-david@fromorbit.com> <1408084747-4540-7-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1408084747-4540-7-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.23 (2014-03-12) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: bombadil.infradead.org[198.137.202.9] X-Barracuda-Start-Time: 1409272377 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.8933 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- > index 96c898e..758c07d 100644 > --- a/fs/xfs/xfs_trans_buf.c > +++ b/fs/xfs/xfs_trans_buf.c > @@ -324,11 +324,13 @@ xfs_trans_read_buf_map( > */ > if (XFS_FORCED_SHUTDOWN(mp)) { > trace_xfs_bdstrat_shut(bp, _RET_IP_); > - xfs_bioerror_relse(bp); > - } else { > - xfs_buf_iorequest(bp); > + bp->b_flags &= ~(XBF_READ | XBF_DONE); > + xfs_buf_ioerror(bp, -EIO); > + xfs_buf_stale(bp); > + return -EIO; > } This is a large change of behavior as it doesn't hit the error path after the xfs_buf_iowait anymore. While I don't think that that path was entirely correct this version seems to be even less so by not releasing the buffer reference or forcing the shutdown. From BATV+a70b89fbbf3a21f374f9+4023+infradead.org+hch@bombadil.srs.infradead.org Thu Aug 28 19:37: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 40C1E7F5E for ; Thu, 28 Aug 2014 19:37:57 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 17EE9304048 for ; Thu, 28 Aug 2014 17:37:57 -0700 (PDT) X-ASG-Debug-ID: 1409272676-04bdf010a15e01e0001-NocioJ Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.9]) by cuda.sgi.com with ESMTP id 19htLgakKYEbPmuL (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 28 Aug 2014 17:37:56 -0700 (PDT) X-Barracuda-Envelope-From: BATV+a70b89fbbf3a21f374f9+4023+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 1XNACS-0007jY-2p; Fri, 29 Aug 2014 00:37:56 +0000 Date: Thu, 28 Aug 2014 17:37:56 -0700 From: Christoph Hellwig To: Dave Chinner Cc: Christoph Hellwig , xfs@oss.sgi.com Subject: Re: [PATCH 9/9] xfs: check xfs_buf_read_uncached returns correctly Message-ID: <20140829003756.GG17502@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 9/9] xfs: check xfs_buf_read_uncached returns correctly References: <1408084747-4540-1-git-send-email-david@fromorbit.com> <1408084747-4540-10-git-send-email-david@fromorbit.com> <20140815125608.GA27856@infradead.org> <20140815235843.GA26465@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140815235843.GA26465@dastard> User-Agent: Mutt/1.5.23 (2014-03-12) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: bombadil.infradead.org[198.137.202.9] X-Barracuda-Start-Time: 1409272676 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.8934 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Sat, Aug 16, 2014 at 09:58:43AM +1000, Dave Chinner wrote: > > I'd rather get rid of these annoying calling conventions. Make it > > return and errno, and the bp in a pointer argument, with the bp > > never non-NULL in case of error. > > Ok. I considered that, then just did the simple thing. There's only about a dozen callers of all xfs_buf_read* variants, so I think switching them over to return an errno shouldn't be much of a problem. From BATV+a70b89fbbf3a21f374f9+4023+infradead.org+hch@bombadil.srs.infradead.org Thu Aug 28 19:39: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 AC9B37F62 for ; Thu, 28 Aug 2014 19:39:12 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id 859EF8F8052 for ; Thu, 28 Aug 2014 17:39:12 -0700 (PDT) X-ASG-Debug-ID: 1409272751-04bdf0109a5e02c0001-NocioJ Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.9]) by cuda.sgi.com with ESMTP id JE82EkG4VBSpUL3r (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 28 Aug 2014 17:39:11 -0700 (PDT) X-Barracuda-Envelope-From: BATV+a70b89fbbf3a21f374f9+4023+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 1XNADf-00089l-8N; Fri, 29 Aug 2014 00:39:11 +0000 Date: Thu, 28 Aug 2014 17:39:11 -0700 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 1/7] xfs: don't dirty buffers beyond EOF Message-ID: <20140829003911.GA30463@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 1/7] xfs: don't dirty buffers beyond EOF References: <1409226551-16570-1-git-send-email-david@fromorbit.com> <1409226551-16570-2-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1409226551-16570-2-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.23 (2014-03-12) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: bombadil.infradead.org[198.137.202.9] X-Barracuda-Start-Time: 1409272751 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.8934 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Not sure if my 10 cents are worth anything given that I haven't spent much time with this code recently, but I feel very uneasy diverging from the generic path in this area. From BATV+a70b89fbbf3a21f374f9+4023+infradead.org+hch@bombadil.srs.infradead.org Thu Aug 28 19:39: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 (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id D22687F62 for ; Thu, 28 Aug 2014 19:39:35 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 6A4C4AC001 for ; Thu, 28 Aug 2014 17:39:35 -0700 (PDT) X-ASG-Debug-ID: 1409272774-04bdf010a05e0310001-NocioJ Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.9]) by cuda.sgi.com with ESMTP id OrD8m00d5PGvERlp (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 28 Aug 2014 17:39:34 -0700 (PDT) X-Barracuda-Envelope-From: BATV+a70b89fbbf3a21f374f9+4023+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 1XNAE2-0008F0-L2; Fri, 29 Aug 2014 00:39:34 +0000 Date: Thu, 28 Aug 2014 17:39:34 -0700 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 2/7] xfs: don't zero partial page cache pages during O_DIRECT writes Message-ID: <20140829003934.GB30463@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 2/7] xfs: don't zero partial page cache pages during O_DIRECT writes References: <1409226551-16570-1-git-send-email-david@fromorbit.com> <1409226551-16570-3-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1409226551-16570-3-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.23 (2014-03-12) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: bombadil.infradead.org[198.137.202.9] X-Barracuda-Start-Time: 1409272774 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.8934 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Thu, Aug 28, 2014 at 09:49:06PM +1000, Dave Chinner wrote: > From: Chris Mason > > xfs is using truncate_pagecache_range to invalidate the page cache > during DIO reads. This is different from the other filesystems who > only invalidate pages during DIO writes. > > truncate_pagecache_range is meant to be used when we are freeing the > underlying data structs from disk, so it will zero any partial > ranges in the page. This means a DIO read can zero out part of the > page cache page, and it is possible the page will stay in cache. > > buffered reads will find an up to date page with zeros instead of > the data actually on disk. > > This patch fixes things by using invalidate_inode_pages2_range > instead. It preserves the page cache invalidation, but won't zero > any pages. > > [dchinner: catch error and warn if it fails. Comment.] Looks good, Reviewed-by: Christoph Hellwig From BATV+a70b89fbbf3a21f374f9+4023+infradead.org+hch@bombadil.srs.infradead.org Thu Aug 28 19:39: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 (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id B42BF7F62 for ; Thu, 28 Aug 2014 19:39:53 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 422B9AC003 for ; Thu, 28 Aug 2014 17:39:53 -0700 (PDT) X-ASG-Debug-ID: 1409272791-04cbb054888d8010001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id KcnnbWyS12kceJiQ (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 28 Aug 2014 17:39:52 -0700 (PDT) X-Barracuda-Envelope-From: BATV+a70b89fbbf3a21f374f9+4023+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 1XNAEJ-0000V0-M9; Fri, 29 Aug 2014 00:39:51 +0000 Date: Thu, 28 Aug 2014 17:39:51 -0700 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 3/7] xfs: don't zero partial page cache pages during O_DIRECT writes Message-ID: <20140829003951.GC30463@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 3/7] xfs: don't zero partial page cache pages during O_DIRECT writes References: <1409226551-16570-1-git-send-email-david@fromorbit.com> <1409226551-16570-4-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1409226551-16570-4-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.23 (2014-03-12) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1409272792 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.8934 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Thu, Aug 28, 2014 at 09:49:07PM +1000, Dave Chinner wrote: > From: Dave Chinner > > Similar to direct IO reads, direct IO writes are using > truncate_pagecache_range to invalidate the page cache. This is > incorrect due to the sub-block zeroing in the page cache that > truncate_pagecache_range() triggers. > > This patch fixes things by using invalidate_inode_pages2_range > instead. It preserves the page cache invalidation, but won't zero > any pages. Looks good, Reviewed-by: Christoph Hellwig From BATV+a70b89fbbf3a21f374f9+4023+infradead.org+hch@bombadil.srs.infradead.org Thu Aug 28 19:40: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 607577F67 for ; Thu, 28 Aug 2014 19:40:49 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 3B0EA8F8052 for ; Thu, 28 Aug 2014 17:40:49 -0700 (PDT) X-ASG-Debug-ID: 1409272847-04cbb054878d80b0001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id nDfj01uZlvXAuWa6 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 28 Aug 2014 17:40:48 -0700 (PDT) X-Barracuda-Envelope-From: BATV+a70b89fbbf3a21f374f9+4023+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 1XNAFD-0004Hs-Td; Fri, 29 Aug 2014 00:40:47 +0000 Date: Thu, 28 Aug 2014 17:40:47 -0700 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 4/7] xfs: use ranged writeback and invalidation for direct IO Message-ID: <20140829004047.GD30463@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 4/7] xfs: use ranged writeback and invalidation for direct IO References: <1409226551-16570-1-git-send-email-david@fromorbit.com> <1409226551-16570-5-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1409226551-16570-5-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.23 (2014-03-12) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1409272848 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.8934 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Thu, Aug 28, 2014 at 09:49:08PM +1000, Dave Chinner wrote: > From: Dave Chinner > > Now we are not doing silly things with dirtying buffers beyond EOF > and using invalidation correctly, we can finally reduce the ranges of > writeback and invalidation used by direct IO to match that of the IO > being issued. > > Bring the writeback and invalidation ranges back to match the > generic direct IO code - this will greatly reduce the perturbation > of cached data when direct IO and buffered IO are mixed, but still > provide the same buffered vs direct IO coherency behaviour we > currently have. > > Signed-off-by: Dave Chinner Looks correct, although I wonder if it's really worth the risk exposing us to the crazy details of the page cache invalidation range notations.. Reviewed-by: Christoph Hellwig From BATV+a70b89fbbf3a21f374f9+4023+infradead.org+hch@bombadil.srs.infradead.org Thu Aug 28 19:41: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 (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 4FB417F67 for ; Thu, 28 Aug 2014 19:41:11 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 3927C304053 for ; Thu, 28 Aug 2014 17:41:11 -0700 (PDT) X-ASG-Debug-ID: 1409272870-04cbb054878d80f0001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id tLw4HzH8rdSY87WB (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 28 Aug 2014 17:41:10 -0700 (PDT) X-Barracuda-Envelope-From: BATV+a70b89fbbf3a21f374f9+4023+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 1XNAFa-0004JD-1m; Fri, 29 Aug 2014 00:41:10 +0000 Date: Thu, 28 Aug 2014 17:41:10 -0700 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 5/7] xfs: don't log inode unless extent shift makes extent modifications Message-ID: <20140829004110.GE30463@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 5/7] xfs: don't log inode unless extent shift makes extent modifications References: <1409226551-16570-1-git-send-email-david@fromorbit.com> <1409226551-16570-6-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1409226551-16570-6-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.23 (2014-03-12) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1409272870 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-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.8934 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS Looks good, Reviewed-by: Christoph Hellwig From BATV+a70b89fbbf3a21f374f9+4023+infradead.org+hch@bombadil.srs.infradead.org Thu Aug 28 19:41: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 C67157F56 for ; Thu, 28 Aug 2014 19:41:56 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 54525AC001 for ; Thu, 28 Aug 2014 17:41:56 -0700 (PDT) X-ASG-Debug-ID: 1409272914-04cb6c550064d560001-NocioJ Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.9]) by cuda.sgi.com with ESMTP id OVP8nbAik55zkryp (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 28 Aug 2014 17:41:55 -0700 (PDT) X-Barracuda-Envelope-From: BATV+a70b89fbbf3a21f374f9+4023+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 1XNAGI-0004R3-Kz; Fri, 29 Aug 2014 00:41:54 +0000 Date: Thu, 28 Aug 2014 17:41:54 -0700 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 6/7] xfs: xfs_file_collapse_range is delalloc challenged Message-ID: <20140829004154.GF30463@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 6/7] xfs: xfs_file_collapse_range is delalloc challenged References: <1409226551-16570-1-git-send-email-david@fromorbit.com> <1409226551-16570-7-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1409226551-16570-7-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.23 (2014-03-12) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: bombadil.infradead.org[198.137.202.9] X-Barracuda-Start-Time: 1409272915 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.8933 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Thu, Aug 28, 2014 at 09:49:10PM +1000, Dave Chinner wrote: > From: Dave Chinner > > If we have delalloc extents on a file before we run a collapse range > opertaion, we sync the range that we are going to collapse to > convert delalloc extents in that region to real extents to simplify > the shift operation. > > However, the shift operation then assumes that the extent list is > not going to change as it iterates over the extent list moving > things about. Unfortunately, this isn't true because we can't hold > the ILOCK over all the operations. We can prevent new IO from > modifying the extent list by holding the IOLOCK, but that doesn't > prevent writeback from running.... > > And when writeback runs, it can convert delalloc extents is the > range of the file prior to the region being collapsed, and this > changes the indexes of all the extents in the file. That causes the > collapse range operation to Go Bad. > > The right fix is to rewrite the extent shift operation not to be > dependent on the extent list not changing across the entire > operation, but this is a fairly significant piece of work to do. > Hence, as a short-term workaround for the problem, sync the entire > file before starting a collapse operation to remove all delalloc > ranges from the file and so avoid the problem of concurrent > writeback changing the extent list. > > Diagnosed-and-Reported-by: Brian Foster > Signed-off-by: Dave Chinner > Reviewed-by: Brian Foster Looks good, Reviewed-by: Christoph Hellwig From BATV+a70b89fbbf3a21f374f9+4023+infradead.org+hch@bombadil.srs.infradead.org Thu Aug 28 19:42: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 E56227F78 for ; Thu, 28 Aug 2014 19:42:27 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 81D43AC001 for ; Thu, 28 Aug 2014 17:42:27 -0700 (PDT) X-ASG-Debug-ID: 1409272946-04cb6c54ff64d5a0001-NocioJ Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.9]) by cuda.sgi.com with ESMTP id EBG7zj98wyTtRCJl (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 28 Aug 2014 17:42:26 -0700 (PDT) X-Barracuda-Envelope-From: BATV+a70b89fbbf3a21f374f9+4023+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 1XNAGo-0004V9-4Q; Fri, 29 Aug 2014 00:42:26 +0000 Date: Thu, 28 Aug 2014 17:42:26 -0700 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 7/7] xfs: trim eofblocks before collapse range Message-ID: <20140829004226.GG30463@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 7/7] xfs: trim eofblocks before collapse range References: <1409226551-16570-1-git-send-email-david@fromorbit.com> <1409226551-16570-8-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1409226551-16570-8-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.23 (2014-03-12) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: bombadil.infradead.org[198.137.202.9] X-Barracuda-Start-Time: 1409272946 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.8933 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Looks good, Reviewed-by: Christoph Hellwig From david@fromorbit.com Thu Aug 28 19:46: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 8D92E7F63 for ; Thu, 28 Aug 2014 19:46:13 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 65B848F8050 for ; Thu, 28 Aug 2014 17:46:13 -0700 (PDT) X-ASG-Debug-ID: 1409273170-04cb6c54fe64d800001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id cMomh2OQwJJOPnRu for ; Thu, 28 Aug 2014 17:46:10 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.145 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AjYaAKnM/1N5LDJ8PGdsb2JhbABbgw1TV4IshQenTgYGmFSBZYVyAYEVFwUBAQEBODaEAwEBBAEnExwjBQsIAxgJJQ8FJQMHGhOIOge/bhcYhWSJUAeETAWVXYZ8iy5vjHErL4EIJIEjAQEB Received: from ppp121-44-50-124.lns20.syd6.internode.on.net (HELO dastard) ([121.44.50.124]) by ipmail06.adl6.internode.on.net with ESMTP; 29 Aug 2014 10:16:09 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1XNAKN-0002Ff-Dh; Fri, 29 Aug 2014 10:46:07 +1000 Date: Fri, 29 Aug 2014 10:46:07 +1000 From: Dave Chinner To: Iustin Pop Cc: Iustin Pop , xfs@oss.sgi.com, hch@infradead.org Subject: Re: [PATCH] xfs: fix behaviour of XFS_IOC_FSSETXATTR on directories Message-ID: <20140829004607.GX20518@dastard> X-ASG-Orig-Subj: Re: [PATCH] xfs: fix behaviour of XFS_IOC_FSSETXATTR on directories References: <20140718191314.GB27801@teal.hq.k1024.org> <1409199773-16802-1-git-send-email-iusty@k1024.org> <20140828093158.GR20518@dastard> <20140828223414.GC29940@google.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140828223414.GC29940@google.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: 1409273170 X-Barracuda-URL: http://192.48.176.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.8933 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Thu, Aug 28, 2014 at 03:34:14PM -0700, Iustin Pop wrote: > On Don, Aug 28, 2014 at 07:31:58 +1000, Dave Chinner wrote: > > On Wed, Aug 27, 2014 at 09:22:53PM -0700, Iustin Pop wrote: > > > Currently, the ioctl handling code for XFS_IOC_FSSETXATTR treats all > > > targets as regular files: it refuses to change the extent size if > > > extents are allocated. This is wrong for directories, as there the > > > extent size is only used as a default for children. > > > > > > The patch fixes this by only checking for allocated extents for regular > > > files; it leaves undefined what it means to set an extent size on a > > > non-regular, non-directory inode. Additionally, when setting a non-zero > > > extent size, the appropriate flags (EXTSIZE, respectively EXTSZINHERIT) > > > are enforced for regular files and directories. > > > > > > Signed-off-by: Iustin Pop > > > --- > > > A patch against xfstests to test for the fixed behaviour will follow > > > shortly. > > > > > > fs/xfs/xfs_ioctl.c | 34 ++++++++++++++++++++++++++-------- > > > 1 file changed, 26 insertions(+), 8 deletions(-) > > > > > > diff --git a/fs/xfs/xfs_ioctl.c b/fs/xfs/xfs_ioctl.c > > > index 8bc1bbc..5b9acd2 100644 > > > --- a/fs/xfs/xfs_ioctl.c > > > +++ b/fs/xfs/xfs_ioctl.c > > > @@ -1116,14 +1116,32 @@ xfs_ioctl_setattr( > > > } > > > > > > if (mask & FSX_EXTSIZE) { > > > - /* > > > - * Can't change extent size if any extents are allocated. > > > - */ > > > - if (ip->i_d.di_nextents && > > > - ((ip->i_d.di_extsize << mp->m_sb.sb_blocklog) != > > > - fa->fsx_extsize)) { > > > - code = XFS_ERROR(EINVAL); /* EFBIG? */ > > > - goto error_return; > > > > Doesn't apply to a current 3.17-rc1 tree. Can you update the patch? > > Will do, thanks. Is it correct to use git://oss.sgi.com/xfs/xfs, master > branch as what I should rebase it on top of? I'm moving off oss.sgi.com. I'll keep the trees up to date for a while, but the master kernel tree I'm using now is: git://git.kernel.org/pub/scm/linux/kernel/git/dgc/linux-xfs.git master > > > + if (S_ISDIR(ip->i_d.di_mode)) { > > > + /* > > > + * Enforce setting the EXTSZINHERIT flag when > > > + * a non-zero extent size has been specified. > > > + */ > > > + if (fa->fsx_extsize) { > > > + fa->fsx_xflags |= XFS_XFLAG_EXTSZINHERIT; > > > + } > > > + } else if (S_ISREG(ip->i_d.di_mode)) { > > > + /* > > > + * For a regular file, we can't change extent > > > + * size if any extents are allocated. > > > + */ > > > + if (ip->i_d.di_nextents && > > > + ((ip->i_d.di_extsize << mp->m_sb.sb_blocklog) != > > > + fa->fsx_extsize)) { > > > + code = XFS_ERROR(EINVAL); /* EFBIG? */ > > > + goto error_return; > > > + } > > > + /* > > > + * Enforce setting the EXTSIZE flag when > > > + * a non-zero extent size has been specified. > > > + */ > > > + if (fa->fsx_extsize) { > > > + fa->fsx_xflags |= XFS_XFLAG_EXTSIZE; > > > + } > > > } > > > > Hmmmm. That's not validating/enforcing the correct use of > > XFS_XFLAG_EXTSIZE or XFS_XFLAG_EXTSZINHERIT, that's setting it > > implicitly based on the type of inode. > > > > If we are going to enforce this properly, then XFS_XFLAG_EXTSIZE is > > only valid for a regular file, and XFS_XFLAG_EXTSZINHERIT is only > > valid on a directory, and the flags on th einode should only be set > > if the hint is not zero. i.e: > > > > if (mask & FSX_EXTSIZE) { > > error = -EINVAL; > > > > /* validate the flags are set appropriately */ > > if ((fa->fsx_xflags & XFS_XFLAG_EXTSIZE) && > > !S_ISREG(ip->i_d.di_mode)) > > goto error_return; > > if ((fa->fsx_xflags & XFS_XFLAG_EXTSZINHERIT) && > > !S_ISDIR(ip->i_d.di_mode)) > > goto error_return; > > This only prevents invalid flags, but doesn't prevent setting a non-zero > extent_size without the appropriate flag. We already are having this > discussion in the other patch, so I'll defer this to that. So take the previous code I cleared the flags on extsize == 0, and do this: - if (mask & FSX_EXTSIZE) + if (fa->fsx_flags & (XFS_XFLAG_EXTSIZE | XFS_XFLAG_EXTSZINHERIT)) { ip->i_d.di_extsize = fa->fsx_extsize >> mp->m_sb.sb_blocklog; + if (ip->i_d.di_extsize == 0) + fa->fsx_flags &= ~(XFS_XFLAG_EXTSIZE | XFS_XFLAG_EXTSZINHERIT); + } The way that mask gets used is just nasty, IMO. We could clean that code up a lot with a bit of factoring. > But aside from that, the current code that actually applies the flag > changes (xfs_set_diflags) implicitly drops invalid flags - that's why I > didn't bother to validate the flags here. Which points out that the flag validation code is broken, yes? > If we want to do validation, > maybe we should validate (with error, not silently) in that function, > instead of here? No. We need to have a clear separation of user input validation from the modification of the inode state, because if we abort modification during a transaction due to a validation failure after modifying the inode, then we have to abort the dirty transaction and that will cause a filesystem shutdown. Which would then be called a "user level DOS" and hence we must maintain the separation of validation from modification that we already have... Cheers, Dave. -- Dave Chinner david@fromorbit.com From xfactor973@gmail.com Thu Aug 28 19:51: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.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 6997E7F58 for ; Thu, 28 Aug 2014 19:51:18 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id D8D61AC001 for ; Thu, 28 Aug 2014 17:51:17 -0700 (PDT) X-ASG-Debug-ID: 1409273475-04cb6c54ff64db10001-NocioJ Received: from mail-ie0-f172.google.com (mail-ie0-f172.google.com [209.85.223.172]) by cuda.sgi.com with ESMTP id fX4f9qoqsTAxjJm8 (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Thu, 28 Aug 2014 17:51:15 -0700 (PDT) X-Barracuda-Envelope-From: xfactor973@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.223.172 X-Barracuda-IPDD: Level1 [gmail.com/209.85.223.172] Received: by mail-ie0-f172.google.com with SMTP id rd18so1958166iec.3 for ; Thu, 28 Aug 2014 17:51:15 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.223.172] X-Barracuda-IPDD: Level1 [gmail.com/209.85.223.172] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:in-reply-to:references:date:message-id:subject:from:to :content-type; bh=rj+9OpmMwU74fJCMnalyNjNXrQtgmYFt2HUJYWQ+zeU=; b=DpHKBF1eD0op9UbPNjc2HNIf+vYwL/gptPtKfXUsbcoQ5j7vLoCmSarWoHbhJhzmXv Rz/wPV6J1LhO7IIJz8LkdCRqJ/dENmfK94InqYOParAYSHhpXWdtZ+KmvYZgSLzuq/jO Lw9s3hD3gl07UkDE7k0HhcbJ3C8p6KfKRtfPbtfLUGCjKjXNffNKkDR5I+5/MGwFs4TI u3x4J/OrLRCan4FR7wncHC1wrxHOV7l9qu20yEYC+pLb+VDR+LRm0HVfjvrPw0Q5v7uL T5KB1cgdbgwawyu6lGSTEvTS3Mi7cP5kZy/0k2nJ+ceH572iM1qDqmIK59ujuFgS+5lQ SRAA== MIME-Version: 1.0 X-Received: by 10.50.25.105 with SMTP id b9mr504194igg.46.1409273475153; Thu, 28 Aug 2014 17:51:15 -0700 (PDT) Received: by 10.50.132.41 with HTTP; Thu, 28 Aug 2014 17:51:15 -0700 (PDT) In-Reply-To: <20140828232915.GV20518@dastard> References: <20140828232915.GV20518@dastard> Date: Thu, 28 Aug 2014 17:51:15 -0700 Message-ID: Subject: Re: Find hardlinks to a file From: Chris Holcombe X-ASG-Orig-Subj: Re: Find hardlinks to a file To: 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: 1409273475 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.8935 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 So let me ask you this. Is it possible to transform an inode number into a path name with xfs? That's basically the crux of my problem. On Thu, Aug 28, 2014 at 4:29 PM, Dave Chinner wrote: > On Thu, Aug 28, 2014 at 04:14:25PM -0700, Chris Holcombe wrote: >> My apologies if this has already been asked. I feel that I've done a >> sufficient amount of Google search homework. I'm working with Gluster >> (http://www.gluster.org/) and they have a directory called xattrop >> where they store links to files that need to be healed. When I stat >> the file I can see that there's 2 or 3 hard links to the file. I >> can't seem to find a way in code or with an xfs_* utility to find the >> path of those hard links. Does anyone know how to do this or if it's >> even possible? From looking through the XFS documentation I don't >> really see a way to do it without a find /mount_point -num >> brute force method. btrfs has a utility called: >> >> btrfs inspect-internal inode-resolve [-v] >> Resolves an in subvolume to all filesystem >> paths. >> >> I'd like to build an equivalent tool in C for XFS if it's possible. > > You need help from the filesystem, both in terms of the on-disk > format and the kernel code needed to push that information back out > to userspace. Indeed, this is the functionality we need for reverse > inode->path lookups: > > http://thread.gmane.org/gmane.comp.file-systems.xfs.general/27772 > > (parent pointers, for those that don't want to follow the link) > > Right now it's state is in limbo. We have a more recent design, > but since SGI has dropped off the edge of the world, nobody is > working on it. > > It's on my radar along with reverse mapping btrees for filesystem > block to inode lookups so that we can do all of this sort of stuff > easily without needing to walk the entire filesystem to find the > forward pointers to objects.... > > Cheers, > > Dave. > -- > Dave Chinner > david@fromorbit.com From david@fromorbit.com Thu Aug 28 19:54: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 510F97F72 for ; Thu, 28 Aug 2014 19:54:03 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 3CF848F8050 for ; Thu, 28 Aug 2014 17:54:02 -0700 (PDT) X-ASG-Debug-ID: 1409273640-04cbb054878d8860001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id KaRu6ETHyXM7vv2M for ; Thu, 28 Aug 2014 17:54:01 -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: AisaAAXO/1N5LDJ8PGdsb2JhbABbgw2BKoIshQenTgYGmjmFcgGBFRcFAQEBATg2hAQBBTocIxAIAw4KCSUPBSUDBxoTiEG/cRcYhWSJUAeETAWcWYsua4x1Ky+CTwEBAQ Received: from ppp121-44-50-124.lns20.syd6.internode.on.net (HELO dastard) ([121.44.50.124]) by ipmail06.adl6.internode.on.net with ESMTP; 29 Aug 2014 10:23:59 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1XNARy-0002Go-Gf; Fri, 29 Aug 2014 10:53:58 +1000 Date: Fri, 29 Aug 2014 10:53:58 +1000 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com Subject: Re: [PATCH 1/7] xfs: don't dirty buffers beyond EOF Message-ID: <20140829005358.GY20518@dastard> X-ASG-Orig-Subj: Re: [PATCH 1/7] xfs: don't dirty buffers beyond EOF References: <1409226551-16570-1-git-send-email-david@fromorbit.com> <1409226551-16570-2-git-send-email-david@fromorbit.com> <20140829003911.GA30463@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140829003911.GA30463@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: 1409273640 X-Barracuda-URL: http://192.48.176.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.8935 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Thu, Aug 28, 2014 at 05:39:11PM -0700, Christoph Hellwig wrote: > Not sure if my 10 cents are worth anything given that I haven't spent > much time with this code recently, but I feel very uneasy diverging > from the generic path in this area. I can't see how we have any other choice right now. We're caught between a rock and a hard place - XFS uses bufferheads differently to all other filesystems (esp. w.r.t. to EOF block zeroing behaviour), and so changing behaviour in the generic code to suit XFS is likely to introduce subtle data corruption bugs in other filesystems. I think the best thing we can do is move away from bufferheads in XFS. We've already got lots of hacky code to manage bufferhead/extent state coherency and so the sooner we get rid of bufferheads the sooner that crap goes away, too. Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Thu Aug 28 19: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 13B237F72 for ; Thu, 28 Aug 2014 19:56:10 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 9C456AC003 for ; Thu, 28 Aug 2014 17:56:09 -0700 (PDT) X-ASG-Debug-ID: 1409273767-04bdf0109a5e0ce0001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id fIAsr235xm3U2t2K for ; Thu, 28 Aug 2014 17:56:07 -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: AisaADPP/1N5LDJ8PGdsb2JhbABbgw2BKoIshQenTgYGmjmFcgGBFRcFAQEBATg2hAQBBScTHCMQCAMOCgklDwUlAwcaE4hBv3EXGIVkiVAHhEwBBJxZiy5vixmBWCsvgk8BAQE Received: from ppp121-44-50-124.lns20.syd6.internode.on.net (HELO dastard) ([121.44.50.124]) by ipmail06.adl6.internode.on.net with ESMTP; 29 Aug 2014 10:25:44 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1XNATf-0002H8-GF; Fri, 29 Aug 2014 10:55:43 +1000 Date: Fri, 29 Aug 2014 10:55:43 +1000 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com Subject: Re: [PATCH 2/9] xfs: xfs_buf_ioend and xfs_buf_iodone_work duplicate functionality Message-ID: <20140829005543.GZ20518@dastard> X-ASG-Orig-Subj: Re: [PATCH 2/9] xfs: xfs_buf_ioend and xfs_buf_iodone_work duplicate functionality References: <1408084747-4540-1-git-send-email-david@fromorbit.com> <1408084747-4540-3-git-send-email-david@fromorbit.com> <20140829002209.GB17502@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140829002209.GB17502@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: 1409273767 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.8935 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Thu, Aug 28, 2014 at 05:22:09PM -0700, Christoph Hellwig wrote: > > STATIC void > > needs the static removed as pointed out by Brian. > > - bool read = !!(bp->b_flags & XBF_READ); > > + bool read = !!(bp->b_flags & XBF_READ); > > We don't really need the double negation here. Good point. I'll fix it. -- Dave Chinner david@fromorbit.com From BATV+a70b89fbbf3a21f374f9+4023+infradead.org+hch@bombadil.srs.infradead.org Thu Aug 28 19:59: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 (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id D44EE7F72 for ; Thu, 28 Aug 2014 19:59:26 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 9AB0C304051 for ; Thu, 28 Aug 2014 17:59:26 -0700 (PDT) X-ASG-Debug-ID: 1409273965-04bdf010a05e0f50001-NocioJ Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.9]) by cuda.sgi.com with ESMTP id LSGWICRT8sq8Lv0b (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 28 Aug 2014 17:59:25 -0700 (PDT) X-Barracuda-Envelope-From: BATV+a70b89fbbf3a21f374f9+4023+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 1XNAXD-0006va-M7; Fri, 29 Aug 2014 00:59:23 +0000 Date: Thu, 28 Aug 2014 17:59:23 -0700 From: Christoph Hellwig To: Eric Sandeen Cc: Eric Sandeen , xfs-oss Subject: Re: [PATCH 1/4] xfs: check resblks before calling xfs_dir_canenter Message-ID: <20140829005923.GA26340@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 1/4] xfs: check resblks before calling xfs_dir_canenter References: <53F6942B.80808@redhat.com> <53F694F9.9030406@sandeen.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <53F694F9.9030406@sandeen.net> User-Agent: Mutt/1.5.23 (2014-03-12) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: bombadil.infradead.org[198.137.202.9] X-Barracuda-Start-Time: 1409273965 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.8935 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Looks good (although not useful on it's own, but there's more followups) Reviewed-by: Christoph Hellwig From BATV+a70b89fbbf3a21f374f9+4023+infradead.org+hch@bombadil.srs.infradead.org Thu Aug 28 20:00: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 B98D67F83 for ; Thu, 28 Aug 2014 20:00:59 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 985AE8F8052 for ; Thu, 28 Aug 2014 18:00:59 -0700 (PDT) X-ASG-Debug-ID: 1409274057-04cb6c54fd64e260001-NocioJ Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.9]) by cuda.sgi.com with ESMTP id dP8TOj1y2NspKSvB (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 28 Aug 2014 18:00:57 -0700 (PDT) X-Barracuda-Envelope-From: BATV+a70b89fbbf3a21f374f9+4023+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 1XNAYi-000865-1i; Fri, 29 Aug 2014 01:00:56 +0000 Date: Thu, 28 Aug 2014 18:00:56 -0700 From: Christoph Hellwig To: Eric Sandeen Cc: Eric Sandeen , xfs-oss Subject: Re: [PATCH 2/4] xfs: combine xfs_dir_canenter into xfs_dir_createname Message-ID: <20140829010056.GB26340@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 2/4] xfs: combine xfs_dir_canenter into xfs_dir_createname References: <53F6942B.80808@redhat.com> <53F695C3.1020607@sandeen.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <53F695C3.1020607@sandeen.net> User-Agent: Mutt/1.5.23 (2014-03-12) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: bombadil.infradead.org[198.137.202.9] X-Barracuda-Start-Time: 1409274057 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.8935 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Thu, Aug 21, 2014 at 07:58:43PM -0500, Eric Sandeen wrote: > xfs_dir_canenter and xfs_dir_createname are > almost identical. > > Fold the former into the latter, with a helpful > wrapper for the former. If createname is called without > an inode number, it now only checks for space, and does > not actually add the entry. > > Signed-off-by: Eric Sandeen The code changes looks good to me, but.. > /* > - Enter a name in a directory. > + * Enter a name in a directory. > + * If inum is 0, only test for available space. > */ > int > xfs_dir_createname( Given how confusing the xfs_dir_createname function name is now this probably needs a more detailed description mentioning the checking as first class behavior. From david@fromorbit.com Thu Aug 28 20:06: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 (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id B258C7F85 for ; Thu, 28 Aug 2014 20:06:19 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 4026EAC001 for ; Thu, 28 Aug 2014 18:06:15 -0700 (PDT) X-ASG-Debug-ID: 1409274373-04cbb054858d91b0001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id sZa9qo7QLecd4Pce for ; Thu, 28 Aug 2014 18:06: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: AisaAIvR/1N5LDJ8PGdsb2JhbABbgw2BKoIshQenTgYGmjmFcgGBFRcFAQEBATg2hAQBBTocIxAIAw4KCSUPBSUDBxoTiEG/chcYhWSJUAeDL4EdAQSPG40+iy5vjHErL4JPAQEB Received: from ppp121-44-50-124.lns20.syd6.internode.on.net (HELO dastard) ([121.44.50.124]) by ipmail06.adl6.internode.on.net with ESMTP; 29 Aug 2014 10:35:55 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1XNAdW-0002JE-49; Fri, 29 Aug 2014 11:05:54 +1000 Date: Fri, 29 Aug 2014 11:05:54 +1000 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com Subject: Re: [PATCH 5/9] xfs: xfs_bioerror can die. Message-ID: <20140829010554.GA20518@dastard> X-ASG-Orig-Subj: Re: [PATCH 5/9] xfs: xfs_bioerror can die. References: <1408084747-4540-1-git-send-email-david@fromorbit.com> <1408084747-4540-6-git-send-email-david@fromorbit.com> <20140829002825.GE17502@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140829002825.GE17502@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: 1409274373 X-Barracuda-URL: http://192.48.176.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.8935 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Thu, Aug 28, 2014 at 05:28:25PM -0700, Christoph Hellwig wrote: > On Fri, Aug 15, 2014 at 04:39:03PM +1000, Dave Chinner wrote: > > Internal buffer write error handling is a mess due to the unnatural > > split between xfs_bioerror and xfs_bioerror_relse(). The buffer > > reference counting is also wrong for the xfs_bioerror path for > > xfs_bwrite - it uses sync IO and so xfs_buf_ioend will release a > > hold count that was never taken. > > Which seems to be cause by patch 1 in the series, and thus the > additional hold for the error case should be introduced there. will fix. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Thu Aug 28 20:12: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 F05977F86 for ; Thu, 28 Aug 2014 20:12:43 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id D07AF304051 for ; Thu, 28 Aug 2014 18:12:40 -0700 (PDT) X-ASG-Debug-ID: 1409274758-04cbb054868d95d0001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id K6BLmZ5yXJ8Rqp28 for ; Thu, 28 Aug 2014 18:12:38 -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: AisaALnS/1N5LDJ8PGdsb2JhbABbgw2BKoIshQenTgYGmjmFcgGBFRcFAQEBATg2hAQBBScTHCMQCAMOCgklDwUlAwcaE4hBv3EXGIVkiVAHgy+BHQWcWYsub4xxKy+CTwEBAQ Received: from ppp121-44-50-124.lns20.syd6.internode.on.net (HELO dastard) ([121.44.50.124]) by ipmail06.adl6.internode.on.net with ESMTP; 29 Aug 2014 10:42:38 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1XNAk0-0002Jy-Ep; Fri, 29 Aug 2014 11:12:36 +1000 Date: Fri, 29 Aug 2014 11:12:36 +1000 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com Subject: Re: [PATCH 6/9] xfs: kill xfs_bioerror_relse Message-ID: <20140829011236.GB20518@dastard> X-ASG-Orig-Subj: Re: [PATCH 6/9] xfs: kill xfs_bioerror_relse References: <1408084747-4540-1-git-send-email-david@fromorbit.com> <1408084747-4540-7-git-send-email-david@fromorbit.com> <20140829003257.GF17502@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140829003257.GF17502@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: 1409274758 X-Barracuda-URL: http://192.48.176.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.8935 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Thu, Aug 28, 2014 at 05:32:57PM -0700, Christoph Hellwig wrote: > > index 96c898e..758c07d 100644 > > --- a/fs/xfs/xfs_trans_buf.c > > +++ b/fs/xfs/xfs_trans_buf.c > > @@ -324,11 +324,13 @@ xfs_trans_read_buf_map( > > */ > > if (XFS_FORCED_SHUTDOWN(mp)) { > > trace_xfs_bdstrat_shut(bp, _RET_IP_); > > - xfs_bioerror_relse(bp); > > - } else { > > - xfs_buf_iorequest(bp); > > + bp->b_flags &= ~(XBF_READ | XBF_DONE); > > + xfs_buf_ioerror(bp, -EIO); > > + xfs_buf_stale(bp); > > + return -EIO; > > } > > This is a large change of behavior as it doesn't hit the error > path after the xfs_buf_iowait anymore. While I don't think that > that path was entirely correct this version seems to be even less so > by not releasing the buffer reference or forcing the shutdown. The IO is synchronous, so the previous behaviour did not release the buffer here. But, yes, it needs to because we're not running the io wait on it anymore. And this happens only during a shutdown, so i don't see any need to trigger a shutdown ;) As it is, I think this gets properly fixed by the next patch.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Thu Aug 28 20: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 (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id BB9A07F89 for ; Thu, 28 Aug 2014 20:16:07 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 4D71AAC002 for ; Thu, 28 Aug 2014 18:16:07 -0700 (PDT) X-ASG-Debug-ID: 1409274965-04bdf010a15e1a80001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id NEZpbdoHmnFD1fcD for ; Thu, 28 Aug 2014 18:16:05 -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: AjAaAODT/1N5LDJ8PGdsb2JhbABbgw2BKoIshQenTgYGmjmFaQkBgRUXBQEBAQE4NoQEAQU6HCMQCAMOCgklDwUlAwcaE4hBv24XGIVkiVAHgy+BHQWcWYsujWArL4JPAQEB Received: from ppp121-44-50-124.lns20.syd6.internode.on.net (HELO dastard) ([121.44.50.124]) by ipmail06.adl6.internode.on.net with ESMTP; 29 Aug 2014 10:45:54 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1XNAnB-0002Km-5c; Fri, 29 Aug 2014 11:15:53 +1000 Date: Fri, 29 Aug 2014 11:15:53 +1000 From: Dave Chinner To: Chris Holcombe Cc: xfs@oss.sgi.com Subject: Re: Find hardlinks to a file Message-ID: <20140829011553.GC20518@dastard> X-ASG-Orig-Subj: Re: Find hardlinks to a file References: <20140828232915.GV20518@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1409274965 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.8935 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Thu, Aug 28, 2014 at 05:51:15PM -0700, Chris Holcombe wrote: > So let me ask you this. Is it possible to transform an inode number > into a path name with xfs? That's basically the crux of my problem. $ man xfs_ncheck -- Dave Chinner david@fromorbit.com From sandeen@sandeen.net Thu Aug 28 21:14: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=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 363967F75 for ; Thu, 28 Aug 2014 21:14:09 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id B915CAC001 for ; Thu, 28 Aug 2014 19:14:05 -0700 (PDT) X-ASG-Debug-ID: 1409278443-04cb6c54fd651a60001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id 9ar4Xyy7Ax3xgxug for ; Thu, 28 Aug 2014 19:14: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 B994C6370CE2; Thu, 28 Aug 2014 21:14:02 -0500 (CDT) Message-ID: <53FFE1EC.9010102@sandeen.net> Date: Thu, 28 Aug 2014 21:14:04 -0500 From: Eric Sandeen MIME-Version: 1.0 To: Eric Sandeen , xfs-oss Subject: [PATCH 2/4 V2] xfs: combine xfs_dir_canenter into xfs_dir_createname References: <53F6942B.80808@redhat.com> <53F695C3.1020607@sandeen.net> X-ASG-Orig-Subj: [PATCH 2/4 V2] xfs: combine xfs_dir_canenter into xfs_dir_createname In-Reply-To: <53F695C3.1020607@sandeen.net> 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: 1409278443 X-Barracuda-URL: http://192.48.176.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.8936 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- xfs_dir_canenter and xfs_dir_createname are almost identical. Fold the former into the latter, with a helpful wrapper for the former. If createname is called without an inode number, it now only checks for space, and does not actually add the entry. Signed-off-by: Eric Sandeen --- V2: slightly more verbose comment diff --git a/fs/xfs/libxfs/xfs_dir2.c b/fs/xfs/libxfs/xfs_dir2.c index ea84e1c..fdd391f 100644 --- a/fs/xfs/libxfs/xfs_dir2.c +++ b/fs/xfs/libxfs/xfs_dir2.c @@ -237,7 +237,8 @@ xfs_dir_init( } /* - Enter a name in a directory. + * Enter a name in a directory, or check for available space. + * If inum is 0, only the available space test is performed. */ int xfs_dir_createname( @@ -254,10 +255,12 @@ xfs_dir_createname( int v; /* type-checking value */ ASSERT(S_ISDIR(dp->i_d.di_mode)); - rval = xfs_dir_ino_validate(tp->t_mountp, inum); - if (rval) - return rval; - XFS_STATS_INC(xs_dir_create); + if (inum) { + rval = xfs_dir_ino_validate(tp->t_mountp, inum); + if (rval) + return rval; + XFS_STATS_INC(xs_dir_create); + } args = kmem_zalloc(sizeof(*args), KM_SLEEP | KM_NOFS); if (!args) @@ -276,6 +279,8 @@ xfs_dir_createname( args->whichfork = XFS_DATA_FORK; args->trans = tp; args->op_flags = XFS_DA_OP_ADDNAME | XFS_DA_OP_OKNOENT; + if (!inum) + args->op_flags |= XFS_DA_OP_JUSTCHECK; if (dp->i_d.di_format == XFS_DINODE_FMT_LOCAL) { rval = xfs_dir2_sf_addname(args); @@ -542,50 +547,7 @@ xfs_dir_canenter( xfs_inode_t *dp, struct xfs_name *name) /* name of entry to add */ { - struct xfs_da_args *args; - int rval; - int v; /* type-checking value */ - - ASSERT(S_ISDIR(dp->i_d.di_mode)); - - args = kmem_zalloc(sizeof(*args), KM_SLEEP | KM_NOFS); - if (!args) - return -ENOMEM; - - args->geo = dp->i_mount->m_dir_geo; - args->name = name->name; - args->namelen = name->len; - args->filetype = name->type; - args->hashval = dp->i_mount->m_dirnameops->hashname(name); - args->dp = dp; - args->whichfork = XFS_DATA_FORK; - args->trans = tp; - args->op_flags = XFS_DA_OP_JUSTCHECK | XFS_DA_OP_ADDNAME | - XFS_DA_OP_OKNOENT; - - if (dp->i_d.di_format == XFS_DINODE_FMT_LOCAL) { - rval = xfs_dir2_sf_addname(args); - goto out_free; - } - - rval = xfs_dir2_isblock(args, &v); - if (rval) - goto out_free; - if (v) { - rval = xfs_dir2_block_addname(args); - goto out_free; - } - - rval = xfs_dir2_isleaf(args, &v); - if (rval) - goto out_free; - if (v) - rval = xfs_dir2_leaf_addname(args); - else - rval = xfs_dir2_node_addname(args); -out_free: - kmem_free(args); - return rval; + return xfs_dir_createname(tp, dp, name, 0, NULL, NULL, 0); } /* From david@fromorbit.com Thu Aug 28 21:52: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 (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id BF8C77F8A for ; Thu, 28 Aug 2014 21:52:26 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 41517AC003 for ; Thu, 28 Aug 2014 19:52:25 -0700 (PDT) X-ASG-Debug-ID: 1409280742-04cbb054858ddcc0001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id g30tn8DzycbK7qdZ for ; Thu, 28 Aug 2014 19:52:23 -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: Aj0aADPq/1N5LDJ8PGdsb2JhbABbgw1TV4IsUIQ3p04GBphUgWWFcgGBFRcFAQEBATg2hAMBAQQBIw8BIyMFCwgDGAICBSECAg8FJQMHGhOIOgemFJQ3FxiBFIRQhAOEaxEBUAeCeYFTBYUEApBXhnyBXIlSb4xxKy+BCAcXBoEjAQEB Received: from ppp121-44-50-124.lns20.syd6.internode.on.net (HELO dastard) ([121.44.50.124]) by ipmail06.adl6.internode.on.net with ESMTP; 29 Aug 2014 12:22:21 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1XNCIU-0002Vd-SY; Fri, 29 Aug 2014 12:52:18 +1000 Date: Fri, 29 Aug 2014 12:52:18 +1000 From: Dave Chinner To: Iustin Pop Cc: Iustin Pop , xfs@oss.sgi.com, hch@infradead.org, fstests@vger.kernel.org Subject: Re: [PATCH xfstests] xfs: add tests for XFS_IOC_FSSETXATTR behaviour Message-ID: <20140829025218.GG26465@dastard> X-ASG-Orig-Subj: Re: [PATCH xfstests] xfs: add tests for XFS_IOC_FSSETXATTR behaviour References: <20140718191314.GB27801@teal.hq.k1024.org> <1409199840-16907-1-git-send-email-iusty@k1024.org> <20140828101628.GS20518@dastard> <20140828222854.GB29940@google.com> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <20140828222854.GB29940@google.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: 1409280742 X-Barracuda-URL: http://192.48.176.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.8938 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Thu, Aug 28, 2014 at 03:28:54PM -0700, Iustin Pop wrote: > On Don, Aug 28, 2014 at 08:16:28 +1000, Dave Chinner wrote: > > [cc fstests@vger.kernel.org] > > > > On Wed, Aug 27, 2014 at 09:24:00PM -0700, Iustin Pop wrote: > > > Add two tests that check for correct behaviour of XFS_IOC_FSSETXATTR: > > > > > > - 307: check that extent size can always be set on a directory > > > - 308: check that setting a non-zero extent size directly via the ioctl > > > sets the expected flags (EXTSIZE and EXTSZINHERIT) > > > > > > Signed-off-by: Iustin Pop > > > > Minor stuff first: > > > > - xfstests patches should be sent to fstests@vger.kernel.org now. > > OK, will do. There was nothing written in the git repository's README, > hence I chose what I thought best. Documentation always needs updating, and stuff is in the process of being moved around. > > > +# Copyright (c) 2014 Google Inc. All Rights Reserved. > > > > Is that correct? It doesn't match the email address you sent this > > from and I've never seen you post from a @google.com address. I > > always like to check that the copyright assignment is correct in > > situations like this... > > It is correct indeed (and thanks for double-checking). I prefer to send > my interactions/contributions done not as part of my job using my > personal address (hence I always wrote to xfs@ from the same address), > but even in that case, the copyright remains with my employer. > > Just as a confirmation, sending this email from my @google.com address. Thanks, I'll know in future ;) > > > +# now create a 'big' (with extents) directory > > > +mkdir $big > > > +idx=1 > > > +while xfs_bmap $big | grep -q "no extents"; do > > > + touch $big/$idx > > > + idx=$((idx+1)) > > > + if [ "$idx" -gt 1048576 ]; then > > > + # still no extents? giving up > > > + echo "Can't make a directory to have extents even after 1M files" 1>&2 > > > + exit > > > + fi > > > +done > > > > urk. largest inode size is 2kb, which means at most it can fit less > > than 100 dirents in the inode before spilling to extent form. So > > just do a loop that creates 1000 files - there's no need to > > overengineer the test code. > > Will do. It's fine to still check that the directory does have extents, > I hope? $XFS_IO_PROG -c 'bmap -vp' $big | _filter_bmap > > > +int main(int argc, char **argv) { > > > + struct fsxattr fa; > > > + int fd = open(argv[1], O_RDONLY); > > > + if (fd < 0) { > > > + perror("open"); > > > + return 1; > > > + } > > > + fa.fsx_xflags = 0; > > > + fa.fsx_extsize = 1048576 * 8; > > > + int r = xfsctl(argv[1], fd, XFS_IOC_FSSETXATTR, &fa); > > > > .... that code is quite broken. Yes, it would work to set the > > appropriate extent size flags with the kernel > > changes you made, but that's not how this ioctl works. > > > > i.e. it will cause any flag bits that are set on the inode to be > > cleared > > Good point… > > > and it's likely to fail on old kernels beacuse they have > > very different behaviour to what your patch does. > > OK, that I didn't know. (Would you mind quickly explaining?) The extsize hint on the inode is not used by the kernel code unless the XFS_XFLAG_EXTSIZE is also set. So existing kernels may set the inode extszhint field, but the code will ignore it because the flags didn't get set on the inode. See xfs_get_extsz_hint(). With your kernel changes, the above *invalid* code will result in the flags being set on the inode, and so there's a change of behaviour from "old kernel, does not trigger extsz behaviour" to "new kernel, extsz behaviour is invoked". > > We have xfs_io precisely so that we don't have to maintain random > > test code like this throughout xfstests - do it once, do it right, > > use it everywhere. > > I totally agree that xfs_io is what people should use, but I disagree on > the use of xfs_io in this particular test, let me explain why. > > With 3.16-rc1 at least, it is possible to set fsx_extsize to a non-zero > value, without setting the flags (if you call the ioctl directly). Such > an inode will be (unless I'm mistaken) flagged with a warning by > xfs_repair, which means that it's an invalid inode state. Yes, since this commit bd5683f ("xfs_repair: validate inode di_flags field") in 2011 repair will flag that the hint is non-zero but the correct flags are not set. Likewise it will warn if the wrong flags are set. You can get wrong flags set on the inode in many ways, but historically the kernel and repair utilities haven't cared. > So in my view, there's a kernel bug, in that it allows a user land > application to put an inode into a "wrong" state. This particular test > is designed to reproduce this kernel bug, so that the kernel fix can be > verified that is indeed a fix. Yes this is not what xfstests is for. If we fix an API bug, there's little value to testing forever that the API is fixed. What we are trying to cover is that when the parameters are set correctly that the behaviour is correct. If you want to do "is the API validating user input correctly" testing then that's what trinity is for. Dave Jones has long wanted to get better ioctl coverage for filesystem specific operations, so I'd suggest that this is the avenue for testing whether an API behaves correctly and catches all invalid input. Then we get to fix all the problems that trinity causes, just like the mm folk have been doing for the past couple of years... Cheers, Dave. -- Dave Chinner david@fromorbit.com From stefanrin@gmail.com Fri Aug 29 01:31: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 (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id C9C757F86 for ; Fri, 29 Aug 2014 01:31:52 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id A9A2D8F8052 for ; Thu, 28 Aug 2014 23:31:49 -0700 (PDT) X-ASG-Debug-ID: 1409293904-04bdf0109a5ee6e0001-NocioJ Received: from mail-wi0-f169.google.com (mail-wi0-f169.google.com [209.85.212.169]) by cuda.sgi.com with ESMTP id PX3LE8PFHmLIg5Uc (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Thu, 28 Aug 2014 23:31:45 -0700 (PDT) X-Barracuda-Envelope-From: stefanrin@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.212.169 X-Barracuda-IPDD: Level1 [gmail.com/209.85.212.169] Received: by mail-wi0-f169.google.com with SMTP id n3so352085wiv.4 for ; Thu, 28 Aug 2014 23:31:44 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.212.169] X-Barracuda-IPDD: Level1 [gmail.com/209.85.212.169] 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:content-transfer-encoding; bh=2nPnr4Lc3CfvX/PPhO2BNqC1shQJo9R4pZrWNvd0LMg=; b=jaqHV7aYayPx9GaE+fdfSNBRxc4AjXeYoMR/LvyELTtLlwD2wuwTugUnun06dm7Bpd PK2j7l5+/6L2z4Eh369omKR/giNrA2D0JzubGrl34ITokSFXIMorJqpk+SAKajAYhsiR KlNnhJYsCJ7nRK4wyj3nW/T/8yNbaVZCxZ55Wfxo4BjbLcRV+0CAdzblE57omJyNU6Y0 MW1y6zLPVlB9LadjjD3j8T10CHPW7Maa0Urhilmjlxfi74/PfdDDoeNolEPxEGohxsS3 9aRQiX5CtuQbkaPiXxov3kzWiZQ8LYRzlAmxS7+43tYmGYWklc/LSPfK4n46BieXpnQz QkcQ== MIME-Version: 1.0 X-Received: by 10.194.122.6 with SMTP id lo6mr11167088wjb.17.1409293904003; Thu, 28 Aug 2014 23:31:44 -0700 (PDT) Received: by 10.194.80.161 with HTTP; Thu, 28 Aug 2014 23:31:43 -0700 (PDT) In-Reply-To: <20140827230732.GN20518@dastard> References: <3dc9caf6f9b415f6e4c0ebac1f1626d3@zbfmail.de> <20140827230732.GN20518@dastard> Date: Fri, 29 Aug 2014 08:31:43 +0200 Message-ID: Subject: Re: mount options question From: Stefan Ring X-ASG-Orig-Subj: Re: mount options question To: Dave Chinner Cc: weber@zbfmail.de, Xfs Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable X-Barracuda-Connect: mail-wi0-f169.google.com[209.85.212.169] X-Barracuda-Start-Time: 1409293904 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.8943 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, Aug 28, 2014 at 1:07 AM, Dave Chinner wrote: > On Wed, Aug 27, 2014 at 12:14:21PM +0200, Marko Weber|8000 wrote: >> >> sorry dave and all other, >> >> can you guys recommend me the most stable / best mount options for >> my new server with ssd=C2=B4s and XFS filesystem? >> >> at moment i would set: defaults,nobarrier,discard,logbsize=3D256k,noike= ep >> or is just "default" the best solution and xfs detect itself whats best. >> >> can you guide me a bit? >> >> as eleavtor i set elevator=3Dnoop >> >> i setup disks with linux softraid raid1. On top of the raid is LVM >> (for some data partations). >> >> >> would be nice to hear some tipps from you > > Unless you have specific requirements or have the knowledge to > understand how the different options affect behaviour, then just use > the defaults. Mostly agreed, but using "discard" would be a no-brainer for me. I suppose XFS does not automatically switch it on for non-rotational storage. From david@fromorbit.com Fri Aug 29 03:38: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 07ABF7F92 for ; Fri, 29 Aug 2014 03:38:07 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id DA9948F804B for ; Fri, 29 Aug 2014 01:38:03 -0700 (PDT) X-ASG-Debug-ID: 1409301476-04cb6c54fd6608c0001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id ogKBOjKQPDx0eykm for ; Fri, 29 Aug 2014 01:37:57 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.145 Received: from ppp121-44-50-124.lns20.syd6.internode.on.net (HELO dastard) ([121.44.50.124]) by ipmail06.adl6.internode.on.net with ESMTP; 29 Aug 2014 18:07:41 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1XNHgg-0003C8-Bm; Fri, 29 Aug 2014 18:37:38 +1000 Date: Fri, 29 Aug 2014 18:37:38 +1000 From: Dave Chinner To: Stefan Ring Cc: weber@zbfmail.de, Xfs Subject: Re: mount options question Message-ID: <20140829083738.GD20518@dastard> X-ASG-Orig-Subj: Re: mount options question References: <3dc9caf6f9b415f6e4c0ebac1f1626d3@zbfmail.de> <20140827230732.GN20518@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1409301476 X-Barracuda-URL: http://192.48.176.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.8946 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Fri, Aug 29, 2014 at 08:31:43AM +0200, Stefan Ring wrote: > On Thu, Aug 28, 2014 at 1:07 AM, Dave Chinner wrote: > > On Wed, Aug 27, 2014 at 12:14:21PM +0200, Marko Weber|8000 wrote: > >> > >> sorry dave and all other, > >> > >> can you guys recommend me the most stable / best mount options for > >> my new server with ssd´s and XFS filesystem? > >> > >> at moment i would set: defaults,nobarrier,discard,logbsize=256k,noikeep > >> or is just "default" the best solution and xfs detect itself whats best. > >> > >> can you guide me a bit? > >> > >> as eleavtor i set elevator=noop > >> > >> i setup disks with linux softraid raid1. On top of the raid is LVM > >> (for some data partations). > >> > >> > >> would be nice to hear some tipps from you > > > > Unless you have specific requirements or have the knowledge to > > understand how the different options affect behaviour, then just use > > the defaults. > > Mostly agreed, but using "discard" would be a no-brainer for me. I > suppose XFS does not automatically switch it on for non-rotational > storage. Yup, you're not using your brain. :P mount -o discard *sucks* on so many levels it is not funny. I don't recommend that anybody *ever* use it, on XFS, ext4 or btrfs. Just use fstrim if you ever need to clean up a SSD. Cheers, Dave. -- Dave Chinner david@fromorbit.com From webmaster@dev102.magizz.com Fri Aug 29 03:39: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=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 119207F95 for ; Fri, 29 Aug 2014 03:39:20 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id E458F8F8050 for ; Fri, 29 Aug 2014 01:39:19 -0700 (PDT) X-ASG-Debug-ID: 1409301556-04cbb054868eb000001-NocioJ Received: from vps.magizz.com (vps.magizz.com [162.251.83.157]) by cuda.sgi.com with ESMTP id 5ExYHjRLo4DmfSjz (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 29 Aug 2014 01:39:17 -0700 (PDT) X-Barracuda-Envelope-From: webmaster@dev102.magizz.com X-Barracuda-Apparent-Source-IP: 162.251.83.157 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=dev102.magizz.com; s=default; h=Content-Type:Content-Transfer-Encoding:MIME-Version:List-Unsubscribe:Message-ID:Reply-To:From:Date:Subject:To; bh=/ghb0Pe4at666Uy2r6SBKlGrOhAhRojJ8HljdVVdRyI=; b=R2DD6QuDmcVQn4yuoNOfg4zHS3/dziUyLQvh2J+TZtlb5qXVQ9XT3E9xyPsVgSfGqgC3Hm99Vd1DLIZbWVcIrZLqqF6lkIuZrwJU+dIHfzetpbD/n2vRLty51zSn99GszdZqpq80s9N/6Z/5tKiXOqMGNGNlXaCcwjMvmiSPbaA=; Received: from dev102magizz by vps.magizz.com with local (Exim 4.82) (envelope-from ) id 1XNHiG-0001YZ-Fj for xfs@oss.sgi.com; Fri, 29 Aug 2014 12:39:16 +0400 To: xfs@oss.sgi.com Subject: Goodbye from our newsletter X-PHP-Script: dev102.magizz.com/mailz/index.php for 66.249.65.30 X-ASG-Orig-Subj: Goodbye from our newsletter Received: from crawl-66-249-65-30.googlebot.com [66.249.65.30] by dev102.magizz.com with HTTP; Fri, 29 Aug 2014 08:39:14 +0000 Date: Fri, 29 Aug 2014 08:39:16 +0000 From: Webmaster Reply-To: Webmaster Message-ID: X-Priority: 3 X-Mailer: PHPMailer 5.2.5 (https://github.com/Synchro/PHPMailer/) X-phpList-version: 3.0.7 X-MessageID: systemmessage X-ListMember: xfs@oss.sgi.com Precedence: bulk Bounces-To: webmaster@dev102.magizz.com List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Content-Type: text/plain; charset=UTF-8 X-AntiAbuse: This header was added to track abuse, please include it with any abuse report X-AntiAbuse: Primary Hostname - vps.magizz.com X-AntiAbuse: Original Domain - oss.sgi.com X-AntiAbuse: Originator/Caller UID/GID - [503 514] / [47 12] X-AntiAbuse: Sender Address Domain - dev102.magizz.com X-Get-Message-Sender-Via: vps.magizz.com: authenticated_id: dev102magizz/from_h X-Barracuda-Connect: vps.magizz.com[162.251.83.157] X-Barracuda-Start-Time: 1409301557 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 X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.8946 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature Goodbye from our Newsletter, sorry to see you go. You have been unsubscribed from our newsletters. This is the last email you will receive from us. Our newsletter system, phpList, will refuse to send you any further messages, without manual intervention by our administrator. If there is an error in this information, you can re-subscribe: please go to http://dev102.magizz.com/mailz/?p=subscribe and follow the steps. Thank you From samuel.granjeaud@inserm.fr Fri Aug 29 05:08: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 (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id D099B7F95 for ; Fri, 29 Aug 2014 05:08:15 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id BECD8304039 for ; Fri, 29 Aug 2014 03:08:12 -0700 (PDT) X-ASG-Debug-ID: 1409306889-04cb6c5500663820001-NocioJ Received: from smtp.inserm.fr (smtp.inserm.fr [195.98.252.37]) by cuda.sgi.com with ESMTP id tu4YElnHXL2FSJ71 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 29 Aug 2014 03:08:11 -0700 (PDT) X-Barracuda-Envelope-From: samuel.granjeaud@inserm.fr X-Barracuda-Apparent-Source-IP: 195.98.252.37 Received: from localhost (localhost.localdomain [127.0.0.1]) by smtp.inserm.fr (SrvInserm) with ESMTP id 5B61216846A for ; Fri, 29 Aug 2014 12:08:09 +0200 (CEST) X-Virus-Scanned: amavisd-new at inserm.fr Received: from smtp.inserm.fr ([195.98.252.37]) by localhost (potentille.inserm.fr [127.0.0.1]) (amavisd-new, port 10026) with ESMTP id btTV-QTKML_1 for ; Fri, 29 Aug 2014 12:08:09 +0200 (CEST) Received: from cognac-lmde.crcm.mrs (236-ne1068.marseille.inserm.fr [195.220.68.236]) (using TLSv1 with cipher DHE-RSA-AES128-SHA (128/128 bits)) (No client certificate requested) by smtp.inserm.fr (SrvInserm) with ESMTP id 428651683DD for ; Fri, 29 Aug 2014 12:08:08 +0200 (CEST) Message-ID: <54005108.1020203@inserm.fr> Date: Fri, 29 Aug 2014 12:08:08 +0200 From: Samuel Granjeaud User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Thunderbird/24.6.0 MIME-Version: 1.0 To: xfs@oss.sgi.com Subject: Run out of inodes? Content-Type: text/plain; charset=ISO-8859-1; format=flowed X-ASG-Orig-Subj: Run out of inodes? Content-Transfer-Encoding: 7bit X-Barracuda-Connect: smtp.inserm.fr[195.98.252.37] X-Barracuda-Start-Time: 1409306890 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.8948 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Hi, Sorry if the answer is obvious, but I didn't find any clear answer after googling. I have a XFS system of 18T over LVM. Recently, I could not create new files or directories. # mkdir tempo mkdir: cannot create directory `tempo': No space left on device After deleting a few files, this command runs successfully. So I think that the system runs out of something, inodes I guess. But the df diagnosis does not enlight it: only 1% used. # df -ht xfs Filesystem Size Used Avail Use% Mounted on /dev/mapper/vg1_backup-backup 18T 12T 6.6T 63% /mnt/vg1_backup/backup # df -it xfs Filesystem Inodes IUsed IFree IUse% Mounted on /dev/mapper/vg1_backup-backup 18874040320 530042 18873510278 1% /mnt/vg1_backup/backup So what is wrong? How should I solve the problem? I read about xfs_grow -m, but I am not sure if it could help. Of course, I rebooted the system before my trials. Best regards, Samuel From greg.freemyer@gmail.com Fri Aug 29 06:27: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=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 6DC2B7F9F for ; Fri, 29 Aug 2014 06:27:11 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id E2A77AC001 for ; Fri, 29 Aug 2014 04:27:07 -0700 (PDT) X-ASG-Debug-ID: 1409311626-04cbb054878f1920001-NocioJ Received: from mail-qa0-f46.google.com (mail-qa0-f46.google.com [209.85.216.46]) by cuda.sgi.com with ESMTP id QKCLR2E3DTp7VxL7 (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Fri, 29 Aug 2014 04:27:06 -0700 (PDT) X-Barracuda-Envelope-From: greg.freemyer@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.216.46 X-Barracuda-IPDD: Level1 [gmail.com/209.85.216.46] Received: by mail-qa0-f46.google.com with SMTP id w8so1974503qac.33 for ; Fri, 29 Aug 2014 04:27:06 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.216.46] X-Barracuda-IPDD: Level1 [gmail.com/209.85.216.46] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=user-agent:in-reply-to:references:mime-version :content-transfer-encoding:content-type:subject:from:date:to:cc :message-id; bh=ECpCMf8S2hiuCO+hLw6n9QCpUwSjkwxqlC1+5fQXiu0=; b=TezQ0E0CA8Eq23zCl0MpdSR66SeUY6C2jPkuPaUjZXapA+1kFcfTIoAR3gLKYsYukA P3r10CncVxKNKMUG85vfgCASwOhzhFf7wJn+6BTrJlCar0X7qrfReP4VVT/sihkDibOW e3ihAipK5XDCdRofuSh2MNXaDpLk9PoTtC47Mrsimuj0UlRvlfKuOPdk3A48Hth0rN7j qsSB2SOYJzwRTkfmXH+TFCXkPHVHC14WIJBTXMlBQmNRpdQdbKekkroV2ZbBNu9+mb0o pnTwOOcqGP/+OaWh9tkB9tj4rYGgoArTMGxl/dr3XxnjHRF/owSqRvJQ58Oh15tzJLsQ pvlw== X-Received: by 10.224.16.138 with SMTP id o10mr16695198qaa.12.1409311626093; Fri, 29 Aug 2014 04:27:06 -0700 (PDT) Received: from [192.168.3.56] (c-98-251-114-210.hsd1.ga.comcast.net. [98.251.114.210]) by mx.google.com with ESMTPSA id b89sm10065323qgb.0.2014.08.29.04.27.04 for (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Fri, 29 Aug 2014 04:27:05 -0700 (PDT) User-Agent: K-9 Mail for Android In-Reply-To: <20140829083738.GD20518@dastard> References: <3dc9caf6f9b415f6e4c0ebac1f1626d3@zbfmail.de> <20140827230732.GN20518@dastard> <20140829083738.GD20518@dastard> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Content-Type: text/plain; charset=UTF-8 Subject: Re: mount options question From: Greg Freemyer X-ASG-Orig-Subj: Re: mount options question Date: Fri, 29 Aug 2014 07:26:59 -0400 To: Dave Chinner ,Stefan Ring CC: Xfs ,weber@zbfmail.de Message-ID: <6306cfa5-457d-4794-8fc0-1768f7f1deec@email.android.com> X-Barracuda-Connect: mail-qa0-f46.google.com[209.85.216.46] X-Barracuda-Start-Time: 1409311626 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.8950 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 August 29, 2014 4:37:38 AM EDT, Dave Chinner wrote: >On Fri, Aug 29, 2014 at 08:31:43AM +0200, Stefan Ring wrote: >> On Thu, Aug 28, 2014 at 1:07 AM, Dave Chinner >wrote: >> > On Wed, Aug 27, 2014 at 12:14:21PM +0200, Marko Weber|8000 wrote: >> >> >> >> sorry dave and all other, >> >> >> >> can you guys recommend me the most stable / best mount options for >> >> my new server with ssd´s and XFS filesystem? >> >> >> >> at moment i would set: >defaults,nobarrier,discard,logbsize=256k,noikeep >> >> or is just "default" the best solution and xfs detect itself whats >best. >> >> >> >> can you guide me a bit? >> >> >> >> as eleavtor i set elevator=noop >> >> >> >> i setup disks with linux softraid raid1. On top of the raid is LVM >> >> (for some data partations). >> >> >> >> >> >> would be nice to hear some tipps from you >> > >> > Unless you have specific requirements or have the knowledge to >> > understand how the different options affect behaviour, then just >use >> > the defaults. >> >> Mostly agreed, but using "discard" would be a no-brainer for me. I >> suppose XFS does not automatically switch it on for non-rotational >> storage. > >Yup, you're not using your brain. :P > >mount -o discard *sucks* on so many levels it is not funny. I don't >recommend that anybody *ever* use it, on XFS, ext4 or btrfs. Just >use fstrim if you ever need to clean up a SSD. In particular trim is a synchronous command in many SSDs, I don't know about the impact on the kernel block stack. For the SSD itself that means the SSDs basically flush their write cache on every trim call. I often tell people to do performance testing with and without it and report back to me if they see no degradation caused by -o discard. To date no one has ever reported back. I think -o discard should have never been introduced and certainly not 5 years ago. In theory, SSDs that handle trim as a asynchronous command are now available, but I don't know any specifics. In any case, fstrim works for almost all workloads and doesn't have the potential continuous negative impact of -o discard. Greg -- Sent from my Android phone with K-9 Mail. Please excuse my brevity. From eflorac@intellique.com Fri Aug 29 06:43: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 10C337FA3 for ; Fri, 29 Aug 2014 06:43:44 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 91848AC002 for ; Fri, 29 Aug 2014 04:43:43 -0700 (PDT) X-ASG-Debug-ID: 1409312621-04cbb054858f21d0001-NocioJ Received: from mail1.g1.pair.com (mail1.g1.pair.com [66.39.3.162]) by cuda.sgi.com with ESMTP id vxkjA9UUYYhyCADr (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 29 Aug 2014 04:43:41 -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 3E6C82B885; Fri, 29 Aug 2014 07:43:41 -0400 (EDT) Received: from harpe.intellique.com (labo.djinux.com [82.225.196.72]) by mail1.g1.pair.com (Postfix) with ESMTPSA id 3290A2B3C1; Fri, 29 Aug 2014 07:43:40 -0400 (EDT) Date: Fri, 29 Aug 2014 13:43:43 +0200 From: Emmanuel Florac To: Samuel Granjeaud Cc: xfs@oss.sgi.com Subject: Re: Run out of inodes? Message-ID: <20140829134343.5d1c1c61@harpe.intellique.com> X-ASG-Orig-Subj: Re: Run out of inodes? In-Reply-To: <54005108.1020203@inserm.fr> References: <54005108.1020203@inserm.fr> Organization: Intellique X-Mailer: Claws Mail 3.10.0 (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: 1409312621 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.8950 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Le Fri, 29 Aug 2014 12:08:08 +0200 Samuel Granjeaud =E9crivait: > I have a XFS system of 18T over LVM. Recently, I could not create new=20 > files or directories. What is the distribution, the kernel version (uname -a)? What are the mount options? Maybe the FS has been mounted with inode64 as an option at some point in time, but isn't anymore? --=20 ------------------------------------------------------------------------ Emmanuel Florac | Direction technique | Intellique | | +33 1 78 94 84 02 ------------------------------------------------------------------------ From bfoster@redhat.com Fri Aug 29 06:48: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 DD6B57FA6 for ; Fri, 29 Aug 2014 06:48:23 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id BCE8A304048 for ; Fri, 29 Aug 2014 04:48:20 -0700 (PDT) X-ASG-Debug-ID: 1409312898-04cb6c55006678e0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id IiQ5ei2ehe8gEJ5M (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 29 Aug 2014 04:48: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-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 s7TBm7cr006162 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL); Fri, 29 Aug 2014 07:48:08 -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 s7TBm7pc010287; Fri, 29 Aug 2014 07:48:07 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 8A72112577F; Fri, 29 Aug 2014 07:48:06 -0400 (EDT) Date: Fri, 29 Aug 2014 07:48:06 -0400 From: Brian Foster To: Samuel Granjeaud Cc: xfs@oss.sgi.com Subject: Re: Run out of inodes? Message-ID: <20140829114806.GA17610@bfoster.bfoster> X-ASG-Orig-Subj: Re: Run out of inodes? References: <54005108.1020203@inserm.fr> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <54005108.1020203@inserm.fr> 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: 1409312899 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Fri, Aug 29, 2014 at 12:08:08PM +0200, Samuel Granjeaud wrote: > Hi, > > Sorry if the answer is obvious, but I didn't find any clear answer after > googling. > > I have a XFS system of 18T over LVM. Recently, I could not create new files > or directories. > > # mkdir tempo > mkdir: cannot create directory `tempo': No space left on device > > After deleting a few files, this command runs successfully. > > So I think that the system runs out of something, inodes I guess. > > But the df diagnosis does not enlight it: only 1% used. > > # df -ht xfs > Filesystem Size Used Avail Use% Mounted on > /dev/mapper/vg1_backup-backup > 18T 12T 6.6T 63% /mnt/vg1_backup/backup > # df -it xfs > Filesystem Inodes IUsed IFree IUse% Mounted on > /dev/mapper/vg1_backup-backup > 18874040320 530042 18873510278 1% > /mnt/vg1_backup/backup > > So what is wrong? How should I solve the problem? > > I read about xfs_grow -m, but I am not sure if it could help. > Of course, I rebooted the system before my trials. > You should probably include more information for context: http://xfs.org/index.php/XFS_FAQ#Q:_What_information_should_I_include_when_reporting_a_problem.3F That aside... is inode64 enabled? Is imaxpct set to a non-default value? Also, how is this filesystem used? I notice it's named as some kind of backup volume. Brian > Best regards, > Samuel > > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From bfoster@redhat.com Fri Aug 29 07:13: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 (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id B9CA07FAB for ; Fri, 29 Aug 2014 07:13:09 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id A723E8F8049 for ; Fri, 29 Aug 2014 05:13:06 -0700 (PDT) X-ASG-Debug-ID: 1409314385-04cb6c54ff668570001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id dJpPaV0OMomRmox7 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 29 Aug 2014 05:13: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-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 s7TCD2cl004488 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL); Fri, 29 Aug 2014 08:13:03 -0400 Received: from laptop.bfoster (vpn-61-58.rdu2.redhat.com [10.10.61.58]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s7TCD0r5028464 (version=TLSv1/SSLv3 cipher=AES128-GCM-SHA256 bits=128 verify=NO); Fri, 29 Aug 2014 08:13:02 -0400 Date: Fri, 29 Aug 2014 08:13:00 -0400 From: Brian Foster To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 1/7 v2] xfs: don't dirty buffers beyond EOF Message-ID: <20140829121300.GA3640@laptop.bfoster> X-ASG-Orig-Subj: Re: [PATCH 1/7 v2] xfs: don't dirty buffers beyond EOF References: <1409226551-16570-1-git-send-email-david@fromorbit.com> <1409226551-16570-2-git-send-email-david@fromorbit.com> <20140828133457.GA35386@bfoster.bfoster> <20140828223706.GT20518@dastard> <20140828234932.GW20518@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140828234932.GW20518@dastard> 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: 1409314385 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Fri, Aug 29, 2014 at 09:49:32AM +1000, Dave Chinner wrote: > > From: Dave Chinner > > generic/263 is failing fsx at this point with a page spanning > EOF that cannot be invalidated. The operations are: > > 1190 mapwrite 0x52c00 thru 0x5e569 (0xb96a bytes) > 1191 mapread 0x5c000 thru 0x5d636 (0x1637 bytes) > 1192 write 0x5b600 thru 0x771ff (0x1bc00 bytes) > > where 1190 extents EOF from 0x54000 to 0x5e569. When the direct IO > write attempts to invalidate the cached page over this range, it > fails with -EBUSY and so any attempt to do page invalidation fails. > > The real question is this: Why can't that page be invalidated after > it has been written to disk and cleaned? > > Well, there's data on the first two buffers in the page (1k block > size, 4k page), but the third buffer on the page (i.e. beyond EOF) > is failing drop_buffers because it's bh->b_state == 0x3, which is > BH_Uptodate | BH_Dirty. IOWs, there's dirty buffers beyond EOF. Say > what? > > OK, set_buffer_dirty() is called on all buffers from > __set_page_buffers_dirty(), regardless of whether the buffer is > beyond EOF or not, which means that when we get to ->writepage, > we have buffers marked dirty beyond EOF that we need to clean. > So, we need to implement our own .set_page_dirty method that > doesn't dirty buffers beyond EOF. > > This is messy because the buffer code is not meant to be shared > and it has interesting locking issues on the buffer dirty bits. > So just copy and paste it and then modify it to suit what we need. > > Note: the solutions the other filesystems and generic block code use > of marking the buffers clean in ->writepage does not work for XFS. > It still leaves dirty buffers beyond EOF and invalidations still > fail. Hence rather than play whack-a-mole, this patch simply > prevents those buffers from being dirtied in the first place. > > cc: > Signed-off-by: Dave Chinner > --- > > v2: fix page offset calculation. passed 61 million fsx ops before > hitting an unrelated problem in xfs_zero_file_space(), so no > difference to the result with this updated patch. > > fs/xfs/xfs_aops.c | 58 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ > 1 file changed, 58 insertions(+) > > diff --git a/fs/xfs/xfs_aops.c b/fs/xfs/xfs_aops.c > index 11e9b4c..9bd2f53 100644 > --- a/fs/xfs/xfs_aops.c > +++ b/fs/xfs/xfs_aops.c > @@ -1753,11 +1753,69 @@ xfs_vm_readpages( > return mpage_readpages(mapping, pages, nr_pages, xfs_get_blocks); > } > > +/* > + * This is basically a copy of __set_page_dirty_buffers() with one > + * small tweak: buffers beyond EOF do not get marked dirty. If we mark them > + * dirty, we'll never be able to clean them because we don't write buffers > + * beyond EOF, and that means we can't invalidate pages that span EOF > + * that have been marked dirty. Further, the dirty state can leak into > + * the file interior if the file is extended, resulting in all sorts of > + * bad things happening as the state does not match the unerlying data. underlying I tend to agree with Christoph in that it would be nice if this was handled generically one way or another. That said, I understand not wanting to tweak behavior for other filesystems. You mention that the trajectory for XFS is to kill the use of buffer heads, I suppose that means this code is hopefully short-lived and probably less likely subject to problems due to changes in the core code. Given that and the fact that it looks correct at this point: Reviewed-by: Brian Foster Though it would be nice to see a small addition to the comment above to state that explicitly. E.g., 'XXX this code should die when buffer heads in XFS die...' or something along those lines... thanks. Brian > + */ > +STATIC int > +xfs_vm_set_page_dirty( > + struct page *page) > +{ > + struct address_space *mapping = page->mapping; > + struct inode *inode = mapping->host; > + loff_t end_offset; > + loff_t offset; > + int newly_dirty; > + > + if (unlikely(!mapping)) > + return !TestSetPageDirty(page); > + > + end_offset = i_size_read(inode); > + offset = page_offset(page); > + > + spin_lock(&mapping->private_lock); > + if (page_has_buffers(page)) { > + struct buffer_head *head = page_buffers(page); > + struct buffer_head *bh = head; > + > + do { > + if (offset < end_offset) > + set_buffer_dirty(bh); > + bh = bh->b_this_page; > + offset += 1 << inode->i_blkbits; > + } while (bh != head); > + } > + newly_dirty = !TestSetPageDirty(page); > + spin_unlock(&mapping->private_lock); > + > + if (newly_dirty) { > + /* sigh - __set_page_dirty() is static, so copy it here, too */ > + unsigned long flags; > + > + spin_lock_irqsave(&mapping->tree_lock, flags); > + if (page->mapping) { /* Race with truncate? */ > + WARN_ON_ONCE(!PageUptodate(page)); > + account_page_dirtied(page, mapping); > + radix_tree_tag_set(&mapping->page_tree, > + page_index(page), PAGECACHE_TAG_DIRTY); > + } > + spin_unlock_irqrestore(&mapping->tree_lock, flags); > + __mark_inode_dirty(mapping->host, I_DIRTY_PAGES); > + } > + return newly_dirty; > +} > + > const struct address_space_operations xfs_address_space_operations = { > .readpage = xfs_vm_readpage, > .readpages = xfs_vm_readpages, > .writepage = xfs_vm_writepage, > .writepages = xfs_vm_writepages, > + .set_page_dirty = xfs_vm_set_page_dirty, > .releasepage = xfs_vm_releasepage, > .invalidatepage = xfs_vm_invalidatepage, > .write_begin = xfs_vm_write_begin, > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From samuel.granjeaud@inserm.fr Fri Aug 29 08:29: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.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 899457FAA for ; Fri, 29 Aug 2014 08:29:27 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 78043304032 for ; Fri, 29 Aug 2014 06:29:24 -0700 (PDT) X-ASG-Debug-ID: 1409318957-04cbb054868f65f0001-NocioJ Received: from smtp.inserm.fr (smtp.inserm.fr [195.98.252.37]) by cuda.sgi.com with ESMTP id Cb3XDCkndKGCaTS7 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 29 Aug 2014 06:29:18 -0700 (PDT) X-Barracuda-Envelope-From: samuel.granjeaud@inserm.fr X-Barracuda-Apparent-Source-IP: 195.98.252.37 Received: from localhost (localhost.localdomain [127.0.0.1]) by smtp.inserm.fr (SrvInserm) with ESMTP id B143016825F for ; Fri, 29 Aug 2014 15:29:17 +0200 (CEST) X-Virus-Scanned: amavisd-new at inserm.fr Received: from smtp.inserm.fr ([195.98.252.37]) by localhost (potentille.inserm.fr [127.0.0.1]) (amavisd-new, port 10026) with ESMTP id NYm4gkavOM0y for ; Fri, 29 Aug 2014 15:29:17 +0200 (CEST) Received: from cognac-lmde.crcm.mrs (236-ne1068.marseille.inserm.fr [195.220.68.236]) (using TLSv1 with cipher DHE-RSA-AES128-SHA (128/128 bits)) (No client certificate requested) by smtp.inserm.fr (SrvInserm) with ESMTP id 8C911168356 for ; Fri, 29 Aug 2014 15:29:16 +0200 (CEST) Message-ID: <5400802C.5050005@inserm.fr> Date: Fri, 29 Aug 2014 15:29:16 +0200 From: Samuel Granjeaud User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Thunderbird/24.6.0 MIME-Version: 1.0 To: xfs@oss.sgi.com Subject: Re: Run out of inodes? References: <54005108.1020203@inserm.fr> <20140829114806.GA17610@bfoster.bfoster> X-ASG-Orig-Subj: Re: Run out of inodes? In-Reply-To: <20140829114806.GA17610@bfoster.bfoster> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit X-Barracuda-Connect: smtp.inserm.fr[195.98.252.37] X-Barracuda-Start-Time: 1409318958 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.8953 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Taking into account the two answers, here is some more information. The system is a openfiler installation, v2.3, up-to-date. https://www.openfiler.com/community/download The problematic system is a backup but the production system uses the same openfiler NAS system. The difference is that there are currently more files on the backup system than the production system; so I guess the problem will appear sooner on the prod sys. # xfs_info /dev/vg1_backup/backup meta-data=/mnt/vg1_backup/backup isize=256 agcount=80, agsize=58981376 blks = sectsz=512 data = bsize=4096 blocks=4718510080, imaxpct=25 = sunit=0 swidth=0 blks, unwritten=1 naming =version 2 bsize=4096 log =internal bsize=4096 blocks=32768, version=1 = sectsz=512 sunit=0 blks realtime =none extsz=65536 blocks=0, rtextents=0 # uname -a Linux 2.6.26.8-1.0.11.smp.gcc3.4.x86_64 #1 SMP Sun Jan 11 02:42:55 GMT 2009 x86_64 x86_64 x86_64 GNU/Linux # xfs_info -V /dev/vg1_backup/backup xfs_info version 2.6.25 # cat /etc/fstab ... /dev/vg1/pcurrent /mnt/vg1/pcurrent xfs defaults,usrquota,grpquota 0 0 # cat /etc/mtab ... /dev/mapper/vg1-pcurrent /mnt/vg1/pcurrent xfs rw,usrquota,grpquota 0 0 # lvm version LVM version: 2.02.34 (2008-04-10) Library version: 1.02.24 (2007-12-20) Driver version: 4.13.0 ]# more /proc/meminfo /proc/mounts /proc/partitions :::::::::::::: /proc/meminfo :::::::::::::: MemTotal: 2057876 kB MemFree: 18808 kB Buffers: 3868 kB Cached: 1906736 kB SwapCached: 160 kB Active: 581108 kB Inactive: 1367680 kB SwapTotal: 1028152 kB SwapFree: 1027848 kB Dirty: 156 kB Writeback: 0 kB AnonPages: 38168 kB Mapped: 34376 kB Slab: 67104 kB SReclaimable: 55772 kB SUnreclaim: 11332 kB PageTables: 4112 kB NFS_Unstable: 0 kB Bounce: 0 kB WritebackTmp: 0 kB CommitLimit: 2057088 kB Committed_AS: 105580 kB VmallocTotal: 34359738367 kB VmallocUsed: 272688 kB VmallocChunk: 34359465359 kB HugePages_Total: 0 HugePages_Free: 0 HugePages_Rsvd: 0 HugePages_Surp: 0 Hugepagesize: 2048 kB :::::::::::::: /proc/mounts :::::::::::::: rootfs / rootfs rw 0 0 /dev /dev tmpfs rw,mode=755 0 0 /dev/root / ext3 rw,errors=continue,data=ordered 0 0 /proc /proc proc rw 0 0 /proc/bus/usb /proc/bus/usb usbfs rw 0 0 /sys /sys sysfs rw 0 0 devpts /dev/pts devpts rw,gid=5,mode=620 0 0 /dev/sda1 /boot ext3 rw,errors=continue,data=ordered 0 0 tmpfs /dev/shm tmpfs rw 0 0 /dev/vg1/pcurrent /mnt/vg1/pcurrent xfs rw,attr2,nobarrier,usrquota,prjquota,grpquota 0 0 none /proc/sys/fs/binfmt_misc binfmt_misc rw 0 0 sunrpc /var/lib/nfs/rpc_pipefs rpc_pipefs rw 0 0 :::::::::::::: /proc/partitions :::::::::::::: major minor #blocks name 8 0 3145728 sda 8 1 104391 sda1 8 2 2008125 sda2 8 3 1028160 sda3 8 16 1887436800 sdb 8 17 1887436656 sdb1 8 32 1887436800 sdc 8 33 1887436656 sdc1 8 48 1887436800 sdd 8 49 1887436656 sdd1 8 64 1887436800 sde 8 65 1887436656 sde1 8 80 1887436800 sdf 8 81 1887436656 sdf1 8 96 1887436800 sdg 8 97 1887436656 sdg1 8 112 1887436800 sdh 8 113 1887436656 sdh1 8 128 1887436800 sdi 8 129 1887436656 sdi1 8 144 1887436800 sdj 8 145 1887436656 sdj1 8 160 1887436800 sdk 8 161 1887436656 sdk1 8 176 655360000 sdl 8 177 655355578 sdl1 253 0 18874040320 dm-0 The system is a ESXi virtual machine. RAID is hardware, managed at the BIOS level. Disks are DELL SATA. I have no idea concerning the inode64 option. Just tell me how to find it out. I don't think this option was changed: as previously told, removing a few files allows files to be created without error. I could add some more information if needed. Thanks for your help, Samuel From sandeen@sandeen.net Fri Aug 29 10:02: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 E90CD7F9A for ; Fri, 29 Aug 2014 10:02:30 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 77C90AC007 for ; Fri, 29 Aug 2014 08:02:27 -0700 (PDT) X-ASG-Debug-ID: 1409324545-04cbb054868faed0001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id DVW4VFMM5wjXJtvW for ; Fri, 29 Aug 2014 08:02:25 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1 with cipher DHE-RSA-AES128-SHA (128/128 bits)) (No client certificate requested) by sandeen.net (Postfix) with ESMTPSA id 125466370CED; Fri, 29 Aug 2014 10:02:25 -0500 (CDT) Message-ID: <54009603.9050404@sandeen.net> Date: Fri, 29 Aug 2014 10:02:27 -0500 From: Eric Sandeen MIME-Version: 1.0 To: Samuel Granjeaud , xfs@oss.sgi.com Subject: Re: Run out of inodes? References: <54005108.1020203@inserm.fr> <20140829114806.GA17610@bfoster.bfoster> <5400802C.5050005@inserm.fr> X-ASG-Orig-Subj: Re: Run out of inodes? In-Reply-To: <5400802C.5050005@inserm.fr> 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: 1409324545 X-Barracuda-URL: http://192.48.176.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.8955 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 BSF_SC0_SA085 Custom Rule SA085 On 8/29/14, 8:29 AM, Samuel Granjeaud wrote: > Taking into account the two answers, here is some more information. > > The system is a openfiler installation, v2.3, up-to-date. > https://www.openfiler.com/community/download > > The problematic system is a backup but the production system uses the same openfiler NAS system. The difference is that there are currently more files on the backup system than the production system; so I guess the problem will appear sooner on the prod sys. > > # xfs_info /dev/vg1_backup/backup > meta-data=/mnt/vg1_backup/backup isize=256 agcount=80, agsize=58981376 blks > = sectsz=512 > data = bsize=4096 blocks=4718510080, imaxpct=25 > = sunit=0 swidth=0 blks, unwritten=1 > naming =version 2 bsize=4096 > log =internal bsize=4096 blocks=32768, version=1 > = sectsz=512 sunit=0 blks > realtime =none extsz=65536 blocks=0, rtextents=0 > > # uname -a > Linux 2.6.26.8-1.0.11.smp.gcc3.4.x86_64 #1 SMP Sun Jan 11 02:42:55 GMT 2009 x86_64 x86_64 x86_64 GNU/Linux > > # xfs_info -V /dev/vg1_backup/backup > xfs_info version 2.6.25 > > # cat /etc/fstab > ... > /dev/vg1/pcurrent /mnt/vg1/pcurrent xfs defaults,usrquota,grpquota 0 0 > > # cat /etc/mtab > ... > /dev/mapper/vg1-pcurrent /mnt/vg1/pcurrent xfs rw,usrquota,grpquota 0 0 > I have no idea concerning the inode64 option. Just tell me how to find it out. I don't think this option was changed: as previously told, removing a few files allows files to be created without error. You'll want to be using the inode64 mount option for this filesystem; I'm surprised the openfiler folks didn't do this by default. http://xfs.org/index.php/XFS_FAQ#Q:_What_is_the_inode64_mount_option_for.3F add it to fstab for this filesystem, reboot the box (or unmount/mount the filesystem) and all should be well. -Eric From samuel.granjeaud@inserm.fr Fri Aug 29 10:22: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 41CC37FB7 for ; Fri, 29 Aug 2014 10:22:11 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id CD1FEAC003 for ; Fri, 29 Aug 2014 08:22:10 -0700 (PDT) X-ASG-Debug-ID: 1409325725-04bdf010a1604230001-NocioJ Received: from smtp.inserm.fr (smtp.inserm.fr [195.98.252.37]) by cuda.sgi.com with ESMTP id 3TQaPuC6qDFNVYYF (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 29 Aug 2014 08:22:06 -0700 (PDT) X-Barracuda-Envelope-From: samuel.granjeaud@inserm.fr X-Barracuda-Apparent-Source-IP: 195.98.252.37 Received: from localhost (localhost.localdomain [127.0.0.1]) by smtp.inserm.fr (SrvInserm) with ESMTP id BF9D1168473 for ; Fri, 29 Aug 2014 17:22:04 +0200 (CEST) X-Virus-Scanned: amavisd-new at inserm.fr Received: from smtp.inserm.fr ([195.98.252.37]) by localhost (potentille.inserm.fr [127.0.0.1]) (amavisd-new, port 10026) with ESMTP id gByL1T2nsJPa for ; Fri, 29 Aug 2014 17:22:04 +0200 (CEST) Received: from cognac-lmde.crcm.mrs (236-ne1068.marseille.inserm.fr [195.220.68.236]) (using TLSv1 with cipher DHE-RSA-AES128-SHA (128/128 bits)) (No client certificate requested) by smtp.inserm.fr (SrvInserm) with ESMTP id A686916841B for ; Fri, 29 Aug 2014 17:22:03 +0200 (CEST) Message-ID: <54009A9B.9000208@inserm.fr> Date: Fri, 29 Aug 2014 17:22:03 +0200 From: Samuel Granjeaud User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Thunderbird/24.6.0 MIME-Version: 1.0 To: xfs@oss.sgi.com Subject: Re: Run out of inodes? References: <54005108.1020203@inserm.fr> <20140829114806.GA17610@bfoster.bfoster> <5400802C.5050005@inserm.fr> <54009603.9050404@sandeen.net> X-ASG-Orig-Subj: Re: Run out of inodes? In-Reply-To: <54009603.9050404@sandeen.net> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit X-Barracuda-Connect: smtp.inserm.fr[195.98.252.37] X-Barracuda-Start-Time: 1409325725 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=BSF_SC0_SA085 X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.8956 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 BSF_SC0_SA085 Custom Rule SA085 Eric Sandeen wrote, On 29/08/14 17:02: > > You'll want to be using the inode64 mount option for this filesystem; I'm surprised the openfiler folks didn't do this by default. > > http://xfs.org/index.php/XFS_FAQ#Q:_What_is_the_inode64_mount_option_for.3F Well, I am using the 2.3 version; may be the 2.99 version does it. > add it to fstab for this filesystem, reboot the box (or unmount/mount the filesystem) and all should be well. I added the option and rebooted the system. A short rsync ran successfully, but it may not have exhausted the pool of previously released inodes. Tonight a bigger rsync will take place and I will let you know the result. Thanks for pointing me this option, that I hesitated to apply. From stan@hardwarefreak.com Fri Aug 29 11:38: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 10EFC7FBB for ; Fri, 29 Aug 2014 11:38:37 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id F24868F8052 for ; Fri, 29 Aug 2014 09:38:33 -0700 (PDT) X-ASG-Debug-ID: 1409330304-04cb6c54fd672ed0001-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 ZlSFAqe1BSdyhtsQ for ; Fri, 29 Aug 2014 09:38:25 -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: by greer.hardwarefreak.com (Postfix, from userid 33) id 4804D6C192; Fri, 29 Aug 2014 11:38:24 -0500 (CDT) To: Dave Chinner Subject: Re: storage, libaio, or XFS =?UTF-8?Q?problem=3F=20=20=33=2E=34=2E=32=36?= X-PHP-Originating-Script: 0:func.inc X-ASG-Orig-Subj: Re: storage, libaio, or XFS =?UTF-8?Q?problem=3F=20=20=33=2E=34=2E=32=36?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Date: Fri, 29 Aug 2014 11:38:16 -0500 From: Stan Hoeppner Cc: In-Reply-To: <20140828230817.GU20518@dastard> References: <3fe8c34c0ccbbd720015d273fa2b8b30@localhost> <20140826075345.GJ20518@dastard> <8c29baf987467a84f0b7c1d09c863662@localhost> <20140828003226.GO20518@dastard> <7f9e5aef187b44e899077467aeb0809d@localhost> <20140828230817.GU20518@dastard> Message-ID: <2d2ce7bb38c00a7d35f4a324f6a36cbb@localhost> X-Sender: stan@hardwarefreak.com User-Agent: RoundCube Webmail/0.3.1 X-Barracuda-Connect: mo-65-41-216-221.sta.embarqhsd.net[65.41.216.221] X-Barracuda-Start-Time: 1409330304 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 On Fri, 29 Aug 2014 09:08:17 +1000, Dave Chinner wrote: > On Thu, Aug 28, 2014 at 05:31:33PM -0500, Stan Hoeppner wrote: >> On Thu, 28 Aug 2014 10:32:27 +1000, Dave Chinner >> wrote: >> > On Tue, Aug 26, 2014 at 12:19:43PM -0500, Stan Hoeppner wrote: >> >> Aug 25 23:05:39 Anguish-ssu-1 kernel: [22409.328839] XFS (sdd): >> >> xfs_do_force_shutdown(0x8) called from line 3732 of file >> >> fs/xfs/xfs_bmap.c. >> >> Return address = 0xffffffffa01cc9a6 >> > >> > Yup, that's kinda important. That's from xfs_bmap_finish(), and >> > freeing an extent has failed and triggered SHUTDOWN_CORRUPT_INCORE >> > which it's found some kind of inconsistency in the free space >> > btrees. So, likely the same problem that caused EFI recovery to fail >> > on the other volume. >> > >> > Are the tests being run on newly made filesystems? If not, have >> > these filesystems had xfs_repair run on them after a failure? If >> > so, what is the error that is fixed? If not, does repairing the >> > filesystem make the problem go away? >> >> Newly made after every error of any kind, whether app, XFS shutdown, call >> trace, etc. I've not attempted xfs_repair. > > Please do. Another storage crash yesterday. xfs_repair output inline below for the 7 filesystems. I'm also pasting the dmesg output. This time there is no oops, no call traces. The filesystems mounted fine after mounting, replaying, and repairing. >> Part of the problem is the storage hardware is a moving target. >> They're swapping modules and upgrading firmware every few days. >> And I don't have a view into that. So it's difficult to know when >> IO problems are due to hardware or buggy code. However, I can >> state with certainty that we only run into the XFS problems when >> using AIO. And it has occurred on both test rigs, each of which >> have their own RAID controllers and disks. > > Which, in and of itself doesn't point at AIO or XFS being the > problem. What is says is that something goes wrong under the > extremely high IO load that can be generated with AIO+DIO. That > "something" might be a race in XFS, a bug in AIO, or could be a > load related storage problem. > > For example, I've been on the wrong end of hard to track down > problems on beta/early access storage before. For example there was > an incident years ago that took 3 more than 3 months to isolate a > filesystem corruption that occurred under high load. It took that > long to isolate a test case, reproduce it in house on identical > hardware, firmware, software, etc and then *capture it with a FC > analyser*. > > The bug? The bleeding edge storage arrays being used had had a > firmware bug in it. When the number of outstanding IOs hit the > *array controller* command tag queue depth limit (some several > thousand simultaneous IOs in flight) it would occasionally misdirect > a single write IO to the *wrong lun*. i.e. it would misdirect a > write. > > It was only under *extreme* loads that this would happen, and it's > this sort of load that AIO+DIO can easily generate - you can have > several thousand IOs in flight without too much hassle, and that > will hit limits in the storage arrays that aren't often hit. Array > controller CTQ depth limits are a good example of a limit that > normal IO won't go near to stressing. I hadn't considered that up to this point. That is *very* insightful, and applicable, since we are dealing with a beta storage array and firmware. Worth mentioning is that the storage vendor has added a custom routine which expends Herculean effort to identify full stripes before writeback. This because some of our writes for a given low rate stream are as low as 32KB and may be 2-3 seconds apart. With a 64-128KB chunk, 768 to 1536KB stripe width, we'd get massive RMW without this feature. Testing thus far shows it is fairly effective, though we still get pretty serious RMW due to the fact we're writing 350 of these small streams per array at ~72 KB/s max, along with 2 streams at ~48 MB/s, and and 50 streams at ~1.2 MB/s. Multiply this by 7 LUNs per controller and it becomes clear we're putting a pretty serious load on the firmware and cache. >> >> update timestamps for inode 0xf000000a4 >> >> Aug 25 23:05:49 Anguish-ssu-1 kernel: [22419.605835] XFS (sdd): failed >> to >> >> update timestamps for inode 0x2810f413c >> >> Aug 25 23:05:49 Anguish-ssu-1 kernel: [22419.606169] XFS (sdd): failed >> to >> >> update timestamps for inode 0x60000009f >> > >> > And that is interesting. Makes me wonder if the inode is getting >> > unlocked on transaction commit failure, or whether there's some >> > other path in the shutdown code that is not unlocking the inode >> > correctly. >> >> Is this a separate time stamp from that which noatime disables? We're >> mounting with noatime, nodiratime. > > Yes. mtime/ctime updates go through this on the write path. > > Cheers, > > Dave. dmesg and xfs_repair [ 9707.147739] end_request: I/O error, dev dm-8, sector 769 [ 9707.147743] end_request: I/O error, dev dm-5, sector 1 [ 9707.147746] end_request: I/O error, dev dm-17, sector 1 [ 9707.147752] end_request: I/O error, dev dm-8, sector 770 [ 9707.147755] end_request: I/O error, dev dm-5, sector 2 [ 9707.147757] end_request: I/O error, dev dm-17, sector 2 [ 9707.147762] end_request: I/O error, dev dm-5, sector 3 [ 9707.147765] end_request: I/O error, dev dm-17, sector 3 [ 9707.147767] end_request: I/O error, dev dm-8, sector 771 [ 9707.147771] end_request: I/O error, dev dm-5, sector 4 [ 9707.147776] end_request: I/O error, dev dm-17, sector 4 [ 9707.147778] end_request: I/O error, dev dm-8, sector 772 [ 9707.147786] end_request: I/O error, dev dm-17, sector 5 [ 9707.147787] end_request: I/O error, dev dm-8, sector 773 [ 9707.147789] end_request: I/O error, dev dm-5, sector 5 [ 9707.147797] end_request: I/O error, dev dm-8, sector 774 [ 9707.147799] end_request: I/O error, dev dm-17, sector 6 [ 9707.147801] end_request: I/O error, dev dm-5, sector 6 [ 9707.147806] end_request: I/O error, dev dm-17, sector 7 [ 9707.147808] end_request: I/O error, dev dm-5, sector 7 [ 9707.147816] end_request: I/O error, dev dm-17, sector 0 [ 9707.147820] end_request: I/O error, dev dm-5, sector 0 [ 9707.147823] end_request: I/O error, dev dm-17, sector 1 [ 9707.147829] end_request: I/O error, dev dm-5, sector 1 [ 9707.147831] end_request: I/O error, dev dm-17, sector 2 [ 9707.147836] end_request: I/O error, dev dm-5, sector 2 [ 9707.147838] end_request: I/O error, dev dm-17, sector 3 [ 9707.147844] end_request: I/O error, dev dm-17, sector 4 [ 9707.147848] end_request: I/O error, dev dm-5, sector 3 [ 9707.147850] end_request: I/O error, dev dm-8, sector 775 [ 9707.147855] end_request: I/O error, dev dm-17, sector 5 [ 9707.147858] end_request: I/O error, dev dm-5, sector 4 [ 9707.147866] end_request: I/O error, dev dm-5, sector 5 [ 9707.147868] end_request: I/O error, dev dm-17, sector 6 [ 9707.147872] end_request: I/O error, dev dm-8, sector 768 [ 9707.147875] end_request: I/O error, dev dm-17, sector 7 [ 9707.147879] end_request: I/O error, dev dm-8, sector 769 [ 9707.147883] end_request: I/O error, dev dm-17, sector 0 [ 9707.147885] end_request: I/O error, dev dm-5, sector 6 [ 9707.147891] end_request: I/O error, dev dm-17, sector 1 [ 9707.147892] end_request: I/O error, dev dm-5, sector 7 [ 9707.147898] end_request: I/O error, dev dm-17, sector 2 [ 9707.147902] end_request: I/O error, dev dm-5, sector 0 [ 9707.147904] end_request: I/O error, dev dm-17, sector 3 [ 9707.147910] end_request: I/O error, dev dm-5, sector 1 [ 9707.147912] end_request: I/O error, dev dm-17, sector 4 [ 9707.147917] end_request: I/O error, dev dm-5, sector 2 [ 9707.147919] end_request: I/O error, dev dm-17, sector 5 [ 9707.147925] end_request: I/O error, dev dm-5, sector 3 [ 9707.147927] end_request: I/O error, dev dm-17, sector 6 [ 9707.147931] end_request: I/O error, dev dm-5, sector 4 [ 9707.147933] end_request: I/O error, dev dm-17, sector 7 [ 9707.147935] end_request: I/O error, dev dm-8, sector 770 [ 9707.147938] end_request: I/O error, dev dm-5, sector 5 [ 9707.147941] end_request: I/O error, dev dm-8, sector 771 [ 9707.147944] end_request: I/O error, dev dm-17, sector 0 [ 9707.147946] end_request: I/O error, dev dm-5, sector 6 [ 9707.147948] end_request: I/O error, dev dm-8, sector 772 [ 9707.147952] end_request: I/O error, dev dm-5, sector 7 [ 9707.147954] end_request: I/O error, dev dm-8, sector 773 [ 9707.147956] end_request: I/O error, dev dm-17, sector 1 [ 9707.147961] end_request: I/O error, dev dm-5, sector 0 [ 9707.147963] end_request: I/O error, dev dm-17, sector 2 [ 9707.147965] end_request: I/O error, dev dm-8, sector 774 [ 9707.147968] end_request: I/O error, dev dm-5, sector 1 [ 9707.147970] end_request: I/O error, dev dm-8, sector 775 [ 9707.147972] end_request: I/O error, dev dm-17, sector 3 [ 9707.147975] end_request: I/O error, dev dm-5, sector 2 [ 9707.147979] end_request: I/O error, dev dm-17, sector 4 [ 9707.147981] end_request: I/O error, dev dm-5, sector 3 [ 9707.147985] end_request: I/O error, dev dm-8, sector 776 [ 9707.147987] end_request: I/O error, dev dm-17, sector 5 [ 9707.147988] end_request: I/O error, dev dm-5, sector 4 [ 9707.147993] end_request: I/O error, dev dm-17, sector 6 [ 9707.147995] end_request: I/O error, dev dm-5, sector 5 [ 9707.147997] end_request: I/O error, dev dm-8, sector 777 [ 9707.148002] end_request: I/O error, dev dm-5, sector 6 [ 9707.148004] end_request: I/O error, dev dm-8, sector 778 [ 9707.148006] end_request: I/O error, dev dm-17, sector 7 [ 9707.148008] end_request: I/O error, dev dm-5, sector 7 [ 9707.148012] end_request: I/O error, dev dm-8, sector 779 [ 9707.148014] end_request: I/O error, dev dm-17, sector 0 [ 9707.148017] end_request: I/O error, dev dm-5, sector 0 [ 9707.148019] end_request: I/O error, dev dm-8, sector 780 [ 9707.148021] end_request: I/O error, dev dm-17, sector 1 [ 9707.148023] end_request: I/O error, dev dm-5, sector 1 [ 9707.148025] end_request: I/O error, dev dm-8, sector 781 [ 9707.148028] end_request: I/O error, dev dm-17, sector 2 [ 9707.148031] end_request: I/O error, dev dm-5, sector 2 [ 9707.148033] end_request: I/O error, dev dm-8, sector 782 [ 9707.148036] end_request: I/O error, dev dm-17, sector 3 [ 9707.148042] end_request: I/O error, dev dm-5, sector 3 [ 9707.148044] end_request: I/O error, dev dm-17, sector 4 [ 9707.148052] end_request: I/O error, dev dm-17, sector 5 [ 9707.148053] end_request: I/O error, dev dm-5, sector 4 [ 9707.148058] end_request: I/O error, dev dm-17, sector 6 [ 9707.148066] end_request: I/O error, dev dm-5, sector 5 [ 9707.148069] end_request: I/O error, dev dm-17, sector 7 [ 9707.148070] end_request: I/O error, dev dm-8, sector 783 [ 9707.148074] end_request: I/O error, dev dm-5, sector 6 [ 9707.148080] end_request: I/O error, dev dm-8, sector 776 [ 9707.148081] end_request: I/O error, dev dm-17, sector 128 [ 9707.148085] end_request: I/O error, dev dm-5, sector 7 [ 9707.148088] end_request: I/O error, dev dm-17, sector 129 [ 9707.148093] end_request: I/O error, dev dm-8, sector 777 [ 9707.148094] end_request: I/O error, dev dm-5, sector 16 [ 9707.148098] end_request: I/O error, dev dm-17, sector 130 [ 9707.148102] end_request: I/O error, dev dm-5, sector 17 [ 9707.148105] end_request: I/O error, dev dm-17, sector 131 [ 9707.148109] end_request: I/O error, dev dm-5, sector 18 [ 9707.148113] end_request: I/O error, dev dm-17, sector 132 [ 9707.148116] end_request: I/O error, dev dm-5, sector 19 [ 9707.148121] end_request: I/O error, dev dm-17, sector 133 [ 9707.148123] end_request: I/O error, dev dm-5, sector 20 [ 9707.148131] end_request: I/O error, dev dm-5, sector 21 [ 9707.148133] end_request: I/O error, dev dm-17, sector 134 [ 9707.148135] end_request: I/O error, dev dm-8, sector 778 [ 9707.148140] end_request: I/O error, dev dm-17, sector 135 [ 9707.148142] end_request: I/O error, dev dm-5, sector 22 [ 9707.148144] end_request: I/O error, dev dm-8, sector 779 [ 9707.148149] end_request: I/O error, dev dm-5, sector 23 [ 9707.148155] end_request: I/O error, dev dm-17, sector 128 [ 9707.148157] end_request: I/O error, dev dm-8, sector 780 [ 9707.148161] end_request: I/O error, dev dm-5, sector 0 [ 9707.148166] end_request: I/O error, dev dm-8, sector 781 [ 9707.148168] end_request: I/O error, dev dm-17, sector 129 [ 9707.148174] end_request: I/O error, dev dm-5, sector 1 [ 9707.148175] end_request: I/O error, dev dm-17, sector 130 [ 9707.148180] end_request: I/O error, dev dm-5, sector 2 [ 9707.148182] end_request: I/O error, dev dm-17, sector 131 [ 9707.148187] end_request: I/O error, dev dm-5, sector 3 [ 9707.148190] end_request: I/O error, dev dm-17, sector 132 [ 9707.148197] end_request: I/O error, dev dm-5, sector 4 [ 9707.148202] end_request: I/O error, dev dm-17, sector 133 [ 9707.148205] end_request: I/O error, dev dm-8, sector 782 [ 9707.148211] end_request: I/O error, dev dm-8, sector 783 [ 9707.148214] end_request: I/O error, dev dm-17, sector 134 [ 9707.148218] end_request: I/O error, dev dm-5, sector 5 [ 9707.148221] end_request: I/O error, dev dm-17, sector 135 [ 9707.148224] end_request: I/O error, dev dm-5, sector 6 [ 9707.148230] end_request: I/O error, dev dm-17, sector 16 [ 9707.148232] end_request: I/O error, dev dm-5, sector 7 [ 9707.148237] end_request: I/O error, dev dm-17, sector 17 [ 9707.148243] end_request: I/O error, dev dm-5, sector 0 [ 9707.148247] end_request: I/O error, dev dm-17, sector 18 [ 9707.148249] end_request: I/O error, dev dm-8, sector 784 [ 9707.148254] end_request: I/O error, dev dm-17, sector 19 [ 9707.148256] end_request: I/O error, dev dm-8, sector 785 [ 9707.148261] end_request: I/O error, dev dm-17, sector 20 [ 9707.148263] end_request: I/O error, dev dm-8, sector 786 [ 9707.148268] end_request: I/O error, dev dm-5, sector 1 [ 9707.148271] end_request: I/O error, dev dm-8, sector 787 [ 9707.148273] end_request: I/O error, dev dm-17, sector 21 [ 9707.148277] end_request: I/O error, dev dm-8, sector 788 [ 9707.148280] end_request: I/O error, dev dm-17, sector 22 [ 9707.148283] end_request: I/O error, dev dm-8, sector 789 [ 9707.148287] end_request: I/O error, dev dm-17, sector 23 [ 9707.148291] end_request: I/O error, dev dm-8, sector 790 [ 9707.148296] end_request: I/O error, dev dm-17, sector 0 [ 9707.148302] end_request: I/O error, dev dm-8, sector 791 [ 9707.148303] end_request: I/O error, dev dm-17, sector 1 [ 9707.148309] end_request: I/O error, dev dm-5, sector 2 [ 9707.148311] end_request: I/O error, dev dm-17, sector 2 [ 9707.148318] end_request: I/O error, dev dm-17, sector 3 [ 9707.148320] end_request: I/O error, dev dm-8, sector 784 [ 9707.148325] end_request: I/O error, dev dm-17, sector 4 [ 9707.148331] end_request: I/O error, dev dm-8, sector 785 [ 9707.148333] end_request: I/O error, dev dm-17, sector 5 [ 9707.148337] end_request: I/O error, dev dm-5, sector 3 [ 9707.148340] end_request: I/O error, dev dm-17, sector 6 [ 9707.148343] end_request: I/O error, dev dm-5, sector 4 [ 9707.148345] end_request: I/O error, dev dm-8, sector 786 [ 9707.148349] end_request: I/O error, dev dm-17, sector 7 [ 9707.148352] end_request: I/O error, dev dm-8, sector 787 [ 9707.148357] end_request: I/O error, dev dm-17, sector 0 [ 9707.148359] end_request: I/O error, dev dm-5, sector 5 [ 9707.148369] end_request: I/O error, dev dm-8, sector 788 [ 9707.148370] end_request: I/O error, dev dm-5, sector 6 [ 9707.148372] end_request: I/O error, dev dm-17, sector 1 [ 9707.148377] end_request: I/O error, dev dm-5, sector 7 [ 9707.148379] end_request: I/O error, dev dm-17, sector 2 [ 9707.148386] end_request: I/O error, dev dm-5, sector 0 [ 9707.148388] end_request: I/O error, dev dm-17, sector 3 [ 9707.148394] end_request: I/O error, dev dm-5, sector 1 [ 9707.148396] end_request: I/O error, dev dm-17, sector 4 [ 9707.148401] end_request: I/O error, dev dm-5, sector 2 [ 9707.148403] end_request: I/O error, dev dm-17, sector 5 [ 9707.148409] end_request: I/O error, dev dm-5, sector 3 [ 9707.148411] end_request: I/O error, dev dm-17, sector 6 [ 9707.148418] end_request: I/O error, dev dm-17, sector 7 [ 9707.148419] end_request: I/O error, dev dm-5, sector 4 [ 9707.148423] end_request: I/O error, dev dm-8, sector 789 [ 9707.148426] end_request: I/O error, dev dm-5, sector 5 [ 9707.148432] end_request: I/O error, dev dm-5, sector 6 [ 9707.148435] end_request: I/O error, dev dm-17, sector 8 [ 9707.148439] end_request: I/O error, dev dm-5, sector 7 [ 9707.148442] end_request: I/O error, dev dm-17, sector 9 [ 9707.148448] end_request: I/O error, dev dm-5, sector 0 [ 9707.148450] end_request: I/O error, dev dm-17, sector 10 [ 9707.148456] end_request: I/O error, dev dm-5, sector 1 [ 9707.148457] end_request: I/O error, dev dm-17, sector 11 [ 9707.148462] end_request: I/O error, dev dm-5, sector 2 [ 9707.148464] end_request: I/O error, dev dm-17, sector 12 [ 9707.148469] end_request: I/O error, dev dm-5, sector 3 [ 9707.148471] end_request: I/O error, dev dm-17, sector 13 [ 9707.148475] end_request: I/O error, dev dm-5, sector 4 [ 9707.148478] end_request: I/O error, dev dm-17, sector 14 [ 9707.148483] end_request: I/O error, dev dm-5, sector 5 [ 9707.148485] end_request: I/O error, dev dm-17, sector 15 [ 9707.148494] end_request: I/O error, dev dm-17, sector 16 [ 9707.148498] end_request: I/O error, dev dm-5, sector 6 [ 9707.148499] end_request: I/O error, dev dm-8, sector 790 [ 9707.148503] end_request: I/O error, dev dm-17, sector 17 [ 9707.148507] end_request: I/O error, dev dm-5, sector 7 [ 9707.148509] end_request: I/O error, dev dm-8, sector 791 [ 9707.148512] end_request: I/O error, dev dm-17, sector 18 [ 9707.148518] end_request: I/O error, dev dm-8, sector 0 [ 9707.148520] end_request: I/O error, dev dm-17, sector 19 [ 9707.148527] end_request: I/O error, dev dm-17, sector 20 [ 9707.148533] end_request: I/O error, dev dm-5, sector 0 [ 9707.148535] end_request: I/O error, dev dm-17, sector 21 [ 9707.148538] end_request: I/O error, dev dm-8, sector 1 [ 9707.148543] end_request: I/O error, dev dm-17, sector 22 [ 9707.148546] end_request: I/O error, dev dm-8, sector 2 [ 9707.148549] end_request: I/O error, dev dm-5, sector 1 [ 9707.148554] end_request: I/O error, dev dm-17, sector 23 [ 9707.148557] end_request: I/O error, dev dm-8, sector 3 [ 9707.148560] end_request: I/O error, dev dm-5, sector 2 [ 9707.148563] end_request: I/O error, dev dm-8, sector 4 [ 9707.148570] end_request: I/O error, dev dm-17, sector 0 [ 9707.148571] end_request: I/O error, dev dm-5, sector 3 [ 9707.148578] end_request: I/O error, dev dm-5, sector 4 [ 9707.148580] end_request: I/O error, dev dm-8, sector 5 [ 9707.148582] end_request: I/O error, dev dm-17, sector 1 [ 9707.148589] end_request: I/O error, dev dm-17, sector 2 [ 9707.148591] end_request: I/O error, dev dm-5, sector 5 [ 9707.148596] end_request: I/O error, dev dm-17, sector 3 [ 9707.148599] end_request: I/O error, dev dm-5, sector 6 [ 9707.148601] end_request: I/O error, dev dm-8, sector 6 [ 9707.148607] end_request: I/O error, dev dm-5, sector 7 [ 9707.148610] end_request: I/O error, dev dm-17, sector 4 [ 9707.148611] end_request: I/O error, dev dm-8, sector 7 [ 9707.148617] end_request: I/O error, dev dm-17, sector 5 [ 9707.148620] end_request: I/O error, dev dm-8, sector 0 [ 9707.148627] end_request: I/O error, dev dm-5, sector 0 [ 9707.148630] end_request: I/O error, dev dm-17, sector 6 [ 9707.148636] end_request: I/O error, dev dm-17, sector 7 [ 9707.148642] end_request: I/O error, dev dm-5, sector 1 [ 9707.148644] end_request: I/O error, dev dm-8, sector 1 [ 9707.148650] end_request: I/O error, dev dm-5, sector 2 [ 9707.148656] end_request: I/O error, dev dm-8, sector 2 [ 9707.148661] end_request: I/O error, dev dm-5, sector 3 [ 9707.148663] end_request: I/O error, dev dm-17, sector 0 [ 9707.148671] end_request: I/O error, dev dm-17, sector 1 [ 9707.148673] end_request: I/O error, dev dm-8, sector 3 [ 9707.148678] end_request: I/O error, dev dm-17, sector 2 [ 9707.148686] end_request: I/O error, dev dm-17, sector 3 [ 9707.148687] end_request: I/O error, dev dm-8, sector 4 [ 9707.148695] end_request: I/O error, dev dm-5, sector 4 [ 9707.148696] end_request: I/O error, dev dm-8, sector 5 [ 9707.148698] end_request: I/O error, dev dm-17, sector 4 [ 9707.148705] end_request: I/O error, dev dm-17, sector 5 [ 9707.148708] end_request: I/O error, dev dm-8, sector 6 [ 9707.148720] end_request: I/O error, dev dm-17, sector 6 [ 9707.148722] end_request: I/O error, dev dm-8, sector 7 [ 9707.148724] end_request: I/O error, dev dm-5, sector 5 [ 9707.148733] end_request: I/O error, dev dm-5, sector 6 [ 9707.148735] end_request: I/O error, dev dm-17, sector 7 [ 9707.148738] end_request: I/O error, dev dm-8, sector 0 [ 9707.148744] end_request: I/O error, dev dm-17, sector 0 [ 9707.148747] end_request: I/O error, dev dm-5, sector 7 [ 9707.148749] end_request: I/O error, dev dm-8, sector 1 [ 9707.148753] end_request: I/O error, dev dm-17, sector 1 [ 9707.148756] end_request: I/O error, dev dm-8, sector 2 [ 9707.148761] end_request: I/O error, dev dm-5, sector 0 [ 9707.148763] end_request: I/O error, dev dm-17, sector 2 [ 9707.148768] end_request: I/O error, dev dm-5, sector 1 [ 9707.148770] end_request: I/O error, dev dm-17, sector 3 [ 9707.148775] end_request: I/O error, dev dm-5, sector 2 [ 9707.148777] end_request: I/O error, dev dm-17, sector 4 [ 9707.148781] end_request: I/O error, dev dm-8, sector 3 [ 9707.148784] end_request: I/O error, dev dm-17, sector 5 [ 9707.148788] end_request: I/O error, dev dm-8, sector 4 [ 9707.148793] end_request: I/O error, dev dm-5, sector 3 [ 9707.148795] end_request: I/O error, dev dm-17, sector 6 [ 9707.148801] end_request: I/O error, dev dm-17, sector 7 [ 9707.148803] end_request: I/O error, dev dm-5, sector 4 [ 9707.148806] end_request: I/O error, dev dm-8, sector 5 [ 9707.148810] end_request: I/O error, dev dm-5, sector 5 [ 9707.148814] end_request: I/O error, dev dm-8, sector 6 [ 9707.148816] end_request: I/O error, dev dm-17, sector 0 [ 9707.148819] end_request: I/O error, dev dm-5, sector 6 [ 9707.148822] end_request: I/O error, dev dm-17, sector 1 [ 9707.148825] end_request: I/O error, dev dm-5, sector 7 [ 9707.148827] end_request: I/O error, dev dm-8, sector 7 [ 9707.148829] end_request: I/O error, dev dm-17, sector 2 [ 9707.148834] end_request: I/O error, dev dm-5, sector 0 [ 9707.148836] end_request: I/O error, dev dm-8, sector 0 [ 9707.148838] end_request: I/O error, dev dm-17, sector 3 [ 9707.148843] end_request: I/O error, dev dm-8, sector 1 [ 9707.148844] end_request: I/O error, dev dm-17, sector 4 [ 9707.148846] end_request: I/O error, dev dm-5, sector 1 [ 9707.148849] end_request: I/O error, dev dm-8, sector 2 [ 9707.148853] end_request: I/O error, dev dm-5, sector 2 [ 9707.148854] end_request: I/O error, dev dm-17, sector 5 [ 9707.148856] end_request: I/O error, dev dm-8, sector 3 [ 9707.148861] end_request: I/O error, dev dm-17, sector 6 [ 9707.148863] end_request: I/O error, dev dm-8, sector 4 [ 9707.148865] end_request: I/O error, dev dm-5, sector 3 [ 9707.148869] end_request: I/O error, dev dm-8, sector 5 [ 9707.148871] end_request: I/O error, dev dm-5, sector 4 [ 9707.148873] end_request: I/O error, dev dm-17, sector 7 [ 9707.148875] end_request: I/O error, dev dm-8, sector 6 [ 9707.148880] end_request: I/O error, dev dm-5, sector 5 [ 9707.148881] end_request: I/O error, dev dm-17, sector 0 [ 9707.148883] end_request: I/O error, dev dm-8, sector 7 [ 9707.148888] end_request: I/O error, dev dm-17, sector 1 [ 9707.148890] end_request: I/O error, dev dm-5, sector 6 [ 9707.148892] end_request: I/O error, dev dm-8, sector 0 [ 9707.148896] end_request: I/O error, dev dm-5, sector 7 [ 9707.148898] end_request: I/O error, dev dm-8, sector 1 [ 9707.148900] end_request: I/O error, dev dm-17, sector 2 [ 9707.148905] end_request: I/O error, dev dm-5, sector 0 [ 9707.148908] end_request: I/O error, dev dm-17, sector 3 [ 9707.148913] end_request: I/O error, dev dm-8, sector 2 [ 9707.148916] end_request: I/O error, dev dm-17, sector 4 [ 9707.148918] end_request: I/O error, dev dm-5, sector 1 [ 9707.148923] end_request: I/O error, dev dm-17, sector 5 [ 9707.148925] end_request: I/O error, dev dm-5, sector 2 [ 9707.148931] end_request: I/O error, dev dm-17, sector 6 [ 9707.148939] end_request: I/O error, dev dm-17, sector 7 [ 9707.148941] end_request: I/O error, dev dm-5, sector 3 [ 9707.148943] end_request: I/O error, dev dm-8, sector 3 [ 9707.148949] end_request: I/O error, dev dm-5, sector 4 [ 9707.148951] end_request: I/O error, dev dm-8, sector 4 [ 9707.148953] end_request: I/O error, dev dm-17, sector 0 [ 9707.148958] end_request: I/O error, dev dm-8, sector 5 [ 9707.148961] end_request: I/O error, dev dm-17, sector 1 [ 9707.148966] end_request: I/O error, dev dm-5, sector 5 [ 9707.148968] end_request: I/O error, dev dm-17, sector 2 [ 9707.148973] end_request: I/O error, dev dm-8, sector 6 [ 9707.148975] end_request: I/O error, dev dm-17, sector 3 [ 9707.148978] end_request: I/O error, dev dm-5, sector 6 [ 9707.148980] end_request: I/O error, dev dm-8, sector 7 [ 9707.148988] end_request: I/O error, dev dm-5, sector 7 [ 9707.148992] end_request: I/O error, dev dm-17, sector 4 [ 9707.148995] end_request: I/O error, dev dm-8, sector 16 [ 9707.149002] end_request: I/O error, dev dm-5, sector 0 [ 9707.149005] end_request: I/O error, dev dm-17, sector 5 [ 9707.149007] end_request: I/O error, dev dm-8, sector 17 [ 9707.149012] end_request: I/O error, dev dm-17, sector 6 [ 9707.149016] end_request: I/O error, dev dm-8, sector 18 [ 9707.149020] end_request: I/O error, dev dm-17, sector 7 [ 9707.149023] end_request: I/O error, dev dm-5, sector 1 [ 9707.149029] end_request: I/O error, dev dm-17, sector 8 [ 9707.149030] end_request: I/O error, dev dm-8, sector 19 [ 9707.149038] end_request: I/O error, dev dm-17, sector 9 [ 9707.149040] end_request: I/O error, dev dm-8, sector 20 [ 9707.149046] end_request: I/O error, dev dm-17, sector 10 [ 9707.149047] end_request: I/O error, dev dm-8, sector 21 [ 9707.149053] end_request: I/O error, dev dm-17, sector 11 [ 9707.149058] end_request: I/O error, dev dm-8, sector 22 [ 9707.149060] end_request: I/O error, dev dm-17, sector 12 [ 9707.149065] end_request: I/O error, dev dm-5, sector 2 [ 9707.149067] end_request: I/O error, dev dm-17, sector 13 [ 9707.149072] end_request: I/O error, dev dm-5, sector 3 [ 9707.149075] end_request: I/O error, dev dm-17, sector 14 [ 9707.149079] end_request: I/O error, dev dm-5, sector 4 [ 9707.149082] end_request: I/O error, dev dm-17, sector 15 [ 9707.149086] end_request: I/O error, dev dm-5, sector 5 [ 9707.149088] end_request: I/O error, dev dm-8, sector 23 [ 9707.149094] end_request: I/O error, dev dm-5, sector 6 [ 9707.149098] end_request: I/O error, dev dm-17, sector 128 [ 9707.149099] end_request: I/O error, dev dm-8, sector 0 [ 9707.149101] end_request: I/O error, dev dm-5, sector 7 [ 9707.149109] end_request: I/O error, dev dm-8, sector 1 [ 9707.149111] end_request: I/O error, dev dm-17, sector 129 [ 9707.149113] end_request: I/O error, dev dm-5, sector 0 [ 9707.149118] end_request: I/O error, dev dm-17, sector 130 [ 9707.149122] end_request: I/O error, dev dm-8, sector 2 [ 9707.149124] end_request: I/O error, dev dm-5, sector 1 [ 9707.149128] end_request: I/O error, dev dm-17, sector 131 [ 9707.149131] end_request: I/O error, dev dm-5, sector 2 [ 9707.149135] end_request: I/O error, dev dm-17, sector 132 [ 9707.149138] end_request: I/O error, dev dm-5, sector 3 [ 9707.149143] end_request: I/O error, dev dm-17, sector 133 [ 9707.149145] end_request: I/O error, dev dm-5, sector 4 [ 9707.149150] end_request: I/O error, dev dm-17, sector 134 [ 9707.149153] end_request: I/O error, dev dm-5, sector 5 [ 9707.149158] end_request: I/O error, dev dm-17, sector 135 [ 9707.149162] end_request: I/O error, dev dm-5, sector 6 [ 9707.149164] end_request: I/O error, dev dm-8, sector 3 [ 9707.149171] end_request: I/O error, dev dm-5, sector 7 [ 9707.149175] end_request: I/O error, dev dm-17, sector 0 [ 9707.149176] end_request: I/O error, dev dm-8, sector 4 [ 9707.149181] end_request: I/O error, dev dm-17, sector 1 [ 9707.149184] end_request: I/O error, dev dm-8, sector 5 [ 9707.149187] end_request: I/O error, dev dm-5, sector 0 [ 9707.149192] end_request: I/O error, dev dm-17, sector 2 [ 9707.149196] end_request: I/O error, dev dm-8, sector 6 [ 9707.149202] end_request: I/O error, dev dm-5, sector 1 [ 9707.149204] end_request: I/O error, dev dm-17, sector 3 [ 9707.149208] end_request: I/O error, dev dm-5, sector 2 [ 9707.149211] end_request: I/O error, dev dm-17, sector 4 [ 9707.149215] end_request: I/O error, dev dm-5, sector 3 [ 9707.149218] end_request: I/O error, dev dm-17, sector 5 [ 9707.149226] end_request: I/O error, dev dm-17, sector 6 [ 9707.149228] end_request: I/O error, dev dm-5, sector 4 [ 9707.149233] end_request: I/O error, dev dm-17, sector 7 [ 9707.149236] end_request: I/O error, dev dm-5, sector 5 [ 9707.149240] end_request: I/O error, dev dm-8, sector 7 [ 9707.149245] end_request: I/O error, dev dm-17, sector 0 [ 9707.149247] end_request: I/O error, dev dm-5, sector 6 [ 9707.149256] end_request: I/O error, dev dm-17, sector 1 [ 9707.149258] end_request: I/O error, dev dm-5, sector 7 [ 9707.149262] end_request: I/O error, dev dm-8, sector 0 [ 9707.149270] end_request: I/O error, dev dm-17, sector 2 [ 9707.149271] end_request: I/O error, dev dm-5, sector 128 [ 9707.149277] end_request: I/O error, dev dm-8, sector 1 [ 9707.149279] end_request: I/O error, dev dm-5, sector 129 [ 9707.149282] end_request: I/O error, dev dm-17, sector 3 [ 9707.149285] end_request: I/O error, dev dm-5, sector 130 [ 9707.149289] end_request: I/O error, dev dm-17, sector 4 [ 9707.149293] end_request: I/O error, dev dm-5, sector 131 [ 9707.149296] end_request: I/O error, dev dm-8, sector 2 [ 9707.149299] end_request: I/O error, dev dm-17, sector 5 [ 9707.149306] end_request: I/O error, dev dm-8, sector 3 [ 9707.149308] end_request: I/O error, dev dm-17, sector 6 [ 9707.149310] end_request: I/O error, dev dm-5, sector 132 [ 9707.149315] end_request: I/O error, dev dm-17, sector 7 [ 9707.149318] end_request: I/O error, dev dm-5, sector 133 [ 9707.149324] end_request: I/O error, dev dm-5, sector 134 [ 9707.149326] end_request: I/O error, dev dm-17, sector 4096 [ 9707.149329] end_request: I/O error, dev dm-8, sector 4 [ 9707.149334] end_request: I/O error, dev dm-17, sector 4097 [ 9707.149336] end_request: I/O error, dev dm-8, sector 5 [ 9707.149341] end_request: I/O error, dev dm-17, sector 4098 [ 9707.149343] end_request: I/O error, dev dm-8, sector 6 [ 9707.149349] end_request: I/O error, dev dm-17, sector 4099 [ 9707.149356] end_request: I/O error, dev dm-5, sector 135 [ 9707.149358] end_request: I/O error, dev dm-8, sector 7 [ 9707.149362] end_request: I/O error, dev dm-17, sector 4100 [ 9707.149369] end_request: I/O error, dev dm-17, sector 4101 [ 9707.149374] end_request: I/O error, dev dm-8, sector 0 [ 9707.149376] end_request: I/O error, dev dm-5, sector 128 [ 9707.149379] end_request: I/O error, dev dm-17, sector 4102 [ 9707.149382] end_request: I/O error, dev dm-5, sector 129 [ 9707.149384] end_request: I/O error, dev dm-8, sector 1 [ 9707.149390] end_request: I/O error, dev dm-17, sector 4103 [ 9707.149392] end_request: I/O error, dev dm-8, sector 2 [ 9707.149396] end_request: I/O error, dev dm-5, sector 130 [ 9707.149403] end_request: I/O error, dev dm-8, sector 3 [ 9707.149404] end_request: I/O error, dev dm-5, sector 131 [ 9707.149410] end_request: I/O error, dev dm-5, sector 132 [ 9707.149416] end_request: I/O error, dev dm-5, sector 133 [ 9707.149423] end_request: I/O error, dev dm-5, sector 134 [ 9707.149431] end_request: I/O error, dev dm-5, sector 135 [ 9707.149433] end_request: I/O error, dev dm-8, sector 4 [ 9707.149440] end_request: I/O error, dev dm-8, sector 5 [ 9707.149445] end_request: I/O error, dev dm-5, sector 16 [ 9707.149452] end_request: I/O error, dev dm-5, sector 17 [ 9707.149458] end_request: I/O error, dev dm-5, sector 18 [ 9707.149466] end_request: I/O error, dev dm-5, sector 19 [ 9707.149467] end_request: I/O error, dev dm-8, sector 6 [ 9707.149475] end_request: I/O error, dev dm-8, sector 7 [ 9707.149476] end_request: I/O error, dev dm-5, sector 20 [ 9707.149483] end_request: I/O error, dev dm-5, sector 21 [ 9707.149490] end_request: I/O error, dev dm-5, sector 22 [ 9707.149493] end_request: I/O error, dev dm-8, sector 0 [ 9707.149498] end_request: I/O error, dev dm-5, sector 23 [ 9707.149503] end_request: I/O error, dev dm-8, sector 1 [ 9707.149514] end_request: I/O error, dev dm-5, sector 0 [ 9707.149515] end_request: I/O error, dev dm-8, sector 2 [ 9707.149522] end_request: I/O error, dev dm-8, sector 3 [ 9707.149528] end_request: I/O error, dev dm-8, sector 4 [ 9707.149534] end_request: I/O error, dev dm-5, sector 1 [ 9707.149539] end_request: I/O error, dev dm-8, sector 5 [ 9707.149544] end_request: I/O error, dev dm-5, sector 2 [ 9707.149546] end_request: I/O error, dev dm-8, sector 6 [ 9707.149550] end_request: I/O error, dev dm-5, sector 3 [ 9707.149552] end_request: I/O error, dev dm-8, sector 7 [ 9707.149557] end_request: I/O error, dev dm-5, sector 4 [ 9707.149560] end_request: I/O error, dev dm-8, sector 0 [ 9707.149563] end_request: I/O error, dev dm-5, sector 5 [ 9707.149567] end_request: I/O error, dev dm-8, sector 1 [ 9707.149569] end_request: I/O error, dev dm-5, sector 6 [ 9707.149573] end_request: I/O error, dev dm-8, sector 2 [ 9707.149575] end_request: I/O error, dev dm-5, sector 7 [ 9707.149580] end_request: I/O error, dev dm-8, sector 3 [ 9707.149583] end_request: I/O error, dev dm-5, sector 0 [ 9707.149586] end_request: I/O error, dev dm-8, sector 4 [ 9707.149590] end_request: I/O error, dev dm-5, sector 1 [ 9707.149592] end_request: I/O error, dev dm-8, sector 5 [ 9707.149596] end_request: I/O error, dev dm-5, sector 2 [ 9707.149599] end_request: I/O error, dev dm-8, sector 6 [ 9707.149606] end_request: I/O error, dev dm-5, sector 3 [ 9707.149608] end_request: I/O error, dev dm-8, sector 7 [ 9707.149613] end_request: I/O error, dev dm-5, sector 4 [ 9707.149625] end_request: I/O error, dev dm-5, sector 5 [ 9707.149627] end_request: I/O error, dev dm-8, sector 0 [ 9707.149636] end_request: I/O error, dev dm-8, sector 1 [ 9707.149642] end_request: I/O error, dev dm-5, sector 6 [ 9707.149651] end_request: I/O error, dev dm-5, sector 7 [ 9707.149660] end_request: I/O error, dev dm-8, sector 2 [ 9707.149673] end_request: I/O error, dev dm-5, sector 8 [ 9707.149675] end_request: I/O error, dev dm-8, sector 3 [ 9707.149682] end_request: I/O error, dev dm-8, sector 4 [ 9707.149689] end_request: I/O error, dev dm-5, sector 9 [ 9707.149697] end_request: I/O error, dev dm-8, sector 5 [ 9707.149706] end_request: I/O error, dev dm-5, sector 10 [ 9707.149709] end_request: I/O error, dev dm-5, sector 11 [ 9707.149712] end_request: I/O error, dev dm-5, sector 12 [ 9707.149714] end_request: I/O error, dev dm-5, sector 13 [ 9707.149717] end_request: I/O error, dev dm-5, sector 14 [ 9707.149719] end_request: I/O error, dev dm-5, sector 15 [ 9707.149735] end_request: I/O error, dev dm-8, sector 6 [ 9707.149738] end_request: I/O error, dev dm-5, sector 16 [ 9707.149749] end_request: I/O error, dev dm-5, sector 17 [ 9707.149752] end_request: I/O error, dev dm-8, sector 7 [ 9707.149763] end_request: I/O error, dev dm-5, sector 18 [ 9707.149776] end_request: I/O error, dev dm-8, sector 0 [ 9707.149778] end_request: I/O error, dev dm-5, sector 19 [ 9707.149784] end_request: I/O error, dev dm-5, sector 20 [ 9707.149790] end_request: I/O error, dev dm-5, sector 21 [ 9707.149797] end_request: I/O error, dev dm-5, sector 22 [ 9707.149805] end_request: I/O error, dev dm-5, sector 23 [ 9707.149810] end_request: I/O error, dev dm-8, sector 1 [ 9707.149819] end_request: I/O error, dev dm-8, sector 2 [ 9707.149821] end_request: I/O error, dev dm-5, sector 0 [ 9707.149833] end_request: I/O error, dev dm-5, sector 1 [ 9707.149834] end_request: I/O error, dev dm-8, sector 3 [ 9707.149842] end_request: I/O error, dev dm-8, sector 4 [ 9707.149844] end_request: I/O error, dev dm-5, sector 2 [ 9707.149850] end_request: I/O error, dev dm-5, sector 3 [ 9707.149852] end_request: I/O error, dev dm-8, sector 5 [ 9707.149859] end_request: I/O error, dev dm-5, sector 4 [ 9707.149862] end_request: I/O error, dev dm-8, sector 6 [ 9707.149871] end_request: I/O error, dev dm-5, sector 5 [ 9707.149873] end_request: I/O error, dev dm-8, sector 7 [ 9707.149879] end_request: I/O error, dev dm-5, sector 6 [ 9707.149891] end_request: I/O error, dev dm-5, sector 7 [ 9707.149892] end_request: I/O error, dev dm-8, sector 0 [ 9707.149903] end_request: I/O error, dev dm-8, sector 1 [ 9707.149906] end_request: I/O error, dev dm-5, sector 0 [ 9707.149910] end_request: I/O error, dev dm-8, sector 2 [ 9707.149914] end_request: I/O error, dev dm-5, sector 1 [ 9707.149918] end_request: I/O error, dev dm-8, sector 3 [ 9707.149921] end_request: I/O error, dev dm-5, sector 2 [ 9707.149929] end_request: I/O error, dev dm-5, sector 3 [ 9707.149940] end_request: I/O error, dev dm-5, sector 4 [ 9707.149942] end_request: I/O error, dev dm-8, sector 4 [ 9707.149952] end_request: I/O error, dev dm-8, sector 5 [ 9707.149954] end_request: I/O error, dev dm-5, sector 5 [ 9707.149960] end_request: I/O error, dev dm-5, sector 6 [ 9707.149967] end_request: I/O error, dev dm-5, sector 7 [ 9707.149977] end_request: I/O error, dev dm-5, sector 0 [ 9707.149983] end_request: I/O error, dev dm-5, sector 1 [ 9707.149992] end_request: I/O error, dev dm-5, sector 2 [ 9707.149998] end_request: I/O error, dev dm-8, sector 6 [ 9707.150006] end_request: I/O error, dev dm-5, sector 3 [ 9707.150012] end_request: I/O error, dev dm-5, sector 4 [ 9707.150019] end_request: I/O error, dev dm-5, sector 5 [ 9707.150023] end_request: I/O error, dev dm-8, sector 7 [ 9707.150030] end_request: I/O error, dev dm-5, sector 6 [ 9707.150031] end_request: I/O error, dev dm-8, sector 0 [ 9707.150038] end_request: I/O error, dev dm-8, sector 1 [ 9707.150039] end_request: I/O error, dev dm-5, sector 7 [ 9707.150045] end_request: I/O error, dev dm-8, sector 2 [ 9707.150048] end_request: I/O error, dev dm-5, sector 0 [ 9707.150051] end_request: I/O error, dev dm-8, sector 3 [ 9707.150054] end_request: I/O error, dev dm-5, sector 1 [ 9707.150058] end_request: I/O error, dev dm-8, sector 4 [ 9707.150061] end_request: I/O error, dev dm-5, sector 2 [ 9707.150064] end_request: I/O error, dev dm-8, sector 5 [ 9707.150067] end_request: I/O error, dev dm-5, sector 3 [ 9707.150070] end_request: I/O error, dev dm-8, sector 6 [ 9707.150073] end_request: I/O error, dev dm-5, sector 4 [ 9707.150076] end_request: I/O error, dev dm-8, sector 7 [ 9707.150079] end_request: I/O error, dev dm-5, sector 5 [ 9707.150085] end_request: I/O error, dev dm-8, sector 0 [ 9707.150086] end_request: I/O error, dev dm-5, sector 6 [ 9707.150091] end_request: I/O error, dev dm-5, sector 7 [ 9707.150093] end_request: I/O error, dev dm-8, sector 1 [ 9707.150103] end_request: I/O error, dev dm-5, sector 0 [ 9707.150109] end_request: I/O error, dev dm-8, sector 2 [ 9707.150111] end_request: I/O error, dev dm-5, sector 1 [ 9707.150118] end_request: I/O error, dev dm-5, sector 2 [ 9707.150128] end_request: I/O error, dev dm-5, sector 3 [ 9707.150130] end_request: I/O error, dev dm-8, sector 3 [ 9707.150141] end_request: I/O error, dev dm-5, sector 4 [ 9707.150143] end_request: I/O error, dev dm-8, sector 4 [ 9707.150149] end_request: I/O error, dev dm-8, sector 5 [ 9707.150152] end_request: I/O error, dev dm-5, sector 5 [ 9707.150158] end_request: I/O error, dev dm-5, sector 6 [ 9707.150164] end_request: I/O error, dev dm-5, sector 7 [ 9707.150173] end_request: I/O error, dev dm-8, sector 6 [ 9707.150176] end_request: I/O error, dev dm-5, sector 0 [ 9707.150182] end_request: I/O error, dev dm-5, sector 1 [ 9707.150189] end_request: I/O error, dev dm-8, sector 7 [ 9707.150191] end_request: I/O error, dev dm-5, sector 2 [ 9707.150198] end_request: I/O error, dev dm-5, sector 3 [ 9707.150204] end_request: I/O error, dev dm-5, sector 4 [ 9707.150210] end_request: I/O error, dev dm-5, sector 5 [ 9707.150217] end_request: I/O error, dev dm-5, sector 6 [ 9707.150223] end_request: I/O error, dev dm-5, sector 7 [ 9707.150226] end_request: I/O error, dev dm-8, sector 0 [ 9707.150233] end_request: I/O error, dev dm-5, sector 8 [ 9707.150239] end_request: I/O error, dev dm-8, sector 1 [ 9707.150244] end_request: I/O error, dev dm-5, sector 9 [ 9707.150250] end_request: I/O error, dev dm-5, sector 10 [ 9707.150257] end_request: I/O error, dev dm-5, sector 11 [ 9707.150262] end_request: I/O error, dev dm-8, sector 2 [ 9707.150264] end_request: I/O error, dev dm-5, sector 12 [ 9707.150270] end_request: I/O error, dev dm-5, sector 13 [ 9707.150276] end_request: I/O error, dev dm-5, sector 14 [ 9707.150285] end_request: I/O error, dev dm-5, sector 15 [ 9707.150294] end_request: I/O error, dev dm-5, sector 128 [ 9707.150300] end_request: I/O error, dev dm-5, sector 129 [ 9707.150307] end_request: I/O error, dev dm-5, sector 130 [ 9707.150309] end_request: I/O error, dev dm-8, sector 3 [ 9707.150319] end_request: I/O error, dev dm-8, sector 4 [ 9707.150326] end_request: I/O error, dev dm-5, sector 131 [ 9707.150331] end_request: I/O error, dev dm-8, sector 5 [ 9707.150335] end_request: I/O error, dev dm-5, sector 132 [ 9707.150341] end_request: I/O error, dev dm-5, sector 133 [ 9707.150347] end_request: I/O error, dev dm-5, sector 134 [ 9707.150356] end_request: I/O error, dev dm-5, sector 135 [ 9707.150358] end_request: I/O error, dev dm-8, sector 6 [ 9707.150365] end_request: I/O error, dev dm-5, sector 0 [ 9707.150368] end_request: I/O error, dev dm-8, sector 7 [ 9707.150378] end_request: I/O error, dev dm-5, sector 1 [ 9707.150381] end_request: I/O error, dev dm-8, sector 0 [ 9707.150390] end_request: I/O error, dev dm-5, sector 2 [ 9707.150392] end_request: I/O error, dev dm-8, sector 1 [ 9707.150398] end_request: I/O error, dev dm-8, sector 2 [ 9707.150400] end_request: I/O error, dev dm-5, sector 3 [ 9707.150407] end_request: I/O error, dev dm-5, sector 4 [ 9707.150418] end_request: I/O error, dev dm-5, sector 5 [ 9707.150421] end_request: I/O error, dev dm-8, sector 3 [ 9707.150430] end_request: I/O error, dev dm-5, sector 6 [ 9707.150431] end_request: I/O error, dev dm-8, sector 4 [ 9707.150437] end_request: I/O error, dev dm-8, sector 5 [ 9707.150438] end_request: I/O error, dev dm-5, sector 7 [ 9707.150447] end_request: I/O error, dev dm-5, sector 0 [ 9707.150453] end_request: I/O error, dev dm-8, sector 6 [ 9707.150455] end_request: I/O error, dev dm-5, sector 1 [ 9707.150461] end_request: I/O error, dev dm-5, sector 2 [ 9707.150465] end_request: I/O error, dev dm-8, sector 7 [ 9707.150467] end_request: I/O error, dev dm-5, sector 3 [ 9707.150473] end_request: I/O error, dev dm-5, sector 4 [ 9707.150474] end_request: I/O error, dev dm-8, sector 128 [ 9707.150480] end_request: I/O error, dev dm-5, sector 5 [ 9707.150482] end_request: I/O error, dev dm-8, sector 129 [ 9707.150486] end_request: I/O error, dev dm-5, sector 6 [ 9707.150488] end_request: I/O error, dev dm-8, sector 130 [ 9707.150492] end_request: I/O error, dev dm-5, sector 7 [ 9707.150495] end_request: I/O error, dev dm-8, sector 131 [ 9707.150501] end_request: I/O error, dev dm-8, sector 132 [ 9707.150506] end_request: I/O error, dev dm-5, sector 4096 [ 9707.150507] end_request: I/O error, dev dm-8, sector 133 [ 9707.150513] end_request: I/O error, dev dm-8, sector 134 [ 9707.150515] end_request: I/O error, dev dm-5, sector 4097 [ 9707.150520] end_request: I/O error, dev dm-5, sector 4098 [ 9707.150522] end_request: I/O error, dev dm-8, sector 135 [ 9707.150528] end_request: I/O error, dev dm-5, sector 4099 [ 9707.150530] end_request: I/O error, dev dm-8, sector 128 [ 9707.150537] end_request: I/O error, dev dm-5, sector 4100 [ 9707.150546] end_request: I/O error, dev dm-8, sector 129 [ 9707.150548] end_request: I/O error, dev dm-5, sector 4101 [ 9707.150555] end_request: I/O error, dev dm-5, sector 4102 [ 9707.150563] end_request: I/O error, dev dm-5, sector 4103 [ 9707.150565] end_request: I/O error, dev dm-8, sector 130 [ 9707.150590] end_request: I/O error, dev dm-8, sector 131 [ 9707.150613] end_request: I/O error, dev dm-8, sector 132 [ 9707.150658] end_request: I/O error, dev dm-8, sector 133 [ 9707.150665] end_request: I/O error, dev dm-8, sector 134 [ 9707.150685] end_request: I/O error, dev dm-8, sector 135 [ 9707.150696] end_request: I/O error, dev dm-8, sector 16 [ 9707.150708] end_request: I/O error, dev dm-8, sector 17 [ 9707.150715] end_request: I/O error, dev dm-8, sector 18 [ 9707.150728] end_request: I/O error, dev dm-8, sector 19 [ 9707.150746] end_request: I/O error, dev dm-8, sector 20 [ 9707.150758] end_request: I/O error, dev dm-8, sector 21 [ 9707.150771] end_request: I/O error, dev dm-8, sector 22 [ 9707.150790] end_request: I/O error, dev dm-8, sector 23 [ 9707.150802] end_request: I/O error, dev dm-8, sector 0 [ 9707.150809] end_request: I/O error, dev dm-8, sector 1 [ 9707.150815] end_request: I/O error, dev dm-8, sector 2 [ 9707.150821] end_request: I/O error, dev dm-8, sector 3 [ 9707.150827] end_request: I/O error, dev dm-8, sector 4 [ 9707.150833] end_request: I/O error, dev dm-8, sector 5 [ 9707.150839] end_request: I/O error, dev dm-8, sector 6 [ 9707.150845] end_request: I/O error, dev dm-8, sector 7 [ 9707.150853] end_request: I/O error, dev dm-8, sector 0 [ 9707.150860] end_request: I/O error, dev dm-8, sector 1 [ 9707.150872] end_request: I/O error, dev dm-8, sector 2 [ 9707.150879] end_request: I/O error, dev dm-8, sector 3 [ 9707.150896] end_request: I/O error, dev dm-8, sector 4 [ 9707.150906] end_request: I/O error, dev dm-8, sector 5 [ 9707.150926] end_request: I/O error, dev dm-8, sector 6 [ 9707.150936] end_request: I/O error, dev dm-8, sector 7 [ 9707.150946] end_request: I/O error, dev dm-8, sector 8 [ 9707.150954] end_request: I/O error, dev dm-8, sector 9 [ 9707.150971] end_request: I/O error, dev dm-8, sector 10 [ 9707.150999] end_request: I/O error, dev dm-8, sector 11 [ 9707.151016] end_request: I/O error, dev dm-8, sector 12 [ 9707.151033] end_request: I/O error, dev dm-8, sector 13 [ 9707.151045] end_request: I/O error, dev dm-8, sector 14 [ 9707.151057] end_request: I/O error, dev dm-8, sector 15 [ 9707.151078] end_request: I/O error, dev dm-8, sector 16 [ 9707.151085] end_request: I/O error, dev dm-8, sector 17 [ 9707.151092] end_request: I/O error, dev dm-8, sector 18 [ 9707.151098] end_request: I/O error, dev dm-8, sector 19 [ 9707.151104] end_request: I/O error, dev dm-8, sector 20 [ 9707.151110] end_request: I/O error, dev dm-8, sector 21 [ 9707.151116] end_request: I/O error, dev dm-8, sector 22 [ 9707.151122] end_request: I/O error, dev dm-8, sector 23 [ 9707.151130] end_request: I/O error, dev dm-8, sector 0 [ 9707.151136] end_request: I/O error, dev dm-8, sector 1 [ 9707.151142] end_request: I/O error, dev dm-8, sector 2 [ 9707.151148] end_request: I/O error, dev dm-8, sector 3 [ 9707.151154] end_request: I/O error, dev dm-8, sector 4 [ 9707.151169] end_request: I/O error, dev dm-8, sector 5 [ 9707.151183] end_request: I/O error, dev dm-8, sector 6 [ 9707.151196] end_request: I/O error, dev dm-8, sector 7 [ 9707.151207] end_request: I/O error, dev dm-8, sector 0 [ 9707.151216] end_request: I/O error, dev dm-8, sector 1 [ 9707.151232] end_request: I/O error, dev dm-8, sector 2 [ 9707.151242] end_request: I/O error, dev dm-8, sector 3 [ 9707.151273] end_request: I/O error, dev dm-8, sector 4 [ 9707.151302] end_request: I/O error, dev dm-8, sector 5 [ 9707.151316] end_request: I/O error, dev dm-8, sector 6 [ 9707.151343] end_request: I/O error, dev dm-8, sector 7 [ 9707.151355] end_request: I/O error, dev dm-8, sector 0 [ 9707.151368] end_request: I/O error, dev dm-8, sector 1 [ 9707.151396] end_request: I/O error, dev dm-8, sector 2 [ 9707.151408] end_request: I/O error, dev dm-8, sector 3 [ 9707.151414] end_request: I/O error, dev dm-8, sector 4 [ 9707.151420] end_request: I/O error, dev dm-8, sector 5 [ 9707.151426] end_request: I/O error, dev dm-8, sector 6 [ 9707.151432] end_request: I/O error, dev dm-8, sector 7 [ 9707.151440] end_request: I/O error, dev dm-8, sector 0 [ 9707.151446] end_request: I/O error, dev dm-8, sector 1 [ 9707.151452] end_request: I/O error, dev dm-8, sector 2 [ 9707.151458] end_request: I/O error, dev dm-8, sector 3 [ 9707.151464] end_request: I/O error, dev dm-8, sector 4 [ 9707.151470] end_request: I/O error, dev dm-8, sector 5 [ 9707.151478] end_request: I/O error, dev dm-8, sector 6 [ 9707.151486] end_request: I/O error, dev dm-8, sector 7 [ 9707.151495] end_request: I/O error, dev dm-8, sector 0 [ 9707.151520] end_request: I/O error, dev dm-8, sector 1 [ 9707.151543] end_request: I/O error, dev dm-8, sector 2 [ 9707.151551] end_request: I/O error, dev dm-8, sector 3 [ 9707.151569] end_request: I/O error, dev dm-8, sector 4 [ 9707.151582] end_request: I/O error, dev dm-8, sector 5 [ 9707.151591] end_request: I/O error, dev dm-8, sector 6 [ 9707.151606] end_request: I/O error, dev dm-8, sector 7 [ 9707.151622] end_request: I/O error, dev dm-8, sector 0 [ 9707.151632] end_request: I/O error, dev dm-8, sector 1 [ 9707.151654] end_request: I/O error, dev dm-8, sector 2 [ 9707.151669] end_request: I/O error, dev dm-8, sector 3 [ 9707.151681] end_request: I/O error, dev dm-8, sector 4 [ 9707.151695] end_request: I/O error, dev dm-8, sector 5 [ 9707.151701] end_request: I/O error, dev dm-8, sector 6 [ 9707.151707] end_request: I/O error, dev dm-8, sector 7 [ 9707.151716] end_request: I/O error, dev dm-8, sector 8 [ 9707.151722] end_request: I/O error, dev dm-8, sector 9 [ 9707.151728] end_request: I/O error, dev dm-8, sector 10 [ 9707.151734] end_request: I/O error, dev dm-8, sector 11 [ 9707.151740] end_request: I/O error, dev dm-8, sector 12 [ 9707.151746] end_request: I/O error, dev dm-8, sector 13 [ 9707.151752] end_request: I/O error, dev dm-8, sector 14 [ 9707.151758] end_request: I/O error, dev dm-8, sector 15 [ 9707.151766] end_request: I/O error, dev dm-8, sector 128 [ 9707.151790] end_request: I/O error, dev dm-8, sector 129 [ 9707.151805] end_request: I/O error, dev dm-8, sector 130 [ 9707.151815] end_request: I/O error, dev dm-8, sector 131 [ 9707.151837] end_request: I/O error, dev dm-8, sector 132 [ 9707.151846] end_request: I/O error, dev dm-8, sector 133 [ 9707.151872] end_request: I/O error, dev dm-8, sector 134 [ 9707.151881] end_request: I/O error, dev dm-8, sector 135 [ 9707.151902] end_request: I/O error, dev dm-8, sector 0 [ 9707.151925] end_request: I/O error, dev dm-8, sector 1 [ 9707.151946] end_request: I/O error, dev dm-8, sector 2 [ 9707.151959] end_request: I/O error, dev dm-8, sector 3 [ 9707.151968] end_request: I/O error, dev dm-8, sector 4 [ 9707.151977] end_request: I/O error, dev dm-8, sector 5 [ 9707.151989] end_request: I/O error, dev dm-8, sector 6 [ 9707.151998] end_request: I/O error, dev dm-8, sector 7 [ 9707.152006] end_request: I/O error, dev dm-8, sector 0 [ 9707.152013] end_request: I/O error, dev dm-8, sector 1 [ 9707.152019] end_request: I/O error, dev dm-8, sector 2 [ 9707.152025] end_request: I/O error, dev dm-8, sector 3 [ 9707.152030] end_request: I/O error, dev dm-8, sector 4 [ 9707.152036] end_request: I/O error, dev dm-8, sector 5 [ 9707.152042] end_request: I/O error, dev dm-8, sector 6 [ 9707.152048] end_request: I/O error, dev dm-8, sector 7 [ 9707.152058] end_request: I/O error, dev dm-8, sector 4096 [ 9707.152064] end_request: I/O error, dev dm-8, sector 4097 [ 9707.152073] end_request: I/O error, dev dm-8, sector 4098 [ 9707.152081] end_request: I/O error, dev dm-8, sector 4099 [ 9707.152091] end_request: I/O error, dev dm-8, sector 4100 [ 9707.152106] end_request: I/O error, dev dm-8, sector 4101 [ 9707.152115] end_request: I/O error, dev dm-8, sector 4102 [ 9707.152133] end_request: I/O error, dev dm-8, sector 4103 [ 9707.184511] end_request: I/O error, dev dm-4, sector 0 [ 9707.184523] end_request: I/O error, dev dm-4, sector 1 [ 9707.184530] end_request: I/O error, dev dm-4, sector 2 [ 9707.184537] end_request: I/O error, dev dm-4, sector 3 [ 9707.184543] end_request: I/O error, dev dm-4, sector 4 [ 9707.184549] end_request: I/O error, dev dm-4, sector 5 [ 9707.184555] end_request: I/O error, dev dm-4, sector 6 [ 9707.184561] end_request: I/O error, dev dm-4, sector 7 [ 9707.184576] end_request: I/O error, dev dm-4, sector 93674283000 [ 9707.184586] end_request: I/O error, dev dm-4, sector 93674283001 [ 9707.184599] end_request: I/O error, dev dm-4, sector 93674283002 [ 9707.184605] end_request: I/O error, dev dm-4, sector 93674283003 [ 9707.184612] end_request: I/O error, dev dm-4, sector 93674283004 [ 9707.184618] end_request: I/O error, dev dm-4, sector 93674283005 [ 9707.184624] end_request: I/O error, dev dm-4, sector 93674283006 [ 9707.184630] end_request: I/O error, dev dm-4, sector 93674283007 [ 9707.184639] end_request: I/O error, dev dm-4, sector 0 [ 9707.184645] end_request: I/O error, dev dm-4, sector 1 [ 9707.184651] end_request: I/O error, dev dm-4, sector 2 [ 9707.184657] end_request: I/O error, dev dm-4, sector 3 [ 9707.184663] end_request: I/O error, dev dm-4, sector 4 [ 9707.184669] end_request: I/O error, dev dm-4, sector 5 [ 9707.184675] end_request: I/O error, dev dm-4, sector 6 [ 9707.184681] end_request: I/O error, dev dm-4, sector 7 [ 9707.184697] end_request: I/O error, dev dm-4, sector 0 [ 9707.184704] end_request: I/O error, dev dm-4, sector 1 [ 9707.184710] end_request: I/O error, dev dm-4, sector 2 [ 9707.184716] end_request: I/O error, dev dm-4, sector 3 [ 9707.184722] end_request: I/O error, dev dm-4, sector 4 [ 9707.184728] end_request: I/O error, dev dm-4, sector 5 [ 9707.184734] end_request: I/O error, dev dm-4, sector 6 [ 9707.184739] end_request: I/O error, dev dm-4, sector 7 [ 9707.184749] end_request: I/O error, dev dm-4, sector 24 [ 9707.184755] end_request: I/O error, dev dm-4, sector 25 [ 9707.184761] end_request: I/O error, dev dm-4, sector 26 [ 9707.184767] end_request: I/O error, dev dm-4, sector 27 [ 9707.184773] end_request: I/O error, dev dm-4, sector 28 [ 9707.184779] end_request: I/O error, dev dm-4, sector 29 [ 9707.184785] end_request: I/O error, dev dm-4, sector 30 [ 9707.184791] end_request: I/O error, dev dm-4, sector 31 [ 9707.209178] end_request: I/O error, dev dm-4, sector 0 [ 9707.209190] end_request: I/O error, dev dm-4, sector 1 [ 9707.209197] end_request: I/O error, dev dm-4, sector 2 [ 9707.209203] end_request: I/O error, dev dm-4, sector 3 [ 9707.209209] end_request: I/O error, dev dm-4, sector 4 [ 9707.209215] end_request: I/O error, dev dm-4, sector 5 [ 9707.209221] end_request: I/O error, dev dm-4, sector 6 [ 9707.209226] end_request: I/O error, dev dm-4, sector 7 [ 9707.209237] end_request: I/O error, dev dm-4, sector 0 [ 9707.209243] end_request: I/O error, dev dm-4, sector 1 [ 9707.209249] end_request: I/O error, dev dm-4, sector 2 [ 9707.209255] end_request: I/O error, dev dm-4, sector 3 [ 9707.209262] end_request: I/O error, dev dm-4, sector 4 [ 9707.209273] end_request: I/O error, dev dm-4, sector 5 [ 9707.209284] end_request: I/O error, dev dm-4, sector 6 [ 9707.209293] end_request: I/O error, dev dm-4, sector 7 [ 9707.209302] end_request: I/O error, dev dm-4, sector 0 [ 9707.209308] end_request: I/O error, dev dm-4, sector 1 [ 9707.209314] end_request: I/O error, dev dm-4, sector 2 [ 9707.209320] end_request: I/O error, dev dm-4, sector 3 [ 9707.209325] end_request: I/O error, dev dm-4, sector 4 [ 9707.209331] end_request: I/O error, dev dm-4, sector 5 [ 9707.209338] end_request: I/O error, dev dm-4, sector 6 [ 9707.209343] end_request: I/O error, dev dm-4, sector 7 [ 9707.209351] end_request: I/O error, dev dm-4, sector 0 [ 9707.209357] end_request: I/O error, dev dm-4, sector 1 [ 9707.209367] end_request: I/O error, dev dm-4, sector 2 [ 9707.209378] end_request: I/O error, dev dm-4, sector 3 [ 9707.209388] end_request: I/O error, dev dm-4, sector 4 [ 9707.209394] end_request: I/O error, dev dm-4, sector 5 [ 9707.209400] end_request: I/O error, dev dm-4, sector 6 [ 9707.209406] end_request: I/O error, dev dm-4, sector 7 [ 9707.209418] end_request: I/O error, dev dm-4, sector 0 [ 9707.209424] end_request: I/O error, dev dm-4, sector 1 [ 9707.209430] end_request: I/O error, dev dm-4, sector 2 [ 9707.209436] end_request: I/O error, dev dm-4, sector 3 [ 9707.209441] end_request: I/O error, dev dm-4, sector 4 [ 9707.209447] end_request: I/O error, dev dm-4, sector 5 [ 9707.209453] end_request: I/O error, dev dm-4, sector 6 [ 9707.209458] end_request: I/O error, dev dm-4, sector 7 [ 9707.209466] end_request: I/O error, dev dm-4, sector 0 [ 9707.209472] end_request: I/O error, dev dm-4, sector 1 [ 9707.209478] end_request: I/O error, dev dm-4, sector 2 [ 9707.209483] end_request: I/O error, dev dm-4, sector 3 [ 9707.209489] end_request: I/O error, dev dm-4, sector 4 [ 9707.209495] end_request: I/O error, dev dm-4, sector 5 [ 9707.209501] end_request: I/O error, dev dm-4, sector 6 [ 9707.209506] end_request: I/O error, dev dm-4, sector 7 [ 9707.209514] end_request: I/O error, dev dm-4, sector 0 [ 9707.209532] end_request: I/O error, dev dm-4, sector 1 [ 9707.209538] end_request: I/O error, dev dm-4, sector 2 [ 9707.209544] end_request: I/O error, dev dm-4, sector 3 [ 9707.209550] end_request: I/O error, dev dm-4, sector 4 [ 9707.209555] end_request: I/O error, dev dm-4, sector 5 [ 9707.209561] end_request: I/O error, dev dm-4, sector 6 [ 9707.209567] end_request: I/O error, dev dm-4, sector 7 [ 9707.209575] end_request: I/O error, dev dm-4, sector 0 [ 9707.209581] end_request: I/O error, dev dm-4, sector 1 [ 9707.209587] end_request: I/O error, dev dm-4, sector 2 [ 9707.209593] end_request: I/O error, dev dm-4, sector 3 [ 9707.209599] end_request: I/O error, dev dm-4, sector 4 [ 9707.209604] end_request: I/O error, dev dm-4, sector 5 [ 9707.209610] end_request: I/O error, dev dm-4, sector 6 [ 9707.209616] end_request: I/O error, dev dm-4, sector 7 [ 9707.209623] end_request: I/O error, dev dm-4, sector 0 [ 9707.209632] end_request: I/O error, dev dm-4, sector 1 [ 9707.209637] end_request: I/O error, dev dm-4, sector 2 [ 9707.209643] end_request: I/O error, dev dm-4, sector 3 [ 9707.209649] end_request: I/O error, dev dm-4, sector 4 [ 9707.209654] end_request: I/O error, dev dm-4, sector 5 [ 9707.209660] end_request: I/O error, dev dm-4, sector 6 [ 9707.209665] end_request: I/O error, dev dm-4, sector 7 [ 9707.209673] end_request: I/O error, dev dm-4, sector 56 [ 9707.209679] end_request: I/O error, dev dm-4, sector 57 [ 9707.209685] end_request: I/O error, dev dm-4, sector 58 [ 9707.209691] end_request: I/O error, dev dm-4, sector 59 [ 9707.209696] end_request: I/O error, dev dm-4, sector 60 [ 9707.209702] end_request: I/O error, dev dm-4, sector 61 [ 9707.209708] end_request: I/O error, dev dm-4, sector 62 [ 9707.209713] end_request: I/O error, dev dm-4, sector 63 [ 9707.209721] end_request: I/O error, dev dm-4, sector 0 [ 9707.209727] end_request: I/O error, dev dm-4, sector 1 [ 9707.209732] end_request: I/O error, dev dm-4, sector 2 [ 9707.209738] end_request: I/O error, dev dm-4, sector 3 [ 9707.209744] end_request: I/O error, dev dm-4, sector 4 [ 9707.209749] end_request: I/O error, dev dm-4, sector 5 [ 9707.209755] end_request: I/O error, dev dm-4, sector 6 [ 9707.209761] end_request: I/O error, dev dm-4, sector 7 [ 9707.209768] end_request: I/O error, dev dm-4, sector 0 [ 9707.209774] end_request: I/O error, dev dm-4, sector 1 [ 9707.209780] end_request: I/O error, dev dm-4, sector 2 [ 9707.209785] end_request: I/O error, dev dm-4, sector 3 [ 9707.209791] end_request: I/O error, dev dm-4, sector 4 [ 9707.209797] end_request: I/O error, dev dm-4, sector 5 [ 9707.209802] end_request: I/O error, dev dm-4, sector 6 [ 9707.209808] end_request: I/O error, dev dm-4, sector 7 [ 9707.209820] end_request: I/O error, dev dm-4, sector 93674282880 [ 9707.209826] end_request: I/O error, dev dm-4, sector 93674282881 [ 9707.209832] end_request: I/O error, dev dm-4, sector 93674282882 [ 9707.209838] end_request: I/O error, dev dm-4, sector 93674282883 [ 9707.209843] end_request: I/O error, dev dm-4, sector 93674282884 [ 9707.209849] end_request: I/O error, dev dm-4, sector 93674282885 [ 9707.209855] end_request: I/O error, dev dm-4, sector 93674282886 [ 9707.209861] end_request: I/O error, dev dm-4, sector 93674282887 [ 9707.209868] end_request: I/O error, dev dm-4, sector 93674282992 [ 9707.209874] end_request: I/O error, dev dm-4, sector 93674282993 [ 9707.209880] end_request: I/O error, dev dm-4, sector 93674282994 [ 9707.209886] end_request: I/O error, dev dm-4, sector 93674282995 [ 9707.209891] end_request: I/O error, dev dm-4, sector 93674282996 [ 9707.209897] end_request: I/O error, dev dm-4, sector 93674282997 [ 9707.209903] end_request: I/O error, dev dm-4, sector 93674282998 [ 9707.209908] end_request: I/O error, dev dm-4, sector 93674282999 [ 9707.209916] end_request: I/O error, dev dm-4, sector 0 [ 9707.209921] end_request: I/O error, dev dm-4, sector 1 [ 9707.209927] end_request: I/O error, dev dm-4, sector 2 [ 9707.209933] end_request: I/O error, dev dm-4, sector 3 [ 9707.209938] end_request: I/O error, dev dm-4, sector 4 [ 9707.209944] end_request: I/O error, dev dm-4, sector 5 [ 9707.209950] end_request: I/O error, dev dm-4, sector 6 [ 9707.209955] end_request: I/O error, dev dm-4, sector 7 [ 9707.209964] end_request: I/O error, dev dm-4, sector 8 [ 9707.209970] end_request: I/O error, dev dm-4, sector 9 [ 9707.209976] end_request: I/O error, dev dm-4, sector 10 [ 9707.209981] end_request: I/O error, dev dm-4, sector 11 [ 9707.209987] end_request: I/O error, dev dm-4, sector 12 [ 9707.209993] end_request: I/O error, dev dm-4, sector 13 [ 9707.209998] end_request: I/O error, dev dm-4, sector 14 [ 9707.210004] end_request: I/O error, dev dm-4, sector 15 [ 9707.210014] end_request: I/O error, dev dm-4, sector 93674283000 [ 9707.210020] end_request: I/O error, dev dm-4, sector 93674283001 [ 9707.210026] end_request: I/O error, dev dm-4, sector 93674283002 [ 9707.210031] end_request: I/O error, dev dm-4, sector 93674283003 [ 9707.210037] end_request: I/O error, dev dm-4, sector 93674283004 [ 9707.210043] end_request: I/O error, dev dm-4, sector 93674283005 [ 9707.210048] end_request: I/O error, dev dm-4, sector 93674283006 [ 9707.210054] end_request: I/O error, dev dm-4, sector 93674283007 [ 9707.210061] end_request: I/O error, dev dm-4, sector 93674283000 [ 9707.210067] end_request: I/O error, dev dm-4, sector 93674283001 [ 9707.210073] end_request: I/O error, dev dm-4, sector 93674283002 [ 9707.210079] end_request: I/O error, dev dm-4, sector 93674283003 [ 9707.210084] end_request: I/O error, dev dm-4, sector 93674283004 [ 9707.210090] end_request: I/O error, dev dm-4, sector 93674283005 [ 9707.210096] end_request: I/O error, dev dm-4, sector 93674283006 [ 9707.210101] end_request: I/O error, dev dm-4, sector 93674283007 [ 9707.210108] end_request: I/O error, dev dm-4, sector 93674283000 [ 9707.210114] end_request: I/O error, dev dm-4, sector 93674283001 [ 9707.210120] end_request: I/O error, dev dm-4, sector 93674283002 [ 9707.210126] end_request: I/O error, dev dm-4, sector 93674283003 [ 9707.210132] end_request: I/O error, dev dm-4, sector 93674283004 [ 9707.210137] end_request: I/O error, dev dm-4, sector 93674283005 [ 9707.210143] end_request: I/O error, dev dm-4, sector 93674283006 [ 9707.210149] end_request: I/O error, dev dm-4, sector 93674283007 [ 9707.210156] end_request: I/O error, dev dm-4, sector 93674283000 [ 9707.210162] end_request: I/O error, dev dm-4, sector 93674283001 [ 9707.210167] end_request: I/O error, dev dm-4, sector 93674283002 [ 9707.210173] end_request: I/O error, dev dm-4, sector 93674283003 [ 9707.210179] end_request: I/O error, dev dm-4, sector 93674283004 [ 9707.210185] end_request: I/O error, dev dm-4, sector 93674283005 [ 9707.210190] end_request: I/O error, dev dm-4, sector 93674283006 [ 9707.210196] end_request: I/O error, dev dm-4, sector 93674283007 [ 9707.210204] end_request: I/O error, dev dm-4, sector 93674283000 [ 9707.210210] end_request: I/O error, dev dm-4, sector 93674283001 [ 9707.210215] end_request: I/O error, dev dm-4, sector 93674283002 [ 9707.210221] end_request: I/O error, dev dm-4, sector 93674283003 [ 9707.210227] end_request: I/O error, dev dm-4, sector 93674283004 [ 9707.210233] end_request: I/O error, dev dm-4, sector 93674283005 [ 9707.210239] end_request: I/O error, dev dm-4, sector 93674283006 [ 9707.210244] end_request: I/O error, dev dm-4, sector 93674283007 [ 9707.210252] end_request: I/O error, dev dm-4, sector 93674283000 [ 9707.210258] end_request: I/O error, dev dm-4, sector 93674283001 [ 9707.210264] end_request: I/O error, dev dm-4, sector 93674283002 [ 9707.210270] end_request: I/O error, dev dm-4, sector 93674283003 [ 9707.210276] end_request: I/O error, dev dm-4, sector 93674283004 [ 9707.210281] end_request: I/O error, dev dm-4, sector 93674283005 [ 9707.210287] end_request: I/O error, dev dm-4, sector 93674283006 [ 9707.210293] end_request: I/O error, dev dm-4, sector 93674283007 [ 9707.210300] end_request: I/O error, dev dm-4, sector 93674282944 [ 9707.210306] end_request: I/O error, dev dm-4, sector 93674282945 [ 9707.210312] end_request: I/O error, dev dm-4, sector 93674282946 [ 9707.210317] end_request: I/O error, dev dm-4, sector 93674282947 [ 9707.210323] end_request: I/O error, dev dm-4, sector 93674282948 [ 9707.210329] end_request: I/O error, dev dm-4, sector 93674282949 [ 9707.210334] end_request: I/O error, dev dm-4, sector 93674282950 [ 9707.210340] end_request: I/O error, dev dm-4, sector 93674282951 [ 9707.210348] end_request: I/O error, dev dm-4, sector 93674282992 [ 9707.210354] end_request: I/O error, dev dm-4, sector 93674282993 [ 9707.210360] end_request: I/O error, dev dm-4, sector 93674282994 [ 9707.210366] end_request: I/O error, dev dm-4, sector 93674282995 [ 9707.210372] end_request: I/O error, dev dm-4, sector 93674282996 [ 9707.210377] end_request: I/O error, dev dm-4, sector 93674282997 [ 9707.210383] end_request: I/O error, dev dm-4, sector 93674282998 [ 9707.210389] end_request: I/O error, dev dm-4, sector 93674282999 [ 9707.210396] end_request: I/O error, dev dm-4, sector 8 [ 9707.210402] end_request: I/O error, dev dm-4, sector 9 [ 9707.210408] end_request: I/O error, dev dm-4, sector 10 [ 9707.210414] end_request: I/O error, dev dm-4, sector 11 [ 9707.210419] end_request: I/O error, dev dm-4, sector 12 [ 9707.210425] end_request: I/O error, dev dm-4, sector 13 [ 9707.210430] end_request: I/O error, dev dm-4, sector 14 [ 9707.210436] end_request: I/O error, dev dm-4, sector 15 [ 9707.210444] end_request: I/O error, dev dm-4, sector 8 [ 9707.210450] end_request: I/O error, dev dm-4, sector 9 [ 9707.210455] end_request: I/O error, dev dm-4, sector 10 [ 9707.210461] end_request: I/O error, dev dm-4, sector 11 [ 9707.210466] end_request: I/O error, dev dm-4, sector 12 [ 9707.210472] end_request: I/O error, dev dm-4, sector 13 [ 9707.210478] end_request: I/O error, dev dm-4, sector 14 [ 9707.210483] end_request: I/O error, dev dm-4, sector 15 [ 9707.210491] end_request: I/O error, dev dm-4, sector 93674283000 [ 9707.210497] end_request: I/O error, dev dm-4, sector 93674283001 [ 9707.210503] end_request: I/O error, dev dm-4, sector 93674283002 [ 9707.210509] end_request: I/O error, dev dm-4, sector 93674283003 [ 9707.210519] end_request: I/O error, dev dm-4, sector 93674283004 [ 9707.210531] end_request: I/O error, dev dm-4, sector 93674283005 [ 9707.210537] end_request: I/O error, dev dm-4, sector 93674283006 [ 9707.210543] end_request: I/O error, dev dm-4, sector 93674283007 [ 9707.210551] end_request: I/O error, dev dm-4, sector 93674283000 [ 9707.210557] end_request: I/O error, dev dm-4, sector 93674283001 [ 9707.210563] end_request: I/O error, dev dm-4, sector 93674283002 [ 9707.210568] end_request: I/O error, dev dm-4, sector 93674283003 [ 9707.210574] end_request: I/O error, dev dm-4, sector 93674283004 [ 9707.210580] end_request: I/O error, dev dm-4, sector 93674283005 [ 9707.210586] end_request: I/O error, dev dm-4, sector 93674283006 [ 9707.210591] end_request: I/O error, dev dm-4, sector 93674283007 [ 9707.210603] end_request: I/O error, dev dm-4, sector 93674283000 [ 9707.210609] end_request: I/O error, dev dm-4, sector 93674283001 [ 9707.210615] end_request: I/O error, dev dm-4, sector 93674283002 [ 9707.210620] end_request: I/O error, dev dm-4, sector 93674283003 [ 9707.210626] end_request: I/O error, dev dm-4, sector 93674283004 [ 9707.210632] end_request: I/O error, dev dm-4, sector 93674283005 [ 9707.210638] end_request: I/O error, dev dm-4, sector 93674283006 [ 9707.210643] end_request: I/O error, dev dm-4, sector 93674283007 [ 9707.210651] end_request: I/O error, dev dm-4, sector 0 [ 9707.210657] end_request: I/O error, dev dm-4, sector 1 [ 9707.210662] end_request: I/O error, dev dm-4, sector 2 [ 9707.210668] end_request: I/O error, dev dm-4, sector 3 [ 9707.210674] end_request: I/O error, dev dm-4, sector 4 [ 9707.210679] end_request: I/O error, dev dm-4, sector 5 [ 9707.210685] end_request: I/O error, dev dm-4, sector 6 [ 9707.210690] end_request: I/O error, dev dm-4, sector 7 [ 9707.210698] end_request: I/O error, dev dm-4, sector 0 [ 9707.210703] end_request: I/O error, dev dm-4, sector 1 [ 9707.210709] end_request: I/O error, dev dm-4, sector 2 [ 9707.210715] end_request: I/O error, dev dm-4, sector 3 [ 9707.210721] end_request: I/O error, dev dm-4, sector 4 [ 9707.210726] end_request: I/O error, dev dm-4, sector 5 [ 9707.210732] end_request: I/O error, dev dm-4, sector 6 [ 9707.210738] end_request: I/O error, dev dm-4, sector 7 [ 9707.210745] end_request: I/O error, dev dm-4, sector 0 [ 9707.210751] end_request: I/O error, dev dm-4, sector 1 [ 9707.210756] end_request: I/O error, dev dm-4, sector 2 [ 9707.210762] end_request: I/O error, dev dm-4, sector 3 [ 9707.210768] end_request: I/O error, dev dm-4, sector 4 [ 9707.210773] end_request: I/O error, dev dm-4, sector 5 [ 9707.210779] end_request: I/O error, dev dm-4, sector 6 [ 9707.210784] end_request: I/O error, dev dm-4, sector 7 [ 9707.210792] end_request: I/O error, dev dm-4, sector 0 [ 9707.210798] end_request: I/O error, dev dm-4, sector 1 [ 9707.210803] end_request: I/O error, dev dm-4, sector 2 [ 9707.210809] end_request: I/O error, dev dm-4, sector 3 [ 9707.210815] end_request: I/O error, dev dm-4, sector 4 [ 9707.210820] end_request: I/O error, dev dm-4, sector 5 [ 9707.210826] end_request: I/O error, dev dm-4, sector 6 [ 9707.210831] end_request: I/O error, dev dm-4, sector 7 [ 9707.210839] end_request: I/O error, dev dm-4, sector 0 [ 9707.210845] end_request: I/O error, dev dm-4, sector 1 [ 9707.210850] end_request: I/O error, dev dm-4, sector 2 [ 9707.210856] end_request: I/O error, dev dm-4, sector 3 [ 9707.210861] end_request: I/O error, dev dm-4, sector 4 [ 9707.210867] end_request: I/O error, dev dm-4, sector 5 [ 9707.210873] end_request: I/O error, dev dm-4, sector 6 [ 9707.210878] end_request: I/O error, dev dm-4, sector 7 [ 9707.210886] end_request: I/O error, dev dm-4, sector 0 [ 9707.210891] end_request: I/O error, dev dm-4, sector 1 [ 9707.210897] end_request: I/O error, dev dm-4, sector 2 [ 9707.210903] end_request: I/O error, dev dm-4, sector 3 [ 9707.210908] end_request: I/O error, dev dm-4, sector 4 [ 9707.210914] end_request: I/O error, dev dm-4, sector 5 [ 9707.210919] end_request: I/O error, dev dm-4, sector 6 [ 9707.210925] end_request: I/O error, dev dm-4, sector 7 [ 9707.210933] end_request: I/O error, dev dm-4, sector 0 [ 9707.210938] end_request: I/O error, dev dm-4, sector 1 [ 9707.210944] end_request: I/O error, dev dm-4, sector 2 [ 9707.210950] end_request: I/O error, dev dm-4, sector 3 [ 9707.210955] end_request: I/O error, dev dm-4, sector 4 [ 9707.210961] end_request: I/O error, dev dm-4, sector 5 [ 9707.210967] end_request: I/O error, dev dm-4, sector 6 [ 9707.210972] end_request: I/O error, dev dm-4, sector 7 [ 9707.210980] end_request: I/O error, dev dm-4, sector 2048 [ 9707.210986] end_request: I/O error, dev dm-4, sector 2049 [ 9707.210992] end_request: I/O error, dev dm-4, sector 2050 [ 9707.210997] end_request: I/O error, dev dm-4, sector 2051 [ 9707.211003] end_request: I/O error, dev dm-4, sector 2052 [ 9707.211009] end_request: I/O error, dev dm-4, sector 2053 [ 9707.211014] end_request: I/O error, dev dm-4, sector 2054 [ 9707.211020] end_request: I/O error, dev dm-4, sector 2055 [ 9707.211028] end_request: I/O error, dev dm-4, sector 0 [ 9707.211033] end_request: I/O error, dev dm-4, sector 1 [ 9707.211039] end_request: I/O error, dev dm-4, sector 2 [ 9707.211045] end_request: I/O error, dev dm-4, sector 3 [ 9707.211050] end_request: I/O error, dev dm-4, sector 4 [ 9707.211056] end_request: I/O error, dev dm-4, sector 5 [ 9707.211062] end_request: I/O error, dev dm-4, sector 6 [ 9707.211067] end_request: I/O error, dev dm-4, sector 7 [ 9707.211075] end_request: I/O error, dev dm-4, sector 0 [ 9707.211080] end_request: I/O error, dev dm-4, sector 1 [ 9707.211086] end_request: I/O error, dev dm-4, sector 2 [ 9707.211092] end_request: I/O error, dev dm-4, sector 3 [ 9707.211097] end_request: I/O error, dev dm-4, sector 4 [ 9707.211103] end_request: I/O error, dev dm-4, sector 5 [ 9707.211109] end_request: I/O error, dev dm-4, sector 6 [ 9707.211114] end_request: I/O error, dev dm-4, sector 7 [ 9707.211122] end_request: I/O error, dev dm-4, sector 0 [ 9707.211127] end_request: I/O error, dev dm-4, sector 1 [ 9707.211133] end_request: I/O error, dev dm-4, sector 2 [ 9707.211139] end_request: I/O error, dev dm-4, sector 3 [ 9707.211144] end_request: I/O error, dev dm-4, sector 4 [ 9707.211150] end_request: I/O error, dev dm-4, sector 5 [ 9707.211155] end_request: I/O error, dev dm-4, sector 6 [ 9707.211161] end_request: I/O error, dev dm-4, sector 7 [ 9707.211168] end_request: I/O error, dev dm-4, sector 0 [ 9707.211174] end_request: I/O error, dev dm-4, sector 1 [ 9707.211180] end_request: I/O error, dev dm-4, sector 2 [ 9707.211185] end_request: I/O error, dev dm-4, sector 3 [ 9707.211191] end_request: I/O error, dev dm-4, sector 4 [ 9707.211197] end_request: I/O error, dev dm-4, sector 5 [ 9707.211202] end_request: I/O error, dev dm-4, sector 6 [ 9707.211208] end_request: I/O error, dev dm-4, sector 7 [ 9707.211215] end_request: I/O error, dev dm-4, sector 0 [ 9707.211221] end_request: I/O error, dev dm-4, sector 1 [ 9707.211227] end_request: I/O error, dev dm-4, sector 2 [ 9707.211232] end_request: I/O error, dev dm-4, sector 3 [ 9707.211238] end_request: I/O error, dev dm-4, sector 4 [ 9707.211243] end_request: I/O error, dev dm-4, sector 5 [ 9707.211249] end_request: I/O error, dev dm-4, sector 6 [ 9707.211255] end_request: I/O error, dev dm-4, sector 7 [ 9707.211262] end_request: I/O error, dev dm-4, sector 0 [ 9707.211268] end_request: I/O error, dev dm-4, sector 1 [ 9707.211274] end_request: I/O error, dev dm-4, sector 2 [ 9707.211279] end_request: I/O error, dev dm-4, sector 3 [ 9707.211285] end_request: I/O error, dev dm-4, sector 4 [ 9707.211290] end_request: I/O error, dev dm-4, sector 5 [ 9707.211296] end_request: I/O error, dev dm-4, sector 6 [ 9707.211302] end_request: I/O error, dev dm-4, sector 7 [ 9707.211309] end_request: I/O error, dev dm-4, sector 0 [ 9707.211315] end_request: I/O error, dev dm-4, sector 1 [ 9707.211321] end_request: I/O error, dev dm-4, sector 2 [ 9707.211326] end_request: I/O error, dev dm-4, sector 3 [ 9707.211332] end_request: I/O error, dev dm-4, sector 4 [ 9707.211337] end_request: I/O error, dev dm-4, sector 5 [ 9707.211343] end_request: I/O error, dev dm-4, sector 6 [ 9707.211349] end_request: I/O error, dev dm-4, sector 7 [ 9707.211356] end_request: I/O error, dev dm-4, sector 0 [ 9707.211362] end_request: I/O error, dev dm-4, sector 1 [ 9707.211367] end_request: I/O error, dev dm-4, sector 2 [ 9707.211373] end_request: I/O error, dev dm-4, sector 3 [ 9707.211379] end_request: I/O error, dev dm-4, sector 4 [ 9707.211384] end_request: I/O error, dev dm-4, sector 5 [ 9707.211390] end_request: I/O error, dev dm-4, sector 6 [ 9707.211395] end_request: I/O error, dev dm-4, sector 7 [ 9707.211403] end_request: I/O error, dev dm-4, sector 0 [ 9707.211409] end_request: I/O error, dev dm-4, sector 1 [ 9707.211414] end_request: I/O error, dev dm-4, sector 2 [ 9707.211420] end_request: I/O error, dev dm-4, sector 3 [ 9707.211426] end_request: I/O error, dev dm-4, sector 4 [ 9707.211431] end_request: I/O error, dev dm-4, sector 5 [ 9707.211437] end_request: I/O error, dev dm-4, sector 6 [ 9707.211443] end_request: I/O error, dev dm-4, sector 7 [ 9707.211450] end_request: I/O error, dev dm-4, sector 0 [ 9707.211456] end_request: I/O error, dev dm-4, sector 1 [ 9707.211461] end_request: I/O error, dev dm-4, sector 2 [ 9707.211467] end_request: I/O error, dev dm-4, sector 3 [ 9707.211473] end_request: I/O error, dev dm-4, sector 4 [ 9707.211478] end_request: I/O error, dev dm-4, sector 5 [ 9707.211484] end_request: I/O error, dev dm-4, sector 6 [ 9707.211489] end_request: I/O error, dev dm-4, sector 7 [ 9707.211497] end_request: I/O error, dev dm-4, sector 0 [ 9707.211502] end_request: I/O error, dev dm-4, sector 1 [ 9707.211508] end_request: I/O error, dev dm-4, sector 2 [ 9707.211519] end_request: I/O error, dev dm-4, sector 3 [ 9707.211527] end_request: I/O error, dev dm-4, sector 4 [ 9707.211533] end_request: I/O error, dev dm-4, sector 5 [ 9707.211539] end_request: I/O error, dev dm-4, sector 6 [ 9707.211545] end_request: I/O error, dev dm-4, sector 7 [ 9707.211553] end_request: I/O error, dev dm-4, sector 0 [ 9707.211559] end_request: I/O error, dev dm-4, sector 1 [ 9707.211564] end_request: I/O error, dev dm-4, sector 2 [ 9707.211570] end_request: I/O error, dev dm-4, sector 3 [ 9707.211576] end_request: I/O error, dev dm-4, sector 4 [ 9707.211581] end_request: I/O error, dev dm-4, sector 5 [ 9707.211587] end_request: I/O error, dev dm-4, sector 6 [ 9707.211593] end_request: I/O error, dev dm-4, sector 7 [ 9707.211600] end_request: I/O error, dev dm-4, sector 8 [ 9707.211606] end_request: I/O error, dev dm-4, sector 9 [ 9707.211612] end_request: I/O error, dev dm-4, sector 10 [ 9707.211617] end_request: I/O error, dev dm-4, sector 11 [ 9707.211623] end_request: I/O error, dev dm-4, sector 12 [ 9707.211628] end_request: I/O error, dev dm-4, sector 13 [ 9707.211634] end_request: I/O error, dev dm-4, sector 14 [ 9707.211640] end_request: I/O error, dev dm-4, sector 15 [ 9707.211647] end_request: I/O error, dev dm-4, sector 8 [ 9707.211653] end_request: I/O error, dev dm-4, sector 9 [ 9707.211659] end_request: I/O error, dev dm-4, sector 10 [ 9707.211664] end_request: I/O error, dev dm-4, sector 11 [ 9707.211670] end_request: I/O error, dev dm-4, sector 12 [ 9707.211676] end_request: I/O error, dev dm-4, sector 13 [ 9707.211681] end_request: I/O error, dev dm-4, sector 14 [ 9707.211687] end_request: I/O error, dev dm-4, sector 15 [ 9707.211694] end_request: I/O error, dev dm-4, sector 8 [ 9707.211700] end_request: I/O error, dev dm-4, sector 9 [ 9707.211706] end_request: I/O error, dev dm-4, sector 10 [ 9707.211712] end_request: I/O error, dev dm-4, sector 11 [ 9707.211717] end_request: I/O error, dev dm-4, sector 12 [ 9707.211723] end_request: I/O error, dev dm-4, sector 13 [ 9707.211729] end_request: I/O error, dev dm-4, sector 14 [ 9707.211734] end_request: I/O error, dev dm-4, sector 15 [ 9707.211742] end_request: I/O error, dev dm-4, sector 8 [ 9707.211747] end_request: I/O error, dev dm-4, sector 9 [ 9707.211753] end_request: I/O error, dev dm-4, sector 10 [ 9707.211759] end_request: I/O error, dev dm-4, sector 11 [ 9707.211764] end_request: I/O error, dev dm-4, sector 12 [ 9707.211770] end_request: I/O error, dev dm-4, sector 13 [ 9707.211776] end_request: I/O error, dev dm-4, sector 14 [ 9707.211781] end_request: I/O error, dev dm-4, sector 15 [ 9707.211789] end_request: I/O error, dev dm-4, sector 24 [ 9707.211795] end_request: I/O error, dev dm-4, sector 25 [ 9707.211801] end_request: I/O error, dev dm-4, sector 26 [ 9707.211806] end_request: I/O error, dev dm-4, sector 27 [ 9707.211812] end_request: I/O error, dev dm-4, sector 28 [ 9707.211818] end_request: I/O error, dev dm-4, sector 29 [ 9707.211823] end_request: I/O error, dev dm-4, sector 30 [ 9707.211829] end_request: I/O error, dev dm-4, sector 31 [ 9707.211836] end_request: I/O error, dev dm-4, sector 24 [ 9707.211842] end_request: I/O error, dev dm-4, sector 25 [ 9707.211848] end_request: I/O error, dev dm-4, sector 26 [ 9707.211854] end_request: I/O error, dev dm-4, sector 27 [ 9707.211859] end_request: I/O error, dev dm-4, sector 28 [ 9707.211865] end_request: I/O error, dev dm-4, sector 29 [ 9707.211871] end_request: I/O error, dev dm-4, sector 30 [ 9707.211876] end_request: I/O error, dev dm-4, sector 31 [ 9707.211883] end_request: I/O error, dev dm-4, sector 24 [ 9707.211889] end_request: I/O error, dev dm-4, sector 25 [ 9707.211895] end_request: I/O error, dev dm-4, sector 26 [ 9707.211901] end_request: I/O error, dev dm-4, sector 27 [ 9707.211906] end_request: I/O error, dev dm-4, sector 28 [ 9707.211912] end_request: I/O error, dev dm-4, sector 29 [ 9707.211918] end_request: I/O error, dev dm-4, sector 30 [ 9707.211923] end_request: I/O error, dev dm-4, sector 31 [ 9707.211931] end_request: I/O error, dev dm-4, sector 24 [ 9707.211936] end_request: I/O error, dev dm-4, sector 25 [ 9707.211942] end_request: I/O error, dev dm-4, sector 26 [ 9707.211948] end_request: I/O error, dev dm-4, sector 27 [ 9707.211953] end_request: I/O error, dev dm-4, sector 28 [ 9707.211959] end_request: I/O error, dev dm-4, sector 29 [ 9707.211964] end_request: I/O error, dev dm-4, sector 30 [ 9707.211970] end_request: I/O error, dev dm-4, sector 31 [ 9707.211977] end_request: I/O error, dev dm-4, sector 56 [ 9707.211983] end_request: I/O error, dev dm-4, sector 57 [ 9707.211989] end_request: I/O error, dev dm-4, sector 58 [ 9707.211995] end_request: I/O error, dev dm-4, sector 59 [ 9707.212000] end_request: I/O error, dev dm-4, sector 60 [ 9707.212006] end_request: I/O error, dev dm-4, sector 61 [ 9707.212011] end_request: I/O error, dev dm-4, sector 62 [ 9707.212017] end_request: I/O error, dev dm-4, sector 63 [ 9707.212024] end_request: I/O error, dev dm-4, sector 56 [ 9707.212030] end_request: I/O error, dev dm-4, sector 57 [ 9707.212036] end_request: I/O error, dev dm-4, sector 58 [ 9707.212041] end_request: I/O error, dev dm-4, sector 59 [ 9707.212047] end_request: I/O error, dev dm-4, sector 60 [ 9707.212053] end_request: I/O error, dev dm-4, sector 61 [ 9707.212058] end_request: I/O error, dev dm-4, sector 62 [ 9707.212064] end_request: I/O error, dev dm-4, sector 63 [ 9707.212071] end_request: I/O error, dev dm-4, sector 56 [ 9707.212077] end_request: I/O error, dev dm-4, sector 57 [ 9707.212083] end_request: I/O error, dev dm-4, sector 58 [ 9707.212089] end_request: I/O error, dev dm-4, sector 59 [ 9707.212094] end_request: I/O error, dev dm-4, sector 60 [ 9707.212100] end_request: I/O error, dev dm-4, sector 61 [ 9707.212106] end_request: I/O error, dev dm-4, sector 62 [ 9707.212111] end_request: I/O error, dev dm-4, sector 63 [ 9707.212119] end_request: I/O error, dev dm-4, sector 56 [ 9707.212125] end_request: I/O error, dev dm-4, sector 57 [ 9707.212130] end_request: I/O error, dev dm-4, sector 58 [ 9707.212136] end_request: I/O error, dev dm-4, sector 59 [ 9707.212142] end_request: I/O error, dev dm-4, sector 60 [ 9707.212147] end_request: I/O error, dev dm-4, sector 61 [ 9707.212153] end_request: I/O error, dev dm-4, sector 62 [ 9707.212159] end_request: I/O error, dev dm-4, sector 63 [ 9707.212166] end_request: I/O error, dev dm-4, sector 120 [ 9707.212172] end_request: I/O error, dev dm-4, sector 121 [ 9707.212178] end_request: I/O error, dev dm-4, sector 122 [ 9707.212184] end_request: I/O error, dev dm-4, sector 123 [ 9707.212189] end_request: I/O error, dev dm-4, sector 124 [ 9707.212195] end_request: I/O error, dev dm-4, sector 125 [ 9707.212201] end_request: I/O error, dev dm-4, sector 126 [ 9707.212206] end_request: I/O error, dev dm-4, sector 127 [ 9707.212214] end_request: I/O error, dev dm-4, sector 120 [ 9707.212220] end_request: I/O error, dev dm-4, sector 121 [ 9707.212225] end_request: I/O error, dev dm-4, sector 122 [ 9707.212231] end_request: I/O error, dev dm-4, sector 123 [ 9707.212237] end_request: I/O error, dev dm-4, sector 124 [ 9707.212242] end_request: I/O error, dev dm-4, sector 125 [ 9707.212248] end_request: I/O error, dev dm-4, sector 126 [ 9707.212253] end_request: I/O error, dev dm-4, sector 127 [ 9707.212261] end_request: I/O error, dev dm-4, sector 120 [ 9707.212266] end_request: I/O error, dev dm-4, sector 121 [ 9707.212272] end_request: I/O error, dev dm-4, sector 122 [ 9707.212278] end_request: I/O error, dev dm-4, sector 123 [ 9707.212283] end_request: I/O error, dev dm-4, sector 124 [ 9707.212289] end_request: I/O error, dev dm-4, sector 125 [ 9707.212295] end_request: I/O error, dev dm-4, sector 126 [ 9707.212300] end_request: I/O error, dev dm-4, sector 127 [ 9707.212308] end_request: I/O error, dev dm-4, sector 120 [ 9707.212314] end_request: I/O error, dev dm-4, sector 121 [ 9707.212319] end_request: I/O error, dev dm-4, sector 122 [ 9707.212325] end_request: I/O error, dev dm-4, sector 123 [ 9707.212330] end_request: I/O error, dev dm-4, sector 124 [ 9707.212336] end_request: I/O error, dev dm-4, sector 125 [ 9707.212342] end_request: I/O error, dev dm-4, sector 126 [ 9707.212347] end_request: I/O error, dev dm-4, sector 127 [ 9707.212355] end_request: I/O error, dev dm-4, sector 0 [ 9707.212361] end_request: I/O error, dev dm-4, sector 1 [ 9707.212367] end_request: I/O error, dev dm-4, sector 2 [ 9707.212372] end_request: I/O error, dev dm-4, sector 3 [ 9707.212378] end_request: I/O error, dev dm-4, sector 4 [ 9707.212383] end_request: I/O error, dev dm-4, sector 5 [ 9707.212389] end_request: I/O error, dev dm-4, sector 6 [ 9707.212395] end_request: I/O error, dev dm-4, sector 7 [ 9707.212402] end_request: I/O error, dev dm-4, sector 0 [ 9707.212408] end_request: I/O error, dev dm-4, sector 1 [ 9707.212414] end_request: I/O error, dev dm-4, sector 2 [ 9707.212419] end_request: I/O error, dev dm-4, sector 3 [ 9707.212425] end_request: I/O error, dev dm-4, sector 4 [ 9707.212431] end_request: I/O error, dev dm-4, sector 5 [ 9707.212436] end_request: I/O error, dev dm-4, sector 6 [ 9707.212442] end_request: I/O error, dev dm-4, sector 7 [ 9707.212449] end_request: I/O error, dev dm-4, sector 8 [ 9707.212455] end_request: I/O error, dev dm-4, sector 9 [ 9707.212461] end_request: I/O error, dev dm-4, sector 10 [ 9707.212466] end_request: I/O error, dev dm-4, sector 11 [ 9707.212472] end_request: I/O error, dev dm-4, sector 12 [ 9707.212478] end_request: I/O error, dev dm-4, sector 13 [ 9707.212483] end_request: I/O error, dev dm-4, sector 14 [ 9707.212489] end_request: I/O error, dev dm-4, sector 15 [ 9707.212496] end_request: I/O error, dev dm-4, sector 8 [ 9707.212502] end_request: I/O error, dev dm-4, sector 9 [ 9707.212507] end_request: I/O error, dev dm-4, sector 10 [ 9707.212521] end_request: I/O error, dev dm-4, sector 11 [ 9707.212527] end_request: I/O error, dev dm-4, sector 12 [ 9707.212534] end_request: I/O error, dev dm-4, sector 13 [ 9707.212541] end_request: I/O error, dev dm-4, sector 14 [ 9707.212547] end_request: I/O error, dev dm-4, sector 15 [ 9707.212555] end_request: I/O error, dev dm-4, sector 24 [ 9707.212561] end_request: I/O error, dev dm-4, sector 25 [ 9707.212566] end_request: I/O error, dev dm-4, sector 26 [ 9707.212572] end_request: I/O error, dev dm-4, sector 27 [ 9707.212578] end_request: I/O error, dev dm-4, sector 28 [ 9707.212583] end_request: I/O error, dev dm-4, sector 29 [ 9707.212589] end_request: I/O error, dev dm-4, sector 30 [ 9707.212594] end_request: I/O error, dev dm-4, sector 31 [ 9707.212602] end_request: I/O error, dev dm-4, sector 24 [ 9707.212608] end_request: I/O error, dev dm-4, sector 25 [ 9707.212614] end_request: I/O error, dev dm-4, sector 26 [ 9707.212619] end_request: I/O error, dev dm-4, sector 27 [ 9707.212625] end_request: I/O error, dev dm-4, sector 28 [ 9707.212630] end_request: I/O error, dev dm-4, sector 29 [ 9707.212636] end_request: I/O error, dev dm-4, sector 30 [ 9707.212642] end_request: I/O error, dev dm-4, sector 31 [ 9707.212649] end_request: I/O error, dev dm-4, sector 56 [ 9707.212655] end_request: I/O error, dev dm-4, sector 57 [ 9707.212661] end_request: I/O error, dev dm-4, sector 58 [ 9707.212666] end_request: I/O error, dev dm-4, sector 59 [ 9707.212672] end_request: I/O error, dev dm-4, sector 60 [ 9707.212677] end_request: I/O error, dev dm-4, sector 61 [ 9707.212683] end_request: I/O error, dev dm-4, sector 62 [ 9707.212689] end_request: I/O error, dev dm-4, sector 63 [ 9707.212696] end_request: I/O error, dev dm-4, sector 56 [ 9707.212702] end_request: I/O error, dev dm-4, sector 57 [ 9707.212708] end_request: I/O error, dev dm-4, sector 58 [ 9707.212713] end_request: I/O error, dev dm-4, sector 59 [ 9707.212719] end_request: I/O error, dev dm-4, sector 60 [ 9707.212724] end_request: I/O error, dev dm-4, sector 61 [ 9707.212730] end_request: I/O error, dev dm-4, sector 62 [ 9707.212735] end_request: I/O error, dev dm-4, sector 63 [ 9707.212743] end_request: I/O error, dev dm-4, sector 120 [ 9707.212749] end_request: I/O error, dev dm-4, sector 121 [ 9707.212754] end_request: I/O error, dev dm-4, sector 122 [ 9707.212760] end_request: I/O error, dev dm-4, sector 123 [ 9707.212766] end_request: I/O error, dev dm-4, sector 124 [ 9707.212771] end_request: I/O error, dev dm-4, sector 125 [ 9707.212777] end_request: I/O error, dev dm-4, sector 126 [ 9707.212782] end_request: I/O error, dev dm-4, sector 127 [ 9707.212790] end_request: I/O error, dev dm-4, sector 120 [ 9707.212796] end_request: I/O error, dev dm-4, sector 121 [ 9707.212801] end_request: I/O error, dev dm-4, sector 122 [ 9707.212807] end_request: I/O error, dev dm-4, sector 123 [ 9707.212813] end_request: I/O error, dev dm-4, sector 124 [ 9707.212818] end_request: I/O error, dev dm-4, sector 125 [ 9707.212824] end_request: I/O error, dev dm-4, sector 126 [ 9707.212829] end_request: I/O error, dev dm-4, sector 127 [ 9707.212837] end_request: I/O error, dev dm-4, sector 0 [ 9707.212843] end_request: I/O error, dev dm-4, sector 1 [ 9707.212848] end_request: I/O error, dev dm-4, sector 2 [ 9707.212854] end_request: I/O error, dev dm-4, sector 3 [ 9707.212859] end_request: I/O error, dev dm-4, sector 4 [ 9707.212865] end_request: I/O error, dev dm-4, sector 5 [ 9707.212871] end_request: I/O error, dev dm-4, sector 6 [ 9707.212876] end_request: I/O error, dev dm-4, sector 7 [ 9707.212884] end_request: I/O error, dev dm-4, sector 0 [ 9707.212889] end_request: I/O error, dev dm-4, sector 1 [ 9707.212895] end_request: I/O error, dev dm-4, sector 2 [ 9707.212901] end_request: I/O error, dev dm-4, sector 3 [ 9707.212906] end_request: I/O error, dev dm-4, sector 4 [ 9707.212912] end_request: I/O error, dev dm-4, sector 5 [ 9707.212918] end_request: I/O error, dev dm-4, sector 6 [ 9707.212923] end_request: I/O error, dev dm-4, sector 7 [ 9707.212931] end_request: I/O error, dev dm-4, sector 0 [ 9707.212937] end_request: I/O error, dev dm-4, sector 1 [ 9707.212942] end_request: I/O error, dev dm-4, sector 2 [ 9707.212948] end_request: I/O error, dev dm-4, sector 3 [ 9707.212954] end_request: I/O error, dev dm-4, sector 4 [ 9707.212959] end_request: I/O error, dev dm-4, sector 5 [ 9707.212965] end_request: I/O error, dev dm-4, sector 6 [ 9707.212970] end_request: I/O error, dev dm-4, sector 7 [ 9707.212977] end_request: I/O error, dev dm-4, sector 0 [ 9707.212983] end_request: I/O error, dev dm-4, sector 1 [ 9707.212989] end_request: I/O error, dev dm-4, sector 2 [ 9707.212995] end_request: I/O error, dev dm-4, sector 3 [ 9707.213000] end_request: I/O error, dev dm-4, sector 4 [ 9707.213006] end_request: I/O error, dev dm-4, sector 5 [ 9707.213011] end_request: I/O error, dev dm-4, sector 6 [ 9707.213017] end_request: I/O error, dev dm-4, sector 7 [ 9707.213024] end_request: I/O error, dev dm-4, sector 0 [ 9707.213030] end_request: I/O error, dev dm-4, sector 1 [ 9707.213036] end_request: I/O error, dev dm-4, sector 2 [ 9707.213042] end_request: I/O error, dev dm-4, sector 3 [ 9707.213047] end_request: I/O error, dev dm-4, sector 4 [ 9707.213053] end_request: I/O error, dev dm-4, sector 5 [ 9707.213058] end_request: I/O error, dev dm-4, sector 6 [ 9707.213064] end_request: I/O error, dev dm-4, sector 7 [ 9707.213071] end_request: I/O error, dev dm-4, sector 0 [ 9707.213077] end_request: I/O error, dev dm-4, sector 1 [ 9707.213083] end_request: I/O error, dev dm-4, sector 2 [ 9707.213089] end_request: I/O error, dev dm-4, sector 3 [ 9707.213094] end_request: I/O error, dev dm-4, sector 4 [ 9707.213100] end_request: I/O error, dev dm-4, sector 5 [ 9707.213105] end_request: I/O error, dev dm-4, sector 6 [ 9707.213111] end_request: I/O error, dev dm-4, sector 7 [ 9707.213119] end_request: I/O error, dev dm-4, sector 16 [ 9707.213124] end_request: I/O error, dev dm-4, sector 17 [ 9707.213130] end_request: I/O error, dev dm-4, sector 18 [ 9707.213136] end_request: I/O error, dev dm-4, sector 19 [ 9707.213142] end_request: I/O error, dev dm-4, sector 20 [ 9707.213147] end_request: I/O error, dev dm-4, sector 21 [ 9707.213153] end_request: I/O error, dev dm-4, sector 22 [ 9707.213158] end_request: I/O error, dev dm-4, sector 23 [ 9707.213166] end_request: I/O error, dev dm-4, sector 128 [ 9707.213172] end_request: I/O error, dev dm-4, sector 129 [ 9707.213177] end_request: I/O error, dev dm-4, sector 130 [ 9707.213183] end_request: I/O error, dev dm-4, sector 131 [ 9707.213189] end_request: I/O error, dev dm-4, sector 132 [ 9707.213194] end_request: I/O error, dev dm-4, sector 133 [ 9707.213200] end_request: I/O error, dev dm-4, sector 134 [ 9707.213206] end_request: I/O error, dev dm-4, sector 135 [ 9707.213213] end_request: I/O error, dev dm-4, sector 128 [ 9707.213219] end_request: I/O error, dev dm-4, sector 129 [ 9707.213225] end_request: I/O error, dev dm-4, sector 130 [ 9707.213231] end_request: I/O error, dev dm-4, sector 131 [ 9707.213237] end_request: I/O error, dev dm-4, sector 132 [ 9707.213242] end_request: I/O error, dev dm-4, sector 133 [ 9707.213248] end_request: I/O error, dev dm-4, sector 134 [ 9707.213254] end_request: I/O error, dev dm-4, sector 135 [ 9707.213262] end_request: I/O error, dev dm-4, sector 128 [ 9707.213269] end_request: I/O error, dev dm-4, sector 129 [ 9707.213274] end_request: I/O error, dev dm-4, sector 130 [ 9707.213280] end_request: I/O error, dev dm-4, sector 131 [ 9707.213286] end_request: I/O error, dev dm-4, sector 132 [ 9707.213291] end_request: I/O error, dev dm-4, sector 133 [ 9707.213297] end_request: I/O error, dev dm-4, sector 134 [ 9707.213302] end_request: I/O error, dev dm-4, sector 135 [ 9707.213310] end_request: I/O error, dev dm-4, sector 16 [ 9707.213316] end_request: I/O error, dev dm-4, sector 17 [ 9707.213321] end_request: I/O error, dev dm-4, sector 18 [ 9707.213327] end_request: I/O error, dev dm-4, sector 19 [ 9707.213333] end_request: I/O error, dev dm-4, sector 20 [ 9707.213338] end_request: I/O error, dev dm-4, sector 21 [ 9707.213344] end_request: I/O error, dev dm-4, sector 22 [ 9707.213349] end_request: I/O error, dev dm-4, sector 23 [ 9707.213357] end_request: I/O error, dev dm-4, sector 128 [ 9707.213363] end_request: I/O error, dev dm-4, sector 129 [ 9707.213368] end_request: I/O error, dev dm-4, sector 130 [ 9707.213374] end_request: I/O error, dev dm-4, sector 131 [ 9707.213380] end_request: I/O error, dev dm-4, sector 132 [ 9707.213385] end_request: I/O error, dev dm-4, sector 133 [ 9707.213391] end_request: I/O error, dev dm-4, sector 134 [ 9707.213396] end_request: I/O error, dev dm-4, sector 135 [ 9707.213404] end_request: I/O error, dev dm-4, sector 64 [ 9707.213410] end_request: I/O error, dev dm-4, sector 65 [ 9707.213416] end_request: I/O error, dev dm-4, sector 66 [ 9707.213422] end_request: I/O error, dev dm-4, sector 67 [ 9707.213427] end_request: I/O error, dev dm-4, sector 68 [ 9707.213433] end_request: I/O error, dev dm-4, sector 69 [ 9707.213438] end_request: I/O error, dev dm-4, sector 70 [ 9707.213444] end_request: I/O error, dev dm-4, sector 71 [ 9707.213452] end_request: I/O error, dev dm-4, sector 64 [ 9707.213457] end_request: I/O error, dev dm-4, sector 65 [ 9707.213463] end_request: I/O error, dev dm-4, sector 66 [ 9707.213469] end_request: I/O error, dev dm-4, sector 67 [ 9707.213474] end_request: I/O error, dev dm-4, sector 68 [ 9707.213480] end_request: I/O error, dev dm-4, sector 69 [ 9707.213485] end_request: I/O error, dev dm-4, sector 70 [ 9707.213491] end_request: I/O error, dev dm-4, sector 71 [ 9707.213499] end_request: I/O error, dev dm-4, sector 64 [ 9707.213505] end_request: I/O error, dev dm-4, sector 65 [ 9707.213518] end_request: I/O error, dev dm-4, sector 66 [ 9707.213527] end_request: I/O error, dev dm-4, sector 67 [ 9707.213533] end_request: I/O error, dev dm-4, sector 68 [ 9707.213540] end_request: I/O error, dev dm-4, sector 69 [ 9707.213545] end_request: I/O error, dev dm-4, sector 70 [ 9707.213551] end_request: I/O error, dev dm-4, sector 71 [ 9707.213559] end_request: I/O error, dev dm-4, sector 64 [ 9707.213565] end_request: I/O error, dev dm-4, sector 65 [ 9707.213571] end_request: I/O error, dev dm-4, sector 66 [ 9707.213576] end_request: I/O error, dev dm-4, sector 67 [ 9707.213582] end_request: I/O error, dev dm-4, sector 68 [ 9707.213588] end_request: I/O error, dev dm-4, sector 69 [ 9707.213593] end_request: I/O error, dev dm-4, sector 70 [ 9707.213599] end_request: I/O error, dev dm-4, sector 71 [ 9707.213606] end_request: I/O error, dev dm-4, sector 64 [ 9707.213612] end_request: I/O error, dev dm-4, sector 65 [ 9707.213618] end_request: I/O error, dev dm-4, sector 66 [ 9707.213623] end_request: I/O error, dev dm-4, sector 67 [ 9707.213629] end_request: I/O error, dev dm-4, sector 68 [ 9707.213635] end_request: I/O error, dev dm-4, sector 69 [ 9707.213640] end_request: I/O error, dev dm-4, sector 70 [ 9707.213646] end_request: I/O error, dev dm-4, sector 71 [ 9707.213653] end_request: I/O error, dev dm-4, sector 64 [ 9707.213659] end_request: I/O error, dev dm-4, sector 65 [ 9707.213665] end_request: I/O error, dev dm-4, sector 66 [ 9707.213671] end_request: I/O error, dev dm-4, sector 67 [ 9707.213677] end_request: I/O error, dev dm-4, sector 68 [ 9707.213682] end_request: I/O error, dev dm-4, sector 69 [ 9707.213688] end_request: I/O error, dev dm-4, sector 70 [ 9707.213693] end_request: I/O error, dev dm-4, sector 71 [ 9707.213701] end_request: I/O error, dev dm-4, sector 64 [ 9707.213707] end_request: I/O error, dev dm-4, sector 65 [ 9707.213712] end_request: I/O error, dev dm-4, sector 66 [ 9707.213718] end_request: I/O error, dev dm-4, sector 67 [ 9707.213724] end_request: I/O error, dev dm-4, sector 68 [ 9707.213729] end_request: I/O error, dev dm-4, sector 69 [ 9707.213735] end_request: I/O error, dev dm-4, sector 70 [ 9707.213741] end_request: I/O error, dev dm-4, sector 71 [ 9707.213748] end_request: I/O error, dev dm-4, sector 64 [ 9707.213754] end_request: I/O error, dev dm-4, sector 65 [ 9707.213760] end_request: I/O error, dev dm-4, sector 66 [ 9707.213765] end_request: I/O error, dev dm-4, sector 67 [ 9707.213771] end_request: I/O error, dev dm-4, sector 68 [ 9707.213776] end_request: I/O error, dev dm-4, sector 69 [ 9707.213782] end_request: I/O error, dev dm-4, sector 70 [ 9707.213791] end_request: I/O error, dev dm-4, sector 71 [ 9707.213798] end_request: I/O error, dev dm-4, sector 64 [ 9707.213804] end_request: I/O error, dev dm-4, sector 65 [ 9707.213810] end_request: I/O error, dev dm-4, sector 66 [ 9707.213815] end_request: I/O error, dev dm-4, sector 67 [ 9707.213821] end_request: I/O error, dev dm-4, sector 68 [ 9707.213827] end_request: I/O error, dev dm-4, sector 69 [ 9707.213832] end_request: I/O error, dev dm-4, sector 70 [ 9707.213838] end_request: I/O error, dev dm-4, sector 71 [ 9707.213845] end_request: I/O error, dev dm-4, sector 64 [ 9707.213851] end_request: I/O error, dev dm-4, sector 65 [ 9707.213857] end_request: I/O error, dev dm-4, sector 66 [ 9707.213862] end_request: I/O error, dev dm-4, sector 67 [ 9707.213868] end_request: I/O error, dev dm-4, sector 68 [ 9707.213873] end_request: I/O error, dev dm-4, sector 69 [ 9707.213879] end_request: I/O error, dev dm-4, sector 70 [ 9707.213885] end_request: I/O error, dev dm-4, sector 71 [ 9707.213892] end_request: I/O error, dev dm-4, sector 256 [ 9707.213898] end_request: I/O error, dev dm-4, sector 257 [ 9707.213904] end_request: I/O error, dev dm-4, sector 258 [ 9707.213909] end_request: I/O error, dev dm-4, sector 259 [ 9707.213915] end_request: I/O error, dev dm-4, sector 260 [ 9707.213921] end_request: I/O error, dev dm-4, sector 261 [ 9707.213926] end_request: I/O error, dev dm-4, sector 262 [ 9707.213932] end_request: I/O error, dev dm-4, sector 263 [ 9707.213939] end_request: I/O error, dev dm-4, sector 256 [ 9707.213945] end_request: I/O error, dev dm-4, sector 257 [ 9707.213951] end_request: I/O error, dev dm-4, sector 258 [ 9707.213956] end_request: I/O error, dev dm-4, sector 259 [ 9707.213962] end_request: I/O error, dev dm-4, sector 260 [ 9707.213967] end_request: I/O error, dev dm-4, sector 261 [ 9707.213973] end_request: I/O error, dev dm-4, sector 262 [ 9707.213979] end_request: I/O error, dev dm-4, sector 263 [ 9707.213987] end_request: I/O error, dev dm-4, sector 264 [ 9707.213992] end_request: I/O error, dev dm-4, sector 265 [ 9707.213998] end_request: I/O error, dev dm-4, sector 266 [ 9707.214004] end_request: I/O error, dev dm-4, sector 267 [ 9707.214009] end_request: I/O error, dev dm-4, sector 268 [ 9707.214015] end_request: I/O error, dev dm-4, sector 269 [ 9707.214020] end_request: I/O error, dev dm-4, sector 270 [ 9707.214026] end_request: I/O error, dev dm-4, sector 271 [ 9707.214033] end_request: I/O error, dev dm-4, sector 264 [ 9707.214039] end_request: I/O error, dev dm-4, sector 265 [ 9707.214045] end_request: I/O error, dev dm-4, sector 266 [ 9707.214051] end_request: I/O error, dev dm-4, sector 267 [ 9707.214056] end_request: I/O error, dev dm-4, sector 268 [ 9707.214062] end_request: I/O error, dev dm-4, sector 269 [ 9707.214068] end_request: I/O error, dev dm-4, sector 270 [ 9707.214073] end_request: I/O error, dev dm-4, sector 271 [ 9707.214081] end_request: I/O error, dev dm-4, sector 272 [ 9707.214087] end_request: I/O error, dev dm-4, sector 273 [ 9707.214092] end_request: I/O error, dev dm-4, sector 274 [ 9707.214098] end_request: I/O error, dev dm-4, sector 275 [ 9707.214104] end_request: I/O error, dev dm-4, sector 276 [ 9707.214109] end_request: I/O error, dev dm-4, sector 277 [ 9707.214115] end_request: I/O error, dev dm-4, sector 278 [ 9707.214120] end_request: I/O error, dev dm-4, sector 279 [ 9707.214128] end_request: I/O error, dev dm-4, sector 272 [ 9707.214134] end_request: I/O error, dev dm-4, sector 273 [ 9707.214139] end_request: I/O error, dev dm-4, sector 274 [ 9707.214145] end_request: I/O error, dev dm-4, sector 275 [ 9707.214150] end_request: I/O error, dev dm-4, sector 276 [ 9707.214156] end_request: I/O error, dev dm-4, sector 277 [ 9707.214162] end_request: I/O error, dev dm-4, sector 278 [ 9707.214168] end_request: I/O error, dev dm-4, sector 279 [ 9707.214175] end_request: I/O error, dev dm-4, sector 768 [ 9707.214181] end_request: I/O error, dev dm-4, sector 769 [ 9707.214187] end_request: I/O error, dev dm-4, sector 770 [ 9707.214193] end_request: I/O error, dev dm-4, sector 771 [ 9707.214198] end_request: I/O error, dev dm-4, sector 772 [ 9707.214204] end_request: I/O error, dev dm-4, sector 773 [ 9707.214209] end_request: I/O error, dev dm-4, sector 774 [ 9707.214215] end_request: I/O error, dev dm-4, sector 775 [ 9707.214223] end_request: I/O error, dev dm-4, sector 768 [ 9707.214228] end_request: I/O error, dev dm-4, sector 769 [ 9707.214234] end_request: I/O error, dev dm-4, sector 770 [ 9707.214240] end_request: I/O error, dev dm-4, sector 771 [ 9707.214245] end_request: I/O error, dev dm-4, sector 772 [ 9707.214251] end_request: I/O error, dev dm-4, sector 773 [ 9707.214257] end_request: I/O error, dev dm-4, sector 774 [ 9707.214262] end_request: I/O error, dev dm-4, sector 775 [ 9707.214270] end_request: I/O error, dev dm-4, sector 776 [ 9707.214276] end_request: I/O error, dev dm-4, sector 777 [ 9707.214282] end_request: I/O error, dev dm-4, sector 778 [ 9707.214287] end_request: I/O error, dev dm-4, sector 779 [ 9707.214293] end_request: I/O error, dev dm-4, sector 780 [ 9707.214299] end_request: I/O error, dev dm-4, sector 781 [ 9707.214304] end_request: I/O error, dev dm-4, sector 782 [ 9707.214310] end_request: I/O error, dev dm-4, sector 783 [ 9707.214317] end_request: I/O error, dev dm-4, sector 776 [ 9707.214323] end_request: I/O error, dev dm-4, sector 777 [ 9707.214329] end_request: I/O error, dev dm-4, sector 778 [ 9707.214334] end_request: I/O error, dev dm-4, sector 779 [ 9707.214340] end_request: I/O error, dev dm-4, sector 780 [ 9707.214345] end_request: I/O error, dev dm-4, sector 781 [ 9707.214351] end_request: I/O error, dev dm-4, sector 782 [ 9707.214357] end_request: I/O error, dev dm-4, sector 783 [ 9707.214364] end_request: I/O error, dev dm-4, sector 784 [ 9707.214370] end_request: I/O error, dev dm-4, sector 785 [ 9707.214376] end_request: I/O error, dev dm-4, sector 786 [ 9707.214382] end_request: I/O error, dev dm-4, sector 787 [ 9707.214387] end_request: I/O error, dev dm-4, sector 788 [ 9707.214393] end_request: I/O error, dev dm-4, sector 789 [ 9707.214398] end_request: I/O error, dev dm-4, sector 790 [ 9707.214404] end_request: I/O error, dev dm-4, sector 791 [ 9707.214411] end_request: I/O error, dev dm-4, sector 784 [ 9707.214417] end_request: I/O error, dev dm-4, sector 785 [ 9707.214423] end_request: I/O error, dev dm-4, sector 786 [ 9707.214428] end_request: I/O error, dev dm-4, sector 787 [ 9707.214434] end_request: I/O error, dev dm-4, sector 788 [ 9707.214439] end_request: I/O error, dev dm-4, sector 789 [ 9707.214445] end_request: I/O error, dev dm-4, sector 790 [ 9707.214451] end_request: I/O error, dev dm-4, sector 791 [ 9707.214458] end_request: I/O error, dev dm-4, sector 0 [ 9707.214464] end_request: I/O error, dev dm-4, sector 1 [ 9707.214470] end_request: I/O error, dev dm-4, sector 2 [ 9707.214475] end_request: I/O error, dev dm-4, sector 3 [ 9707.214481] end_request: I/O error, dev dm-4, sector 4 [ 9707.214486] end_request: I/O error, dev dm-4, sector 5 [ 9707.214492] end_request: I/O error, dev dm-4, sector 6 [ 9707.214498] end_request: I/O error, dev dm-4, sector 7 [ 9707.214505] end_request: I/O error, dev dm-4, sector 0 [ 9707.214518] end_request: I/O error, dev dm-4, sector 1 [ 9707.214524] end_request: I/O error, dev dm-4, sector 2 [ 9707.214529] end_request: I/O error, dev dm-4, sector 3 [ 9707.214535] end_request: I/O error, dev dm-4, sector 4 [ 9707.214541] end_request: I/O error, dev dm-4, sector 5 [ 9707.214546] end_request: I/O error, dev dm-4, sector 6 [ 9707.214552] end_request: I/O error, dev dm-4, sector 7 [ 9707.214560] end_request: I/O error, dev dm-4, sector 0 [ 9707.214566] end_request: I/O error, dev dm-4, sector 1 [ 9707.214572] end_request: I/O error, dev dm-4, sector 2 [ 9707.214577] end_request: I/O error, dev dm-4, sector 3 [ 9707.214583] end_request: I/O error, dev dm-4, sector 4 [ 9707.214589] end_request: I/O error, dev dm-4, sector 5 [ 9707.214594] end_request: I/O error, dev dm-4, sector 6 [ 9707.214600] end_request: I/O error, dev dm-4, sector 7 [ 9707.214608] end_request: I/O error, dev dm-4, sector 0 [ 9707.214614] end_request: I/O error, dev dm-4, sector 1 [ 9707.214619] end_request: I/O error, dev dm-4, sector 2 [ 9707.214625] end_request: I/O error, dev dm-4, sector 3 [ 9707.214630] end_request: I/O error, dev dm-4, sector 4 [ 9707.214636] end_request: I/O error, dev dm-4, sector 5 [ 9707.214642] end_request: I/O error, dev dm-4, sector 6 [ 9707.214647] end_request: I/O error, dev dm-4, sector 7 [ 9707.214655] end_request: I/O error, dev dm-4, sector 0 [ 9707.214661] end_request: I/O error, dev dm-4, sector 1 [ 9707.214667] end_request: I/O error, dev dm-4, sector 2 [ 9707.214672] end_request: I/O error, dev dm-4, sector 3 [ 9707.214678] end_request: I/O error, dev dm-4, sector 4 [ 9707.214684] end_request: I/O error, dev dm-4, sector 5 [ 9707.214689] end_request: I/O error, dev dm-4, sector 6 [ 9707.214695] end_request: I/O error, dev dm-4, sector 7 [ 9707.214703] end_request: I/O error, dev dm-4, sector 16 [ 9707.214709] end_request: I/O error, dev dm-4, sector 17 [ 9707.214714] end_request: I/O error, dev dm-4, sector 18 [ 9707.214720] end_request: I/O error, dev dm-4, sector 19 [ 9707.214726] end_request: I/O error, dev dm-4, sector 20 [ 9707.214731] end_request: I/O error, dev dm-4, sector 21 [ 9707.214737] end_request: I/O error, dev dm-4, sector 22 [ 9707.214743] end_request: I/O error, dev dm-4, sector 23 [ 9707.214750] end_request: I/O error, dev dm-4, sector 0 [ 9707.214756] end_request: I/O error, dev dm-4, sector 1 [ 9707.214762] end_request: I/O error, dev dm-4, sector 2 [ 9707.214767] end_request: I/O error, dev dm-4, sector 3 [ 9707.214773] end_request: I/O error, dev dm-4, sector 4 [ 9707.214779] end_request: I/O error, dev dm-4, sector 5 [ 9707.214784] end_request: I/O error, dev dm-4, sector 6 [ 9707.214790] end_request: I/O error, dev dm-4, sector 7 [ 9707.214797] end_request: I/O error, dev dm-4, sector 0 [ 9707.214803] end_request: I/O error, dev dm-4, sector 1 [ 9707.214809] end_request: I/O error, dev dm-4, sector 2 [ 9707.214815] end_request: I/O error, dev dm-4, sector 3 [ 9707.214820] end_request: I/O error, dev dm-4, sector 4 [ 9707.214826] end_request: I/O error, dev dm-4, sector 5 [ 9707.214831] end_request: I/O error, dev dm-4, sector 6 [ 9707.214837] end_request: I/O error, dev dm-4, sector 7 [ 9707.214845] end_request: I/O error, dev dm-4, sector 0 [ 9707.214851] end_request: I/O error, dev dm-4, sector 1 [ 9707.214856] end_request: I/O error, dev dm-4, sector 2 [ 9707.214862] end_request: I/O error, dev dm-4, sector 3 [ 9707.214867] end_request: I/O error, dev dm-4, sector 4 [ 9707.214873] end_request: I/O error, dev dm-4, sector 5 [ 9707.214879] end_request: I/O error, dev dm-4, sector 6 [ 9707.214884] end_request: I/O error, dev dm-4, sector 7 [ 9707.214892] end_request: I/O error, dev dm-4, sector 0 [ 9707.214898] end_request: I/O error, dev dm-4, sector 1 [ 9707.214903] end_request: I/O error, dev dm-4, sector 2 [ 9707.214909] end_request: I/O error, dev dm-4, sector 3 [ 9707.214915] end_request: I/O error, dev dm-4, sector 4 [ 9707.214920] end_request: I/O error, dev dm-4, sector 5 [ 9707.214926] end_request: I/O error, dev dm-4, sector 6 [ 9707.214931] end_request: I/O error, dev dm-4, sector 7 [ 9707.214939] end_request: I/O error, dev dm-4, sector 0 [ 9707.214945] end_request: I/O error, dev dm-4, sector 1 [ 9707.214950] end_request: I/O error, dev dm-4, sector 2 [ 9707.214956] end_request: I/O error, dev dm-4, sector 3 [ 9707.214962] end_request: I/O error, dev dm-4, sector 4 [ 9707.214967] end_request: I/O error, dev dm-4, sector 5 [ 9707.214973] end_request: I/O error, dev dm-4, sector 6 [ 9707.214979] end_request: I/O error, dev dm-4, sector 7 [ 9707.214986] end_request: I/O error, dev dm-4, sector 0 [ 9707.214992] end_request: I/O error, dev dm-4, sector 1 [ 9707.214998] end_request: I/O error, dev dm-4, sector 2 [ 9707.215003] end_request: I/O error, dev dm-4, sector 3 [ 9707.215009] end_request: I/O error, dev dm-4, sector 4 [ 9707.215015] end_request: I/O error, dev dm-4, sector 5 [ 9707.215023] end_request: I/O error, dev dm-4, sector 6 [ 9707.215029] end_request: I/O error, dev dm-4, sector 7 [ 9707.215036] end_request: I/O error, dev dm-4, sector 0 [ 9707.215042] end_request: I/O error, dev dm-4, sector 1 [ 9707.215047] end_request: I/O error, dev dm-4, sector 2 [ 9707.215053] end_request: I/O error, dev dm-4, sector 3 [ 9707.215059] end_request: I/O error, dev dm-4, sector 4 [ 9707.215064] end_request: I/O error, dev dm-4, sector 5 [ 9707.215070] end_request: I/O error, dev dm-4, sector 6 [ 9707.215075] end_request: I/O error, dev dm-4, sector 7 [ 9707.215083] end_request: I/O error, dev dm-4, sector 0 [ 9707.215089] end_request: I/O error, dev dm-4, sector 1 [ 9707.215094] end_request: I/O error, dev dm-4, sector 2 [ 9707.215100] end_request: I/O error, dev dm-4, sector 3 [ 9707.215106] end_request: I/O error, dev dm-4, sector 4 [ 9707.215111] end_request: I/O error, dev dm-4, sector 5 [ 9707.215117] end_request: I/O error, dev dm-4, sector 6 [ 9707.215122] end_request: I/O error, dev dm-4, sector 7 [ 9707.215130] end_request: I/O error, dev dm-4, sector 0 [ 9707.215136] end_request: I/O error, dev dm-4, sector 1 [ 9707.215141] end_request: I/O error, dev dm-4, sector 2 [ 9707.215147] end_request: I/O error, dev dm-4, sector 3 [ 9707.215153] end_request: I/O error, dev dm-4, sector 4 [ 9707.215158] end_request: I/O error, dev dm-4, sector 5 [ 9707.215164] end_request: I/O error, dev dm-4, sector 6 [ 9707.215169] end_request: I/O error, dev dm-4, sector 7 [ 9707.215177] end_request: I/O error, dev dm-4, sector 0 [ 9707.215183] end_request: I/O error, dev dm-4, sector 1 [ 9707.215188] end_request: I/O error, dev dm-4, sector 2 [ 9707.215194] end_request: I/O error, dev dm-4, sector 3 [ 9707.215199] end_request: I/O error, dev dm-4, sector 4 [ 9707.215205] end_request: I/O error, dev dm-4, sector 5 [ 9707.215211] end_request: I/O error, dev dm-4, sector 6 [ 9707.215216] end_request: I/O error, dev dm-4, sector 7 [ 9707.215223] end_request: I/O error, dev dm-4, sector 0 [ 9707.215229] end_request: I/O error, dev dm-4, sector 1 [ 9707.215235] end_request: I/O error, dev dm-4, sector 2 [ 9707.215241] end_request: I/O error, dev dm-4, sector 3 [ 9707.215246] end_request: I/O error, dev dm-4, sector 4 [ 9707.215252] end_request: I/O error, dev dm-4, sector 5 [ 9707.215258] end_request: I/O error, dev dm-4, sector 6 [ 9707.215263] end_request: I/O error, dev dm-4, sector 7 [ 9707.215271] end_request: I/O error, dev dm-4, sector 0 [ 9707.215277] end_request: I/O error, dev dm-4, sector 1 [ 9707.215282] end_request: I/O error, dev dm-4, sector 2 [ 9707.215288] end_request: I/O error, dev dm-4, sector 3 [ 9707.215293] end_request: I/O error, dev dm-4, sector 4 [ 9707.215299] end_request: I/O error, dev dm-4, sector 5 [ 9707.215305] end_request: I/O error, dev dm-4, sector 6 [ 9707.215310] end_request: I/O error, dev dm-4, sector 7 [ 9707.215318] end_request: I/O error, dev dm-4, sector 128 [ 9707.215324] end_request: I/O error, dev dm-4, sector 129 [ 9707.215329] end_request: I/O error, dev dm-4, sector 130 [ 9707.215335] end_request: I/O error, dev dm-4, sector 131 [ 9707.215341] end_request: I/O error, dev dm-4, sector 132 [ 9707.215346] end_request: I/O error, dev dm-4, sector 133 [ 9707.215352] end_request: I/O error, dev dm-4, sector 134 [ 9707.215358] end_request: I/O error, dev dm-4, sector 135 [ 9707.215365] end_request: I/O error, dev dm-4, sector 128 [ 9707.215371] end_request: I/O error, dev dm-4, sector 129 [ 9707.215377] end_request: I/O error, dev dm-4, sector 130 [ 9707.215383] end_request: I/O error, dev dm-4, sector 131 [ 9707.215388] end_request: I/O error, dev dm-4, sector 132 [ 9707.215394] end_request: I/O error, dev dm-4, sector 133 [ 9707.215399] end_request: I/O error, dev dm-4, sector 134 [ 9707.215405] end_request: I/O error, dev dm-4, sector 135 [ 9707.215413] end_request: I/O error, dev dm-4, sector 16 [ 9707.215418] end_request: I/O error, dev dm-4, sector 17 [ 9707.215424] end_request: I/O error, dev dm-4, sector 18 [ 9707.215430] end_request: I/O error, dev dm-4, sector 19 [ 9707.215435] end_request: I/O error, dev dm-4, sector 20 [ 9707.215441] end_request: I/O error, dev dm-4, sector 21 [ 9707.215447] end_request: I/O error, dev dm-4, sector 22 [ 9707.215452] end_request: I/O error, dev dm-4, sector 23 [ 9707.215460] end_request: I/O error, dev dm-4, sector 0 [ 9707.215465] end_request: I/O error, dev dm-4, sector 1 [ 9707.215471] end_request: I/O error, dev dm-4, sector 2 [ 9707.215477] end_request: I/O error, dev dm-4, sector 3 [ 9707.215482] end_request: I/O error, dev dm-4, sector 4 [ 9707.215488] end_request: I/O error, dev dm-4, sector 5 [ 9707.215494] end_request: I/O error, dev dm-4, sector 6 [ 9707.215499] end_request: I/O error, dev dm-4, sector 7 [ 9707.215514] end_request: I/O error, dev dm-4, sector 0 [ 9707.215520] end_request: I/O error, dev dm-4, sector 1 [ 9707.215526] end_request: I/O error, dev dm-4, sector 2 [ 9707.215532] end_request: I/O error, dev dm-4, sector 3 [ 9707.215537] end_request: I/O error, dev dm-4, sector 4 [ 9707.215543] end_request: I/O error, dev dm-4, sector 5 [ 9707.215549] end_request: I/O error, dev dm-4, sector 6 [ 9707.215554] end_request: I/O error, dev dm-4, sector 7 [ 9707.215562] end_request: I/O error, dev dm-4, sector 8 [ 9707.215568] end_request: I/O error, dev dm-4, sector 9 [ 9707.215573] end_request: I/O error, dev dm-4, sector 10 [ 9707.215579] end_request: I/O error, dev dm-4, sector 11 [ 9707.215585] end_request: I/O error, dev dm-4, sector 12 [ 9707.215590] end_request: I/O error, dev dm-4, sector 13 [ 9707.215596] end_request: I/O error, dev dm-4, sector 14 [ 9707.215601] end_request: I/O error, dev dm-4, sector 15 [ 9707.215609] end_request: I/O error, dev dm-4, sector 16 [ 9707.215615] end_request: I/O error, dev dm-4, sector 17 [ 9707.215620] end_request: I/O error, dev dm-4, sector 18 [ 9707.215626] end_request: I/O error, dev dm-4, sector 19 [ 9707.215632] end_request: I/O error, dev dm-4, sector 20 [ 9707.215637] end_request: I/O error, dev dm-4, sector 21 [ 9707.215643] end_request: I/O error, dev dm-4, sector 22 [ 9707.215649] end_request: I/O error, dev dm-4, sector 23 [ 9707.215656] end_request: I/O error, dev dm-4, sector 0 [ 9707.215662] end_request: I/O error, dev dm-4, sector 1 [ 9707.215668] end_request: I/O error, dev dm-4, sector 2 [ 9707.215673] end_request: I/O error, dev dm-4, sector 3 [ 9707.215679] end_request: I/O error, dev dm-4, sector 4 [ 9707.215685] end_request: I/O error, dev dm-4, sector 5 [ 9707.215690] end_request: I/O error, dev dm-4, sector 6 [ 9707.215696] end_request: I/O error, dev dm-4, sector 7 [ 9707.215704] end_request: I/O error, dev dm-4, sector 0 [ 9707.215709] end_request: I/O error, dev dm-4, sector 1 [ 9707.215715] end_request: I/O error, dev dm-4, sector 2 [ 9707.215721] end_request: I/O error, dev dm-4, sector 3 [ 9707.215726] end_request: I/O error, dev dm-4, sector 4 [ 9707.215732] end_request: I/O error, dev dm-4, sector 5 [ 9707.215738] end_request: I/O error, dev dm-4, sector 6 [ 9707.215743] end_request: I/O error, dev dm-4, sector 7 [ 9707.215751] end_request: I/O error, dev dm-4, sector 0 [ 9707.215757] end_request: I/O error, dev dm-4, sector 1 [ 9707.215762] end_request: I/O error, dev dm-4, sector 2 [ 9707.215768] end_request: I/O error, dev dm-4, sector 3 [ 9707.215774] end_request: I/O error, dev dm-4, sector 4 [ 9707.215779] end_request: I/O error, dev dm-4, sector 5 [ 9707.215785] end_request: I/O error, dev dm-4, sector 6 [ 9707.215791] end_request: I/O error, dev dm-4, sector 7 [ 9707.215798] end_request: I/O error, dev dm-4, sector 0 [ 9707.215804] end_request: I/O error, dev dm-4, sector 1 [ 9707.215810] end_request: I/O error, dev dm-4, sector 2 [ 9707.215815] end_request: I/O error, dev dm-4, sector 3 [ 9707.215821] end_request: I/O error, dev dm-4, sector 4 [ 9707.215826] end_request: I/O error, dev dm-4, sector 5 [ 9707.215832] end_request: I/O error, dev dm-4, sector 6 [ 9707.215838] end_request: I/O error, dev dm-4, sector 7 [ 9707.215845] end_request: I/O error, dev dm-4, sector 0 [ 9707.215851] end_request: I/O error, dev dm-4, sector 1 [ 9707.215857] end_request: I/O error, dev dm-4, sector 2 [ 9707.215862] end_request: I/O error, dev dm-4, sector 3 [ 9707.215868] end_request: I/O error, dev dm-4, sector 4 [ 9707.215873] end_request: I/O error, dev dm-4, sector 5 [ 9707.215879] end_request: I/O error, dev dm-4, sector 6 [ 9707.215885] end_request: I/O error, dev dm-4, sector 7 [ 9707.215892] end_request: I/O error, dev dm-4, sector 0 [ 9707.215898] end_request: I/O error, dev dm-4, sector 1 [ 9707.215904] end_request: I/O error, dev dm-4, sector 2 [ 9707.215909] end_request: I/O error, dev dm-4, sector 3 [ 9707.215915] end_request: I/O error, dev dm-4, sector 4 [ 9707.215921] end_request: I/O error, dev dm-4, sector 5 [ 9707.215926] end_request: I/O error, dev dm-4, sector 6 [ 9707.215932] end_request: I/O error, dev dm-4, sector 7 [ 9707.215939] end_request: I/O error, dev dm-4, sector 8 [ 9707.215945] end_request: I/O error, dev dm-4, sector 9 [ 9707.215951] end_request: I/O error, dev dm-4, sector 10 [ 9707.215957] end_request: I/O error, dev dm-4, sector 11 [ 9707.215962] end_request: I/O error, dev dm-4, sector 12 [ 9707.215968] end_request: I/O error, dev dm-4, sector 13 [ 9707.215974] end_request: I/O error, dev dm-4, sector 14 [ 9707.215979] end_request: I/O error, dev dm-4, sector 15 [ 9707.215987] end_request: I/O error, dev dm-4, sector 128 [ 9707.215993] end_request: I/O error, dev dm-4, sector 129 [ 9707.215998] end_request: I/O error, dev dm-4, sector 130 [ 9707.216004] end_request: I/O error, dev dm-4, sector 131 [ 9707.216010] end_request: I/O error, dev dm-4, sector 132 [ 9707.216015] end_request: I/O error, dev dm-4, sector 133 [ 9707.216021] end_request: I/O error, dev dm-4, sector 134 [ 9707.216027] end_request: I/O error, dev dm-4, sector 135 [ 9707.216034] end_request: I/O error, dev dm-4, sector 0 [ 9707.216040] end_request: I/O error, dev dm-4, sector 1 [ 9707.216046] end_request: I/O error, dev dm-4, sector 2 [ 9707.216051] end_request: I/O error, dev dm-4, sector 3 [ 9707.216057] end_request: I/O error, dev dm-4, sector 4 [ 9707.216063] end_request: I/O error, dev dm-4, sector 5 [ 9707.216068] end_request: I/O error, dev dm-4, sector 6 [ 9707.216074] end_request: I/O error, dev dm-4, sector 7 [ 9707.216081] end_request: I/O error, dev dm-4, sector 0 [ 9707.216087] end_request: I/O error, dev dm-4, sector 1 [ 9707.216093] end_request: I/O error, dev dm-4, sector 2 [ 9707.216098] end_request: I/O error, dev dm-4, sector 3 [ 9707.216104] end_request: I/O error, dev dm-4, sector 4 [ 9707.216110] end_request: I/O error, dev dm-4, sector 5 [ 9707.216115] end_request: I/O error, dev dm-4, sector 6 [ 9707.216121] end_request: I/O error, dev dm-4, sector 7 [ 9707.216129] end_request: I/O error, dev dm-4, sector 4096 [ 9707.216135] end_request: I/O error, dev dm-4, sector 4097 [ 9707.216140] end_request: I/O error, dev dm-4, sector 4098 [ 9707.216146] end_request: I/O error, dev dm-4, sector 4099 [ 9707.216152] end_request: I/O error, dev dm-4, sector 4100 [ 9707.216157] end_request: I/O error, dev dm-4, sector 4101 [ 9707.216163] end_request: I/O error, dev dm-4, sector 4102 [ 9707.216169] end_request: I/O error, dev dm-4, sector 4103 [ 9707.311427] end_request: I/O error, dev dm-12, sector 0 [ 9707.311442] end_request: I/O error, dev dm-12, sector 1 [ 9707.311449] end_request: I/O error, dev dm-12, sector 2 [ 9707.311455] end_request: I/O error, dev dm-12, sector 3 [ 9707.311461] end_request: I/O error, dev dm-12, sector 4 [ 9707.311467] end_request: I/O error, dev dm-12, sector 5 [ 9707.311473] end_request: I/O error, dev dm-12, sector 6 [ 9707.311479] end_request: I/O error, dev dm-12, sector 7 [ 9707.311490] end_request: I/O error, dev dm-12, sector 93674283000 [ 9707.311497] end_request: I/O error, dev dm-12, sector 93674283001 [ 9707.311503] end_request: I/O error, dev dm-12, sector 93674283002 [ 9707.311509] end_request: I/O error, dev dm-12, sector 93674283003 [ 9707.311515] end_request: I/O error, dev dm-12, sector 93674283004 [ 9707.311520] end_request: I/O error, dev dm-12, sector 93674283005 [ 9707.311526] end_request: I/O error, dev dm-12, sector 93674283006 [ 9707.311532] end_request: I/O error, dev dm-12, sector 93674283007 [ 9707.311541] end_request: I/O error, dev dm-12, sector 0 [ 9707.311547] end_request: I/O error, dev dm-12, sector 1 [ 9707.311553] end_request: I/O error, dev dm-12, sector 2 [ 9707.311559] end_request: I/O error, dev dm-12, sector 3 [ 9707.311564] end_request: I/O error, dev dm-12, sector 4 [ 9707.311570] end_request: I/O error, dev dm-12, sector 5 [ 9707.311576] end_request: I/O error, dev dm-12, sector 6 [ 9707.311581] end_request: I/O error, dev dm-12, sector 7 [ 9707.311598] end_request: I/O error, dev dm-12, sector 0 [ 9707.311604] end_request: I/O error, dev dm-12, sector 1 [ 9707.311610] end_request: I/O error, dev dm-12, sector 2 [ 9707.311616] end_request: I/O error, dev dm-12, sector 3 [ 9707.311622] end_request: I/O error, dev dm-12, sector 4 [ 9707.311628] end_request: I/O error, dev dm-12, sector 5 [ 9707.311633] end_request: I/O error, dev dm-12, sector 6 [ 9707.311639] end_request: I/O error, dev dm-12, sector 7 [ 9707.311650] end_request: I/O error, dev dm-12, sector 24 [ 9707.311656] end_request: I/O error, dev dm-12, sector 25 [ 9707.311662] end_request: I/O error, dev dm-12, sector 26 [ 9707.311668] end_request: I/O error, dev dm-12, sector 27 [ 9707.311673] end_request: I/O error, dev dm-12, sector 28 [ 9707.311679] end_request: I/O error, dev dm-12, sector 29 [ 9707.311685] end_request: I/O error, dev dm-12, sector 30 [ 9707.311691] end_request: I/O error, dev dm-12, sector 31 [ 9707.327194] end_request: I/O error, dev dm-6, sector 0 [ 9707.327212] end_request: I/O error, dev dm-6, sector 1 [ 9707.327219] end_request: I/O error, dev dm-6, sector 2 [ 9707.327225] end_request: I/O error, dev dm-6, sector 3 [ 9707.327231] end_request: I/O error, dev dm-6, sector 4 [ 9707.327237] end_request: I/O error, dev dm-6, sector 5 [ 9707.327243] end_request: I/O error, dev dm-6, sector 6 [ 9707.327248] end_request: I/O error, dev dm-6, sector 7 [ 9707.327266] end_request: I/O error, dev dm-6, sector 93674283000 [ 9707.327278] end_request: I/O error, dev dm-6, sector 93674283001 [ 9707.327284] end_request: I/O error, dev dm-6, sector 93674283002 [ 9707.327290] end_request: I/O error, dev dm-6, sector 93674283003 [ 9707.327298] end_request: I/O error, dev dm-6, sector 93674283004 [ 9707.327304] end_request: I/O error, dev dm-6, sector 93674283005 [ 9707.327310] end_request: I/O error, dev dm-6, sector 93674283006 [ 9707.327318] end_request: I/O error, dev dm-6, sector 93674283007 [ 9707.327328] end_request: I/O error, dev dm-6, sector 0 [ 9707.327334] end_request: I/O error, dev dm-6, sector 1 [ 9707.327340] end_request: I/O error, dev dm-6, sector 2 [ 9707.327346] end_request: I/O error, dev dm-6, sector 3 [ 9707.327352] end_request: I/O error, dev dm-6, sector 4 [ 9707.327357] end_request: I/O error, dev dm-6, sector 5 [ 9707.327363] end_request: I/O error, dev dm-6, sector 6 [ 9707.327369] end_request: I/O error, dev dm-6, sector 7 [ 9707.327384] end_request: I/O error, dev dm-6, sector 0 [ 9707.327391] end_request: I/O error, dev dm-6, sector 1 [ 9707.327397] end_request: I/O error, dev dm-6, sector 2 [ 9707.327403] end_request: I/O error, dev dm-6, sector 3 [ 9707.327408] end_request: I/O error, dev dm-6, sector 4 [ 9707.327414] end_request: I/O error, dev dm-6, sector 5 [ 9707.327420] end_request: I/O error, dev dm-6, sector 6 [ 9707.327425] end_request: I/O error, dev dm-6, sector 7 [ 9707.327435] end_request: I/O error, dev dm-6, sector 24 [ 9707.327441] end_request: I/O error, dev dm-6, sector 25 [ 9707.327447] end_request: I/O error, dev dm-6, sector 26 [ 9707.327453] end_request: I/O error, dev dm-6, sector 27 [ 9707.327459] end_request: I/O error, dev dm-6, sector 28 [ 9707.327465] end_request: I/O error, dev dm-6, sector 29 [ 9707.327470] end_request: I/O error, dev dm-6, sector 30 [ 9707.327476] end_request: I/O error, dev dm-6, sector 31 [ 9707.328737] end_request: I/O error, dev dm-8, sector 0 [ 9707.328751] end_request: I/O error, dev dm-8, sector 1 [ 9707.328758] end_request: I/O error, dev dm-8, sector 2 [ 9707.328764] end_request: I/O error, dev dm-8, sector 3 [ 9707.328770] end_request: I/O error, dev dm-8, sector 4 [ 9707.328776] end_request: I/O error, dev dm-8, sector 5 [ 9707.328781] end_request: I/O error, dev dm-8, sector 6 [ 9707.328787] end_request: I/O error, dev dm-8, sector 7 [ 9707.328799] end_request: I/O error, dev dm-8, sector 93674283000 [ 9707.328806] end_request: I/O error, dev dm-8, sector 93674283001 [ 9707.328812] end_request: I/O error, dev dm-8, sector 93674283002 [ 9707.328818] end_request: I/O error, dev dm-8, sector 93674283003 [ 9707.328824] end_request: I/O error, dev dm-8, sector 93674283004 [ 9707.328830] end_request: I/O error, dev dm-8, sector 93674283005 [ 9707.328836] end_request: I/O error, dev dm-8, sector 93674283006 [ 9707.328842] end_request: I/O error, dev dm-8, sector 93674283007 [ 9707.328850] end_request: I/O error, dev dm-8, sector 0 [ 9707.328857] end_request: I/O error, dev dm-8, sector 1 [ 9707.328862] end_request: I/O error, dev dm-8, sector 2 [ 9707.328868] end_request: I/O error, dev dm-8, sector 3 [ 9707.328874] end_request: I/O error, dev dm-8, sector 4 [ 9707.328880] end_request: I/O error, dev dm-8, sector 5 [ 9707.328886] end_request: I/O error, dev dm-8, sector 6 [ 9707.328891] end_request: I/O error, dev dm-8, sector 7 [ 9707.328906] end_request: I/O error, dev dm-8, sector 0 [ 9707.328912] end_request: I/O error, dev dm-8, sector 1 [ 9707.328918] end_request: I/O error, dev dm-8, sector 2 [ 9707.328924] end_request: I/O error, dev dm-8, sector 3 [ 9707.328930] end_request: I/O error, dev dm-8, sector 4 [ 9707.328936] end_request: I/O error, dev dm-8, sector 5 [ 9707.328942] end_request: I/O error, dev dm-8, sector 6 [ 9707.328947] end_request: I/O error, dev dm-8, sector 7 [ 9707.328957] end_request: I/O error, dev dm-8, sector 24 [ 9707.328964] end_request: I/O error, dev dm-8, sector 25 [ 9707.328970] end_request: I/O error, dev dm-8, sector 26 [ 9707.328976] end_request: I/O error, dev dm-8, sector 27 [ 9707.328981] end_request: I/O error, dev dm-8, sector 28 [ 9707.328987] end_request: I/O error, dev dm-8, sector 29 [ 9707.328993] end_request: I/O error, dev dm-8, sector 30 [ 9707.328999] end_request: I/O error, dev dm-8, sector 31 [ 9707.331922] end_request: I/O error, dev dm-11, sector 0 [ 9707.331936] end_request: I/O error, dev dm-11, sector 1 [ 9707.331943] end_request: I/O error, dev dm-11, sector 2 [ 9707.331949] end_request: I/O error, dev dm-11, sector 3 [ 9707.331955] end_request: I/O error, dev dm-11, sector 4 [ 9707.331961] end_request: I/O error, dev dm-11, sector 5 [ 9707.331967] end_request: I/O error, dev dm-11, sector 6 [ 9707.331973] end_request: I/O error, dev dm-11, sector 7 [ 9707.331985] end_request: I/O error, dev dm-11, sector 93674283000 [ 9707.331992] end_request: I/O error, dev dm-11, sector 93674283001 [ 9707.331998] end_request: I/O error, dev dm-11, sector 93674283002 [ 9707.332004] end_request: I/O error, dev dm-11, sector 93674283003 [ 9707.332010] end_request: I/O error, dev dm-11, sector 93674283004 [ 9707.332016] end_request: I/O error, dev dm-11, sector 93674283005 [ 9707.332021] end_request: I/O error, dev dm-11, sector 93674283006 [ 9707.332027] end_request: I/O error, dev dm-11, sector 93674283007 [ 9707.332036] end_request: I/O error, dev dm-11, sector 0 [ 9707.332042] end_request: I/O error, dev dm-11, sector 1 [ 9707.332048] end_request: I/O error, dev dm-11, sector 2 [ 9707.332054] end_request: I/O error, dev dm-11, sector 3 [ 9707.332060] end_request: I/O error, dev dm-11, sector 4 [ 9707.332066] end_request: I/O error, dev dm-11, sector 5 [ 9707.332071] end_request: I/O error, dev dm-11, sector 6 [ 9707.332077] end_request: I/O error, dev dm-11, sector 7 [ 9707.332091] end_request: I/O error, dev dm-11, sector 0 [ 9707.332098] end_request: I/O error, dev dm-11, sector 1 [ 9707.332104] end_request: I/O error, dev dm-11, sector 2 [ 9707.332110] end_request: I/O error, dev dm-11, sector 3 [ 9707.332115] end_request: I/O error, dev dm-11, sector 4 [ 9707.332121] end_request: I/O error, dev dm-11, sector 5 [ 9707.332127] end_request: I/O error, dev dm-11, sector 6 [ 9707.332133] end_request: I/O error, dev dm-11, sector 7 [ 9707.332143] end_request: I/O error, dev dm-11, sector 24 [ 9707.332149] end_request: I/O error, dev dm-11, sector 25 [ 9707.332155] end_request: I/O error, dev dm-11, sector 26 [ 9707.332161] end_request: I/O error, dev dm-11, sector 27 [ 9707.332167] end_request: I/O error, dev dm-11, sector 28 [ 9707.332172] end_request: I/O error, dev dm-11, sector 29 [ 9707.332178] end_request: I/O error, dev dm-11, sector 30 [ 9707.332184] end_request: I/O error, dev dm-11, sector 31 [ 9707.339763] end_request: I/O error, dev dm-10, sector 0 [ 9707.339775] end_request: I/O error, dev dm-10, sector 1 [ 9707.339781] end_request: I/O error, dev dm-10, sector 2 [ 9707.339787] end_request: I/O error, dev dm-10, sector 3 [ 9707.339793] end_request: I/O error, dev dm-10, sector 4 [ 9707.339799] end_request: I/O error, dev dm-10, sector 5 [ 9707.339805] end_request: I/O error, dev dm-10, sector 6 [ 9707.339811] end_request: I/O error, dev dm-10, sector 7 [ 9707.339823] end_request: I/O error, dev dm-10, sector 93674283000 [ 9707.339829] end_request: I/O error, dev dm-10, sector 93674283001 [ 9707.339836] end_request: I/O error, dev dm-10, sector 93674283002 [ 9707.339845] end_request: I/O error, dev dm-10, sector 93674283003 [ 9707.339851] end_request: I/O error, dev dm-10, sector 93674283004 [ 9707.339857] end_request: I/O error, dev dm-10, sector 93674283005 [ 9707.339863] end_request: I/O error, dev dm-10, sector 93674283006 [ 9707.339869] end_request: I/O error, dev dm-10, sector 93674283007 [ 9707.339877] end_request: I/O error, dev dm-10, sector 0 [ 9707.339884] end_request: I/O error, dev dm-10, sector 1 [ 9707.339889] end_request: I/O error, dev dm-10, sector 2 [ 9707.339895] end_request: I/O error, dev dm-10, sector 3 [ 9707.339901] end_request: I/O error, dev dm-10, sector 4 [ 9707.339907] end_request: I/O error, dev dm-10, sector 5 [ 9707.339913] end_request: I/O error, dev dm-10, sector 6 [ 9707.339918] end_request: I/O error, dev dm-10, sector 7 [ 9707.339933] end_request: I/O error, dev dm-10, sector 0 [ 9707.339939] end_request: I/O error, dev dm-10, sector 1 [ 9707.339945] end_request: I/O error, dev dm-10, sector 2 [ 9707.339951] end_request: I/O error, dev dm-10, sector 3 [ 9707.339956] end_request: I/O error, dev dm-10, sector 4 [ 9707.339962] end_request: I/O error, dev dm-10, sector 5 [ 9707.339968] end_request: I/O error, dev dm-10, sector 6 [ 9707.339974] end_request: I/O error, dev dm-10, sector 7 [ 9707.339984] end_request: I/O error, dev dm-10, sector 24 [ 9707.339990] end_request: I/O error, dev dm-10, sector 25 [ 9707.339996] end_request: I/O error, dev dm-10, sector 26 [ 9707.340001] end_request: I/O error, dev dm-10, sector 27 [ 9707.340007] end_request: I/O error, dev dm-10, sector 28 [ 9707.340013] end_request: I/O error, dev dm-10, sector 29 [ 9707.340018] end_request: I/O error, dev dm-10, sector 30 [ 9707.340024] end_request: I/O error, dev dm-10, sector 31 [ 9707.348041] end_request: I/O error, dev dm-5, sector 0 [ 9707.348054] end_request: I/O error, dev dm-5, sector 1 [ 9707.348061] end_request: I/O error, dev dm-5, sector 2 [ 9707.348067] end_request: I/O error, dev dm-5, sector 3 [ 9707.348074] end_request: I/O error, dev dm-5, sector 4 [ 9707.348080] end_request: I/O error, dev dm-5, sector 5 [ 9707.348086] end_request: I/O error, dev dm-5, sector 6 [ 9707.348092] end_request: I/O error, dev dm-5, sector 7 [ 9707.348103] end_request: I/O error, dev dm-5, sector 93674283000 [ 9707.348110] end_request: I/O error, dev dm-5, sector 93674283001 [ 9707.348116] end_request: I/O error, dev dm-5, sector 93674283002 [ 9707.348122] end_request: I/O error, dev dm-5, sector 93674283003 [ 9707.348129] end_request: I/O error, dev dm-5, sector 93674283004 [ 9707.348135] end_request: I/O error, dev dm-5, sector 93674283005 [ 9707.348141] end_request: I/O error, dev dm-5, sector 93674283006 [ 9707.348147] end_request: I/O error, dev dm-5, sector 93674283007 [ 9707.348156] end_request: I/O error, dev dm-5, sector 0 [ 9707.348162] end_request: I/O error, dev dm-5, sector 1 [ 9707.348168] end_request: I/O error, dev dm-5, sector 2 [ 9707.348174] end_request: I/O error, dev dm-5, sector 3 [ 9707.348180] end_request: I/O error, dev dm-5, sector 4 [ 9707.348186] end_request: I/O error, dev dm-5, sector 5 [ 9707.348192] end_request: I/O error, dev dm-5, sector 6 [ 9707.348198] end_request: I/O error, dev dm-5, sector 7 [ 9707.348213] end_request: I/O error, dev dm-5, sector 0 [ 9707.348235] end_request: I/O error, dev dm-5, sector 1 [ 9707.348241] end_request: I/O error, dev dm-5, sector 2 [ 9707.348247] end_request: I/O error, dev dm-5, sector 3 [ 9707.348253] end_request: I/O error, dev dm-5, sector 4 [ 9707.348259] end_request: I/O error, dev dm-5, sector 5 [ 9707.348265] end_request: I/O error, dev dm-5, sector 6 [ 9707.348271] end_request: I/O error, dev dm-5, sector 7 [ 9707.348281] end_request: I/O error, dev dm-5, sector 24 [ 9707.348288] end_request: I/O error, dev dm-5, sector 25 [ 9707.348294] end_request: I/O error, dev dm-5, sector 26 [ 9707.348300] end_request: I/O error, dev dm-5, sector 27 [ 9707.348306] end_request: I/O error, dev dm-5, sector 28 [ 9707.348312] end_request: I/O error, dev dm-5, sector 29 [ 9707.348318] end_request: I/O error, dev dm-5, sector 30 [ 9707.348323] end_request: I/O error, dev dm-5, sector 31 [ 9707.349150] end_request: I/O error, dev dm-17, sector 0 [ 9707.349166] end_request: I/O error, dev dm-17, sector 1 [ 9707.349173] end_request: I/O error, dev dm-17, sector 2 [ 9707.349179] end_request: I/O error, dev dm-17, sector 3 [ 9707.349185] end_request: I/O error, dev dm-17, sector 4 [ 9707.349191] end_request: I/O error, dev dm-17, sector 5 [ 9707.349197] end_request: I/O error, dev dm-17, sector 6 [ 9707.349203] end_request: I/O error, dev dm-17, sector 7 [ 9707.349223] end_request: I/O error, dev dm-17, sector 93674283000 [ 9707.349234] end_request: I/O error, dev dm-17, sector 93674283001 [ 9707.349241] end_request: I/O error, dev dm-17, sector 93674283002 [ 9707.349247] end_request: I/O error, dev dm-17, sector 93674283003 [ 9707.349253] end_request: I/O error, dev dm-17, sector 93674283004 [ 9707.349259] end_request: I/O error, dev dm-17, sector 93674283005 [ 9707.349265] end_request: I/O error, dev dm-17, sector 93674283006 [ 9707.349271] end_request: I/O error, dev dm-17, sector 93674283007 [ 9707.349281] end_request: I/O error, dev dm-17, sector 0 [ 9707.349287] end_request: I/O error, dev dm-17, sector 1 [ 9707.349293] end_request: I/O error, dev dm-17, sector 2 [ 9707.349299] end_request: I/O error, dev dm-17, sector 3 [ 9707.349305] end_request: I/O error, dev dm-17, sector 4 [ 9707.349311] end_request: I/O error, dev dm-17, sector 5 [ 9707.349317] end_request: I/O error, dev dm-17, sector 6 [ 9707.349323] end_request: I/O error, dev dm-17, sector 7 [ 9707.349339] end_request: I/O error, dev dm-17, sector 0 [ 9707.349346] end_request: I/O error, dev dm-17, sector 1 [ 9707.349352] end_request: I/O error, dev dm-17, sector 2 [ 9707.349358] end_request: I/O error, dev dm-17, sector 3 [ 9707.349365] end_request: I/O error, dev dm-17, sector 4 [ 9707.349372] end_request: I/O error, dev dm-17, sector 5 [ 9707.349378] end_request: I/O error, dev dm-17, sector 6 [ 9707.349384] end_request: I/O error, dev dm-17, sector 7 [ 9707.349393] end_request: I/O error, dev dm-17, sector 24 [ 9707.349400] end_request: I/O error, dev dm-17, sector 25 [ 9707.349406] end_request: I/O error, dev dm-17, sector 26 [ 9707.349412] end_request: I/O error, dev dm-17, sector 27 [ 9707.349418] end_request: I/O error, dev dm-17, sector 28 [ 9707.349424] end_request: I/O error, dev dm-17, sector 29 [ 9707.349430] end_request: I/O error, dev dm-17, sector 30 [ 9707.349436] end_request: I/O error, dev dm-17, sector 31 [ 9707.392587] end_request: I/O error, dev dm-4, sector 0 [ 9707.392602] end_request: I/O error, dev dm-4, sector 1 [ 9707.392609] end_request: I/O error, dev dm-4, sector 2 [ 9707.392615] end_request: I/O error, dev dm-4, sector 3 [ 9707.392621] end_request: I/O error, dev dm-4, sector 4 [ 9707.392627] end_request: I/O error, dev dm-4, sector 5 [ 9707.392633] end_request: I/O error, dev dm-4, sector 6 [ 9707.392639] end_request: I/O error, dev dm-4, sector 7 [ 9707.392651] end_request: I/O error, dev dm-4, sector 93674283000 [ 9707.392657] end_request: I/O error, dev dm-4, sector 93674283001 [ 9707.392663] end_request: I/O error, dev dm-4, sector 93674283002 [ 9707.392669] end_request: I/O error, dev dm-4, sector 93674283003 [ 9707.392675] end_request: I/O error, dev dm-4, sector 93674283004 [ 9707.392681] end_request: I/O error, dev dm-4, sector 93674283005 [ 9707.392687] end_request: I/O error, dev dm-4, sector 93674283006 [ 9707.392694] end_request: I/O error, dev dm-4, sector 93674283007 [ 9707.392703] end_request: I/O error, dev dm-4, sector 0 [ 9707.392709] end_request: I/O error, dev dm-4, sector 1 [ 9707.392715] end_request: I/O error, dev dm-4, sector 2 [ 9707.392721] end_request: I/O error, dev dm-4, sector 3 [ 9707.392727] end_request: I/O error, dev dm-4, sector 4 [ 9707.392733] end_request: I/O error, dev dm-4, sector 5 [ 9707.392738] end_request: I/O error, dev dm-4, sector 6 [ 9707.392744] end_request: I/O error, dev dm-4, sector 7 [ 9707.392759] end_request: I/O error, dev dm-4, sector 0 [ 9707.392765] end_request: I/O error, dev dm-4, sector 1 [ 9707.392772] end_request: I/O error, dev dm-4, sector 2 [ 9707.392777] end_request: I/O error, dev dm-4, sector 3 [ 9707.392784] end_request: I/O error, dev dm-4, sector 4 [ 9707.392789] end_request: I/O error, dev dm-4, sector 5 [ 9707.392795] end_request: I/O error, dev dm-4, sector 6 [ 9707.392801] end_request: I/O error, dev dm-4, sector 7 [ 9707.392810] end_request: I/O error, dev dm-4, sector 24 [ 9707.392817] end_request: I/O error, dev dm-4, sector 25 [ 9707.392823] end_request: I/O error, dev dm-4, sector 26 [ 9707.392829] end_request: I/O error, dev dm-4, sector 27 [ 9707.392835] end_request: I/O error, dev dm-4, sector 28 [ 9707.392840] end_request: I/O error, dev dm-4, sector 29 [ 9707.392846] end_request: I/O error, dev dm-4, sector 30 [ 9707.392852] end_request: I/O error, dev dm-4, sector 31 [ 9708.483744] XFS (dm-8): xfs_log_force: error 5 returned. [ 9722.277632] sd 10:0:0:3: attempting task abort! scmd(ffff883e32b4f0c0) [ 9722.277635] sd 10:0:0:3: [sdak] CDB: Read(10): 28 00 00 00 00 00 00 00 08 00 [ 9722.277643] scsi target10:0:0: handle(0x0009), sas_address(0x500c0ff1dc3d5600), phy(0) [ 9722.277645] scsi target10:0:0: enclosure_logical_id(0x500605b008b36010), slot(0) [ 9722.279380] sd 10:0:0:3: task abort: SUCCESS scmd(ffff883e32b4f0c0) [ 9722.279382] sd 10:0:0:11: attempting task abort! scmd(ffff883e4c343a80) [ 9722.279384] sd 10:0:0:11: [sdam] CDB: Read(10): 28 00 00 00 00 00 00 00 08 00 [ 9722.279390] scsi target10:0:0: handle(0x0009), sas_address(0x500c0ff1dc3d5600), phy(0) [ 9722.279391] scsi target10:0:0: enclosure_logical_id(0x500605b008b36010), slot(0) [ 9722.281340] sd 10:0:0:11: task abort: SUCCESS scmd(ffff883e4c343a80) [ 9722.281342] sd 10:0:0:13: attempting task abort! scmd(ffff883e1bb45dc0) [ 9722.281344] sd 10:0:0:13: [sdao] CDB: Read(10): 28 00 00 00 00 00 00 00 08 00 [ 9722.281349] scsi target10:0:0: handle(0x0009), sas_address(0x500c0ff1dc3d5600), phy(0) [ 9722.281350] scsi target10:0:0: enclosure_logical_id(0x500605b008b36010), slot(0) [ 9722.283067] sd 10:0:0:13: task abort: SUCCESS scmd(ffff883e1bb45dc0) [ 9722.283069] sd 10:0:0:21: attempting task abort! scmd(ffff883e468a3bc0) [ 9722.283071] sd 10:0:0:21: [sdaq] CDB: Read(10): 28 00 00 00 00 00 00 00 08 00 [ 9722.283076] scsi target10:0:0: handle(0x0009), sas_address(0x500c0ff1dc3d5600), phy(0) [ 9722.283078] scsi target10:0:0: enclosure_logical_id(0x500605b008b36010), slot(0) [ 9722.285030] sd 10:0:0:21: task abort: SUCCESS scmd(ffff883e468a3bc0) [ 9722.285032] sd 10:0:0:23: attempting task abort! scmd(ffff883e490e2a80) [ 9722.285034] sd 10:0:0:23: [sdas] CDB: Read(10): 28 00 00 00 00 00 00 00 08 00 [ 9722.285039] scsi target10:0:0: handle(0x0009), sas_address(0x500c0ff1dc3d5600), phy(0) [ 9722.285040] scsi target10:0:0: enclosure_logical_id(0x500605b008b36010), slot(0) [ 9722.286727] sd 10:0:0:23: task abort: SUCCESS scmd(ffff883e490e2a80) [ 9722.286728] sd 10:0:0:31: attempting task abort! scmd(ffff883e378f1580) [ 9722.286730] sd 10:0:0:31: [sdau] CDB: Read(10): 28 00 00 00 00 00 00 00 08 00 [ 9722.286735] scsi target10:0:0: handle(0x0009), sas_address(0x500c0ff1dc3d5600), phy(0) [ 9722.286737] scsi target10:0:0: enclosure_logical_id(0x500605b008b36010), slot(0) [ 9722.288352] sd 10:0:0:31: task abort: SUCCESS scmd(ffff883e378f1580) [ 9722.288353] sd 10:0:0:33: attempting task abort! scmd(ffff883e119bcb80) [ 9722.288355] sd 10:0:0:33: [sdaw] CDB: Read(10): 28 00 00 00 00 00 00 00 08 00 [ 9722.288360] scsi target10:0:0: handle(0x0009), sas_address(0x500c0ff1dc3d5600), phy(0) [ 9722.288362] scsi target10:0:0: enclosure_logical_id(0x500605b008b36010), slot(0) [ 9722.290115] sd 10:0:0:33: task abort: SUCCESS scmd(ffff883e119bcb80) [ 9722.290116] sd 10:0:0:1: attempting task abort! scmd(ffff883e143b85c0) [ 9722.290118] sd 10:0:0:1: [sdai] CDB: Read(10): 28 00 00 00 00 00 00 00 08 00 [ 9722.290123] scsi target10:0:0: handle(0x0009), sas_address(0x500c0ff1dc3d5600), phy(0) [ 9722.290125] scsi target10:0:0: enclosure_logical_id(0x500605b008b36010), slot(0) [ 9722.291939] sd 10:0:0:1: task abort: SUCCESS scmd(ffff883e143b85c0) [ 9723.171675] sd 9:0:0:1: attempting task abort! scmd(ffff883e1eeb7c80) [ 9723.171678] sd 9:0:0:1: [sds] CDB: Read(10): 28 00 00 00 00 00 00 00 08 00 [ 9723.171685] scsi target9:0:0: handle(0x0009), sas_address(0x500c0ff1dc3d5400), phy(0) [ 9723.171687] scsi target9:0:0: enclosure_logical_id(0x500605b008b36000), slot(0) [ 9723.173492] sd 9:0:0:1: task abort: SUCCESS scmd(ffff883e1eeb7c80) [ 9723.173494] sd 9:0:0:3: attempting task abort! scmd(ffff883e1bb45cc0) [ 9723.173496] sd 9:0:0:3: [sdu] CDB: Read(10): 28 00 00 00 00 00 00 00 08 00 [ 9723.173501] scsi target9:0:0: handle(0x0009), sas_address(0x500c0ff1dc3d5400), phy(0) [ 9723.173503] scsi target9:0:0: enclosure_logical_id(0x500605b008b36000), slot(0) [ 9723.175302] sd 9:0:0:3: task abort: SUCCESS scmd(ffff883e1bb45cc0) [ 9723.175304] sd 9:0:0:11: attempting task abort! scmd(ffff884062becdc0) [ 9723.175305] sd 9:0:0:11: [sdw] CDB: Read(10): 28 00 00 00 00 00 00 00 08 00 [ 9723.175310] scsi target9:0:0: handle(0x0009), sas_address(0x500c0ff1dc3d5400), phy(0) [ 9723.175312] scsi target9:0:0: enclosure_logical_id(0x500605b008b36000), slot(0) [ 9723.177133] sd 9:0:0:11: task abort: SUCCESS scmd(ffff884062becdc0) [ 9723.177135] sd 9:0:0:13: attempting task abort! scmd(ffff883e3669d680) [ 9723.177136] sd 9:0:0:13: [sdy] CDB: Read(10): 28 00 00 00 00 00 00 00 08 00 [ 9723.177141] scsi target9:0:0: handle(0x0009), sas_address(0x500c0ff1dc3d5400), phy(0) [ 9723.177143] scsi target9:0:0: enclosure_logical_id(0x500605b008b36000), slot(0) [ 9723.178781] sd 9:0:0:13: task abort: SUCCESS scmd(ffff883e3669d680) [ 9723.178783] sd 9:0:0:21: attempting task abort! scmd(ffff883e14318380) [ 9723.178785] sd 9:0:0:21: [sdaa] CDB: Read(10): 28 00 00 00 00 00 00 00 08 00 [ 9723.178790] scsi target9:0:0: handle(0x0009), sas_address(0x500c0ff1dc3d5400), phy(0) [ 9723.178791] scsi target9:0:0: enclosure_logical_id(0x500605b008b36000), slot(0) [ 9723.180352] sd 9:0:0:21: task abort: SUCCESS scmd(ffff883e14318380) [ 9723.180354] sd 9:0:0:23: attempting task abort! scmd(ffff883e0e980580) [ 9723.180355] sd 9:0:0:23: [sdac] CDB: Read(10): 28 00 00 00 00 00 00 00 08 00 [ 9723.180360] scsi target9:0:0: handle(0x0009), sas_address(0x500c0ff1dc3d5400), phy(0) [ 9723.180362] scsi target9:0:0: enclosure_logical_id(0x500605b008b36000), slot(0) [ 9723.181881] sd 9:0:0:23: task abort: SUCCESS scmd(ffff883e0e980580) [ 9723.181883] sd 9:0:0:31: attempting task abort! scmd(ffff883e4a7999c0) [ 9723.181885] sd 9:0:0:31: [sdae] CDB: Read(10): 28 00 00 00 00 00 00 00 08 00 [ 9723.181890] scsi target9:0:0: handle(0x0009), sas_address(0x500c0ff1dc3d5400), phy(0) [ 9723.181891] scsi target9:0:0: enclosure_logical_id(0x500605b008b36000), slot(0) [ 9723.183759] sd 9:0:0:31: task abort: SUCCESS scmd(ffff883e4a7999c0) [ 9723.183760] sd 9:0:0:33: attempting task abort! scmd(ffff883e409d14c0) [ 9723.183762] sd 9:0:0:33: [sdag] CDB: Read(10): 28 00 00 00 00 00 00 00 08 00 [ 9723.183767] scsi target9:0:0: handle(0x0009), sas_address(0x500c0ff1dc3d5400), phy(0) [ 9723.183769] scsi target9:0:0: enclosure_logical_id(0x500605b008b36000), slot(0) [ 9723.185723] sd 9:0:0:33: task abort: SUCCESS scmd(ffff883e409d14c0) [ 9736.965552] XFS (dm-4): xfs_log_force: error 5 returned. [ 9736.965555] XFS (dm-6): xfs_log_force: error 5 returned. [ 9736.965558] XFS (dm-10): xfs_log_force: error 5 returned. [ 9737.093272] XFS (dm-5): xfs_log_force: error 5 returned. [ 9737.093276] XFS (dm-12): xfs_log_force: error 5 returned. [ 9737.093382] XFS (dm-11): xfs_log_force: error 5 returned. [ 9738.498207] XFS (dm-8): xfs_log_force: error 5 returned. [ 9766.980016] XFS (dm-4): xfs_log_force: error 5 returned. [ 9766.980018] XFS (dm-6): xfs_log_force: error 5 returned. [ 9766.980021] XFS (dm-10): xfs_log_force: error 5 returned. [ 9767.107734] XFS (dm-12): xfs_log_force: error 5 returned. [ 9767.107736] XFS (dm-5): xfs_log_force: error 5 returned. [ 9767.107853] XFS (dm-11): xfs_log_force: error 5 returned. [ 9768.512673] XFS (dm-8): xfs_log_force: error 5 returned. [ 9772.093958] igb: diskmgmt2 NIC Link is Down [ 9772.094856] ctrl_br0: port 2(diskmgmt2) entered disabled state [ 9796.994474] XFS (dm-4): xfs_log_force: error 5 returned. [ 9796.994477] XFS (dm-6): xfs_log_force: error 5 returned. [ 9796.994479] XFS (dm-10): xfs_log_force: error 5 returned. [ 9797.122198] XFS (dm-12): xfs_log_force: error 5 returned. [ 9797.122201] XFS (dm-11): xfs_log_force: error 5 returned. [ 9797.122203] XFS (dm-5): xfs_log_force: error 5 returned. [ 9798.527124] XFS (dm-8): xfs_log_force: error 5 returned. [ 9827.008938] XFS (dm-4): xfs_log_force: error 5 returned. [ 9827.008941] XFS (dm-6): xfs_log_force: error 5 returned. [ 9827.008943] XFS (dm-10): xfs_log_force: error 5 returned. [ 9827.136657] XFS (dm-12): xfs_log_force: error 5 returned. [ 9827.136660] XFS (dm-11): xfs_log_force: error 5 returned. [ 9827.136662] XFS (dm-5): xfs_log_force: error 5 returned. [ 9828.541590] XFS (dm-8): xfs_log_force: error 5 returned. [ 9857.023394] XFS (dm-4): xfs_log_force: error 5 returned. [ 9857.023397] XFS (dm-6): xfs_log_force: error 5 returned. [ 9857.023399] XFS (dm-10): xfs_log_force: error 5 returned. [ 9857.151117] XFS (dm-12): xfs_log_force: error 5 returned. [ 9857.151121] XFS (dm-5): xfs_log_force: error 5 returned. [ 9857.151134] XFS (dm-11): xfs_log_force: error 5 returned. [ 9858.556050] XFS (dm-8): xfs_log_force: error 5 returned. [ 9887.037857] XFS (dm-4): xfs_log_force: error 5 returned. [ 9887.037860] XFS (dm-6): xfs_log_force: error 5 returned. [ 9887.037861] XFS (dm-10): xfs_log_force: error 5 returned. [ 9887.165578] XFS (dm-5): xfs_log_force: error 5 returned. [ 9887.165580] XFS (dm-12): xfs_log_force: error 5 returned. [ 9887.165589] XFS (dm-11): xfs_log_force: error 5 returned. [ 9888.570521] XFS (dm-8): xfs_log_force: error 5 returned. [ 9917.052312] XFS (dm-4): xfs_log_force: error 5 returned. [ 9917.052315] XFS (dm-6): xfs_log_force: error 5 returned. [ 9917.052317] XFS (dm-10): xfs_log_force: error 5 returned. [ 9917.180029] XFS (dm-5): xfs_log_force: error 5 returned. [ 9917.180032] XFS (dm-12): xfs_log_force: error 5 returned. [ 9917.180054] XFS (dm-11): xfs_log_force: error 5 returned. [ 9918.584961] XFS (dm-8): xfs_log_force: error 5 returned. [ 9947.066762] XFS (dm-4): xfs_log_force: error 5 returned. [ 9947.066764] XFS (dm-6): xfs_log_force: error 5 returned. [ 9947.066766] XFS (dm-10): xfs_log_force: error 5 returned. [ 9947.194487] XFS (dm-12): xfs_log_force: error 5 returned. [ 9947.194489] XFS (dm-5): xfs_log_force: error 5 returned. [ 9947.194492] XFS (dm-11): xfs_log_force: error 5 returned. [ 9948.599419] XFS (dm-8): xfs_log_force: error 5 returned. [ 9977.081216] XFS (dm-4): xfs_log_force: error 5 returned. [ 9977.081219] XFS (dm-6): xfs_log_force: error 5 returned. [ 9977.081221] XFS (dm-10): xfs_log_force: error 5 returned. [ 9977.208935] XFS (dm-12): xfs_log_force: error 5 returned. [ 9977.208937] XFS (dm-5): xfs_log_force: error 5 returned. [ 9977.208949] XFS (dm-11): xfs_log_force: error 5 returned. [ 9978.613866] XFS (dm-8): xfs_log_force: error 5 returned. [10007.095664] XFS (dm-4): xfs_log_force: error 5 returned. [10007.095666] XFS (dm-6): xfs_log_force: error 5 returned. [10007.095668] XFS (dm-10): xfs_log_force: error 5 returned. [10007.223389] XFS (dm-12): xfs_log_force: error 5 returned. [10007.223391] XFS (dm-5): xfs_log_force: error 5 returned. [10007.223397] XFS (dm-11): xfs_log_force: error 5 returned. [10008.628320] XFS (dm-8): xfs_log_force: error 5 returned. [10037.110121] XFS (dm-4): xfs_log_force: error 5 returned. [10037.110124] XFS (dm-6): xfs_log_force: error 5 returned. [10037.110126] XFS (dm-10): xfs_log_force: error 5 returned. [10037.237843] XFS (dm-5): xfs_log_force: error 5 returned. [10037.237845] XFS (dm-12): xfs_log_force: error 5 returned. [10037.237848] XFS (dm-11): xfs_log_force: error 5 returned. [10038.642778] XFS (dm-8): xfs_log_force: error 5 returned. [10067.124580] XFS (dm-4): xfs_log_force: error 5 returned. [10067.124583] XFS (dm-6): xfs_log_force: error 5 returned. [10067.124585] XFS (dm-10): xfs_log_force: error 5 returned. [10067.252297] XFS (dm-5): xfs_log_force: error 5 returned. [10067.252300] XFS (dm-12): xfs_log_force: error 5 returned. [10067.252335] XFS (dm-11): xfs_log_force: error 5 returned. [10068.657230] XFS (dm-8): xfs_log_force: error 5 returned. [10097.139033] XFS (dm-4): xfs_log_force: error 5 returned. [10097.139035] XFS (dm-6): xfs_log_force: error 5 returned. [10097.139037] XFS (dm-10): xfs_log_force: error 5 returned. [10097.266757] XFS (dm-12): xfs_log_force: error 5 returned. [10097.266759] XFS (dm-5): xfs_log_force: error 5 returned. [10097.266807] XFS (dm-11): xfs_log_force: error 5 returned. [10098.671688] XFS (dm-8): xfs_log_force: error 5 returned. [10127.153490] XFS (dm-4): xfs_log_force: error 5 returned. [10127.153492] XFS (dm-6): xfs_log_force: error 5 returned. [10127.153494] XFS (dm-10): xfs_log_force: error 5 returned. [10127.281208] XFS (dm-12): xfs_log_force: error 5 returned. [10127.281210] XFS (dm-5): xfs_log_force: error 5 returned. [10127.281283] XFS (dm-11): xfs_log_force: error 5 returned. [10128.686141] XFS (dm-8): xfs_log_force: error 5 returned. [10157.167939] XFS (dm-4): xfs_log_force: error 5 returned. [10157.167942] XFS (dm-6): xfs_log_force: error 5 returned. [10157.167944] XFS (dm-10): xfs_log_force: error 5 returned. [10157.295664] XFS (dm-12): xfs_log_force: error 5 returned. [10157.295667] XFS (dm-5): xfs_log_force: error 5 returned. [10157.295743] XFS (dm-11): xfs_log_force: error 5 returned. [10158.700595] XFS (dm-8): xfs_log_force: error 5 returned. [10187.182398] XFS (dm-4): xfs_log_force: error 5 returned. [10187.182401] XFS (dm-6): xfs_log_force: error 5 returned. [10187.182403] XFS (dm-10): xfs_log_force: error 5 returned. [10187.310120] XFS (dm-5): xfs_log_force: error 5 returned. [10187.310124] XFS (dm-12): xfs_log_force: error 5 returned. [10187.310127] XFS (dm-11): xfs_log_force: error 5 returned. [10188.715053] XFS (dm-8): xfs_log_force: error 5 returned. [10217.196859] XFS (dm-4): xfs_log_force: error 5 returned. [10217.196862] XFS (dm-6): xfs_log_force: error 5 returned. [10217.196864] XFS (dm-10): xfs_log_force: error 5 returned. [10217.324577] XFS (dm-5): xfs_log_force: error 5 returned. [10217.324579] XFS (dm-12): xfs_log_force: error 5 returned. [10217.324601] XFS (dm-11): xfs_log_force: error 5 returned. [10218.729510] XFS (dm-8): xfs_log_force: error 5 returned. [10247.211313] XFS (dm-4): xfs_log_force: error 5 returned. [10247.211316] XFS (dm-6): xfs_log_force: error 5 returned. [10247.211318] XFS (dm-10): xfs_log_force: error 5 returned. [10247.339035] XFS (dm-12): xfs_log_force: error 5 returned. [10247.339038] XFS (dm-5): xfs_log_force: error 5 returned. [10247.339069] XFS (dm-11): xfs_log_force: error 5 returned. [10248.743970] XFS (dm-8): xfs_log_force: error 5 returned. [10277.225776] XFS (dm-4): xfs_log_force: error 5 returned. [10277.225779] XFS (dm-6): xfs_log_force: error 5 returned. [10277.225781] XFS (dm-10): xfs_log_force: error 5 returned. [10277.353492] XFS (dm-12): xfs_log_force: error 5 returned. [10277.353494] XFS (dm-5): xfs_log_force: error 5 returned. [10277.353510] XFS (dm-11): xfs_log_force: error 5 returned. [10278.758422] XFS (dm-8): xfs_log_force: error 5 returned. [10307.240226] XFS (dm-4): xfs_log_force: error 5 returned. [10307.240229] XFS (dm-6): xfs_log_force: error 5 returned. [10307.240231] XFS (dm-10): xfs_log_force: error 5 returned. [10307.367951] XFS (dm-12): xfs_log_force: error 5 returned. [10307.367953] XFS (dm-5): xfs_log_force: error 5 returned. [10307.367956] XFS (dm-11): xfs_log_force: error 5 returned. [10308.772883] XFS (dm-8): xfs_log_force: error 5 returned. [10337.254687] XFS (dm-4): xfs_log_force: error 5 returned. [10337.254689] XFS (dm-6): xfs_log_force: error 5 returned. [10337.254691] XFS (dm-10): xfs_log_force: error 5 returned. [10337.382408] XFS (dm-5): xfs_log_force: error 5 returned. [10337.382410] XFS (dm-12): xfs_log_force: error 5 returned. [10337.382454] XFS (dm-11): xfs_log_force: error 5 returned. [10338.787341] XFS (dm-8): xfs_log_force: error 5 returned. [10367.269150] XFS (dm-4): xfs_log_force: error 5 returned. [10367.269152] XFS (dm-6): xfs_log_force: error 5 returned. [10367.269154] XFS (dm-10): xfs_log_force: error 5 returned. [10367.396868] XFS (dm-12): xfs_log_force: error 5 returned. [10367.396870] XFS (dm-11): xfs_log_force: error 5 returned. [10367.396872] XFS (dm-5): xfs_log_force: error 5 returned. [10368.801801] XFS (dm-8): xfs_log_force: error 5 returned. [10397.283605] XFS (dm-4): xfs_log_force: error 5 returned. [10397.283607] XFS (dm-6): xfs_log_force: error 5 returned. [10397.283609] XFS (dm-10): xfs_log_force: error 5 returned. [10397.411329] XFS (dm-12): xfs_log_force: error 5 returned. [10397.411331] XFS (dm-5): xfs_log_force: error 5 returned. [10397.411400] XFS (dm-11): xfs_log_force: error 5 returned. [10398.816256] XFS (dm-8): xfs_log_force: error 5 returned. [10427.298066] XFS (dm-4): xfs_log_force: error 5 returned. [10427.298069] XFS (dm-6): xfs_log_force: error 5 returned. [10427.298071] XFS (dm-10): xfs_log_force: error 5 returned. [10427.425786] XFS (dm-12): xfs_log_force: error 5 returned. [10427.425788] XFS (dm-5): xfs_log_force: error 5 returned. [10427.425903] XFS (dm-11): xfs_log_force: error 5 returned. [10428.830718] XFS (dm-8): xfs_log_force: error 5 returned. [10457.312520] XFS (dm-4): xfs_log_force: error 5 returned. [10457.312522] XFS (dm-6): xfs_log_force: error 5 returned. [10457.312524] XFS (dm-10): xfs_log_force: error 5 returned. [10457.440244] XFS (dm-12): xfs_log_force: error 5 returned. [10457.440247] XFS (dm-5): xfs_log_force: error 5 returned. [10457.440274] XFS (dm-11): xfs_log_force: error 5 returned. [10458.845176] XFS (dm-8): xfs_log_force: error 5 returned. [10487.326981] XFS (dm-4): xfs_log_force: error 5 returned. [10487.326984] XFS (dm-6): xfs_log_force: error 5 returned. [10487.326986] XFS (dm-10): xfs_log_force: error 5 returned. [10487.454704] XFS (dm-12): xfs_log_force: error 5 returned. [10487.454707] XFS (dm-11): xfs_log_force: error 5 returned. [10487.454709] XFS (dm-5): xfs_log_force: error 5 returned. [10488.859636] XFS (dm-8): xfs_log_force: error 5 returned. [10517.341441] XFS (dm-4): xfs_log_force: error 5 returned. [10517.341443] XFS (dm-6): xfs_log_force: error 5 returned. [10517.341445] XFS (dm-10): xfs_log_force: error 5 returned. [10517.469158] XFS (dm-5): xfs_log_force: error 5 returned. [10517.469161] XFS (dm-12): xfs_log_force: error 5 returned. [10517.469178] XFS (dm-11): xfs_log_force: error 5 returned. [10518.874098] XFS (dm-8): xfs_log_force: error 5 returned. [10547.355890] XFS (dm-4): xfs_log_force: error 5 returned. [10547.355893] XFS (dm-6): xfs_log_force: error 5 returned. [10547.355895] XFS (dm-10): xfs_log_force: error 5 returned. [10547.483615] XFS (dm-12): xfs_log_force: error 5 returned. [10547.483617] XFS (dm-5): xfs_log_force: error 5 returned. [10547.483634] XFS (dm-11): xfs_log_force: error 5 returned. [10548.888540] XFS (dm-8): xfs_log_force: error 5 returned. [10577.370346] XFS (dm-4): xfs_log_force: error 5 returned. [10577.370349] XFS (dm-6): xfs_log_force: error 5 returned. [10577.370351] XFS (dm-10): xfs_log_force: error 5 returned. [10577.498065] XFS (dm-12): xfs_log_force: error 5 returned. [10577.498067] XFS (dm-5): xfs_log_force: error 5 returned. [10577.498076] XFS (dm-11): xfs_log_force: error 5 returned. [10578.902998] XFS (dm-8): xfs_log_force: error 5 returned. [10607.384795] XFS (dm-4): xfs_log_force: error 5 returned. [10607.384798] XFS (dm-6): xfs_log_force: error 5 returned. [10607.384800] XFS (dm-10): xfs_log_force: error 5 returned. [10607.512518] XFS (dm-12): xfs_log_force: error 5 returned. [10607.512522] XFS (dm-5): xfs_log_force: error 5 returned. [10607.512526] XFS (dm-11): xfs_log_force: error 5 returned. [10608.917453] XFS (dm-8): xfs_log_force: error 5 returned. [10637.399253] XFS (dm-4): xfs_log_force: error 5 returned. [10637.399255] XFS (dm-6): xfs_log_force: error 5 returned. [10637.399257] XFS (dm-10): xfs_log_force: error 5 returned. [10637.526974] XFS (dm-5): xfs_log_force: error 5 returned. [10637.526977] XFS (dm-12): xfs_log_force: error 5 returned. [10637.526986] XFS (dm-11): xfs_log_force: error 5 returned. [10638.931911] XFS (dm-8): xfs_log_force: error 5 returned. [10667.413713] XFS (dm-4): xfs_log_force: error 5 returned. [10667.413718] XFS (dm-6): xfs_log_force: error 5 returned. [10667.413721] XFS (dm-10): xfs_log_force: error 5 returned. [10667.541430] XFS (dm-5): xfs_log_force: error 5 returned. [10667.541432] XFS (dm-11): xfs_log_force: error 5 returned. [10667.541435] XFS (dm-12): xfs_log_force: error 5 returned. [10668.946362] XFS (dm-8): xfs_log_force: error 5 returned. [10697.428165] XFS (dm-4): xfs_log_force: error 5 returned. [10697.428168] XFS (dm-6): xfs_log_force: error 5 returned. [10697.428170] XFS (dm-10): xfs_log_force: error 5 returned. [10697.555889] XFS (dm-5): xfs_log_force: error 5 returned. [10697.555892] XFS (dm-12): xfs_log_force: error 5 returned. [10697.555927] XFS (dm-11): xfs_log_force: error 5 returned. [10698.960823] XFS (dm-8): xfs_log_force: error 5 returned. [10727.442626] XFS (dm-4): xfs_log_force: error 5 returned. [10727.442628] XFS (dm-6): xfs_log_force: error 5 returned. [10727.442630] XFS (dm-10): xfs_log_force: error 5 returned. [10727.570343] XFS (dm-12): xfs_log_force: error 5 returned. [10727.570346] XFS (dm-11): xfs_log_force: error 5 returned. [10727.570348] XFS (dm-5): xfs_log_force: error 5 returned. [10728.975280] XFS (dm-8): xfs_log_force: error 5 returned. [10757.457075] XFS (dm-4): xfs_log_force: error 5 returned. [10757.457078] XFS (dm-6): xfs_log_force: error 5 returned. [10757.457080] XFS (dm-10): xfs_log_force: error 5 returned. [10757.584801] XFS (dm-12): xfs_log_force: error 5 returned. [10757.584803] XFS (dm-5): xfs_log_force: error 5 returned. [10757.584811] XFS (dm-11): xfs_log_force: error 5 returned. [10758.989731] XFS (dm-8): xfs_log_force: error 5 returned. [10787.471536] XFS (dm-4): xfs_log_force: error 5 returned. [10787.471538] XFS (dm-6): xfs_log_force: error 5 returned. [10787.471540] XFS (dm-10): xfs_log_force: error 5 returned. [10787.599258] XFS (dm-5): xfs_log_force: error 5 returned. [10787.599260] XFS (dm-11): xfs_log_force: error 5 returned. [10787.599267] XFS (dm-12): xfs_log_force: error 5 returned. [10789.004195] XFS (dm-8): xfs_log_force: error 5 returned. [10817.485997] XFS (dm-4): xfs_log_force: error 5 returned. [10817.485999] XFS (dm-6): xfs_log_force: error 5 returned. [10817.486001] XFS (dm-10): xfs_log_force: error 5 returned. [10817.613714] XFS (dm-5): xfs_log_force: error 5 returned. [10817.613717] XFS (dm-12): xfs_log_force: error 5 returned. [10817.613752] XFS (dm-11): xfs_log_force: error 5 returned. [10819.018655] XFS (dm-8): xfs_log_force: error 5 returned. [10847.500451] XFS (dm-4): xfs_log_force: error 5 returned. [10847.500453] XFS (dm-6): xfs_log_force: error 5 returned. [10847.500455] XFS (dm-10): xfs_log_force: error 5 returned. [10847.628176] XFS (dm-12): xfs_log_force: error 5 returned. [10847.628178] XFS (dm-5): xfs_log_force: error 5 returned. [10847.628280] XFS (dm-11): xfs_log_force: error 5 returned. [10849.033107] XFS (dm-8): xfs_log_force: error 5 returned. [10877.514912] XFS (dm-4): xfs_log_force: error 5 returned. [10877.514915] XFS (dm-6): xfs_log_force: error 5 returned. [10877.514917] XFS (dm-10): xfs_log_force: error 5 returned. [10877.642630] XFS (dm-12): xfs_log_force: error 5 returned. [10877.642633] XFS (dm-5): xfs_log_force: error 5 returned. [10877.642635] XFS (dm-11): xfs_log_force: error 5 returned. [10879.047564] XFS (dm-8): xfs_log_force: error 5 returned. [10907.529364] XFS (dm-4): xfs_log_force: error 5 returned. [10907.529367] XFS (dm-6): xfs_log_force: error 5 returned. [10907.529369] XFS (dm-10): xfs_log_force: error 5 returned. [10907.657089] XFS (dm-12): xfs_log_force: error 5 returned. [10907.657091] XFS (dm-5): xfs_log_force: error 5 returned. [10907.657225] XFS (dm-11): xfs_log_force: error 5 returned. [10909.062023] XFS (dm-8): xfs_log_force: error 5 returned. [10937.543825] XFS (dm-4): xfs_log_force: error 5 returned. [10937.543828] XFS (dm-6): xfs_log_force: error 5 returned. [10937.543830] XFS (dm-10): xfs_log_force: error 5 returned. [10937.671547] XFS (dm-5): xfs_log_force: error 5 returned. [10937.671551] XFS (dm-12): xfs_log_force: error 5 returned. [10937.671640] XFS (dm-11): xfs_log_force: error 5 returned. [10939.076479] XFS (dm-8): xfs_log_force: error 5 returned. [10967.558287] XFS (dm-4): xfs_log_force: error 5 returned. [10967.558289] XFS (dm-6): xfs_log_force: error 5 returned. [10967.558291] XFS (dm-10): xfs_log_force: error 5 returned. [10967.686004] XFS (dm-5): xfs_log_force: error 5 returned. [10967.686010] XFS (dm-12): xfs_log_force: error 5 returned. [10967.686048] XFS (dm-11): xfs_log_force: error 5 returned. [10969.090939] XFS (dm-8): xfs_log_force: error 5 returned. [10997.572747] XFS (dm-4): xfs_log_force: error 5 returned. [10997.572750] XFS (dm-6): xfs_log_force: error 5 returned. [10997.572752] XFS (dm-10): xfs_log_force: error 5 returned. [10997.700464] XFS (dm-12): xfs_log_force: error 5 returned. [10997.700467] XFS (dm-11): xfs_log_force: error 5 returned. [10997.700473] XFS (dm-5): xfs_log_force: error 5 returned. [10999.105399] XFS (dm-8): xfs_log_force: error 5 returned. [11027.587201] XFS (dm-4): xfs_log_force: error 5 returned. [11027.587204] XFS (dm-6): xfs_log_force: error 5 returned. [11027.587206] XFS (dm-10): xfs_log_force: error 5 returned. [11027.714921] XFS (dm-12): xfs_log_force: error 5 returned. [11027.714923] XFS (dm-5): xfs_log_force: error 5 returned. [11027.714937] XFS (dm-11): xfs_log_force: error 5 returned. [11029.119850] XFS (dm-8): xfs_log_force: error 5 returned. [11057.601654] XFS (dm-4): xfs_log_force: error 5 returned. [11057.601657] XFS (dm-6): xfs_log_force: error 5 returned. [11057.601659] XFS (dm-10): xfs_log_force: error 5 returned. [11057.729380] XFS (dm-12): xfs_log_force: error 5 returned. [11057.729382] XFS (dm-5): xfs_log_force: error 5 returned. [11057.729403] XFS (dm-11): xfs_log_force: error 5 returned. [11059.134312] XFS (dm-8): xfs_log_force: error 5 returned. [11087.616116] XFS (dm-4): xfs_log_force: error 5 returned. [11087.616118] XFS (dm-6): xfs_log_force: error 5 returned. [11087.616120] XFS (dm-10): xfs_log_force: error 5 returned. [11087.743836] XFS (dm-5): xfs_log_force: error 5 returned. [11087.743839] XFS (dm-12): xfs_log_force: error 5 returned. [11087.743841] XFS (dm-11): xfs_log_force: error 5 returned. [11089.148781] XFS (dm-8): xfs_log_force: error 5 returned. [11117.630578] XFS (dm-4): xfs_log_force: error 5 returned. [11117.630580] XFS (dm-6): xfs_log_force: error 5 returned. [11117.630582] XFS (dm-10): xfs_log_force: error 5 returned. [11117.758294] XFS (dm-5): xfs_log_force: error 5 returned. [11117.758297] XFS (dm-12): xfs_log_force: error 5 returned. [11117.758300] XFS (dm-11): xfs_log_force: error 5 returned. [11119.163228] XFS (dm-8): xfs_log_force: error 5 returned. [11147.645032] XFS (dm-4): xfs_log_force: error 5 returned. [11147.645034] XFS (dm-6): xfs_log_force: error 5 returned. [11147.645037] XFS (dm-10): xfs_log_force: error 5 returned. [11147.772757] XFS (dm-12): xfs_log_force: error 5 returned. [11147.772759] XFS (dm-5): xfs_log_force: error 5 returned. [11147.772809] XFS (dm-11): xfs_log_force: error 5 returned. [11149.177684] XFS (dm-8): xfs_log_force: error 5 returned. [11177.659492] XFS (dm-4): xfs_log_force: error 5 returned. [11177.659495] XFS (dm-6): xfs_log_force: error 5 returned. [11177.659497] XFS (dm-10): xfs_log_force: error 5 returned. [11177.787211] XFS (dm-5): xfs_log_force: error 5 returned. [11177.787214] XFS (dm-12): xfs_log_force: error 5 returned. [11177.787275] XFS (dm-11): xfs_log_force: error 5 returned. [11179.192144] XFS (dm-8): xfs_log_force: error 5 returned. [11207.673945] XFS (dm-4): xfs_log_force: error 5 returned. [11207.673947] XFS (dm-6): xfs_log_force: error 5 returned. [11207.673949] XFS (dm-10): xfs_log_force: error 5 returned. [11207.801669] XFS (dm-12): xfs_log_force: error 5 returned. [11207.801672] XFS (dm-5): xfs_log_force: error 5 returned. [11207.801745] XFS (dm-11): xfs_log_force: error 5 returned. [11209.206600] XFS (dm-8): xfs_log_force: error 5 returned. [11237.688406] XFS (dm-4): xfs_log_force: error 5 returned. [11237.688409] XFS (dm-6): xfs_log_force: error 5 returned. [11237.688411] XFS (dm-10): xfs_log_force: error 5 returned. [11237.816127] XFS (dm-5): xfs_log_force: error 5 returned. [11237.816137] XFS (dm-12): xfs_log_force: error 5 returned. [11237.816211] XFS (dm-11): xfs_log_force: error 5 returned. [11239.221062] XFS (dm-8): xfs_log_force: error 5 returned. [11267.702868] XFS (dm-4): xfs_log_force: error 5 returned. [11267.702870] XFS (dm-6): xfs_log_force: error 5 returned. [11267.702872] XFS (dm-10): xfs_log_force: error 5 returned. [11267.830586] XFS (dm-12): xfs_log_force: error 5 returned. [11267.830588] XFS (dm-5): xfs_log_force: error 5 returned. [11267.830594] XFS (dm-11): xfs_log_force: error 5 returned. [11269.235525] XFS (dm-8): xfs_log_force: error 5 returned. [11297.717327] XFS (dm-4): xfs_log_force: error 5 returned. [11297.717330] XFS (dm-6): xfs_log_force: error 5 returned. [11297.717332] XFS (dm-10): xfs_log_force: error 5 returned. [11297.845046] XFS (dm-12): xfs_log_force: error 5 returned. [11297.845048] XFS (dm-5): xfs_log_force: error 5 returned. [11297.845147] XFS (dm-11): xfs_log_force: error 5 returned. [11299.249971] XFS (dm-8): xfs_log_force: error 5 returned. [11327.731781] XFS (dm-4): xfs_log_force: error 5 returned. [11327.731783] XFS (dm-6): xfs_log_force: error 5 returned. [11327.731785] XFS (dm-10): xfs_log_force: error 5 returned. [11327.859499] XFS (dm-12): xfs_log_force: error 5 returned. [11327.859501] XFS (dm-5): xfs_log_force: error 5 returned. [11327.859520] XFS (dm-11): xfs_log_force: error 5 returned. [11329.264433] XFS (dm-8): xfs_log_force: error 5 returned. [11357.746234] XFS (dm-4): xfs_log_force: error 5 returned. [11357.746236] XFS (dm-6): xfs_log_force: error 5 returned. [11357.746238] XFS (dm-10): xfs_log_force: error 5 returned. [11357.873957] XFS (dm-12): xfs_log_force: error 5 returned. [11357.873960] XFS (dm-5): xfs_log_force: error 5 returned. [11357.874008] XFS (dm-11): xfs_log_force: error 5 returned. [11359.278892] XFS (dm-8): xfs_log_force: error 5 returned. [11387.760696] XFS (dm-4): xfs_log_force: error 5 returned. [11387.760699] XFS (dm-6): xfs_log_force: error 5 returned. [11387.760701] XFS (dm-10): xfs_log_force: error 5 returned. [11387.888417] XFS (dm-5): xfs_log_force: error 5 returned. [11387.888420] XFS (dm-12): xfs_log_force: error 5 returned. [11387.888428] XFS (dm-11): xfs_log_force: error 5 returned. [11389.293360] XFS (dm-8): xfs_log_force: error 5 returned. [11417.775159] XFS (dm-4): xfs_log_force: error 5 returned. [11417.775161] XFS (dm-6): xfs_log_force: error 5 returned. [11417.775163] XFS (dm-10): xfs_log_force: error 5 returned. [11417.902876] XFS (dm-5): xfs_log_force: error 5 returned. [11417.902883] XFS (dm-12): xfs_log_force: error 5 returned. [11417.902901] XFS (dm-11): xfs_log_force: error 5 returned. [11419.307809] XFS (dm-8): xfs_log_force: error 5 returned. [11447.789615] XFS (dm-4): xfs_log_force: error 5 returned. [11447.789618] XFS (dm-6): xfs_log_force: error 5 returned. [11447.789620] XFS (dm-10): xfs_log_force: error 5 returned. [11447.917340] XFS (dm-12): xfs_log_force: error 5 returned. [11447.917342] XFS (dm-5): xfs_log_force: error 5 returned. [11447.917345] XFS (dm-11): xfs_log_force: error 5 returned. [11449.322274] XFS (dm-8): xfs_log_force: error 5 returned. [11477.804079] XFS (dm-4): xfs_log_force: error 5 returned. [11477.804082] XFS (dm-6): xfs_log_force: error 5 returned. [11477.804084] XFS (dm-10): xfs_log_force: error 5 returned. [11477.931797] XFS (dm-12): xfs_log_force: error 5 returned. [11477.931800] XFS (dm-11): xfs_log_force: error 5 returned. [11477.931802] XFS (dm-5): xfs_log_force: error 5 returned. [11479.336727] XFS (dm-8): xfs_log_force: error 5 returned. [11507.818531] XFS (dm-4): xfs_log_force: error 5 returned. [11507.818534] XFS (dm-6): xfs_log_force: error 5 returned. [11507.818536] XFS (dm-10): xfs_log_force: error 5 returned. [11507.946256] XFS (dm-12): xfs_log_force: error 5 returned. [11507.946259] XFS (dm-11): xfs_log_force: error 5 returned. [11507.946261] XFS (dm-5): xfs_log_force: error 5 returned. [11509.351188] XFS (dm-8): xfs_log_force: error 5 returned. [11537.832993] XFS (dm-4): xfs_log_force: error 5 returned. [11537.832995] XFS (dm-6): xfs_log_force: error 5 returned. [11537.832997] XFS (dm-10): xfs_log_force: error 5 returned. [11537.960715] XFS (dm-5): xfs_log_force: error 5 returned. [11537.960722] XFS (dm-11): xfs_log_force: error 5 returned. [11537.960725] XFS (dm-12): xfs_log_force: error 5 returned. [11539.365653] XFS (dm-8): xfs_log_force: error 5 returned. [11567.847456] XFS (dm-4): xfs_log_force: error 5 returned. [11567.847459] XFS (dm-6): xfs_log_force: error 5 returned. [11567.847461] XFS (dm-10): xfs_log_force: error 5 returned. [11567.975173] XFS (dm-5): xfs_log_force: error 5 returned. [11567.975175] XFS (dm-12): xfs_log_force: error 5 returned. [11567.975195] XFS (dm-11): xfs_log_force: error 5 returned. [11569.380114] XFS (dm-8): xfs_log_force: error 5 returned. [11597.861911] XFS (dm-4): xfs_log_force: error 5 returned. [11597.861913] XFS (dm-6): xfs_log_force: error 5 returned. [11597.861915] XFS (dm-10): xfs_log_force: error 5 returned. [11597.989636] XFS (dm-12): xfs_log_force: error 5 returned. [11597.989638] XFS (dm-5): xfs_log_force: error 5 returned. [11597.989641] XFS (dm-11): xfs_log_force: error 5 returned. [11599.394567] XFS (dm-8): xfs_log_force: error 5 returned. [11627.876371] XFS (dm-4): xfs_log_force: error 5 returned. [11627.876374] XFS (dm-6): xfs_log_force: error 5 returned. [11627.876376] XFS (dm-10): xfs_log_force: error 5 returned. [11628.004088] XFS (dm-12): xfs_log_force: error 5 returned. [11628.004090] XFS (dm-5): xfs_log_force: error 5 returned. [11628.004093] XFS (dm-11): xfs_log_force: error 5 returned. [11629.409022] XFS (dm-8): xfs_log_force: error 5 returned. [11657.890821] XFS (dm-4): xfs_log_force: error 5 returned. [11657.890823] XFS (dm-6): xfs_log_force: error 5 returned. [11657.890825] XFS (dm-10): xfs_log_force: error 5 returned. [11658.018546] XFS (dm-12): xfs_log_force: error 5 returned. [11658.018548] XFS (dm-5): xfs_log_force: error 5 returned. [11658.018600] XFS (dm-11): xfs_log_force: error 5 returned. [11659.423479] XFS (dm-8): xfs_log_force: error 5 returned. [11687.905280] XFS (dm-4): xfs_log_force: error 5 returned. [11687.905282] XFS (dm-6): xfs_log_force: error 5 returned. [11687.905284] XFS (dm-10): xfs_log_force: error 5 returned. [11688.033002] XFS (dm-5): xfs_log_force: error 5 returned. [11688.033005] XFS (dm-11): xfs_log_force: error 5 returned. [11688.033008] XFS (dm-12): xfs_log_force: error 5 returned. [11689.437934] XFS (dm-8): xfs_log_force: error 5 returned. [11717.919741] XFS (dm-4): xfs_log_force: error 5 returned. [11717.919743] XFS (dm-6): xfs_log_force: error 5 returned. [11717.919745] XFS (dm-10): xfs_log_force: error 5 returned. [11718.047460] XFS (dm-5): xfs_log_force: error 5 returned. [11718.047465] XFS (dm-12): xfs_log_force: error 5 returned. [11718.047476] XFS (dm-11): xfs_log_force: error 5 returned. [11719.452394] XFS (dm-8): xfs_log_force: error 5 returned. [11747.934194] XFS (dm-4): xfs_log_force: error 5 returned. [11747.934196] XFS (dm-6): xfs_log_force: error 5 returned. [11747.934198] XFS (dm-10): xfs_log_force: error 5 returned. [11748.061917] XFS (dm-12): xfs_log_force: error 5 returned. [11748.061919] XFS (dm-5): xfs_log_force: error 5 returned. [11748.061959] XFS (dm-11): xfs_log_force: error 5 returned. [11749.466852] XFS (dm-8): xfs_log_force: error 5 returned. [11777.948654] XFS (dm-4): xfs_log_force: error 5 returned. [11777.948656] XFS (dm-6): xfs_log_force: error 5 returned. [11777.948658] XFS (dm-10): xfs_log_force: error 5 returned. [11778.076372] XFS (dm-12): xfs_log_force: error 5 returned. [11778.076374] XFS (dm-5): xfs_log_force: error 5 returned. [11778.076390] XFS (dm-11): xfs_log_force: error 5 returned. [11779.481303] XFS (dm-8): xfs_log_force: error 5 returned. [11807.963106] XFS (dm-4): xfs_log_force: error 5 returned. [11807.963108] XFS (dm-6): xfs_log_force: error 5 returned. [11807.963110] XFS (dm-10): xfs_log_force: error 5 returned. [11808.090831] XFS (dm-12): xfs_log_force: error 5 returned. [11808.090833] XFS (dm-5): xfs_log_force: error 5 returned. [11808.090895] XFS (dm-11): xfs_log_force: error 5 returned. [11809.495764] XFS (dm-8): xfs_log_force: error 5 returned. [11837.977565] XFS (dm-4): xfs_log_force: error 5 returned. [11837.977568] XFS (dm-6): xfs_log_force: error 5 returned. [11837.977570] XFS (dm-10): xfs_log_force: error 5 returned. [11838.105286] XFS (dm-5): xfs_log_force: error 5 returned. [11838.105288] XFS (dm-12): xfs_log_force: error 5 returned. [11838.105291] XFS (dm-11): xfs_log_force: error 5 returned. [11839.510230] XFS (dm-8): xfs_log_force: error 5 returned. [11867.992026] XFS (dm-4): xfs_log_force: error 5 returned. [11867.992029] XFS (dm-6): xfs_log_force: error 5 returned. [11867.992031] XFS (dm-10): xfs_log_force: error 5 returned. [11868.119743] XFS (dm-5): xfs_log_force: error 5 returned. [11868.119746] XFS (dm-12): xfs_log_force: error 5 returned. [11868.119854] XFS (dm-11): xfs_log_force: error 5 returned. [11869.524677] XFS (dm-8): xfs_log_force: error 5 returned. [11898.006481] XFS (dm-4): xfs_log_force: error 5 returned. [11898.006484] XFS (dm-6): xfs_log_force: error 5 returned. [11898.006486] XFS (dm-10): xfs_log_force: error 5 returned. [11898.134205] XFS (dm-12): xfs_log_force: error 5 returned. [11898.134208] XFS (dm-5): xfs_log_force: error 5 returned. [11898.134275] XFS (dm-11): xfs_log_force: error 5 returned. [11899.539132] XFS (dm-8): xfs_log_force: error 5 returned. [11928.020942] XFS (dm-4): xfs_log_force: error 5 returned. [11928.020945] XFS (dm-6): xfs_log_force: error 5 returned. [11928.020947] XFS (dm-10): xfs_log_force: error 5 returned. [11928.148659] XFS (dm-5): xfs_log_force: error 5 returned. [11928.148661] XFS (dm-11): xfs_log_force: error 5 returned. [11928.148664] XFS (dm-12): xfs_log_force: error 5 returned. [11929.553593] XFS (dm-8): xfs_log_force: error 5 returned. [11958.035392] XFS (dm-4): xfs_log_force: error 5 returned. [11958.035395] XFS (dm-6): xfs_log_force: error 5 returned. [11958.035397] XFS (dm-10): xfs_log_force: error 5 returned. [11958.163116] XFS (dm-12): xfs_log_force: error 5 returned. [11958.163119] XFS (dm-5): xfs_log_force: error 5 returned. [11958.163218] XFS (dm-11): xfs_log_force: error 5 returned. [11959.568048] XFS (dm-8): xfs_log_force: error 5 returned. [11988.049853] XFS (dm-4): xfs_log_force: error 5 returned. [11988.049856] XFS (dm-6): xfs_log_force: error 5 returned. [11988.049858] XFS (dm-10): xfs_log_force: error 5 returned. [11988.177573] XFS (dm-5): xfs_log_force: error 5 returned. [11988.177576] XFS (dm-12): xfs_log_force: error 5 returned. [11988.177579] XFS (dm-11): xfs_log_force: error 5 returned. [11989.582510] XFS (dm-8): xfs_log_force: error 5 returned. [12018.064314] XFS (dm-4): xfs_log_force: error 5 returned. [12018.064317] XFS (dm-6): xfs_log_force: error 5 returned. [12018.064319] XFS (dm-10): xfs_log_force: error 5 returned. [12018.192031] XFS (dm-5): xfs_log_force: error 5 returned. [12018.192034] XFS (dm-12): xfs_log_force: error 5 returned. [12018.192163] XFS (dm-11): xfs_log_force: error 5 returned. [12019.596973] XFS (dm-8): xfs_log_force: error 5 returned. [12048.078769] XFS (dm-4): xfs_log_force: error 5 returned. [12048.078772] XFS (dm-6): xfs_log_force: error 5 returned. [12048.078773] XFS (dm-10): xfs_log_force: error 5 returned. [12048.206493] XFS (dm-12): xfs_log_force: error 5 returned. [12048.206496] XFS (dm-11): xfs_log_force: error 5 returned. [12048.206499] XFS (dm-5): xfs_log_force: error 5 returned. [12049.611419] XFS (dm-8): xfs_log_force: error 5 returned. [12078.093229] XFS (dm-4): xfs_log_force: error 5 returned. [12078.093232] XFS (dm-6): xfs_log_force: error 5 returned. [12078.093234] XFS (dm-10): xfs_log_force: error 5 returned. [12078.220948] XFS (dm-12): xfs_log_force: error 5 returned. [12078.220950] XFS (dm-5): xfs_log_force: error 5 returned. [12078.220961] XFS (dm-11): xfs_log_force: error 5 returned. [12079.625881] XFS (dm-8): xfs_log_force: error 5 returned. [12108.107681] XFS (dm-4): xfs_log_force: error 5 returned. [12108.107684] XFS (dm-6): xfs_log_force: error 5 returned. [12108.107686] XFS (dm-10): xfs_log_force: error 5 returned. [12108.235404] XFS (dm-12): xfs_log_force: error 5 returned. [12108.235407] XFS (dm-5): xfs_log_force: error 5 returned. [12108.235431] XFS (dm-11): xfs_log_force: error 5 returned. [12109.640340] XFS (dm-8): xfs_log_force: error 5 returned. [12138.122142] XFS (dm-4): xfs_log_force: error 5 returned. [12138.122144] XFS (dm-6): xfs_log_force: error 5 returned. [12138.122146] XFS (dm-10): xfs_log_force: error 5 returned. [12138.249863] XFS (dm-5): xfs_log_force: error 5 returned. [12138.249865] XFS (dm-12): xfs_log_force: error 5 returned. [12138.249874] XFS (dm-11): xfs_log_force: error 5 returned. [12139.654807] XFS (dm-8): xfs_log_force: error 5 returned. [12168.136603] XFS (dm-4): xfs_log_force: error 5 returned. [12168.136606] XFS (dm-6): xfs_log_force: error 5 returned. [12168.136608] XFS (dm-10): xfs_log_force: error 5 returned. [12168.264320] XFS (dm-5): xfs_log_force: error 5 returned. [12168.264328] XFS (dm-12): xfs_log_force: error 5 returned. [12168.264346] XFS (dm-11): xfs_log_force: error 5 returned. [12169.669253] XFS (dm-8): xfs_log_force: error 5 returned. [12198.151059] XFS (dm-4): xfs_log_force: error 5 returned. [12198.151062] XFS (dm-6): xfs_log_force: error 5 returned. [12198.151064] XFS (dm-10): xfs_log_force: error 5 returned. [12198.278783] XFS (dm-12): xfs_log_force: error 5 returned. [12198.278786] XFS (dm-11): xfs_log_force: error 5 returned. [12198.278788] XFS (dm-5): xfs_log_force: error 5 returned. [12199.683717] XFS (dm-8): xfs_log_force: error 5 returned. [12228.165522] XFS (dm-4): xfs_log_force: error 5 returned. [12228.165525] XFS (dm-6): xfs_log_force: error 5 returned. [12228.165527] XFS (dm-10): xfs_log_force: error 5 returned. [12228.293240] XFS (dm-12): xfs_log_force: error 5 returned. [12228.293243] XFS (dm-5): xfs_log_force: error 5 returned. [12228.293293] XFS (dm-11): xfs_log_force: error 5 returned. [12229.698172] XFS (dm-8): xfs_log_force: error 5 returned. [12258.179977] XFS (dm-4): xfs_log_force: error 5 returned. [12258.179979] XFS (dm-6): xfs_log_force: error 5 returned. [12258.179981] XFS (dm-10): xfs_log_force: error 5 returned. [12258.307702] XFS (dm-12): xfs_log_force: error 5 returned. [12258.307704] XFS (dm-5): xfs_log_force: error 5 returned. [12258.307711] XFS (dm-11): xfs_log_force: error 5 returned. [12259.712633] XFS (dm-8): xfs_log_force: error 5 returned. [12288.194440] XFS (dm-4): xfs_log_force: error 5 returned. [12288.194442] XFS (dm-6): xfs_log_force: error 5 returned. [12288.194444] XFS (dm-10): xfs_log_force: error 5 returned. [12288.322159] XFS (dm-5): xfs_log_force: error 5 returned. [12288.322171] XFS (dm-12): xfs_log_force: error 5 returned. [12288.322241] XFS (dm-11): xfs_log_force: error 5 returned. [12289.727099] XFS (dm-8): xfs_log_force: error 5 returned. [12318.208903] XFS (dm-4): xfs_log_force: error 5 returned. [12318.208906] XFS (dm-6): xfs_log_force: error 5 returned. [12318.208908] XFS (dm-10): xfs_log_force: error 5 returned. [12318.336620] XFS (dm-5): xfs_log_force: error 5 returned. [12318.336622] XFS (dm-12): xfs_log_force: error 5 returned. [12318.336658] XFS (dm-11): xfs_log_force: error 5 returned. [12319.741560] XFS (dm-8): xfs_log_force: error 5 returned. [12348.223359] XFS (dm-4): xfs_log_force: error 5 returned. [12348.223361] XFS (dm-6): xfs_log_force: error 5 returned. [12348.223363] XFS (dm-10): xfs_log_force: error 5 returned. [12348.351083] XFS (dm-12): xfs_log_force: error 5 returned. [12348.351086] XFS (dm-5): xfs_log_force: error 5 returned. [12348.351088] XFS (dm-11): xfs_log_force: error 5 returned. [12349.756016] XFS (dm-8): xfs_log_force: error 5 returned. [12378.237820] XFS (dm-4): xfs_log_force: error 5 returned. [12378.237823] XFS (dm-6): xfs_log_force: error 5 returned. [12378.237824] XFS (dm-10): xfs_log_force: error 5 returned. [12378.365539] XFS (dm-12): xfs_log_force: error 5 returned. [12378.365541] XFS (dm-5): xfs_log_force: error 5 returned. [12378.365612] XFS (dm-11): xfs_log_force: error 5 returned. [12379.770473] XFS (dm-8): xfs_log_force: error 5 returned. [12408.252275] XFS (dm-4): xfs_log_force: error 5 returned. [12408.252278] XFS (dm-6): xfs_log_force: error 5 returned. [12408.252280] XFS (dm-10): xfs_log_force: error 5 returned. [12408.380000] XFS (dm-12): xfs_log_force: error 5 returned. [12408.380003] XFS (dm-5): xfs_log_force: error 5 returned. [12408.380131] XFS (dm-11): xfs_log_force: error 5 returned. [12409.784934] XFS (dm-8): xfs_log_force: error 5 returned. [12438.266739] XFS (dm-4): xfs_log_force: error 5 returned. [12438.266741] XFS (dm-6): xfs_log_force: error 5 returned. [12438.266743] XFS (dm-10): xfs_log_force: error 5 returned. [12438.394459] XFS (dm-5): xfs_log_force: error 5 returned. [12438.394464] XFS (dm-12): xfs_log_force: error 5 returned. [12438.394480] XFS (dm-11): xfs_log_force: error 5 returned. [12439.799392] XFS (dm-8): xfs_log_force: error 5 returned. [12468.281202] XFS (dm-4): xfs_log_force: error 5 returned. [12468.281204] XFS (dm-6): xfs_log_force: error 5 returned. [12468.281206] XFS (dm-10): xfs_log_force: error 5 returned. [12468.408918] XFS (dm-5): xfs_log_force: error 5 returned. [12468.408920] XFS (dm-11): xfs_log_force: error 5 returned. [12468.408925] XFS (dm-12): xfs_log_force: error 5 returned. [12469.813853] XFS (dm-8): xfs_log_force: error 5 returned. [12498.295656] XFS (dm-4): xfs_log_force: error 5 returned. [12498.295659] XFS (dm-6): xfs_log_force: error 5 returned. [12498.295661] XFS (dm-10): xfs_log_force: error 5 returned. [12498.423378] XFS (dm-12): xfs_log_force: error 5 returned. [12498.423380] XFS (dm-5): xfs_log_force: error 5 returned. [12498.423383] XFS (dm-11): xfs_log_force: error 5 returned. [12499.828314] XFS (dm-8): xfs_log_force: error 5 returned. [12528.310117] XFS (dm-4): xfs_log_force: error 5 returned. [12528.310121] XFS (dm-6): xfs_log_force: error 5 returned. [12528.310124] XFS (dm-10): xfs_log_force: error 5 returned. [12528.437834] XFS (dm-12): xfs_log_force: error 5 returned. [12528.437837] XFS (dm-11): xfs_log_force: error 5 returned. [12528.437840] XFS (dm-5): xfs_log_force: error 5 returned. [12529.842765] XFS (dm-8): xfs_log_force: error 5 returned. [12558.324568] XFS (dm-4): xfs_log_force: error 5 returned. [12558.324571] XFS (dm-6): xfs_log_force: error 5 returned. [12558.324573] XFS (dm-10): xfs_log_force: error 5 returned. [12558.452293] XFS (dm-12): xfs_log_force: error 5 returned. [12558.452296] XFS (dm-11): xfs_log_force: error 5 returned. [12558.452298] XFS (dm-5): xfs_log_force: error 5 returned. [12559.857225] XFS (dm-8): xfs_log_force: error 5 returned. [12588.339030] XFS (dm-4): xfs_log_force: error 5 returned. [12588.339034] XFS (dm-6): xfs_log_force: error 5 returned. [12588.339037] XFS (dm-10): xfs_log_force: error 5 returned. [12588.466750] XFS (dm-12): xfs_log_force: error 5 returned. [12588.466753] XFS (dm-5): xfs_log_force: error 5 returned. [12588.466755] XFS (dm-11): xfs_log_force: error 5 returned. [12589.871694] XFS (dm-8): xfs_log_force: error 5 returned. [12618.353493] XFS (dm-4): xfs_log_force: error 5 returned. [12618.353497] XFS (dm-6): xfs_log_force: error 5 returned. [12618.353499] XFS (dm-10): xfs_log_force: error 5 returned. [12618.481208] XFS (dm-5): xfs_log_force: error 5 returned. [12618.481211] XFS (dm-12): xfs_log_force: error 5 returned. [12618.481221] XFS (dm-11): xfs_log_force: error 5 returned. [12619.886143] XFS (dm-8): xfs_log_force: error 5 returned. [12648.367945] XFS (dm-4): xfs_log_force: error 5 returned. [12648.367949] XFS (dm-6): xfs_log_force: error 5 returned. [12648.367951] XFS (dm-10): xfs_log_force: error 5 returned. [12648.495670] XFS (dm-12): xfs_log_force: error 5 returned. [12648.495672] XFS (dm-5): xfs_log_force: error 5 returned. [12648.495700] XFS (dm-11): xfs_log_force: error 5 returned. [12649.900597] XFS (dm-8): xfs_log_force: error 5 returned. [12678.382406] XFS (dm-4): xfs_log_force: error 5 returned. [12678.382409] XFS (dm-6): xfs_log_force: error 5 returned. [12678.382412] XFS (dm-10): xfs_log_force: error 5 returned. [12678.510124] XFS (dm-5): xfs_log_force: error 5 returned. [12678.510127] XFS (dm-12): xfs_log_force: error 5 returned. [12678.510167] XFS (dm-11): xfs_log_force: error 5 returned. [12679.915058] XFS (dm-8): xfs_log_force: error 5 returned. [12708.396859] XFS (dm-4): xfs_log_force: error 5 returned. [12708.396862] XFS (dm-6): xfs_log_force: error 5 returned. [12708.396864] XFS (dm-10): xfs_log_force: error 5 returned. [12708.524583] XFS (dm-12): xfs_log_force: error 5 returned. [12708.524585] XFS (dm-5): xfs_log_force: error 5 returned. [12708.524589] XFS (dm-11): xfs_log_force: error 5 returned. [12709.929514] XFS (dm-8): xfs_log_force: error 5 returned. [12738.411316] XFS (dm-4): xfs_log_force: error 5 returned. [12738.411319] XFS (dm-6): xfs_log_force: error 5 returned. [12738.411321] XFS (dm-10): xfs_log_force: error 5 returned. [12738.539039] XFS (dm-5): xfs_log_force: error 5 returned. [12738.539043] XFS (dm-12): xfs_log_force: error 5 returned. [12738.539101] XFS (dm-11): xfs_log_force: error 5 returned. [12739.943976] XFS (dm-8): xfs_log_force: error 5 returned. [12768.425781] XFS (dm-4): xfs_log_force: error 5 returned. [12768.425784] XFS (dm-6): xfs_log_force: error 5 returned. [12768.425786] XFS (dm-10): xfs_log_force: error 5 returned. [12768.553499] XFS (dm-5): xfs_log_force: error 5 returned. [12768.553501] XFS (dm-12): xfs_log_force: error 5 returned. [12768.553504] XFS (dm-11): xfs_log_force: error 5 returned. [12769.958432] XFS (dm-8): xfs_log_force: error 5 returned. [12798.440235] XFS (dm-4): xfs_log_force: error 5 returned. [12798.440238] XFS (dm-6): xfs_log_force: error 5 returned. [12798.440240] XFS (dm-10): xfs_log_force: error 5 returned. [12798.567960] XFS (dm-12): xfs_log_force: error 5 returned. [12798.567962] XFS (dm-5): xfs_log_force: error 5 returned. [12798.568044] XFS (dm-11): xfs_log_force: error 5 returned. [12799.972886] XFS (dm-8): xfs_log_force: error 5 returned. [12828.454698] XFS (dm-4): xfs_log_force: error 5 returned. [12828.454701] XFS (dm-6): xfs_log_force: error 5 returned. [12828.454703] XFS (dm-10): xfs_log_force: error 5 returned. [12828.582415] XFS (dm-12): xfs_log_force: error 5 returned. [12828.582418] XFS (dm-5): xfs_log_force: error 5 returned. [12828.582437] XFS (dm-11): xfs_log_force: error 5 returned. [12829.987349] XFS (dm-8): xfs_log_force: error 5 returned. [12858.469149] XFS (dm-4): xfs_log_force: error 5 returned. [12858.469152] XFS (dm-6): xfs_log_force: error 5 returned. [12858.469154] XFS (dm-10): xfs_log_force: error 5 returned. [12858.596872] XFS (dm-12): xfs_log_force: error 5 returned. [12858.596877] XFS (dm-5): xfs_log_force: error 5 returned. [12858.596973] XFS (dm-11): xfs_log_force: error 5 returned. [12860.001803] XFS (dm-8): xfs_log_force: error 5 returned. [12888.483609] XFS (dm-4): xfs_log_force: error 5 returned. [12888.483611] XFS (dm-6): xfs_log_force: error 5 returned. [12888.483613] XFS (dm-10): xfs_log_force: error 5 returned. [12888.611333] XFS (dm-5): xfs_log_force: error 5 returned. [12888.611336] XFS (dm-12): xfs_log_force: error 5 returned. [12888.611344] XFS (dm-11): xfs_log_force: error 5 returned. [12890.016269] XFS (dm-8): xfs_log_force: error 5 returned. [12918.498074] XFS (dm-4): xfs_log_force: error 5 returned. [12918.498077] XFS (dm-6): xfs_log_force: error 5 returned. [12918.498079] XFS (dm-10): xfs_log_force: error 5 returned. [12918.625789] XFS (dm-5): xfs_log_force: error 5 returned. [12918.625792] XFS (dm-12): xfs_log_force: error 5 returned. [12918.625825] XFS (dm-11): xfs_log_force: error 5 returned. [12920.030724] XFS (dm-8): xfs_log_force: error 5 returned. [12948.512529] XFS (dm-4): xfs_log_force: error 5 returned. [12948.512532] XFS (dm-6): xfs_log_force: error 5 returned. [12948.512534] XFS (dm-10): xfs_log_force: error 5 returned. [12948.640255] XFS (dm-12): xfs_log_force: error 5 returned. [12948.640257] XFS (dm-5): xfs_log_force: error 5 returned. [12948.640290] XFS (dm-11): xfs_log_force: error 5 returned. [12950.045188] XFS (dm-8): xfs_log_force: error 5 returned. [12978.526990] XFS (dm-4): xfs_log_force: error 5 returned. [12978.526992] XFS (dm-6): xfs_log_force: error 5 returned. [12978.526994] XFS (dm-10): xfs_log_force: error 5 returned. [12978.654709] XFS (dm-12): xfs_log_force: error 5 returned. [12978.654711] XFS (dm-5): xfs_log_force: error 5 returned. [12978.654768] XFS (dm-11): xfs_log_force: error 5 returned. [12980.059641] XFS (dm-8): xfs_log_force: error 5 returned. [13008.541442] XFS (dm-4): xfs_log_force: error 5 returned. [13008.541445] XFS (dm-6): xfs_log_force: error 5 returned. [13008.541447] XFS (dm-10): xfs_log_force: error 5 returned. [13008.669167] XFS (dm-12): xfs_log_force: error 5 returned. [13008.669169] XFS (dm-5): xfs_log_force: error 5 returned. [13008.669178] XFS (dm-11): xfs_log_force: error 5 returned. [13010.074097] XFS (dm-8): xfs_log_force: error 5 returned. [13038.555900] XFS (dm-4): xfs_log_force: error 5 returned. [13038.555902] XFS (dm-6): xfs_log_force: error 5 returned. [13038.555904] XFS (dm-10): xfs_log_force: error 5 returned. [13038.683624] XFS (dm-5): xfs_log_force: error 5 returned. [13038.683627] XFS (dm-12): xfs_log_force: error 5 returned. [13038.683707] XFS (dm-11): xfs_log_force: error 5 returned. [13040.088560] XFS (dm-8): xfs_log_force: error 5 returned. [13068.570364] XFS (dm-4): xfs_log_force: error 5 returned. [13068.570366] XFS (dm-6): xfs_log_force: error 5 returned. [13068.570368] XFS (dm-10): xfs_log_force: error 5 returned. [13068.698079] XFS (dm-5): xfs_log_force: error 5 returned. [13068.698082] XFS (dm-12): xfs_log_force: error 5 returned. [13068.698118] XFS (dm-11): xfs_log_force: error 5 returned. [13070.103014] XFS (dm-8): xfs_log_force: error 5 returned. [13098.584818] XFS (dm-4): xfs_log_force: error 5 returned. [13098.584820] XFS (dm-6): xfs_log_force: error 5 returned. [13098.584822] XFS (dm-10): xfs_log_force: error 5 returned. [13098.712543] XFS (dm-12): xfs_log_force: error 5 returned. [13098.712545] XFS (dm-5): xfs_log_force: error 5 returned. [13098.712547] XFS (dm-11): xfs_log_force: error 5 returned. [13100.117474] XFS (dm-8): xfs_log_force: error 5 returned. [13128.599279] XFS (dm-4): xfs_log_force: error 5 returned. [13128.599281] XFS (dm-6): xfs_log_force: error 5 returned. [13128.599283] XFS (dm-10): xfs_log_force: error 5 returned. [13128.726996] XFS (dm-12): xfs_log_force: error 5 returned. [13128.726999] XFS (dm-5): xfs_log_force: error 5 returned. [13128.727015] XFS (dm-11): xfs_log_force: error 5 returned. [13130.131930] XFS (dm-8): xfs_log_force: error 5 returned. [13158.613730] XFS (dm-4): xfs_log_force: error 5 returned. [13158.613733] XFS (dm-6): xfs_log_force: error 5 returned. [13158.613734] XFS (dm-10): xfs_log_force: error 5 returned. [13158.741456] XFS (dm-12): xfs_log_force: error 5 returned. [13158.741458] XFS (dm-5): xfs_log_force: error 5 returned. [13158.741483] XFS (dm-11): xfs_log_force: error 5 returned. [13160.146390] XFS (dm-8): xfs_log_force: error 5 returned. [13188.628191] XFS (dm-4): xfs_log_force: error 5 returned. [13188.628195] XFS (dm-6): xfs_log_force: error 5 returned. [13188.628197] XFS (dm-10): xfs_log_force: error 5 returned. [13188.755912] XFS (dm-5): xfs_log_force: error 5 returned. [13188.755919] XFS (dm-12): xfs_log_force: error 5 returned. [13188.755935] XFS (dm-11): xfs_log_force: error 5 returned. [13190.160846] XFS (dm-8): xfs_log_force: error 5 returned. [13218.642653] XFS (dm-4): xfs_log_force: error 5 returned. [13218.642656] XFS (dm-6): xfs_log_force: error 5 returned. [13218.642658] XFS (dm-10): xfs_log_force: error 5 returned. [13218.770368] XFS (dm-5): xfs_log_force: error 5 returned. [13218.770378] XFS (dm-12): xfs_log_force: error 5 returned. [13218.770413] XFS (dm-11): xfs_log_force: error 5 returned. [13220.175303] XFS (dm-8): xfs_log_force: error 5 returned. [13248.657114] XFS (dm-4): xfs_log_force: error 5 returned. [13248.657116] XFS (dm-6): xfs_log_force: error 5 returned. [13248.657118] XFS (dm-10): xfs_log_force: error 5 returned. [13248.784830] XFS (dm-12): xfs_log_force: error 5 returned. [13248.784838] XFS (dm-5): xfs_log_force: error 5 returned. [13248.784872] XFS (dm-11): xfs_log_force: error 5 returned. [13250.189765] XFS (dm-8): xfs_log_force: error 5 returned. [13278.671569] XFS (dm-4): xfs_log_force: error 5 returned. [13278.671572] XFS (dm-6): xfs_log_force: error 5 returned. [13278.671574] XFS (dm-10): xfs_log_force: error 5 returned. [13278.799286] XFS (dm-12): xfs_log_force: error 5 returned. [13278.799288] XFS (dm-5): xfs_log_force: error 5 returned. [13278.799305] XFS (dm-11): xfs_log_force: error 5 returned. [13280.204216] XFS (dm-8): xfs_log_force: error 5 returned. [13308.686020] XFS (dm-4): xfs_log_force: error 5 returned. [13308.686022] XFS (dm-6): xfs_log_force: error 5 returned. [13308.686024] XFS (dm-10): xfs_log_force: error 5 returned. [13308.813745] XFS (dm-12): xfs_log_force: error 5 returned. [13308.813747] XFS (dm-5): xfs_log_force: error 5 returned. [13308.813810] XFS (dm-11): xfs_log_force: error 5 returned. [13310.218673] XFS (dm-8): xfs_log_force: error 5 returned. [13338.700477] XFS (dm-4): xfs_log_force: error 5 returned. [13338.700480] XFS (dm-6): xfs_log_force: error 5 returned. [13338.700482] XFS (dm-10): xfs_log_force: error 5 returned. [13338.828201] XFS (dm-5): xfs_log_force: error 5 returned. [13338.828203] XFS (dm-12): xfs_log_force: error 5 returned. [13338.828247] XFS (dm-11): xfs_log_force: error 5 returned. [13340.233139] XFS (dm-8): xfs_log_force: error 5 returned. [13368.714947] XFS (dm-4): xfs_log_force: error 5 returned. [13368.714950] XFS (dm-6): xfs_log_force: error 5 returned. [13368.714952] XFS (dm-10): xfs_log_force: error 5 returned. [13368.842657] XFS (dm-12): xfs_log_force: error 5 returned. [13368.842659] XFS (dm-5): xfs_log_force: error 5 returned. [13368.842761] XFS (dm-11): xfs_log_force: error 5 returned. [13370.247592] XFS (dm-8): xfs_log_force: error 5 returned. [13398.729394] XFS (dm-4): xfs_log_force: error 5 returned. [13398.729397] XFS (dm-6): xfs_log_force: error 5 returned. [13398.729399] XFS (dm-10): xfs_log_force: error 5 returned. [13398.857119] XFS (dm-12): xfs_log_force: error 5 returned. [13398.857121] XFS (dm-5): xfs_log_force: error 5 returned. [13398.857189] XFS (dm-11): xfs_log_force: error 5 returned. [13400.262047] XFS (dm-8): xfs_log_force: error 5 returned. [13428.743854] XFS (dm-4): xfs_log_force: error 5 returned. [13428.743857] XFS (dm-6): xfs_log_force: error 5 returned. [13428.743858] XFS (dm-10): xfs_log_force: error 5 returned. [13428.871572] XFS (dm-5): xfs_log_force: error 5 returned. [13428.871575] XFS (dm-12): xfs_log_force: error 5 returned. [13428.871685] XFS (dm-11): xfs_log_force: error 5 returned. [13430.276507] XFS (dm-8): xfs_log_force: error 5 returned. [13458.758306] XFS (dm-4): xfs_log_force: error 5 returned. [13458.758309] XFS (dm-6): xfs_log_force: error 5 returned. [13458.758311] XFS (dm-10): xfs_log_force: error 5 returned. [13458.886030] XFS (dm-12): xfs_log_force: error 5 returned. [13458.886033] XFS (dm-5): xfs_log_force: error 5 returned. [13458.886132] XFS (dm-11): xfs_log_force: error 5 returned. [13460.290960] XFS (dm-8): xfs_log_force: error 5 returned. [13488.772763] XFS (dm-4): xfs_log_force: error 5 returned. [13488.772766] XFS (dm-6): xfs_log_force: error 5 returned. [13488.772768] XFS (dm-10): xfs_log_force: error 5 returned. [13488.900488] XFS (dm-12): xfs_log_force: error 5 returned. [13488.900490] XFS (dm-5): xfs_log_force: error 5 returned. [13488.900619] XFS (dm-11): xfs_log_force: error 5 returned. [13490.305424] XFS (dm-8): xfs_log_force: error 5 returned. [13518.787228] XFS (dm-4): xfs_log_force: error 5 returned. [13518.787231] XFS (dm-6): xfs_log_force: error 5 returned. [13518.787232] XFS (dm-10): xfs_log_force: error 5 returned. [13518.914943] XFS (dm-5): xfs_log_force: error 5 returned. [13518.914946] XFS (dm-12): xfs_log_force: error 5 returned. [13518.915075] XFS (dm-11): xfs_log_force: error 5 returned. [13520.319879] XFS (dm-8): xfs_log_force: error 5 returned. [13548.801682] XFS (dm-4): xfs_log_force: error 5 returned. [13548.801685] XFS (dm-6): xfs_log_force: error 5 returned. [13548.801687] XFS (dm-10): xfs_log_force: error 5 returned. [13548.929407] XFS (dm-12): xfs_log_force: error 5 returned. [13548.929410] XFS (dm-5): xfs_log_force: error 5 returned. [13548.929559] XFS (dm-11): xfs_log_force: error 5 returned. [13550.334333] XFS (dm-8): xfs_log_force: error 5 returned. [13578.816143] XFS (dm-4): xfs_log_force: error 5 returned. [13578.816146] XFS (dm-6): xfs_log_force: error 5 returned. [13578.816147] XFS (dm-10): xfs_log_force: error 5 returned. [13578.943861] XFS (dm-12): xfs_log_force: error 5 returned. [13578.943863] XFS (dm-5): xfs_log_force: error 5 returned. [13578.943929] XFS (dm-11): xfs_log_force: error 5 returned. [13580.348796] XFS (dm-8): xfs_log_force: error 5 returned. [13608.830595] XFS (dm-4): xfs_log_force: error 5 returned. [13608.830598] XFS (dm-6): xfs_log_force: error 5 returned. [13608.830599] XFS (dm-10): xfs_log_force: error 5 returned. [13608.958318] XFS (dm-12): xfs_log_force: error 5 returned. [13608.958322] XFS (dm-5): xfs_log_force: error 5 returned. [13608.958495] XFS (dm-11): xfs_log_force: error 5 returned. [13610.363254] XFS (dm-8): xfs_log_force: error 5 returned. [13638.845053] XFS (dm-4): xfs_log_force: error 5 returned. [13638.845056] XFS (dm-6): xfs_log_force: error 5 returned. [13638.845058] XFS (dm-10): xfs_log_force: error 5 returned. [13638.972778] XFS (dm-5): xfs_log_force: error 5 returned. [13638.972780] XFS (dm-12): xfs_log_force: error 5 returned. [13638.972784] XFS (dm-11): xfs_log_force: error 5 returned. [13640.377715] XFS (dm-8): xfs_log_force: error 5 returned. [13668.859524] XFS (dm-4): xfs_log_force: error 5 returned. [13668.859526] XFS (dm-6): xfs_log_force: error 5 returned. [13668.859528] XFS (dm-10): xfs_log_force: error 5 returned. [13668.987234] XFS (dm-12): xfs_log_force: error 5 returned. [13668.987236] XFS (dm-5): xfs_log_force: error 5 returned. [13668.987257] XFS (dm-11): xfs_log_force: error 5 returned. [13670.392168] XFS (dm-8): xfs_log_force: error 5 returned. [13698.873972] XFS (dm-4): xfs_log_force: error 5 returned. [13698.873975] XFS (dm-6): xfs_log_force: error 5 returned. [13698.873977] XFS (dm-10): xfs_log_force: error 5 returned. [13699.001697] XFS (dm-12): xfs_log_force: error 5 returned. [13699.001699] XFS (dm-5): xfs_log_force: error 5 returned. [13699.001721] XFS (dm-11): xfs_log_force: error 5 returned. [13700.406631] XFS (dm-8): xfs_log_force: error 5 returned. [13728.888433] XFS (dm-4): xfs_log_force: error 5 returned. [13728.888436] XFS (dm-6): xfs_log_force: error 5 returned. [13728.888437] XFS (dm-10): xfs_log_force: error 5 returned. [13729.016152] XFS (dm-12): xfs_log_force: error 5 returned. [13729.016154] XFS (dm-5): xfs_log_force: error 5 returned. [13729.016189] XFS (dm-11): xfs_log_force: error 5 returned. [13730.421083] XFS (dm-8): xfs_log_force: error 5 returned. [13758.902885] XFS (dm-4): xfs_log_force: error 5 returned. [13758.902888] XFS (dm-6): xfs_log_force: error 5 returned. [13758.902890] XFS (dm-10): xfs_log_force: error 5 returned. [13759.030611] XFS (dm-12): xfs_log_force: error 5 returned. [13759.030613] XFS (dm-5): xfs_log_force: error 5 returned. [13759.030618] XFS (dm-11): xfs_log_force: error 5 returned. [13760.435541] XFS (dm-8): xfs_log_force: error 5 returned. [13788.917344] XFS (dm-4): xfs_log_force: error 5 returned. [13788.917346] XFS (dm-6): xfs_log_force: error 5 returned. [13788.917348] XFS (dm-10): xfs_log_force: error 5 returned. [13789.045068] XFS (dm-5): xfs_log_force: error 5 returned. [13789.045071] XFS (dm-12): xfs_log_force: error 5 returned. [13789.045126] XFS (dm-11): xfs_log_force: error 5 returned. [13790.450005] XFS (dm-8): xfs_log_force: error 5 returned. [13818.931815] XFS (dm-4): xfs_log_force: error 5 returned. [13818.931818] XFS (dm-6): xfs_log_force: error 5 returned. [13818.931820] XFS (dm-10): xfs_log_force: error 5 returned. [13819.059526] XFS (dm-12): xfs_log_force: error 5 returned. [13819.059528] XFS (dm-5): xfs_log_force: error 5 returned. [13819.059564] XFS (dm-11): xfs_log_force: error 5 returned. [13820.464460] XFS (dm-8): xfs_log_force: error 5 returned. [13848.946267] XFS (dm-4): xfs_log_force: error 5 returned. [13848.946269] XFS (dm-6): xfs_log_force: error 5 returned. [13848.946271] XFS (dm-10): xfs_log_force: error 5 returned. [13849.073991] XFS (dm-12): xfs_log_force: error 5 returned. [13849.073994] XFS (dm-5): xfs_log_force: error 5 returned. [13849.074066] XFS (dm-11): xfs_log_force: error 5 returned. [13850.478923] XFS (dm-8): xfs_log_force: error 5 returned. [13878.960730] XFS (dm-4): xfs_log_force: error 5 returned. [13878.960733] XFS (dm-6): xfs_log_force: error 5 returned. [13878.960735] XFS (dm-10): xfs_log_force: error 5 returned. [13879.088448] XFS (dm-12): xfs_log_force: error 5 returned. [13879.088450] XFS (dm-5): xfs_log_force: error 5 returned. [13879.088515] XFS (dm-11): xfs_log_force: error 5 returned. [13880.493382] XFS (dm-8): xfs_log_force: error 5 returned. [13908.975183] XFS (dm-4): xfs_log_force: error 5 returned. [13908.975185] XFS (dm-6): xfs_log_force: error 5 returned. [13908.975187] XFS (dm-10): xfs_log_force: error 5 returned. [13909.102909] XFS (dm-12): xfs_log_force: error 5 returned. [13909.102911] XFS (dm-5): xfs_log_force: error 5 returned. [13909.102923] XFS (dm-11): xfs_log_force: error 5 returned. [13910.507838] XFS (dm-8): xfs_log_force: error 5 returned. [13938.989642] XFS (dm-4): xfs_log_force: error 5 returned. [13938.989645] XFS (dm-6): xfs_log_force: error 5 returned. [13938.989647] XFS (dm-10): xfs_log_force: error 5 returned. [13939.117366] XFS (dm-5): xfs_log_force: error 5 returned. [13939.117369] XFS (dm-12): xfs_log_force: error 5 returned. [13939.117372] XFS (dm-11): xfs_log_force: error 5 returned. [13940.522300] XFS (dm-8): xfs_log_force: error 5 returned. [13969.004108] XFS (dm-4): xfs_log_force: error 5 returned. [13969.004110] XFS (dm-6): xfs_log_force: error 5 returned. [13969.004112] XFS (dm-10): xfs_log_force: error 5 returned. [13969.131823] XFS (dm-5): xfs_log_force: error 5 returned. [13969.131826] XFS (dm-12): xfs_log_force: error 5 returned. [13969.131847] XFS (dm-11): xfs_log_force: error 5 returned. [13970.536758] XFS (dm-8): xfs_log_force: error 5 returned. [13999.018563] XFS (dm-4): xfs_log_force: error 5 returned. [13999.018565] XFS (dm-6): xfs_log_force: error 5 returned. [13999.018567] XFS (dm-10): xfs_log_force: error 5 returned. [13999.146285] XFS (dm-12): xfs_log_force: error 5 returned. [13999.146288] XFS (dm-5): xfs_log_force: error 5 returned. [13999.146323] XFS (dm-11): xfs_log_force: error 5 returned. [14000.551221] XFS (dm-8): xfs_log_force: error 5 returned. [14029.033024] XFS (dm-4): xfs_log_force: error 5 returned. [14029.033026] XFS (dm-6): xfs_log_force: error 5 returned. [14029.033028] XFS (dm-10): xfs_log_force: error 5 returned. [14029.160742] XFS (dm-12): xfs_log_force: error 5 returned. [14029.160745] XFS (dm-5): xfs_log_force: error 5 returned. [14029.160761] XFS (dm-11): xfs_log_force: error 5 returned. [14030.565673] XFS (dm-8): xfs_log_force: error 5 returned. [14059.047480] XFS (dm-4): xfs_log_force: error 5 returned. [14059.047483] XFS (dm-6): xfs_log_force: error 5 returned. [14059.047486] XFS (dm-10): xfs_log_force: error 5 returned. [14059.175203] XFS (dm-12): xfs_log_force: error 5 returned. [14059.175206] XFS (dm-5): xfs_log_force: error 5 returned. [14059.175273] XFS (dm-11): xfs_log_force: error 5 returned. [14060.580132] XFS (dm-8): xfs_log_force: error 5 returned. [14089.061936] XFS (dm-4): xfs_log_force: error 5 returned. [14089.061939] XFS (dm-6): xfs_log_force: error 5 returned. [14089.061941] XFS (dm-10): xfs_log_force: error 5 returned. [14089.189660] XFS (dm-12): xfs_log_force: error 5 returned. [14089.189662] XFS (dm-5): xfs_log_force: error 5 returned. [14089.189716] XFS (dm-11): xfs_log_force: error 5 returned. [14090.594597] XFS (dm-8): xfs_log_force: error 5 returned. [14119.076400] XFS (dm-4): xfs_log_force: error 5 returned. [14119.076402] XFS (dm-6): xfs_log_force: error 5 returned. [14119.076404] XFS (dm-10): xfs_log_force: error 5 returned. [14119.204115] XFS (dm-5): xfs_log_force: error 5 returned. [14119.204118] XFS (dm-12): xfs_log_force: error 5 returned. [14119.204212] XFS (dm-11): xfs_log_force: error 5 returned. [14120.609051] XFS (dm-8): xfs_log_force: error 5 returned. [14149.090854] XFS (dm-4): xfs_log_force: error 5 returned. [14149.090857] XFS (dm-6): xfs_log_force: error 5 returned. [14149.090859] XFS (dm-10): xfs_log_force: error 5 returned. [14149.218579] XFS (dm-12): xfs_log_force: error 5 returned. [14149.218582] XFS (dm-11): xfs_log_force: error 5 returned. [14149.218584] XFS (dm-5): xfs_log_force: error 5 returned. [14150.623507] XFS (dm-8): xfs_log_force: error 5 returned. [14179.105317] XFS (dm-4): xfs_log_force: error 5 returned. [14179.105320] XFS (dm-6): xfs_log_force: error 5 returned. [14179.105322] XFS (dm-10): xfs_log_force: error 5 returned. [14179.233034] XFS (dm-12): xfs_log_force: error 5 returned. [14179.233036] XFS (dm-5): xfs_log_force: error 5 returned. [14179.233044] XFS (dm-11): xfs_log_force: error 5 returned. [14180.637968] XFS (dm-8): xfs_log_force: error 5 returned. [14209.119768] XFS (dm-4): xfs_log_force: error 5 returned. [14209.119770] XFS (dm-6): xfs_log_force: error 5 returned. [14209.119772] XFS (dm-10): xfs_log_force: error 5 returned. [14209.247492] XFS (dm-12): xfs_log_force: error 5 returned. [14209.247495] XFS (dm-5): xfs_log_force: error 5 returned. [14209.247520] XFS (dm-11): xfs_log_force: error 5 returned. [14210.652422] XFS (dm-8): xfs_log_force: error 5 returned. [14239.134226] XFS (dm-4): xfs_log_force: error 5 returned. [14239.134229] XFS (dm-6): xfs_log_force: error 5 returned. [14239.134231] XFS (dm-10): xfs_log_force: error 5 returned. [14239.261950] XFS (dm-5): xfs_log_force: error 5 returned. [14239.261953] XFS (dm-12): xfs_log_force: error 5 returned. [14239.261984] XFS (dm-11): xfs_log_force: error 5 returned. [14240.666886] XFS (dm-8): xfs_log_force: error 5 returned. [14269.148698] XFS (dm-4): xfs_log_force: error 5 returned. [14269.148702] XFS (dm-6): xfs_log_force: error 5 returned. [14269.148704] XFS (dm-10): xfs_log_force: error 5 returned. [14269.276407] XFS (dm-12): xfs_log_force: error 5 returned. [14269.276410] XFS (dm-5): xfs_log_force: error 5 returned. [14269.276453] XFS (dm-11): xfs_log_force: error 5 returned. [14270.681342] XFS (dm-8): xfs_log_force: error 5 returned. [14299.163152] XFS (dm-4): xfs_log_force: error 5 returned. [14299.163155] XFS (dm-6): xfs_log_force: error 5 returned. [14299.163157] XFS (dm-10): xfs_log_force: error 5 returned. [14299.290871] XFS (dm-12): xfs_log_force: error 5 returned. [14299.290878] XFS (dm-5): xfs_log_force: error 5 returned. [14299.290890] XFS (dm-11): xfs_log_force: error 5 returned. [14300.695797] XFS (dm-8): xfs_log_force: error 5 returned. [14329.177608] XFS (dm-4): xfs_log_force: error 5 returned. [14329.177610] XFS (dm-6): xfs_log_force: error 5 returned. [14329.177612] XFS (dm-10): xfs_log_force: error 5 returned. [14329.305326] XFS (dm-12): xfs_log_force: error 5 returned. [14329.305328] XFS (dm-5): xfs_log_force: error 5 returned. [14329.305398] XFS (dm-11): xfs_log_force: error 5 returned. [14330.710260] XFS (dm-8): xfs_log_force: error 5 returned. [14359.192061] XFS (dm-4): xfs_log_force: error 5 returned. [14359.192064] XFS (dm-6): xfs_log_force: error 5 returned. [14359.192066] XFS (dm-10): xfs_log_force: error 5 returned. [14359.319783] XFS (dm-12): xfs_log_force: error 5 returned. [14359.319787] XFS (dm-5): xfs_log_force: error 5 returned. [14359.319790] XFS (dm-11): xfs_log_force: error 5 returned. [14360.724718] XFS (dm-8): xfs_log_force: error 5 returned. [14389.206519] XFS (dm-4): xfs_log_force: error 5 returned. [14389.206522] XFS (dm-6): xfs_log_force: error 5 returned. [14389.206524] XFS (dm-10): xfs_log_force: error 5 returned. [14389.334242] XFS (dm-5): xfs_log_force: error 5 returned. [14389.334245] XFS (dm-12): xfs_log_force: error 5 returned. [14389.334254] XFS (dm-11): xfs_log_force: error 5 returned. [14390.739179] XFS (dm-8): xfs_log_force: error 5 returned. [14419.220982] XFS (dm-4): xfs_log_force: error 5 returned. [14419.220984] XFS (dm-6): xfs_log_force: error 5 returned. [14419.220986] XFS (dm-10): xfs_log_force: error 5 returned. [14419.348697] XFS (dm-5): xfs_log_force: error 5 returned. [14419.348699] XFS (dm-12): xfs_log_force: error 5 returned. [14419.348732] XFS (dm-11): xfs_log_force: error 5 returned. [14420.753632] XFS (dm-8): xfs_log_force: error 5 returned. [14449.235440] XFS (dm-4): xfs_log_force: error 5 returned. [14449.235442] XFS (dm-6): xfs_log_force: error 5 returned. [14449.235445] XFS (dm-10): xfs_log_force: error 5 returned. [14449.363159] XFS (dm-12): xfs_log_force: error 5 returned. [14449.363165] XFS (dm-5): xfs_log_force: error 5 returned. [14449.363205] XFS (dm-11): xfs_log_force: error 5 returned. [14450.768094] XFS (dm-8): xfs_log_force: error 5 returned. [14479.249893] XFS (dm-4): xfs_log_force: error 5 returned. [14479.249896] XFS (dm-6): xfs_log_force: error 5 returned. [14479.249898] XFS (dm-10): xfs_log_force: error 5 returned. [14479.377612] XFS (dm-12): xfs_log_force: error 5 returned. [14479.377614] XFS (dm-5): xfs_log_force: error 5 returned. [14479.377665] XFS (dm-11): xfs_log_force: error 5 returned. [14480.782551] XFS (dm-8): xfs_log_force: error 5 returned. [14509.264344] XFS (dm-4): xfs_log_force: error 5 returned. [14509.264347] XFS (dm-6): xfs_log_force: error 5 returned. [14509.264349] XFS (dm-10): xfs_log_force: error 5 returned. [14509.392069] XFS (dm-12): xfs_log_force: error 5 returned. [14509.392071] XFS (dm-5): xfs_log_force: error 5 returned. [14509.392079] XFS (dm-11): xfs_log_force: error 5 returned. [14510.796998] XFS (dm-8): xfs_log_force: error 5 returned. [14539.278801] XFS (dm-4): xfs_log_force: error 5 returned. [14539.278804] XFS (dm-6): xfs_log_force: error 5 returned. [14539.278806] XFS (dm-10): xfs_log_force: error 5 returned. [14539.406524] XFS (dm-5): xfs_log_force: error 5 returned. [14539.406528] XFS (dm-12): xfs_log_force: error 5 returned. [14539.406606] XFS (dm-11): xfs_log_force: error 5 returned. [14540.811461] XFS (dm-8): xfs_log_force: error 5 returned. [14569.293264] XFS (dm-4): xfs_log_force: error 5 returned. [14569.293267] XFS (dm-6): xfs_log_force: error 5 returned. [14569.293269] XFS (dm-10): xfs_log_force: error 5 returned. [14569.420980] XFS (dm-5): xfs_log_force: error 5 returned. [14569.420982] XFS (dm-12): xfs_log_force: error 5 returned. [14569.421020] XFS (dm-11): xfs_log_force: error 5 returned. [14570.825915] XFS (dm-8): xfs_log_force: error 5 returned. [14599.307725] XFS (dm-4): xfs_log_force: error 5 returned. [14599.307728] XFS (dm-6): xfs_log_force: error 5 returned. [14599.307729] XFS (dm-10): xfs_log_force: error 5 returned. [14599.435443] XFS (dm-12): xfs_log_force: error 5 returned. [14599.435450] XFS (dm-5): xfs_log_force: error 5 returned. [14599.435548] XFS (dm-11): xfs_log_force: error 5 returned. [14600.840375] XFS (dm-8): xfs_log_force: error 5 returned. [14629.322179] XFS (dm-4): xfs_log_force: error 5 returned. [14629.322182] XFS (dm-6): xfs_log_force: error 5 returned. [14629.322184] XFS (dm-10): xfs_log_force: error 5 returned. [14629.449897] XFS (dm-12): xfs_log_force: error 5 returned. [14629.449900] XFS (dm-5): xfs_log_force: error 5 returned. [14629.449966] XFS (dm-11): xfs_log_force: error 5 returned. [14630.854831] XFS (dm-8): xfs_log_force: error 5 returned. [14659.336632] XFS (dm-4): xfs_log_force: error 5 returned. [14659.336634] XFS (dm-6): xfs_log_force: error 5 returned. [14659.336636] XFS (dm-10): xfs_log_force: error 5 returned. [14659.464357] XFS (dm-12): xfs_log_force: error 5 returned. [14659.464359] XFS (dm-5): xfs_log_force: error 5 returned. [14659.464527] XFS (dm-11): xfs_log_force: error 5 returned. [14660.869290] XFS (dm-8): xfs_log_force: error 5 returned. [14689.351091] XFS (dm-4): xfs_log_force: error 5 returned. [14689.351093] XFS (dm-6): xfs_log_force: error 5 returned. [14689.351095] XFS (dm-10): xfs_log_force: error 5 returned. [14689.478815] XFS (dm-5): xfs_log_force: error 5 returned. [14689.478818] XFS (dm-12): xfs_log_force: error 5 returned. [14689.478823] XFS (dm-11): xfs_log_force: error 5 returned. [14690.883748] XFS (dm-8): xfs_log_force: error 5 returned. [14719.365563] XFS (dm-4): xfs_log_force: error 5 returned. [14719.365566] XFS (dm-6): xfs_log_force: error 5 returned. [14719.365568] XFS (dm-10): xfs_log_force: error 5 returned. [14719.493273] XFS (dm-12): xfs_log_force: error 5 returned. [14719.493275] XFS (dm-5): xfs_log_force: error 5 returned. [14719.493285] XFS (dm-11): xfs_log_force: error 5 returned. [14720.898207] XFS (dm-8): xfs_log_force: error 5 returned. [14749.380019] XFS (dm-4): xfs_log_force: error 5 returned. [14749.380021] XFS (dm-6): xfs_log_force: error 5 returned. [14749.380023] XFS (dm-10): xfs_log_force: error 5 returned. [14749.507735] XFS (dm-12): xfs_log_force: error 5 returned. [14749.507743] XFS (dm-5): xfs_log_force: error 5 returned. [14749.507755] XFS (dm-11): xfs_log_force: error 5 returned. [14750.912671] XFS (dm-8): xfs_log_force: error 5 returned. [14779.394473] XFS (dm-4): xfs_log_force: error 5 returned. [14779.394476] XFS (dm-6): xfs_log_force: error 5 returned. [14779.394478] XFS (dm-10): xfs_log_force: error 5 returned. [14779.522193] XFS (dm-12): xfs_log_force: error 5 returned. [14779.522199] XFS (dm-5): xfs_log_force: error 5 returned. [14779.522210] XFS (dm-11): xfs_log_force: error 5 returned. [14780.927123] XFS (dm-8): xfs_log_force: error 5 returned. [14809.408927] XFS (dm-4): xfs_log_force: error 5 returned. [14809.408930] XFS (dm-6): xfs_log_force: error 5 returned. [14809.408932] XFS (dm-10): xfs_log_force: error 5 returned. [14809.536653] XFS (dm-12): xfs_log_force: error 5 returned. [14809.536655] XFS (dm-5): xfs_log_force: error 5 returned. [14809.536703] XFS (dm-11): xfs_log_force: error 5 returned. [14810.941582] XFS (dm-8): xfs_log_force: error 5 returned. [14839.423386] XFS (dm-4): xfs_log_force: error 5 returned. [14839.423389] XFS (dm-6): xfs_log_force: error 5 returned. [14839.423390] XFS (dm-10): xfs_log_force: error 5 returned. [14839.551110] XFS (dm-12): xfs_log_force: error 5 returned. [14839.551112] XFS (dm-5): xfs_log_force: error 5 returned. [14839.551156] XFS (dm-11): xfs_log_force: error 5 returned. [14840.956047] XFS (dm-8): xfs_log_force: error 5 returned. [14869.437858] XFS (dm-4): xfs_log_force: error 5 returned. [14869.437860] XFS (dm-6): xfs_log_force: error 5 returned. [14869.437862] XFS (dm-10): xfs_log_force: error 5 returned. [14869.565568] XFS (dm-12): xfs_log_force: error 5 returned. [14869.565570] XFS (dm-5): xfs_log_force: error 5 returned. [14869.565631] XFS (dm-11): xfs_log_force: error 5 returned. [14870.970502] XFS (dm-8): xfs_log_force: error 5 returned. [14899.452314] XFS (dm-4): xfs_log_force: error 5 returned. [14899.452317] XFS (dm-6): xfs_log_force: error 5 returned. [14899.452319] XFS (dm-10): xfs_log_force: error 5 returned. [14899.580032] XFS (dm-12): xfs_log_force: error 5 returned. [14899.580039] XFS (dm-5): xfs_log_force: error 5 returned. [14899.580099] XFS (dm-11): xfs_log_force: error 5 returned. [14900.984960] XFS (dm-8): xfs_log_force: error 5 returned. [14929.466771] XFS (dm-4): xfs_log_force: error 5 returned. [14929.466773] XFS (dm-6): xfs_log_force: error 5 returned. [14929.466775] XFS (dm-10): xfs_log_force: error 5 returned. [14929.594489] XFS (dm-12): xfs_log_force: error 5 returned. [14929.594496] XFS (dm-5): xfs_log_force: error 5 returned. [14929.594580] XFS (dm-11): xfs_log_force: error 5 returned. [14930.999423] XFS (dm-8): xfs_log_force: error 5 returned. [14959.481225] XFS (dm-4): xfs_log_force: error 5 returned. [14959.481228] XFS (dm-6): xfs_log_force: error 5 returned. [14959.481230] XFS (dm-10): xfs_log_force: error 5 returned. [14959.608949] XFS (dm-12): xfs_log_force: error 5 returned. [14959.608952] XFS (dm-5): xfs_log_force: error 5 returned. [14959.609040] XFS (dm-11): xfs_log_force: error 5 returned. [14961.013880] XFS (dm-8): xfs_log_force: error 5 returned. [14989.495685] XFS (dm-4): xfs_log_force: error 5 returned. [14989.495688] XFS (dm-6): xfs_log_force: error 5 returned. [14989.495690] XFS (dm-10): xfs_log_force: error 5 returned. [14989.623409] XFS (dm-5): xfs_log_force: error 5 returned. [14989.623412] XFS (dm-12): xfs_log_force: error 5 returned. [14989.623511] XFS (dm-11): xfs_log_force: error 5 returned. [14991.028345] XFS (dm-8): xfs_log_force: error 5 returned. [15019.510157] XFS (dm-4): xfs_log_force: error 5 returned. [15019.510159] XFS (dm-6): xfs_log_force: error 5 returned. [15019.510161] XFS (dm-10): xfs_log_force: error 5 returned. [15019.637868] XFS (dm-12): xfs_log_force: error 5 returned. [15019.637870] XFS (dm-5): xfs_log_force: error 5 returned. [15019.637978] XFS (dm-11): xfs_log_force: error 5 returned. [15021.042801] XFS (dm-8): xfs_log_force: error 5 returned. [15049.524612] XFS (dm-4): xfs_log_force: error 5 returned. [15049.524615] XFS (dm-6): xfs_log_force: error 5 returned. [15049.524617] XFS (dm-10): xfs_log_force: error 5 returned. [15049.652331] XFS (dm-12): xfs_log_force: error 5 returned. [15049.652337] XFS (dm-5): xfs_log_force: error 5 returned. [15049.652349] XFS (dm-11): xfs_log_force: error 5 returned. [15051.057257] XFS (dm-8): xfs_log_force: error 5 returned. [15079.539067] XFS (dm-4): xfs_log_force: error 5 returned. [15079.539070] XFS (dm-6): xfs_log_force: error 5 returned. [15079.539072] XFS (dm-10): xfs_log_force: error 5 returned. [15079.666786] XFS (dm-12): xfs_log_force: error 5 returned. [15079.666792] XFS (dm-5): xfs_log_force: error 5 returned. [15079.666843] XFS (dm-11): xfs_log_force: error 5 returned. [15081.071720] XFS (dm-8): xfs_log_force: error 5 returned. [15109.553520] XFS (dm-4): xfs_log_force: error 5 returned. [15109.553523] XFS (dm-6): xfs_log_force: error 5 returned. [15109.553525] XFS (dm-10): xfs_log_force: error 5 returned. [15109.681243] XFS (dm-12): xfs_log_force: error 5 returned. [15109.681247] XFS (dm-5): xfs_log_force: error 5 returned. [15109.681294] XFS (dm-11): xfs_log_force: error 5 returned. [15111.086179] XFS (dm-8): xfs_log_force: error 5 returned. [15139.567978] XFS (dm-4): xfs_log_force: error 5 returned. [15139.567981] XFS (dm-6): xfs_log_force: error 5 returned. [15139.567983] XFS (dm-10): xfs_log_force: error 5 returned. [15139.695703] XFS (dm-5): xfs_log_force: error 5 returned. [15139.695705] XFS (dm-12): xfs_log_force: error 5 returned. [15139.695716] XFS (dm-11): xfs_log_force: error 5 returned. [15141.100646] XFS (dm-8): xfs_log_force: error 5 returned. [15169.582442] XFS (dm-4): xfs_log_force: error 5 returned. [15169.582445] XFS (dm-6): xfs_log_force: error 5 returned. [15169.582447] XFS (dm-10): xfs_log_force: error 5 returned. [15169.710158] XFS (dm-5): xfs_log_force: error 5 returned. [15169.710169] XFS (dm-12): xfs_log_force: error 5 returned. [15169.710185] XFS (dm-11): xfs_log_force: error 5 returned. [15171.115093] XFS (dm-8): xfs_log_force: error 5 returned. [15199.596902] XFS (dm-4): xfs_log_force: error 5 returned. [15199.596905] XFS (dm-6): xfs_log_force: error 5 returned. [15199.596907] XFS (dm-10): xfs_log_force: error 5 returned. [15199.724618] XFS (dm-12): xfs_log_force: error 5 returned. [15199.724628] XFS (dm-5): xfs_log_force: error 5 returned. [15199.724665] XFS (dm-11): xfs_log_force: error 5 returned. [15201.129555] XFS (dm-8): xfs_log_force: error 5 returned. [15229.611357] XFS (dm-4): xfs_log_force: error 5 returned. [15229.611360] XFS (dm-6): xfs_log_force: error 5 returned. [15229.611362] XFS (dm-10): xfs_log_force: error 5 returned. [15229.739075] XFS (dm-12): xfs_log_force: error 5 returned. [15229.739082] XFS (dm-11): xfs_log_force: error 5 returned. [15229.739085] XFS (dm-5): xfs_log_force: error 5 returned. [15231.144007] XFS (dm-8): xfs_log_force: error 5 returned. [15259.625809] XFS (dm-4): xfs_log_force: error 5 returned. [15259.625811] XFS (dm-6): xfs_log_force: error 5 returned. [15259.625813] XFS (dm-10): xfs_log_force: error 5 returned. [15259.753534] XFS (dm-12): xfs_log_force: error 5 returned. [15259.753536] XFS (dm-5): xfs_log_force: error 5 returned. [15259.753543] XFS (dm-11): xfs_log_force: error 5 returned. [15261.158463] XFS (dm-8): xfs_log_force: error 5 returned. [15289.640266] XFS (dm-4): xfs_log_force: error 5 returned. [15289.640268] XFS (dm-6): xfs_log_force: error 5 returned. [15289.640270] XFS (dm-10): xfs_log_force: error 5 returned. [15289.767990] XFS (dm-5): xfs_log_force: error 5 returned. [15289.767993] XFS (dm-12): xfs_log_force: error 5 returned. [15289.768017] XFS (dm-11): xfs_log_force: error 5 returned. [15291.172927] XFS (dm-8): xfs_log_force: error 5 returned. [15319.654736] XFS (dm-4): xfs_log_force: error 5 returned. [15319.654739] XFS (dm-6): xfs_log_force: error 5 returned. [15319.654741] XFS (dm-10): xfs_log_force: error 5 returned. [15319.782447] XFS (dm-12): xfs_log_force: error 5 returned. [15319.782450] XFS (dm-5): xfs_log_force: error 5 returned. [15319.782484] XFS (dm-11): xfs_log_force: error 5 returned. [15321.187380] XFS (dm-8): xfs_log_force: error 5 returned. [15349.669189] XFS (dm-4): xfs_log_force: error 5 returned. [15349.669191] XFS (dm-6): xfs_log_force: error 5 returned. [15349.669193] XFS (dm-10): xfs_log_force: error 5 returned. [15349.796907] XFS (dm-12): xfs_log_force: error 5 returned. [15349.796914] XFS (dm-5): xfs_log_force: error 5 returned. [15349.796950] XFS (dm-11): xfs_log_force: error 5 returned. [15351.201840] XFS (dm-8): xfs_log_force: error 5 returned. [15379.683644] XFS (dm-4): xfs_log_force: error 5 returned. [15379.683647] XFS (dm-6): xfs_log_force: error 5 returned. [15379.683649] XFS (dm-10): xfs_log_force: error 5 returned. [15379.811362] XFS (dm-12): xfs_log_force: error 5 returned. [15379.811369] XFS (dm-5): xfs_log_force: error 5 returned. [15379.811425] XFS (dm-11): xfs_log_force: error 5 returned. [15381.216295] XFS (dm-8): xfs_log_force: error 5 returned. [15409.698094] XFS (dm-4): xfs_log_force: error 5 returned. [15409.698097] XFS (dm-6): xfs_log_force: error 5 returned. [15409.698099] XFS (dm-10): xfs_log_force: error 5 returned. [15409.825820] XFS (dm-12): xfs_log_force: error 5 returned. [15409.825822] XFS (dm-5): xfs_log_force: error 5 returned. [15409.825885] XFS (dm-11): xfs_log_force: error 5 returned. [15411.230749] XFS (dm-8): xfs_log_force: error 5 returned. [15439.712552] XFS (dm-4): xfs_log_force: error 5 returned. [15439.712554] XFS (dm-6): xfs_log_force: error 5 returned. [15439.712556] XFS (dm-10): xfs_log_force: error 5 returned. [15439.840276] XFS (dm-5): xfs_log_force: error 5 returned. [15439.840279] XFS (dm-12): xfs_log_force: error 5 returned. [15439.840298] XFS (dm-11): xfs_log_force: error 5 returned. [15441.245209] XFS (dm-8): xfs_log_force: error 5 returned. [15469.727023] XFS (dm-4): xfs_log_force: error 5 returned. [15469.727025] XFS (dm-6): xfs_log_force: error 5 returned. [15469.727027] XFS (dm-10): xfs_log_force: error 5 returned. [15469.854733] XFS (dm-12): xfs_log_force: error 5 returned. [15469.854735] XFS (dm-5): xfs_log_force: error 5 returned. [15469.854778] XFS (dm-11): xfs_log_force: error 5 returned. [15471.259666] XFS (dm-8): xfs_log_force: error 5 returned. [15499.741477] XFS (dm-4): xfs_log_force: error 5 returned. [15499.741480] XFS (dm-6): xfs_log_force: error 5 returned. [15499.741482] XFS (dm-10): xfs_log_force: error 5 returned. [15499.869193] XFS (dm-12): xfs_log_force: error 5 returned. [15499.869201] XFS (dm-5): xfs_log_force: error 5 returned. [15499.869248] XFS (dm-11): xfs_log_force: error 5 returned. [15501.274129] XFS (dm-8): xfs_log_force: error 5 returned. [15529.755931] XFS (dm-4): xfs_log_force: error 5 returned. [15529.755934] XFS (dm-6): xfs_log_force: error 5 returned. [15529.755936] XFS (dm-10): xfs_log_force: error 5 returned. [15529.883650] XFS (dm-12): xfs_log_force: error 5 returned. [15529.883656] XFS (dm-5): xfs_log_force: error 5 returned. [15529.883668] XFS (dm-11): xfs_log_force: error 5 returned. [15531.288580] XFS (dm-8): xfs_log_force: error 5 returned. [15559.770383] XFS (dm-4): xfs_log_force: error 5 returned. [15559.770385] XFS (dm-6): xfs_log_force: error 5 returned. [15559.770387] XFS (dm-10): xfs_log_force: error 5 returned. [15559.898108] XFS (dm-12): xfs_log_force: error 5 returned. [15559.898111] XFS (dm-5): xfs_log_force: error 5 returned. [15559.898174] XFS (dm-11): xfs_log_force: error 5 returned. [15561.303040] XFS (dm-8): xfs_log_force: error 5 returned. [15589.784841] XFS (dm-4): xfs_log_force: error 5 returned. [15589.784843] XFS (dm-6): xfs_log_force: error 5 returned. [15589.784845] XFS (dm-10): xfs_log_force: error 5 returned. [15589.912565] XFS (dm-12): xfs_log_force: error 5 returned. [15589.912567] XFS (dm-5): xfs_log_force: error 5 returned. [15589.912612] XFS (dm-11): xfs_log_force: error 5 returned. [15591.317501] XFS (dm-8): xfs_log_force: error 5 returned. [15619.799305] XFS (dm-4): xfs_log_force: error 5 returned. [15619.799308] XFS (dm-6): xfs_log_force: error 5 returned. [15619.799310] XFS (dm-10): xfs_log_force: error 5 returned. [15619.927021] XFS (dm-5): xfs_log_force: error 5 returned. [15619.927025] XFS (dm-12): xfs_log_force: error 5 returned. [15619.927157] XFS (dm-11): xfs_log_force: error 5 returned. [15621.331957] XFS (dm-8): xfs_log_force: error 5 returned. [15649.813766] XFS (dm-4): xfs_log_force: error 5 returned. [15649.813769] XFS (dm-6): xfs_log_force: error 5 returned. [15649.813771] XFS (dm-10): xfs_log_force: error 5 returned. [15649.941486] XFS (dm-12): xfs_log_force: error 5 returned. [15649.941489] XFS (dm-11): xfs_log_force: error 5 returned. [15649.941491] XFS (dm-5): xfs_log_force: error 5 returned. [15651.346412] XFS (dm-8): xfs_log_force: error 5 returned. [15679.828221] XFS (dm-4): xfs_log_force: error 5 returned. [15679.828224] XFS (dm-6): xfs_log_force: error 5 returned. [15679.828226] XFS (dm-10): xfs_log_force: error 5 returned. [15679.955940] XFS (dm-12): xfs_log_force: error 5 returned. [15679.955943] XFS (dm-11): xfs_log_force: error 5 returned. [15679.955945] XFS (dm-5): xfs_log_force: error 5 returned. [15681.360872] XFS (dm-8): xfs_log_force: error 5 returned. [15709.842673] XFS (dm-4): xfs_log_force: error 5 returned. [15709.842676] XFS (dm-6): xfs_log_force: error 5 returned. [15709.842678] XFS (dm-10): xfs_log_force: error 5 returned. [15709.970397] XFS (dm-12): xfs_log_force: error 5 returned. [15709.970400] XFS (dm-5): xfs_log_force: error 5 returned. [15709.970500] XFS (dm-11): xfs_log_force: error 5 returned. [15711.375330] XFS (dm-8): xfs_log_force: error 5 returned. [15739.857131] XFS (dm-4): xfs_log_force: error 5 returned. [15739.857134] XFS (dm-6): xfs_log_force: error 5 returned. [15739.857136] XFS (dm-10): xfs_log_force: error 5 returned. [15739.984856] XFS (dm-5): xfs_log_force: error 5 returned. [15739.984858] XFS (dm-12): xfs_log_force: error 5 returned. [15739.985032] XFS (dm-11): xfs_log_force: error 5 returned. [15741.389791] XFS (dm-8): xfs_log_force: error 5 returned. [15769.871602] XFS (dm-4): xfs_log_force: error 5 returned. [15769.871605] XFS (dm-6): xfs_log_force: error 5 returned. [15769.871607] XFS (dm-10): xfs_log_force: error 5 returned. [15769.999313] XFS (dm-12): xfs_log_force: error 5 returned. [15769.999315] XFS (dm-5): xfs_log_force: error 5 returned. [15769.999323] XFS (dm-11): xfs_log_force: error 5 returned. [15771.404246] XFS (dm-8): xfs_log_force: error 5 returned. [15799.886055] XFS (dm-4): xfs_log_force: error 5 returned. [15799.886058] XFS (dm-6): xfs_log_force: error 5 returned. [15799.886060] XFS (dm-10): xfs_log_force: error 5 returned. [15800.013775] XFS (dm-12): xfs_log_force: error 5 returned. [15800.013781] XFS (dm-5): xfs_log_force: error 5 returned. [15800.013789] XFS (dm-11): xfs_log_force: error 5 returned. [15801.418701] XFS (dm-8): xfs_log_force: error 5 returned. [15829.900508] XFS (dm-4): xfs_log_force: error 5 returned. [15829.900512] XFS (dm-6): xfs_log_force: error 5 returned. [15829.900515] XFS (dm-10): xfs_log_force: error 5 returned. [15830.028226] XFS (dm-5): xfs_log_force: error 5 returned. [15830.028229] XFS (dm-12): xfs_log_force: error 5 returned. [15830.028235] XFS (dm-11): xfs_log_force: error 5 returned. [15831.433163] XFS (dm-8): xfs_log_force: error 5 returned. [15859.914964] XFS (dm-4): xfs_log_force: error 5 returned. [15859.914968] XFS (dm-6): xfs_log_force: error 5 returned. [15859.914971] XFS (dm-10): xfs_log_force: error 5 returned. [15860.042681] XFS (dm-5): xfs_log_force: error 5 returned. [15860.042684] XFS (dm-12): xfs_log_force: error 5 returned. [15860.042705] XFS (dm-11): xfs_log_force: error 5 returned. [15861.447621] XFS (dm-8): xfs_log_force: error 5 returned. [15889.929419] XFS (dm-4): xfs_log_force: error 5 returned. [15889.929423] XFS (dm-6): xfs_log_force: error 5 returned. [15889.929425] XFS (dm-10): xfs_log_force: error 5 returned. [15890.057138] XFS (dm-5): xfs_log_force: error 5 returned. [15890.057142] XFS (dm-12): xfs_log_force: error 5 returned. [15890.057176] XFS (dm-11): xfs_log_force: error 5 returned. [15891.462075] XFS (dm-8): xfs_log_force: error 5 returned. [15919.943885] XFS (dm-4): xfs_log_force: error 5 returned. [15919.943889] XFS (dm-6): xfs_log_force: error 5 returned. [15919.943892] XFS (dm-10): xfs_log_force: error 5 returned. [15920.071597] XFS (dm-5): xfs_log_force: error 5 returned. [15920.071604] XFS (dm-12): xfs_log_force: error 5 returned. [15920.071646] XFS (dm-11): xfs_log_force: error 5 returned. [15921.476529] XFS (dm-8): xfs_log_force: error 5 returned. [15949.958337] XFS (dm-4): xfs_log_force: error 5 returned. [15949.958340] XFS (dm-6): xfs_log_force: error 5 returned. [15949.958342] XFS (dm-10): xfs_log_force: error 5 returned. [15950.086056] XFS (dm-12): xfs_log_force: error 5 returned. [15950.086061] XFS (dm-5): xfs_log_force: error 5 returned. [15950.086116] XFS (dm-11): xfs_log_force: error 5 returned. [15951.490989] XFS (dm-8): xfs_log_force: error 5 returned. [15979.972790] XFS (dm-4): xfs_log_force: error 5 returned. [15979.972793] XFS (dm-6): xfs_log_force: error 5 returned. [15979.972795] XFS (dm-10): xfs_log_force: error 5 returned. [15980.100510] XFS (dm-12): xfs_log_force: error 5 returned. [15980.100514] XFS (dm-5): xfs_log_force: error 5 returned. [15980.100583] XFS (dm-11): xfs_log_force: error 5 returned. [15981.505441] XFS (dm-8): xfs_log_force: error 5 returned. [16009.987242] XFS (dm-4): xfs_log_force: error 5 returned. [16009.987245] XFS (dm-6): xfs_log_force: error 5 returned. [16009.987247] XFS (dm-10): xfs_log_force: error 5 returned. [16010.114968] XFS (dm-12): xfs_log_force: error 5 returned. [16010.114970] XFS (dm-5): xfs_log_force: error 5 returned. [16010.114977] XFS (dm-11): xfs_log_force: error 5 returned. [16011.519899] XFS (dm-8): xfs_log_force: error 5 returned. [16040.001700] XFS (dm-4): xfs_log_force: error 5 returned. [16040.001702] XFS (dm-6): xfs_log_force: error 5 returned. [16040.001704] XFS (dm-10): xfs_log_force: error 5 returned. [16040.129423] XFS (dm-5): xfs_log_force: error 5 returned. [16040.129425] XFS (dm-11): xfs_log_force: error 5 returned. [16040.129435] XFS (dm-12): xfs_log_force: error 5 returned. [16041.534363] XFS (dm-8): xfs_log_force: error 5 returned. [16070.016172] XFS (dm-4): xfs_log_force: error 5 returned. [16070.016176] XFS (dm-6): xfs_log_force: error 5 returned. [16070.016178] XFS (dm-10): xfs_log_force: error 5 returned. [16070.143883] XFS (dm-12): xfs_log_force: error 5 returned. [16070.143886] XFS (dm-5): xfs_log_force: error 5 returned. [16070.143920] XFS (dm-11): xfs_log_force: error 5 returned. [16071.548814] XFS (dm-8): xfs_log_force: error 5 returned. [16100.030626] XFS (dm-4): xfs_log_force: error 5 returned. [16100.030631] XFS (dm-6): xfs_log_force: error 5 returned. [16100.030634] XFS (dm-10): xfs_log_force: error 5 returned. [16100.158339] XFS (dm-12): xfs_log_force: error 5 returned. [16100.158342] XFS (dm-5): xfs_log_force: error 5 returned. [16100.158345] XFS (dm-11): xfs_log_force: error 5 returned. [16101.563272] XFS (dm-8): xfs_log_force: error 5 returned. [16130.045081] XFS (dm-4): xfs_log_force: error 5 returned. [16130.045086] XFS (dm-6): xfs_log_force: error 5 returned. [16130.045088] XFS (dm-10): xfs_log_force: error 5 returned. [16130.172797] XFS (dm-12): xfs_log_force: error 5 returned. [16130.172806] XFS (dm-11): xfs_log_force: error 5 returned. [16130.172808] XFS (dm-5): xfs_log_force: error 5 returned. [16131.577730] XFS (dm-8): xfs_log_force: error 5 returned. [16160.059534] XFS (dm-4): xfs_log_force: error 5 returned. [16160.059538] XFS (dm-6): xfs_log_force: error 5 returned. [16160.059541] XFS (dm-10): xfs_log_force: error 5 returned. [16160.187255] XFS (dm-12): xfs_log_force: error 5 returned. [16160.187258] XFS (dm-5): xfs_log_force: error 5 returned. [16160.187389] XFS (dm-11): xfs_log_force: error 5 returned. [16161.592187] XFS (dm-8): xfs_log_force: error 5 returned. [16190.073992] XFS (dm-4): xfs_log_force: error 5 returned. [16190.073996] XFS (dm-6): xfs_log_force: error 5 returned. [16190.073999] XFS (dm-10): xfs_log_force: error 5 returned. [16190.201713] XFS (dm-5): xfs_log_force: error 5 returned. [16190.201719] XFS (dm-12): xfs_log_force: error 5 returned. [16190.201736] XFS (dm-11): xfs_log_force: error 5 returned. [16191.606647] XFS (dm-8): xfs_log_force: error 5 returned. [16220.088459] XFS (dm-4): xfs_log_force: error 5 returned. [16220.088462] XFS (dm-6): xfs_log_force: error 5 returned. [16220.088464] XFS (dm-10): xfs_log_force: error 5 returned. [16220.216170] XFS (dm-5): xfs_log_force: error 5 returned. [16220.216178] XFS (dm-12): xfs_log_force: error 5 returned. [16220.216325] XFS (dm-11): xfs_log_force: error 5 returned. [16221.621107] XFS (dm-8): xfs_log_force: error 5 returned. [16250.102915] XFS (dm-4): xfs_log_force: error 5 returned. [16250.102918] XFS (dm-6): xfs_log_force: error 5 returned. [16250.102920] XFS (dm-10): xfs_log_force: error 5 returned. [16250.230631] XFS (dm-12): xfs_log_force: error 5 returned. [16250.230633] XFS (dm-11): xfs_log_force: error 5 returned. [16250.230638] XFS (dm-5): xfs_log_force: error 5 returned. [16251.635566] XFS (dm-8): xfs_log_force: error 5 returned. [16280.117368] XFS (dm-4): xfs_log_force: error 5 returned. [16280.117371] XFS (dm-6): xfs_log_force: error 5 returned. [16280.117373] XFS (dm-10): xfs_log_force: error 5 returned. [16280.245087] XFS (dm-12): xfs_log_force: error 5 returned. [16280.245093] XFS (dm-5): xfs_log_force: error 5 returned. [16280.245105] XFS (dm-11): xfs_log_force: error 5 returned. [16281.650017] XFS (dm-8): xfs_log_force: error 5 returned. [16310.131820] XFS (dm-4): xfs_log_force: error 5 returned. [16310.131823] XFS (dm-6): xfs_log_force: error 5 returned. [16310.131825] XFS (dm-10): xfs_log_force: error 5 returned. [16310.259545] XFS (dm-12): xfs_log_force: error 5 returned. [16310.259547] XFS (dm-5): xfs_log_force: error 5 returned. [16310.259552] XFS (dm-11): xfs_log_force: error 5 returned. [16311.664477] XFS (dm-8): xfs_log_force: error 5 returned. [16340.146278] XFS (dm-4): xfs_log_force: error 5 returned. [16340.146280] XFS (dm-6): xfs_log_force: error 5 returned. [16340.146282] XFS (dm-10): xfs_log_force: error 5 returned. [16340.274002] XFS (dm-5): xfs_log_force: error 5 returned. [16340.274005] XFS (dm-12): xfs_log_force: error 5 returned. [16340.274020] XFS (dm-11): xfs_log_force: error 5 returned. [16341.678946] XFS (dm-8): xfs_log_force: error 5 returned. [16370.160749] XFS (dm-4): xfs_log_force: error 5 returned. [16370.160752] XFS (dm-6): xfs_log_force: error 5 returned. [16370.160754] XFS (dm-10): xfs_log_force: error 5 returned. [16370.288460] XFS (dm-5): xfs_log_force: error 5 returned. [16370.288463] XFS (dm-12): xfs_log_force: error 5 returned. [16370.288488] XFS (dm-11): xfs_log_force: error 5 returned. [16371.693394] XFS (dm-8): xfs_log_force: error 5 returned. [16400.175204] XFS (dm-4): xfs_log_force: error 5 returned. [16400.175206] XFS (dm-6): xfs_log_force: error 5 returned. [16400.175208] XFS (dm-10): xfs_log_force: error 5 returned. [16400.302923] XFS (dm-12): xfs_log_force: error 5 returned. [16400.302928] XFS (dm-5): xfs_log_force: error 5 returned. [16400.302957] XFS (dm-11): xfs_log_force: error 5 returned. [16401.707850] XFS (dm-8): xfs_log_force: error 5 returned. [16430.189662] XFS (dm-4): xfs_log_force: error 5 returned. [16430.189664] XFS (dm-6): xfs_log_force: error 5 returned. [16430.189666] XFS (dm-10): xfs_log_force: error 5 returned. [16430.317382] XFS (dm-12): xfs_log_force: error 5 returned. [16430.317387] XFS (dm-5): xfs_log_force: error 5 returned. [16430.317431] XFS (dm-11): xfs_log_force: error 5 returned. [16431.722315] XFS (dm-8): xfs_log_force: error 5 returned. [16460.204118] XFS (dm-4): xfs_log_force: error 5 returned. [16460.204120] XFS (dm-6): xfs_log_force: error 5 returned. [16460.204122] XFS (dm-10): xfs_log_force: error 5 returned. [16460.331843] XFS (dm-12): xfs_log_force: error 5 returned. [16460.331845] XFS (dm-5): xfs_log_force: error 5 returned. [16460.331900] XFS (dm-11): xfs_log_force: error 5 returned. [16461.736774] XFS (dm-8): xfs_log_force: error 5 returned. [16490.218579] XFS (dm-4): xfs_log_force: error 5 returned. [16490.218582] XFS (dm-6): xfs_log_force: error 5 returned. [16490.218584] XFS (dm-10): xfs_log_force: error 5 returned. [16490.346303] XFS (dm-5): xfs_log_force: error 5 returned. [16490.346314] XFS (dm-12): xfs_log_force: error 5 returned. [16490.346378] XFS (dm-11): xfs_log_force: error 5 returned. [16491.751239] XFS (dm-8): xfs_log_force: error 5 returned. [16520.233052] XFS (dm-4): xfs_log_force: error 5 returned. [16520.233054] XFS (dm-6): xfs_log_force: error 5 returned. [16520.233056] XFS (dm-10): xfs_log_force: error 5 returned. [16520.360764] XFS (dm-5): xfs_log_force: error 5 returned. [16520.360767] XFS (dm-12): xfs_log_force: error 5 returned. [16520.360843] XFS (dm-11): xfs_log_force: error 5 returned. [16521.765705] XFS (dm-8): xfs_log_force: error 5 returned. [16550.247509] XFS (dm-4): xfs_log_force: error 5 returned. [16550.247511] XFS (dm-6): xfs_log_force: error 5 returned. [16550.247513] XFS (dm-10): xfs_log_force: error 5 returned. [16550.375228] XFS (dm-12): xfs_log_force: error 5 returned. [16550.375234] XFS (dm-5): xfs_log_force: error 5 returned. [16550.375321] XFS (dm-11): xfs_log_force: error 5 returned. [16551.780153] XFS (dm-8): xfs_log_force: error 5 returned. [16580.261965] XFS (dm-4): xfs_log_force: error 5 returned. [16580.261968] XFS (dm-6): xfs_log_force: error 5 returned. [16580.261970] XFS (dm-10): xfs_log_force: error 5 returned. [16580.389684] XFS (dm-12): xfs_log_force: error 5 returned. [16580.389690] XFS (dm-5): xfs_log_force: error 5 returned. [16580.389740] XFS (dm-11): xfs_log_force: error 5 returned. [16581.794618] XFS (dm-8): xfs_log_force: error 5 returned. [16610.276419] XFS (dm-4): xfs_log_force: error 5 returned. [16610.276421] XFS (dm-6): xfs_log_force: error 5 returned. [16610.276423] XFS (dm-10): xfs_log_force: error 5 returned. [16610.404143] XFS (dm-12): xfs_log_force: error 5 returned. [16610.404146] XFS (dm-5): xfs_log_force: error 5 returned. [16610.404188] XFS (dm-11): xfs_log_force: error 5 returned. [16611.809078] XFS (dm-8): xfs_log_force: error 5 returned. [16640.290878] XFS (dm-4): xfs_log_force: error 5 returned. [16640.290880] XFS (dm-6): xfs_log_force: error 5 returned. [16640.290882] XFS (dm-10): xfs_log_force: error 5 returned. [16640.418602] XFS (dm-5): xfs_log_force: error 5 returned. [16640.418605] XFS (dm-12): xfs_log_force: error 5 returned. [16640.418724] XFS (dm-11): xfs_log_force: error 5 returned. [16641.823546] XFS (dm-8): xfs_log_force: error 5 returned. [16670.305348] XFS (dm-4): xfs_log_force: error 5 returned. [16670.305351] XFS (dm-6): xfs_log_force: error 5 returned. [16670.305353] XFS (dm-10): xfs_log_force: error 5 returned. [16670.433061] XFS (dm-5): xfs_log_force: error 5 returned. [16670.433068] XFS (dm-12): xfs_log_force: error 5 returned. [16670.433128] XFS (dm-11): xfs_log_force: error 5 returned. [16671.837994] XFS (dm-8): xfs_log_force: error 5 returned. [16700.319803] XFS (dm-4): xfs_log_force: error 5 returned. [16700.319805] XFS (dm-6): xfs_log_force: error 5 returned. [16700.319807] XFS (dm-10): xfs_log_force: error 5 returned. [16700.447523] XFS (dm-12): xfs_log_force: error 5 returned. [16700.447528] XFS (dm-5): xfs_log_force: error 5 returned. [16700.447656] XFS (dm-11): xfs_log_force: error 5 returned. [16701.852457] XFS (dm-8): xfs_log_force: error 5 returned. [16730.334256] XFS (dm-4): xfs_log_force: error 5 returned. [16730.334259] XFS (dm-6): xfs_log_force: error 5 returned. [16730.334260] XFS (dm-10): xfs_log_force: error 5 returned. [16730.461976] XFS (dm-12): xfs_log_force: error 5 returned. [16730.461981] XFS (dm-5): xfs_log_force: error 5 returned. [16730.462063] XFS (dm-11): xfs_log_force: error 5 returned. [16731.866907] XFS (dm-8): xfs_log_force: error 5 returned. [16760.348710] XFS (dm-4): xfs_log_force: error 5 returned. [16760.348713] XFS (dm-6): xfs_log_force: error 5 returned. [16760.348716] XFS (dm-10): xfs_log_force: error 5 returned. [16760.476434] XFS (dm-12): xfs_log_force: error 5 returned. [16760.476436] XFS (dm-5): xfs_log_force: error 5 returned. [16760.476459] XFS (dm-11): xfs_log_force: error 5 returned. [16761.881365] XFS (dm-8): xfs_log_force: error 5 returned. [16790.363166] XFS (dm-4): xfs_log_force: error 5 returned. [16790.363169] XFS (dm-6): xfs_log_force: error 5 returned. [16790.363171] XFS (dm-10): xfs_log_force: error 5 returned. [16790.490890] XFS (dm-5): xfs_log_force: error 5 returned. [16790.490901] XFS (dm-12): xfs_log_force: error 5 returned. [16790.491022] XFS (dm-11): xfs_log_force: error 5 returned. [16791.895824] XFS (dm-8): xfs_log_force: error 5 returned. [16798.555345] XFS (dm-4): xfs_log_force: error 5 returned. [16798.555352] XFS (dm-4): xfs_do_force_shutdown(0x1) called from line 1031 of file fs/xfs/xfs_buf.c. Return address = 0xffffffffa025d2a9 [16798.584982] XFS (dm-4): xfs_log_force: error 5 returned. [16798.623227] XFS (dm-4): xfs_log_force: error 5 returned. [16806.100829] XFS (dm-6): xfs_log_force: error 5 returned. [16806.100837] XFS (dm-6): xfs_do_force_shutdown(0x1) called from line 1031 of file fs/xfs/xfs_buf.c. Return address = 0xffffffffa025d2a9 [16806.131651] XFS (dm-6): xfs_log_force: error 5 returned. [16806.171364] XFS (dm-6): xfs_log_force: error 5 returned. [16812.785100] XFS (dm-8): xfs_log_force: error 5 returned. [16812.785107] XFS (dm-8): xfs_do_force_shutdown(0x1) called from line 1031 of file fs/xfs/xfs_buf.c. Return address = 0xffffffffa025d2a9 [16812.814558] XFS (dm-8): xfs_log_force: error 5 returned. [16812.849566] XFS (dm-8): xfs_log_force: error 5 returned. [16816.295231] XFS (dm-10): xfs_log_force: error 5 returned. [16816.295238] XFS (dm-10): xfs_do_force_shutdown(0x1) called from line 1031 of file fs/xfs/xfs_buf.c. Return address = 0xffffffffa025d2a9 [16816.325382] XFS (dm-10): xfs_log_force: error 5 returned. [16816.363627] XFS (dm-10): xfs_log_force: error 5 returned. [16820.505348] XFS (dm-5): xfs_log_force: error 5 returned. [16820.505351] XFS (dm-11): xfs_log_force: error 5 returned. [16820.505354] XFS (dm-12): xfs_log_force: error 5 returned. [16822.543907] XFS (dm-11): xfs_log_force: error 5 returned. [16822.543915] XFS (dm-11): xfs_do_force_shutdown(0x1) called from line 1031 of file fs/xfs/xfs_buf.c. Return address = 0xffffffffa025d2a9 [16822.573578] XFS (dm-11): xfs_log_force: error 5 returned. [16822.610507] XFS (dm-11): xfs_log_force: error 5 returned. [16829.659428] XFS (dm-5): xfs_log_force: error 5 returned. [16829.659435] XFS (dm-5): xfs_do_force_shutdown(0x1) called from line 1031 of file fs/xfs/xfs_buf.c. Return address = 0xffffffffa025d2a9 [16829.692325] XFS (dm-5): xfs_log_force: error 5 returned. [16829.729706] XFS (dm-5): xfs_log_force: error 5 returned. [16833.529927] XFS (dm-12): xfs_log_force: error 5 returned. [16833.529935] XFS (dm-12): xfs_do_force_shutdown(0x1) called from line 1031 of file fs/xfs/xfs_buf.c. Return address = 0xffffffffa025d2a9 [16833.559988] XFS (dm-12): xfs_log_force: error 5 returned. [16833.599082] XFS (dm-12): xfs_log_force: error 5 returned. [17369.624945] XFS (dm-4): Mounting Filesystem [17369.632013] XFS (dm-4): Starting recovery (logdev: internal) [17369.638476] XFS (dm-4): Ending recovery (logdev: internal) [17651.973225] XFS (dm-6): Mounting Filesystem [17651.979557] XFS (dm-6): Starting recovery (logdev: internal) [17651.986804] XFS (dm-6): Ending recovery (logdev: internal) [17714.780957] XFS (dm-8): Mounting Filesystem [17715.040586] XFS (dm-8): Starting recovery (logdev: internal) [17716.476591] XFS (dm-8): Ending recovery (logdev: internal) [17786.815091] XFS (dm-10): Mounting Filesystem [17786.984170] XFS (dm-10): Starting recovery (logdev: internal) [17787.413091] XFS (dm-10): Ending recovery (logdev: internal) [17901.190404] XFS (dm-5): Mounting Filesystem [17901.370431] XFS (dm-5): Starting recovery (logdev: internal) [17901.775778] XFS (dm-5): Ending recovery (logdev: internal) [23766.709975] XFS (dm-11): Mounting Filesystem [23766.716253] XFS (dm-11): Starting recovery (logdev: internal) [23766.723042] XFS (dm-11): Ending recovery (logdev: internal) [23826.394066] XFS (dm-12): Mounting Filesystem [23826.400403] XFS (dm-12): Starting recovery (logdev: internal) [23826.407246] XFS (dm-12): Ending recovery (logdev: internal) root@Anguish-ssu-2:/iris/home/adrian/streamRT/scripts# xfs_repair /dev/s2d_a1l001 Phase 1 - find and verify superblock... Phase 2 - using internal log - zero log... - scan filesystem freespace and inode maps... - found root inode chunk Phase 3 - for each AG... - scan and clear agi unlinked lists... - process known inodes and perform inode discovery... - agno = 0 - agno = 1 - agno = 2 - agno = 3 - agno = 4 - agno = 5 - agno = 6 - agno = 7 - agno = 8 - agno = 9 - agno = 10 - agno = 11 - agno = 12 - agno = 13 - agno = 14 - agno = 15 - agno = 16 - agno = 17 - agno = 18 - agno = 19 - agno = 20 - agno = 21 - agno = 22 - agno = 23 - agno = 24 - agno = 25 - agno = 26 - agno = 27 - agno = 28 - agno = 29 - agno = 30 - agno = 31 - agno = 32 - agno = 33 - agno = 34 - agno = 35 - agno = 36 - agno = 37 - agno = 38 - agno = 39 - agno = 40 - agno = 41 - agno = 42 - agno = 43 - process newly discovered inodes... Phase 4 - check for duplicate blocks... - setting up duplicate extent list... - check for inodes claiming duplicate blocks... - agno = 1 - agno = 0 - agno = 2 - agno = 3 - agno = 4 - agno = 5 - agno = 6 - agno = 8 - agno = 7 - agno = 9 - agno = 10 - agno = 16 - agno = 15 - agno = 13 - agno = 12 - agno = 14 - agno = 11 - agno = 19 - agno = 20 - agno = 21 - agno = 18 - agno = 23 - agno = 22 - agno = 17 - agno = 24 - agno = 25 - agno = 26 - agno = 27 - agno = 28 - agno = 30 - agno = 29 - agno = 31 - agno = 32 - agno = 33 - agno = 34 - agno = 35 - agno = 36 - agno = 37 - agno = 38 - agno = 39 - agno = 40 - agno = 42 - agno = 43 - agno = 41 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 root@Anguish-ssu-2:/iris/home/adrian/streamRT/scripts# xfs_repair /dev/s2d_a1l011 Phase 1 - find and verify superblock... Phase 2 - using internal log - zero log... - scan filesystem freespace and inode maps... - found root inode chunk Phase 3 - for each AG... - scan and clear agi unlinked lists... - process known inodes and perform inode discovery... - agno = 0 - agno = 1 - agno = 2 - agno = 3 - agno = 4 - agno = 5 - agno = 6 - agno = 7 - agno = 8 - agno = 9 - agno = 10 - agno = 11 - agno = 12 - agno = 13 - agno = 14 - agno = 15 - agno = 16 - agno = 17 - agno = 18 - agno = 19 - agno = 20 - agno = 21 - agno = 22 - agno = 23 - agno = 24 - agno = 25 - agno = 26 - agno = 27 - agno = 28 - agno = 29 - agno = 30 - agno = 31 - agno = 32 - agno = 33 - agno = 34 - agno = 35 - agno = 36 - agno = 37 - agno = 38 - agno = 39 - agno = 40 - agno = 41 - agno = 42 - agno = 43 - process newly discovered inodes... Phase 4 - check for duplicate blocks... - setting up duplicate extent list... - check for inodes claiming duplicate blocks... - agno = 0 - agno = 1 - agno = 2 - agno = 3 - agno = 4 - agno = 5 - agno = 6 - agno = 7 - agno = 12 - agno = 13 - agno = 14 - agno = 15 - agno = 17 - agno = 18 - agno = 9 - agno = 8 - agno = 19 - agno = 22 - agno = 20 - agno = 16 - agno = 23 - agno = 21 - agno = 10 - agno = 24 - agno = 11 - agno = 26 - agno = 27 - agno = 29 - agno = 30 - agno = 31 - agno = 28 - agno = 25 - agno = 32 - agno = 33 - agno = 34 - agno = 35 - agno = 36 - agno = 37 - agno = 38 - agno = 39 - agno = 40 - agno = 41 - agno = 42 - agno = 43 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 root@Anguish-ssu-2:/iris/home/adrian/streamRT/scripts# xfs_repair /dev/s2d_a1l021 Phase 1 - find and verify superblock... Phase 2 - using internal log - zero log... - scan filesystem freespace and inode maps... - found root inode chunk Phase 3 - for each AG... - scan and clear agi unlinked lists... - process known inodes and perform inode discovery... - agno = 0 - agno = 1 - agno = 2 - agno = 3 - agno = 4 - agno = 5 - agno = 6 - agno = 7 - agno = 8 - agno = 9 - agno = 10 - agno = 11 - agno = 12 - agno = 13 - agno = 14 - agno = 15 - agno = 16 - agno = 17 - agno = 18 - agno = 19 - agno = 20 - agno = 21 - agno = 22 - agno = 23 - agno = 24 - agno = 25 - agno = 26 - agno = 27 - agno = 28 - agno = 29 - agno = 30 - agno = 31 - agno = 32 - agno = 33 - agno = 34 - agno = 35 - agno = 36 - agno = 37 - agno = 38 - agno = 39 - agno = 40 - agno = 41 - agno = 42 - agno = 43 - process newly discovered inodes... Phase 4 - check for duplicate blocks... - setting up duplicate extent list... - check for inodes claiming duplicate blocks... - agno = 0 - agno = 1 - agno = 2 - agno = 3 - agno = 5 - agno = 4 - agno = 6 - agno = 8 - agno = 9 - agno = 7 - agno = 12 - agno = 10 - agno = 15 - agno = 16 - agno = 11 - agno = 13 - agno = 14 - agno = 17 - agno = 21 - agno = 19 - agno = 20 - agno = 22 - agno = 26 - agno = 28 - agno = 25 - agno = 31 - agno = 27 - agno = 24 - agno = 18 - agno = 29 - agno = 23 - agno = 30 - agno = 32 - agno = 33 - agno = 34 - agno = 35 - agno = 36 - agno = 37 - agno = 38 - agno = 39 - agno = 40 - agno = 41 - agno = 42 - agno = 43 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 root@Anguish-ssu-2:/iris/home/adrian/streamRT/scripts# xfs_repair /dev/s2d_a1l031 Phase 1 - find and verify superblock... Phase 2 - using internal log - zero log... - scan filesystem freespace and inode maps... - found root inode chunk Phase 3 - for each AG... - scan and clear agi unlinked lists... - process known inodes and perform inode discovery... - agno = 0 - agno = 1 - agno = 2 - agno = 3 - agno = 4 - agno = 5 - agno = 6 - agno = 7 - agno = 8 - agno = 9 - agno = 10 - agno = 11 - agno = 12 - agno = 13 - agno = 14 - agno = 15 - agno = 16 - agno = 17 - agno = 18 - agno = 19 - agno = 20 - agno = 21 - agno = 22 - agno = 23 - agno = 24 - agno = 25 - agno = 26 - agno = 27 - agno = 28 - agno = 29 - agno = 30 - agno = 31 - agno = 32 - agno = 33 - agno = 34 - agno = 35 - agno = 36 - agno = 37 - agno = 38 - agno = 39 - agno = 40 - agno = 41 - agno = 42 - agno = 43 - process newly discovered inodes... Phase 4 - check for duplicate blocks... - setting up duplicate extent list... - check for inodes claiming duplicate blocks... - agno = 1 - agno = 0 - agno = 2 - agno = 3 - agno = 4 - agno = 5 - agno = 6 - agno = 8 - agno = 7 - agno = 11 - agno = 9 - agno = 10 - agno = 13 - agno = 14 - agno = 18 - agno = 19 - agno = 21 - agno = 16 - agno = 23 - agno = 12 - agno = 15 - agno = 17 - agno = 24 - agno = 20 - agno = 25 - agno = 22 - agno = 27 - agno = 29 - agno = 26 - agno = 31 - agno = 30 - agno = 28 - agno = 32 - agno = 33 - agno = 34 - agno = 35 - agno = 36 - agno = 37 - agno = 38 - agno = 39 - agno = 40 - agno = 41 - agno = 42 - agno = 43 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 root@Anguish-ssu-2:/iris/home/adrian/streamRT/scripts# xfs_repair /dev/s2d_a1l003 Phase 1 - find and verify superblock... Phase 2 - using internal log - zero log... - scan filesystem freespace and inode maps... - found root inode chunk Phase 3 - for each AG... - scan and clear agi unlinked lists... - process known inodes and perform inode discovery... - agno = 0 - agno = 1 - agno = 2 - agno = 3 - agno = 4 - agno = 5 - agno = 6 - agno = 7 - agno = 8 - agno = 9 - agno = 10 - agno = 11 - agno = 12 - agno = 13 - agno = 14 - agno = 15 - agno = 16 - agno = 17 - agno = 18 - agno = 19 - agno = 20 - agno = 21 - agno = 22 - agno = 23 - agno = 24 - agno = 25 - agno = 26 - agno = 27 - agno = 28 - agno = 29 - agno = 30 - agno = 31 - agno = 32 - agno = 33 - agno = 34 - agno = 35 - agno = 36 - agno = 37 - agno = 38 - agno = 39 - agno = 40 - agno = 41 - agno = 42 - agno = 43 - process newly discovered inodes... Phase 4 - check for duplicate blocks... - setting up duplicate extent list... - check for inodes claiming duplicate blocks... - agno = 0 - agno = 1 - agno = 2 - agno = 3 - agno = 5 - agno = 6 - agno = 8 - agno = 4 - agno = 10 - agno = 9 - agno = 12 - agno = 14 - agno = 16 - agno = 11 - agno = 13 - agno = 19 - agno = 21 - agno = 15 - agno = 7 - agno = 17 - agno = 18 - agno = 23 - agno = 22 - agno = 20 - agno = 24 - agno = 26 - agno = 28 - agno = 30 - agno = 27 - agno = 29 - agno = 31 - agno = 25 - agno = 32 - agno = 33 - agno = 34 - agno = 35 - agno = 36 - agno = 37 - agno = 38 - agno = 39 - agno = 40 - agno = 41 - agno = 42 - agno = 43 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 root@Anguish-ssu-2:/iris/home/adrian/streamRT/scripts# xfs_repair /dev/s2d_a1l013 Phase 1 - find and verify superblock... Phase 2 - using internal log - zero log... - scan filesystem freespace and inode maps... - found root inode chunk Phase 3 - for each AG... - scan and clear agi unlinked lists... - process known inodes and perform inode discovery... - agno = 0 - agno = 1 - agno = 2 - agno = 3 - agno = 4 - agno = 5 - agno = 6 - agno = 7 - agno = 8 - agno = 9 - agno = 10 - agno = 11 - agno = 12 - agno = 13 - agno = 14 - agno = 15 - agno = 16 - agno = 17 - agno = 18 - agno = 19 - agno = 20 - agno = 21 - agno = 22 - agno = 23 - agno = 24 - agno = 25 - agno = 26 - agno = 27 - agno = 28 - agno = 29 - agno = 30 - agno = 31 - agno = 32 - agno = 33 - agno = 34 - agno = 35 - agno = 36 - agno = 37 - agno = 38 - agno = 39 - agno = 40 - agno = 41 - agno = 42 - agno = 43 - process newly discovered inodes... Phase 4 - check for duplicate blocks... - setting up duplicate extent list... - check for inodes claiming duplicate blocks... - agno = 0 - agno = 1 - agno = 2 - agno = 3 - agno = 4 - agno = 6 - agno = 7 - agno = 5 - agno = 9 - agno = 12 - agno = 13 - agno = 14 - agno = 8 - agno = 15 - agno = 10 - agno = 16 - agno = 11 - agno = 17 - agno = 19 - agno = 18 - agno = 20 - agno = 21 - agno = 22 - agno = 23 - agno = 24 - agno = 25 - agno = 26 - agno = 27 - agno = 28 - agno = 29 - agno = 30 - agno = 31 - agno = 32 - agno = 33 - agno = 34 - agno = 35 - agno = 36 - agno = 37 - agno = 38 - agno = 39 - agno = 40 - agno = 41 - agno = 42 - agno = 43 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 root@Anguish-ssu-2:/iris/home/adrian/streamRT/scripts# xfs_repair /dev/s2d_a1l023 Phase 1 - find and verify superblock... Phase 2 - using internal log - zero log... - scan filesystem freespace and inode maps... - found root inode chunk Phase 3 - for each AG... - scan and clear agi unlinked lists... - process known inodes and perform inode discovery... - agno = 0 - agno = 1 - agno = 2 - agno = 3 - agno = 4 - agno = 5 - agno = 6 - agno = 7 - agno = 8 - agno = 9 - agno = 10 - agno = 11 - agno = 12 - agno = 13 - agno = 14 - agno = 15 - agno = 16 - agno = 17 - agno = 18 - agno = 19 - agno = 20 - agno = 21 - agno = 22 - agno = 23 - agno = 24 - agno = 25 - agno = 26 - agno = 27 - agno = 28 - agno = 29 - agno = 30 - agno = 31 - agno = 32 - agno = 33 - agno = 34 - agno = 35 - agno = 36 - agno = 37 - agno = 38 - agno = 39 - agno = 40 - agno = 41 - agno = 42 - agno = 43 - process newly discovered inodes... Phase 4 - check for duplicate blocks... - setting up duplicate extent list... - check for inodes claiming duplicate blocks... - agno = 0 - agno = 1 - agno = 2 - agno = 4 - agno = 5 - agno = 3 - agno = 8 - agno = 10 - agno = 12 - agno = 9 - agno = 15 - agno = 16 - agno = 6 - agno = 13 - agno = 7 - agno = 19 - agno = 11 - agno = 20 - agno = 18 - agno = 17 - agno = 21 - agno = 14 - agno = 22 - agno = 26 - agno = 27 - agno = 30 - agno = 31 - agno = 28 - agno = 29 - agno = 23 - agno = 24 - agno = 25 - agno = 32 - agno = 33 - agno = 34 - agno = 35 - agno = 36 - agno = 37 - agno = 38 - agno = 39 - agno = 40 - agno = 41 - agno = 42 - agno = 43 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 root@Anguish-ssu-2:/iris/home/adrian/streamRT/scripts# xfs_repair /dev/s2d_a1l033 Phase 1 - find and verify superblock... Phase 2 - using internal log - zero log... - scan filesystem freespace and inode maps... - found root inode chunk Phase 3 - for each AG... - scan and clear agi unlinked lists... - process known inodes and perform inode discovery... - agno = 0 - agno = 1 - agno = 2 - agno = 3 - agno = 4 - agno = 5 - agno = 6 - agno = 7 - agno = 8 - agno = 9 - agno = 10 - agno = 11 - agno = 12 - agno = 13 - agno = 14 - agno = 15 - agno = 16 - agno = 17 - agno = 18 - agno = 19 - agno = 20 - agno = 21 - agno = 22 - agno = 23 - agno = 24 - agno = 25 - agno = 26 - agno = 27 - agno = 28 - agno = 29 - agno = 30 - agno = 31 - agno = 32 - agno = 33 - agno = 34 - agno = 35 - agno = 36 - agno = 37 - agno = 38 - agno = 39 - agno = 40 - agno = 41 - agno = 42 - agno = 43 - process newly discovered inodes... Phase 4 - check for duplicate blocks... - setting up duplicate extent list... - check for inodes claiming duplicate blocks... - agno = 0 - agno = 3 - agno = 2 - agno = 6 - agno = 4 - agno = 5 - agno = 11 - agno = 8 - agno = 16 - agno = 7 - agno = 10 - agno = 13 - agno = 24 - agno = 23 - agno = 28 - agno = 25 - agno = 30 - agno = 32 - agno = 17 - agno = 34 - agno = 37 - agno = 12 - agno = 42 - agno = 22 - agno = 20 - agno = 14 - agno = 29 - agno = 31 - agno = 1 - agno = 26 - agno = 27 - agno = 15 - agno = 35 - agno = 21 - agno = 36 - agno = 41 - agno = 33 - agno = 9 - agno = 38 - agno = 43 - agno = 40 - agno = 39 - agno = 19 - agno = 18 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 -- Stan From BATV+a70b89fbbf3a21f374f9+4023+infradead.org+hch@bombadil.srs.infradead.org Fri Aug 29 13:26: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 1D6BF7FBF for ; Fri, 29 Aug 2014 13:26:19 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id F1BB730404E for ; Fri, 29 Aug 2014 11:26:15 -0700 (PDT) X-ASG-Debug-ID: 1409336771-04cb6c5500677db0001-NocioJ Received: from bombadil.infradead.org ([198.137.202.9]) by cuda.sgi.com with ESMTP id aRjgAZJabCK2caUD (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 29 Aug 2014 11:26:11 -0700 (PDT) X-Barracuda-Envelope-From: BATV+a70b89fbbf3a21f374f9+4023+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 1XNQsE-0000of-Up; Fri, 29 Aug 2014 18:26:10 +0000 Date: Fri, 29 Aug 2014 11:26:10 -0700 From: Christoph Hellwig To: Dave Chinner Cc: Christoph Hellwig , xfs@oss.sgi.com Subject: Re: [PATCH 6/9] xfs: kill xfs_bioerror_relse Message-ID: <20140829182610.GA28670@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 6/9] xfs: kill xfs_bioerror_relse References: <1408084747-4540-1-git-send-email-david@fromorbit.com> <1408084747-4540-7-git-send-email-david@fromorbit.com> <20140829003257.GF17502@infradead.org> <20140829011236.GB20518@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140829011236.GB20518@dastard> User-Agent: Mutt/1.5.23 (2014-03-12) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: UNKNOWN[198.137.202.9] X-Barracuda-Start-Time: 1409336771 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.8960 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS On Fri, Aug 29, 2014 at 11:12:36AM +1000, Dave Chinner wrote: > > This is a large change of behavior as it doesn't hit the error > > path after the xfs_buf_iowait anymore. While I don't think that > > that path was entirely correct this version seems to be even less so > > by not releasing the buffer reference or forcing the shutdown. > > The IO is synchronous, so the previous behaviour did not release > the buffer here. But, yes, it needs to because we're not running the > io wait on it anymore. And this happens only during a shutdown, so i > don't see any need to trigger a shutdown ;) > > As it is, I think this gets properly fixed by the next patch.... Do you have any scenario that might actually exercise this path? I enabled xfs_trans_read_buf_io trace events and run xfstests as well as a few other workloads and couldn't hit it at all. And when you think of it: when would be do a trans_get_buf, then not actually updating it with data and then recurse into a trans_read_buf in the same transaction? Maybe it's just time do a bit more of an audit and put this whole code path to rest. From bfoster@redhat.com Fri Aug 29 15:29: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 8D9F67FC3 for ; Fri, 29 Aug 2014 15:29:42 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id 1C6D1AC001 for ; Fri, 29 Aug 2014 13:29:41 -0700 (PDT) X-ASG-Debug-ID: 1409344180-04cbb0548690a850001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id SnoHBmKzPzxiBjpR (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 29 Aug 2014 13: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-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 s7TKTeAO027648 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL) for ; Fri, 29 Aug 2014 16:29:40 -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 s7TKTdUj029026 for ; Fri, 29 Aug 2014 16:29:40 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 679AF125781; Fri, 29 Aug 2014 16:29:38 -0400 (EDT) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH 3/4] xfs: allow collapse to handle delalloc extents Date: Fri, 29 Aug 2014 16:29:37 -0400 X-ASG-Orig-Subj: [PATCH 3/4] xfs: allow collapse to handle delalloc extents Message-Id: <1409344178-44817-4-git-send-email-bfoster@redhat.com> In-Reply-To: <1409344178-44817-1-git-send-email-bfoster@redhat.com> References: <1409344178-44817-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: 1409344180 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 The xfs_bmap_shift_extents() mechanism currently requires any post-EOF delalloc blocks to be explicitly trimmed before it can proceed to avoid hitting delalloc extents during the extent shift sequence. This is because the implementation doesn't account for delalloc extents and expects consistency between the in-core extent list and what is on disk for bmapbt mappings. E.g., it will attempt to look up delalloc extents on disk and fail. Since delayed allocation extents have not been written to disk, no on-disk changes are required to shift such extents. Update xfs_bmap_shift_extents() to check for delalloc extents. If found, simply update the start offset of the record and move on. This should only occur for delalloc blocks that do not have data (e.g., post-eof preallocation). Such blocks are currently trimmed off by the truncate that occurs after the extent shift, so we make no attempt to merge delalloc extents. This eliminates the need for an eofblocks trim prior to collapse. Signed-off-by: Brian Foster --- fs/xfs/libxfs/xfs_bmap.c | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/fs/xfs/libxfs/xfs_bmap.c b/fs/xfs/libxfs/xfs_bmap.c index 449a016..32598cb 100644 --- a/fs/xfs/libxfs/xfs_bmap.c +++ b/fs/xfs/libxfs/xfs_bmap.c @@ -5417,6 +5417,11 @@ xfs_bmap_shift_extents_can_merge( startoff = got->br_startoff - shift; + /* do not merge if either extent is delalloc */ + if (isnullstartblock(left->br_startblock) || + isnullstartblock(got->br_startblock)) + return false; + /* * The extent, once shifted, must be adjacent in-file and on-disk with * the preceding extent. @@ -5554,6 +5559,7 @@ xfs_bmap_shift_extents( int whichfork = XFS_DATA_FORK; int logflags = 0; int total_extents; + bool delalloc; if (unlikely(XFS_TEST_ERROR( (XFS_IFORK_FORMAT(ip, whichfork) != XFS_DINODE_FMT_EXTENTS && @@ -5618,6 +5624,7 @@ xfs_bmap_shift_extents( total_extents = ifp->if_bytes / sizeof(xfs_bmbt_rec_t); while (nexts++ < num_exts && current_ext < total_extents) { startoff = got.br_startoff - offset_shift_fsb; + delalloc = isnullstartblock(got.br_startblock); /* grab the left extent and check for a potential merge */ if (current_ext > 0) { @@ -5649,9 +5656,14 @@ xfs_bmap_shift_extents( /* * We didn't merge the extent so do the shift. Update the start - * offset in the in-core extent and btree, if necessary. + * offset in the in-core extent. If the extent is delalloc, + * there's nothing else to do. Otherwise, update the extent + * on-disk. */ xfs_bmbt_set_startoff(gotp, startoff); + if (delalloc) + goto next; + logflags |= XFS_ILOG_CORE; if (cur) { error = xfs_bmbt_lookup_eq(cur, got.br_startoff, -- 1.8.3.1 From bfoster@redhat.com Fri Aug 29 15:29: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 (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (Postfix) with ESMTP id 904B67FC4 for ; Fri, 29 Aug 2014 15:29:42 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id 6EDFA8F8050 for ; Fri, 29 Aug 2014 13:29:42 -0700 (PDT) X-ASG-Debug-ID: 1409344180-04cbb0548890a860001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 3ObCooCi2cfSKpHP (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 29 Aug 2014 13:29: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-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 s7TKTe4x015087 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL) for ; Fri, 29 Aug 2014 16:29:40 -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 s7TKTd5E010223 for ; Fri, 29 Aug 2014 16:29:39 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 5CD5F125780; Fri, 29 Aug 2014 16:29:38 -0400 (EDT) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH 2/4] xfs: refactor xfs_bmap_shift_extents() into multiple functions Date: Fri, 29 Aug 2014 16:29:36 -0400 X-ASG-Orig-Subj: [PATCH 2/4] xfs: refactor xfs_bmap_shift_extents() into multiple functions Message-Id: <1409344178-44817-3-git-send-email-bfoster@redhat.com> In-Reply-To: <1409344178-44817-1-git-send-email-bfoster@redhat.com> References: <1409344178-44817-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: 1409344181 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 The extent shift mechanism in xfs_bmap_shift_extents() is complicated and handles several different, non-deterministic scenarios. These include extent shifts, extent merges and potential btree updates in either of the former scenarios. Refactor the code to be more linear and readable. The loop logic in xfs_bmap_shift_extents() and some initial error checking is adjusted slightly. The associated btree lookup and update/delete operations are condensed into single blocks of code. This reduces the number of btree-specific blocks and facilitates the separation of the merge operation into a new xfs_bmap_shift_extents_merge() helper. The merge check is also separated into an inline. This is a code refactor only. The behavior of extent shift and collapse range is not modified. Signed-off-by: Brian Foster --- fs/xfs/libxfs/xfs_bmap.c | 243 ++++++++++++++++++++++++++++++++--------------- 1 file changed, 168 insertions(+), 75 deletions(-) diff --git a/fs/xfs/libxfs/xfs_bmap.c b/fs/xfs/libxfs/xfs_bmap.c index 4b3f1b9..449a016 100644 --- a/fs/xfs/libxfs/xfs_bmap.c +++ b/fs/xfs/libxfs/xfs_bmap.c @@ -5404,6 +5404,120 @@ error0: } /* + * Determine whether an extent shift can be accomplished by a merge with the + * extent that precedes the target hole of the shift. + */ +static inline bool +xfs_bmap_shift_extents_can_merge( + struct xfs_bmbt_irec *left, /* preceding extent */ + struct xfs_bmbt_irec *got, /* current extent to shift */ + xfs_fileoff_t shift) /* shift fsb */ +{ + xfs_fileoff_t startoff; + + startoff = got->br_startoff - shift; + + /* + * The extent, once shifted, must be adjacent in-file and on-disk with + * the preceding extent. + */ + if ((left->br_startoff + left->br_blockcount != startoff) || + (left->br_startblock + left->br_blockcount != got->br_startblock) || + (left->br_state != got->br_state) || + (left->br_blockcount + got->br_blockcount > MAXEXTLEN)) + return false; + + return true; +} + +/* + * An extent shift adjusts the file offset of an extent to fill a preceding hole + * in the file. If an extent shift would result in the extent being fully + * adjacent to the extent that currently precedes the hole, we can merge with + * the preceding extent rather than do the shift. + * + * This function assumes the caller has verified a shift-by-merge is possible + * with the provided extents via xfs_bmap_shift_extents_can_merge(). + */ +static int +xfs_bmap_shift_extents_merge( + struct xfs_inode *ip, + int whichfork, + xfs_fileoff_t shift, /* shift fsb */ + int current_ext, /* idx of gotp */ + struct xfs_bmbt_rec_host *gotp, /* extent to shift */ + struct xfs_bmbt_rec_host *leftp, /* preceding extent */ + struct xfs_btree_cur *cur, + int *logflags) /* output */ +{ + struct xfs_ifork *ifp; + struct xfs_bmbt_irec got; + struct xfs_bmbt_irec left; + xfs_filblks_t blockcount; + int error, i; + + ifp = XFS_IFORK_PTR(ip, whichfork); + xfs_bmbt_get_all(gotp, &got); + xfs_bmbt_get_all(leftp, &left); + blockcount = left.br_blockcount + got.br_blockcount; + + ASSERT(xfs_isilocked(ip, XFS_IOLOCK_EXCL)); + ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL)); + ASSERT(xfs_bmap_shift_extents_can_merge(&left, &got, shift)); + + /* + * Merge the in-core extents. Note that the host record pointers and + * current_ext index are invalid once the extent has been removed via + * xfs_iext_remove(). + */ + xfs_bmbt_set_blockcount(leftp, blockcount); + xfs_iext_remove(ip, current_ext, 1, 0); + + /* + * Update the on-disk extent count, the btree if necessary and log the + * inode. + */ + XFS_IFORK_NEXT_SET(ip, whichfork, + XFS_IFORK_NEXTENTS(ip, whichfork) - 1); + *logflags |= XFS_ILOG_CORE; + if (cur) { + /* lookup and remove the extent to merge */ + error = xfs_bmbt_lookup_eq(cur, got.br_startoff, + got.br_startblock, got.br_blockcount, &i); + if (error) + goto error; + XFS_WANT_CORRUPTED_GOTO(i == 1, error); + + error = xfs_btree_delete(cur, &i); + if (error) + goto error; + XFS_WANT_CORRUPTED_GOTO(i == 1, error); + + /* lookup and update size of the previous extent */ + error = xfs_bmbt_lookup_eq(cur, left.br_startoff, + left.br_startblock, left.br_blockcount, &i); + if (error) + goto error; + XFS_WANT_CORRUPTED_GOTO(i == 1, error); + + left.br_blockcount = blockcount; + + error = xfs_bmbt_update(cur, left.br_startoff, + left.br_startblock, left.br_blockcount, + left.br_state); + if (error) + goto error; + } else { + *logflags |= XFS_ILOG_DEXT; + } + + return 0; + +error: + return error; +} + +/* * Shift extent records to the left to cover a hole. * * The maximum number of extents to be shifted in a single operation is @@ -5427,6 +5541,7 @@ xfs_bmap_shift_extents( { struct xfs_btree_cur *cur = NULL; struct xfs_bmbt_rec_host *gotp; + struct xfs_bmbt_rec_host *leftp; struct xfs_bmbt_irec got; struct xfs_bmbt_irec left; struct xfs_mount *mp = ip->i_mount; @@ -5438,7 +5553,6 @@ xfs_bmap_shift_extents( int i; int whichfork = XFS_DATA_FORK; int logflags = 0; - xfs_filblks_t blockcount = 0; int total_extents; if (unlikely(XFS_TEST_ERROR( @@ -5464,6 +5578,13 @@ xfs_bmap_shift_extents( return error; } + 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; + } + /* * Look up the extent index for the fsb where we start shifting. We can * henceforth iterate with current_ext as extent list changes are locked @@ -5476,14 +5597,17 @@ xfs_bmap_shift_extents( gotp = xfs_iext_bno_to_ext(ifp, start_fsb, ¤t_ext); if (!gotp) { *done = 1; - return 0; + goto del_cursor; } + xfs_bmbt_get_all(gotp, &got); - 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; + /* + * If the first extent is shifted, offset_shift_fsb cannot be larger + * than the starting offset of the first extent. + */ + if (current_ext == 0 && got.br_startoff < offset_shift_fsb) { + error = -EINVAL; + goto del_cursor; } /* @@ -5493,30 +5617,42 @@ xfs_bmap_shift_extents( */ total_extents = ifp->if_bytes / sizeof(xfs_bmbt_rec_t); while (nexts++ < num_exts && current_ext < total_extents) { - - 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 accommodate the shift. - */ + /* grab the left extent and check for a potential merge */ if (current_ext > 0) { - xfs_bmbt_get_all(xfs_iext_get_ext(ifp, current_ext - 1), - &left); - if (startoff < left.br_startoff + left.br_blockcount) + leftp = xfs_iext_get_ext(ifp, current_ext - 1); + xfs_bmbt_get_all(leftp, &left); + + /* make sure hole is large enough for shift */ + if (startoff < left.br_startoff + left.br_blockcount) { error = -EINVAL; - } else if (offset_shift_fsb > got.br_startoff) { - /* - * When first extent is shifted, offset_shift_fsb should - * be less than the stating offset of the first extent. - */ - error = -EINVAL; + goto del_cursor; + } + + if (xfs_bmap_shift_extents_can_merge(&left, &got, + offset_shift_fsb)) { + error = xfs_bmap_shift_extents_merge(ip, whichfork, + offset_shift_fsb, current_ext, gotp, + leftp, cur, &logflags); + if (error) + goto del_cursor; + + /* + * The extent was merged so adjust the extent + * index and move onto the next. + */ + current_ext--; + goto next; + } } - if (error) - goto del_cursor; + /* + * We didn't merge the extent so do the shift. Update the start + * offset in the in-core extent and btree, if necessary. + */ + xfs_bmbt_set_startoff(gotp, startoff); + logflags |= XFS_ILOG_CORE; if (cur) { error = xfs_bmbt_lookup_eq(cur, got.br_startoff, got.br_startblock, @@ -5525,53 +5661,8 @@ xfs_bmap_shift_extents( if (error) goto del_cursor; XFS_WANT_CORRUPTED_GOTO(i == 1, del_cursor); - } - - /* Check if we can merge 2 adjacent extents */ - if (current_ext && - left.br_startoff + left.br_blockcount == startoff && - left.br_startblock + left.br_blockcount == - got.br_startblock && - left.br_state == got.br_state && - left.br_blockcount + got.br_blockcount <= MAXEXTLEN) { - blockcount = left.br_blockcount + - got.br_blockcount; - xfs_iext_remove(ip, current_ext, 1, 0); - logflags |= XFS_ILOG_CORE; - if (cur) { - error = xfs_btree_delete(cur, &i); - if (error) - goto del_cursor; - XFS_WANT_CORRUPTED_GOTO(i == 1, del_cursor); - } else { - logflags |= XFS_ILOG_DEXT; - } - XFS_IFORK_NEXT_SET(ip, whichfork, - XFS_IFORK_NEXTENTS(ip, whichfork) - 1); - gotp = xfs_iext_get_ext(ifp, --current_ext); - xfs_bmbt_get_all(gotp, &got); - - /* Make cursor point to the extent we will update */ - 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, blockcount); - got.br_blockcount = blockcount; - } else { - /* We have to update the startoff */ - xfs_bmbt_set_startoff(gotp, startoff); got.br_startoff = startoff; - } - - logflags |= XFS_ILOG_CORE; - if (cur) { error = xfs_bmbt_update(cur, got.br_startoff, got.br_startblock, got.br_blockcount, @@ -5582,18 +5673,20 @@ xfs_bmap_shift_extents( logflags |= XFS_ILOG_DEXT; } - current_ext++; +next: + /* update total extent count and grab the next record */ total_extents = ifp->if_bytes / sizeof(xfs_bmbt_rec_t); + if (++current_ext >= total_extents) + break; + gotp = xfs_iext_get_ext(ifp, current_ext); + xfs_bmbt_get_all(gotp, &got); } /* Check if we are done */ if (current_ext == total_extents) *done = 1; - else if (next_fsb) { - gotp = xfs_iext_get_ext(ifp, current_ext); - xfs_bmbt_get_all(gotp, &got); + else if (next_fsb) *next_fsb = got.br_startoff; - } del_cursor: if (cur) -- 1.8.3.1 From bfoster@redhat.com Fri Aug 29 15:29: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 C2E517FCD for ; Fri, 29 Aug 2014 15:29:44 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay2.corp.sgi.com (Postfix) with ESMTP id B1AA630406B for ; Fri, 29 Aug 2014 13:29:44 -0700 (PDT) X-ASG-Debug-ID: 1409344180-04cb6c54fe67dee0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id BVyjX0vYkTOqr2D9 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 29 Aug 2014 13: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-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 s7TKTekr013508 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL) for ; Fri, 29 Aug 2014 16:29:40 -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 s7TKTdvs010221 for ; Fri, 29 Aug 2014 16:29:39 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 3B70412577F; Fri, 29 Aug 2014 16:29:38 -0400 (EDT) From: Brian Foster To: xfs@oss.sgi.com Subject: [RFC PATCH 0/4] clean up collapse range and handle post-eof delalloc Date: Fri, 29 Aug 2014 16:29:34 -0400 X-ASG-Orig-Subj: [RFC PATCH 0/4] clean up collapse range and handle post-eof delalloc Message-Id: <1409344178-44817-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: 1409344180 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 Here's a drop of what I'm testing over the weekend. It passes some quick tests, but only lightly tested so far. My biggest question at this point is whether there is any risk to the shift of the post-eof extent if the subsequent truncate happens to fail. If it's not worth dealing with that, we could just drop patch 3 and leave the eofblocks trim permanently. In fact, it might even be a good idea to go back to the original [start,-1] writeback in collapse range given that the free file space helper could change at some point to only write and punch out the range being freed... and then we're left shifting a bunch of extents after the freed range that could have dirty data in pagecache, which sounds bad. Thoughts? Brian Brian Foster (4): xfs: track collapse via file offset rather than extent index xfs: refactor xfs_bmap_shift_extents() into multiple functions xfs: allow collapse to handle delalloc extents xfs: remove file writeback and eofblocks trim from collapse range fs/xfs/libxfs/xfs_bmap.c | 302 ++++++++++++++++++++++++++++++++--------------- fs/xfs/libxfs/xfs_bmap.h | 7 +- fs/xfs/xfs_bmap_util.c | 32 +---- 3 files changed, 214 insertions(+), 127 deletions(-) -- 1.8.3.1 From bfoster@redhat.com Fri Aug 29 15:29: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 (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id E30687FCE for ; Fri, 29 Aug 2014 15:29:44 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 809D7AC001 for ; Fri, 29 Aug 2014 13:29:41 -0700 (PDT) X-ASG-Debug-ID: 1409344180-04bdf0109a613f50001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 4WrTAFmWdovAjFb2 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 29 Aug 2014 13: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-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 s7TKTeJg016533 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL) for ; Fri, 29 Aug 2014 16:29:40 -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 s7TKTdsY025621 for ; Fri, 29 Aug 2014 16:29:40 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 74116125782; Fri, 29 Aug 2014 16:29:38 -0400 (EDT) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH 4/4] xfs: remove file writeback and eofblocks trim from collapse range Date: Fri, 29 Aug 2014 16:29:38 -0400 X-ASG-Orig-Subj: [PATCH 4/4] xfs: remove file writeback and eofblocks trim from collapse range Message-Id: <1409344178-44817-5-git-send-email-bfoster@redhat.com> In-Reply-To: <1409344178-44817-1-git-send-email-bfoster@redhat.com> References: <1409344178-44817-1-git-send-email-bfoster@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.26 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1409344180 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 The full writeback and eofblocks trim operations executed prior to collapse range are temporary hacks to avoid problems in the extent shift implementation. The writeback prevents the in-core extent count from changing due to extent conversions in parts of the file prior to the collapse target. The eofblocks trim prevents collapse failure due to attempts to look up delalloc extents on disk for bmapbt mappings. The full writeback is no longer necessary because the extent shift is now file offset based. Each time the ilock is dropped and reacquired, we look up the current extent index based on the file offset where the previous shift left off. The eofblocks trim is no longer required because the extent shift mechanism knows how to shift delalloc extents. Remove the writeback and eofblocks trim from xfs_collapse_file_space(). Signed-off-by: Brian Foster --- fs/xfs/xfs_bmap_util.c | 20 -------------------- 1 file changed, 20 deletions(-) diff --git a/fs/xfs/xfs_bmap_util.c b/fs/xfs/xfs_bmap_util.c index 1e96d77..c9d16bd 100644 --- a/fs/xfs/xfs_bmap_util.c +++ b/fs/xfs/xfs_bmap_util.c @@ -1470,26 +1470,6 @@ xfs_collapse_file_space( next_fsb = XFS_B_TO_FSB(mp, offset + len); shift_fsb = XFS_B_TO_FSB(mp, len); - /* - * Writeback the entire file and force remove any post-eof blocks. The - * writeback prevents changes to the extent list via concurrent - * writeback and the eofblocks trim prevents the extent shift algorithm - * from running into a post-eof delalloc extent. - * - * XXX: This is a temporary fix until the extent shift loop below is - * converted to use offsets and lookups within the ILOCK rather than - * carrying around the index into the extent list for the next - * iteration. - */ - error = filemap_write_and_wait(VFS_I(ip)->i_mapping); - if (error) - return error; - if (xfs_can_free_eofblocks(ip, true)) { - error = xfs_free_eofblocks(mp, ip, false); - if (error) - return error; - } - error = xfs_free_file_space(ip, offset, len); if (error) return error; -- 1.8.3.1 From bfoster@redhat.com Fri Aug 29 15:29: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 5B05F7FCD for ; Fri, 29 Aug 2014 15:29:45 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 3B11F8F8033 for ; Fri, 29 Aug 2014 13:29:42 -0700 (PDT) X-ASG-Debug-ID: 1409344180-04cb6c54fd67dee0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 37HiFTUaSwYVvDi0 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 29 Aug 2014 13:29: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-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 s7TKTepL013514 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL) for ; Fri, 29 Aug 2014 16:29:40 -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 s7TKTd5b029024 for ; Fri, 29 Aug 2014 16:29:39 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 4E48112577D; Fri, 29 Aug 2014 16:29:38 -0400 (EDT) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH 1/4] xfs: track collapse via file offset rather than extent index Date: Fri, 29 Aug 2014 16:29:35 -0400 X-ASG-Orig-Subj: [PATCH 1/4] xfs: track collapse via file offset rather than extent index Message-Id: <1409344178-44817-2-git-send-email-bfoster@redhat.com> In-Reply-To: <1409344178-44817-1-git-send-email-bfoster@redhat.com> References: <1409344178-44817-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: 1409344181 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 The collapse range implementation uses a transaction per extent shift. The progress of the overall operation is tracked via the current extent index of the in-core extent list. This is racy because the ilock must be dropped and reacquired for each transaction according to locking and log reservation rules. Therefore, writeback to prior regions of the file is possible and can change the extent count. This changes the extent to which the current index refers and causes the collapse to fail mid operation. To avoid this problem, the entire file is currently written back before the collapse operation starts. To eliminate the need to flush the entire file, use the file offset (fsb) to track the progress of the overall extent shift operation rather than the extent index. Modify xfs_bmap_shift_extents() to unconditionally convert the start_fsb parameter to an extent index and return the file offset of the extent where the shift left off, if further extents exist. The bulk of ths function can remain based on extent index as ilock is held by the caller. xfs_collapse_file_space() now uses the fsb output as the starting point for the subsequent shift. Signed-off-by: Brian Foster --- fs/xfs/libxfs/xfs_bmap.c | 85 +++++++++++++++++++++++++----------------------- fs/xfs/libxfs/xfs_bmap.h | 7 ++-- fs/xfs/xfs_bmap_util.c | 12 +++---- 3 files changed, 53 insertions(+), 51 deletions(-) diff --git a/fs/xfs/libxfs/xfs_bmap.c b/fs/xfs/libxfs/xfs_bmap.c index 86df952..4b3f1b9 100644 --- a/fs/xfs/libxfs/xfs_bmap.c +++ b/fs/xfs/libxfs/xfs_bmap.c @@ -5406,20 +5406,21 @@ error0: /* * Shift extent records to the left to cover 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. If there is no hole to shift the extents - * into, this will be considered invalid operation and we abort immediately. + * The maximum number of extents to be shifted in a single operation is + * @num_exts. @start_fsb specifies the file offset to start the shift and the + * file offset where we've left off is returned in @next_fsb. @offset_shift_fsb + * is the length by which each extent is shifted. If there is no hole to shift + * the extents into, this will be considered invalid operation and we abort + * immediately. */ int xfs_bmap_shift_extents( 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, + int *done, + xfs_fileoff_t *next_fsb, xfs_fsblock_t *firstblock, struct xfs_bmap_free *flist, int num_exts) @@ -5431,6 +5432,7 @@ xfs_bmap_shift_extents( struct xfs_mount *mp = ip->i_mount; struct xfs_ifork *ifp; xfs_extnum_t nexts = 0; + xfs_extnum_t current_ext; xfs_fileoff_t startoff; int error = 0; int i; @@ -5451,7 +5453,8 @@ xfs_bmap_shift_extents( if (XFS_FORCED_SHUTDOWN(mp)) return -EIO; - ASSERT(current_ext != NULL); + ASSERT(xfs_isilocked(ip, XFS_IOLOCK_EXCL)); + ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL)); ifp = XFS_IFORK_PTR(ip, whichfork); if (!(ifp->if_flags & XFS_IFEXTENTS)) { @@ -5462,20 +5465,18 @@ xfs_bmap_shift_extents( } /* - * If *current_ext is 0, we would need to lookup the extent - * from where we would start shifting and store it in gotp. + * Look up the extent index for the fsb where we start shifting. We can + * henceforth iterate with current_ext as extent list changes are locked + * out via ilock. + * + * gotp can be null in 2 cases: 1) if there are no extents or 2) + * start_fsb lies in a hole beyond which there are no extents. Either + * way, we are done. */ - if (!*current_ext) { - gotp = xfs_iext_bno_to_ext(ifp, start_fsb, current_ext); - /* - * gotp can be null in 2 cases: 1) if there are no extents - * or 2) start_fsb lies in a hole beyond which there are - * no extents. Either way, we are done. - */ - if (!gotp) { - *done = 1; - return 0; - } + gotp = xfs_iext_bno_to_ext(ifp, start_fsb, ¤t_ext); + if (!gotp) { + *done = 1; + return 0; } if (ifp->if_flags & XFS_IFBROOT) { @@ -5487,36 +5488,32 @@ xfs_bmap_shift_extents( /* * There may be delalloc extents in the data fork before the range we - * are collapsing out, so we cannot - * use the count of real extents here. Instead we have to calculate it - * from the incore fork. + * are collapsing out, so we cannot use the count of real extents here. + * Instead we have to calculate it from the incore fork. */ total_extents = ifp->if_bytes / sizeof(xfs_bmbt_rec_t); - while (nexts++ < num_exts && *current_ext < total_extents) { + while (nexts++ < num_exts && current_ext < total_extents) { - gotp = xfs_iext_get_ext(ifp, *current_ext); + 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. + * Before shifting extent into hole, make sure that the hole is + * large enough to accommodate the shift. */ - if (*current_ext) { - xfs_bmbt_get_all(xfs_iext_get_ext(ifp, - *current_ext - 1), &left); - + if (current_ext > 0) { + xfs_bmbt_get_all(xfs_iext_get_ext(ifp, current_ext - 1), + &left); if (startoff < left.br_startoff + left.br_blockcount) error = -EINVAL; } else if (offset_shift_fsb > got.br_startoff) { /* - * When first extent is shifted, offset_shift_fsb - * should be less than the stating offset of - * the first extent. + * When first extent is shifted, offset_shift_fsb should + * be less than the stating offset of the first extent. */ error = -EINVAL; } - if (error) goto del_cursor; @@ -5531,7 +5528,7 @@ xfs_bmap_shift_extents( } /* Check if we can merge 2 adjacent extents */ - if (*current_ext && + if (current_ext && left.br_startoff + left.br_blockcount == startoff && left.br_startblock + left.br_blockcount == got.br_startblock && @@ -5539,7 +5536,7 @@ xfs_bmap_shift_extents( left.br_blockcount + got.br_blockcount <= MAXEXTLEN) { blockcount = left.br_blockcount + got.br_blockcount; - xfs_iext_remove(ip, *current_ext, 1, 0); + xfs_iext_remove(ip, current_ext, 1, 0); logflags |= XFS_ILOG_CORE; if (cur) { error = xfs_btree_delete(cur, &i); @@ -5551,7 +5548,7 @@ xfs_bmap_shift_extents( } XFS_IFORK_NEXT_SET(ip, whichfork, XFS_IFORK_NEXTENTS(ip, whichfork) - 1); - gotp = xfs_iext_get_ext(ifp, --*current_ext); + gotp = xfs_iext_get_ext(ifp, --current_ext); xfs_bmbt_get_all(gotp, &got); /* Make cursor point to the extent we will update */ @@ -5585,13 +5582,18 @@ xfs_bmap_shift_extents( logflags |= XFS_ILOG_DEXT; } - (*current_ext)++; + current_ext++; total_extents = ifp->if_bytes / sizeof(xfs_bmbt_rec_t); } /* Check if we are done */ - if (*current_ext == total_extents) + if (current_ext == total_extents) *done = 1; + else if (next_fsb) { + gotp = xfs_iext_get_ext(ifp, current_ext); + xfs_bmbt_get_all(gotp, &got); + *next_fsb = got.br_startoff; + } del_cursor: if (cur) @@ -5600,5 +5602,6 @@ del_cursor: if (logflags) xfs_trans_log_inode(tp, ip, logflags); + return error; } diff --git a/fs/xfs/libxfs/xfs_bmap.h b/fs/xfs/libxfs/xfs_bmap.h index b879ca5..44db6db 100644 --- a/fs/xfs/libxfs/xfs_bmap.h +++ b/fs/xfs/libxfs/xfs_bmap.h @@ -178,9 +178,8 @@ 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 *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); + xfs_fileoff_t start_fsb, xfs_fileoff_t offset_shift_fsb, + int *done, xfs_fileoff_t *next_fsb, 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 1707980..1e96d77 100644 --- a/fs/xfs/xfs_bmap_util.c +++ b/fs/xfs/xfs_bmap_util.c @@ -1456,18 +1456,18 @@ xfs_collapse_file_space( struct xfs_mount *mp = ip->i_mount; struct xfs_trans *tp; int error; - xfs_extnum_t current_ext = 0; struct xfs_bmap_free free_list; xfs_fsblock_t first_block; int committed; xfs_fileoff_t start_fsb; + xfs_fileoff_t next_fsb; xfs_fileoff_t shift_fsb; ASSERT(xfs_isilocked(ip, XFS_IOLOCK_EXCL)); trace_xfs_collapse_file_space(ip); - start_fsb = XFS_B_TO_FSB(mp, offset + len); + next_fsb = XFS_B_TO_FSB(mp, offset + len); shift_fsb = XFS_B_TO_FSB(mp, len); /* @@ -1525,10 +1525,10 @@ 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, - shift_fsb, ¤t_ext, - &first_block, &free_list, - XFS_BMAP_MAX_SHIFT_EXTENTS); + start_fsb = next_fsb; + error = xfs_bmap_shift_extents(tp, ip, start_fsb, shift_fsb, + &done, &next_fsb, &first_block, &free_list, + XFS_BMAP_MAX_SHIFT_EXTENTS); if (error) goto out; -- 1.8.3.1 From david@fromorbit.com Fri Aug 29 18:45: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 758C47FA5 for ; Fri, 29 Aug 2014 18:45:15 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay3.corp.sgi.com (Postfix) with ESMTP id E8DF6AC006 for ; Fri, 29 Aug 2014 16:45:11 -0700 (PDT) X-ASG-Debug-ID: 1409355908-04cbb05487913ee0001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id O77ooXY8HEBXBY4U for ; Fri, 29 Aug 2014 16:45: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: AkwRALIPAVR5LDJ8PGdsb2JhbABbgw2BKoIshQenVgEBAQEGmj6FbwGBEhcFAQEBATg2hAMBAQQBMgEjIwULCAMYCSUPBSUDBxoTG4gfB70FARcYhWSEA4UESQeDL4EdBZxbmRErL4EHgUgBAQE Received: from ppp121-44-50-124.lns20.syd6.internode.on.net (HELO dastard) ([121.44.50.124]) by ipmail05.adl6.internode.on.net with ESMTP; 30 Aug 2014 09:15:07 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1XNVqr-0005JB-3S; Sat, 30 Aug 2014 09:45:05 +1000 Date: Sat, 30 Aug 2014 09:45:05 +1000 From: Dave Chinner To: Greg Freemyer Cc: Stefan Ring , Xfs , weber@zbfmail.de Subject: Re: mount options question Message-ID: <20140829234505.GE20518@dastard> X-ASG-Orig-Subj: Re: mount options question References: <3dc9caf6f9b415f6e4c0ebac1f1626d3@zbfmail.de> <20140827230732.GN20518@dastard> <20140829083738.GD20518@dastard> <6306cfa5-457d-4794-8fc0-1768f7f1deec@email.android.com> MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <6306cfa5-457d-4794-8fc0-1768f7f1deec@email.android.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: 1409355909 X-Barracuda-URL: http://192.48.176.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.8969 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Fri, Aug 29, 2014 at 07:26:59AM -0400, Greg Freemyer wrote: > > > On August 29, 2014 4:37:38 AM EDT, Dave Chinner wrote: > >On Fri, Aug 29, 2014 at 08:31:43AM +0200, Stefan Ring wrote: > >> On Thu, Aug 28, 2014 at 1:07 AM, Dave Chinner > >wrote: > >> > On Wed, Aug 27, 2014 at 12:14:21PM +0200, Marko Weber|8000 wrote: > >> >> > >> >> sorry dave and all other, > >> >> > >> >> can you guys recommend me the most stable / best mount options for > >> >> my new server with ssd´s and XFS filesystem? > >> >> > >> >> at moment i would set: > >defaults,nobarrier,discard,logbsize=256k,noikeep > >> >> or is just "default" the best solution and xfs detect itself whats > >best. > >> >> > >> >> can you guide me a bit? > >> >> > >> >> as eleavtor i set elevator=noop > >> >> > >> >> i setup disks with linux softraid raid1. On top of the raid is LVM > >> >> (for some data partations). > >> >> > >> >> > >> >> would be nice to hear some tipps from you > >> > > >> > Unless you have specific requirements or have the knowledge to > >> > understand how the different options affect behaviour, then just > >use > >> > the defaults. > >> > >> Mostly agreed, but using "discard" would be a no-brainer for me. I > >> suppose XFS does not automatically switch it on for non-rotational > >> storage. > > > >Yup, you're not using your brain. :P > > > >mount -o discard *sucks* on so many levels it is not funny. I don't > >recommend that anybody *ever* use it, on XFS, ext4 or btrfs. Just > >use fstrim if you ever need to clean up a SSD. > > In particular trim is a synchronous command in many SSDs, I don't > know about the impact on the kernel block stack. blkdev_issue_discard() is synchronous as well, which is a big problem for something that needs to iterate (potentially) thousands of regions for discard when a journal checkpoint completes.... > For the SSD > itself that means the SSDs basically flush their write cache on > every trim call. Oh, it's worse than that, usually. TRIM is one of the slowest operations you can run on many drives, so it can take hundreds of milliseconds to execute.... > I often tell people to do performance testing with and without it > and report back to me if they see no degradation caused by -o > discard. To date no one has ever reported back. I think -o > discard should have never been introduced and certainly not 5 > years ago. It was introduced into XFS as a checkbox feature. We resisted as long as we could, but too many people were shouting at us that we needed realtime discard because ext4 and btrfs had it. Of course, all those people shouting for it realised that we were right in that it sucked the moment they tried to use it and found that performance was woeful. Not to mention that SSD trim implementations were so bad that they caused random data corruption by trimming the wrong regions, drives would simply hang randomly and in a couple of cases too many trims too fast would brick them... So, yeah, it was implement because lots of people demanded it, not because it was a good idea. > In theory, SSDs that handle trim as a asynchronous > command are now available, but I don't know any specifics. Requires SATA 3.1 for the queued TRIM, and I'm not sure that there is any hardware out there that uses this end-to-end yet. And the block layer can't make use of it yet, either... > In any case, fstrim works for almost all workloads and doesn't > have the potential continuous negative impact of -o discard. Precisely my point - you just gave some more detail. :) Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Fri Aug 29 18:55: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 8917C7FAD for ; Fri, 29 Aug 2014 18:55:46 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id 5B2C2304066 for ; Fri, 29 Aug 2014 16:55:46 -0700 (PDT) X-ASG-Debug-ID: 1409356540-04bdf010a161dbc0001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id Sps1PqFmVaENtIse for ; Fri, 29 Aug 2014 16:55:40 -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: AkwRAC4SAVR5LDJ8PGdsb2JhbABRCoMNgSqCLIUHp1YBAQEBBpo+hW8BgRIXBQEBAQE4NoQDAQEBAwE6HCMFCwgDGAklDwUlAwcaE4g6B70BARcYhWSIdAUOSQeDL4EdBZxbmRErL4EHgUgBAQE Received: from ppp121-44-50-124.lns20.syd6.internode.on.net (HELO dastard) ([121.44.50.124]) by ipmail05.adl6.internode.on.net with ESMTP; 30 Aug 2014 09:25:39 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1XNW14-0005KI-Ie; Sat, 30 Aug 2014 09:55:38 +1000 Date: Sat, 30 Aug 2014 09:55:38 +1000 From: Dave Chinner To: Stan Hoeppner Cc: xfs@oss.sgi.com Subject: Re: storage, libaio, or XFS problem? 3.4.26 Message-ID: <20140829235538.GF20518@dastard> X-ASG-Orig-Subj: Re: storage, libaio, or XFS problem? 3.4.26 References: <3fe8c34c0ccbbd720015d273fa2b8b30@localhost> <20140826075345.GJ20518@dastard> <8c29baf987467a84f0b7c1d09c863662@localhost> <20140828003226.GO20518@dastard> <7f9e5aef187b44e899077467aeb0809d@localhost> <20140828230817.GU20518@dastard> <2d2ce7bb38c00a7d35f4a324f6a36cbb@localhost> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <2d2ce7bb38c00a7d35f4a324f6a36cbb@localhost> 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: 1409356540 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-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.8970 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC5_SA210e Custom Rule SA210e On Fri, Aug 29, 2014 at 11:38:16AM -0500, Stan Hoeppner wrote: > On Fri, 29 Aug 2014 09:08:17 +1000, Dave Chinner > wrote: > > On Thu, Aug 28, 2014 at 05:31:33PM -0500, Stan Hoeppner wrote: > >> On Thu, 28 Aug 2014 10:32:27 +1000, Dave Chinner > >> wrote: > >> > On Tue, Aug 26, 2014 at 12:19:43PM -0500, Stan Hoeppner wrote: > >> >> Aug 25 23:05:39 Anguish-ssu-1 kernel: [22409.328839] XFS (sdd): > >> >> xfs_do_force_shutdown(0x8) called from line 3732 of file > >> >> fs/xfs/xfs_bmap.c. > >> >> Return address = 0xffffffffa01cc9a6 > >> > > >> > Yup, that's kinda important. That's from xfs_bmap_finish(), and > >> > freeing an extent has failed and triggered SHUTDOWN_CORRUPT_INCORE > >> > which it's found some kind of inconsistency in the free space > >> > btrees. So, likely the same problem that caused EFI recovery to fail > >> > on the other volume. > >> > > >> > Are the tests being run on newly made filesystems? If not, have > >> > these filesystems had xfs_repair run on them after a failure? If > >> > so, what is the error that is fixed? If not, does repairing the > >> > filesystem make the problem go away? > >> > >> Newly made after every error of any kind, whether app, XFS shutdown, > call > >> trace, etc. I've not attempted xfs_repair. > > > > Please do. > > Another storage crash yesterday. xfs_repair output inline below for the 7 > filesystems. I'm also pasting the dmesg output. This time there is no > oops, no call traces. The filesystems mounted fine after mounting, > replaying, and repairing. Ok, what version of xfs_repair did you use? > > The bug? The bleeding edge storage arrays being used had had a > > firmware bug in it. When the number of outstanding IOs hit the > > *array controller* command tag queue depth limit (some several > > thousand simultaneous IOs in flight) it would occasionally misdirect > > a single write IO to the *wrong lun*. i.e. it would misdirect a > > write. > > > > It was only under *extreme* loads that this would happen, and it's > > this sort of load that AIO+DIO can easily generate - you can have > > several thousand IOs in flight without too much hassle, and that > > will hit limits in the storage arrays that aren't often hit. Array > > controller CTQ depth limits are a good example of a limit that > > normal IO won't go near to stressing. > > I hadn't considered that up to this point. That is *very* insightful, and > applicable, since we are dealing with a beta storage array and firmware. > Worth mentioning is that the storage vendor has added a custom routine > which expends Herculean effort to identify full stripes before writeback. Hmmmm. Food for thought, especially as it is evident that the storage array appears to be crashing completely. At this point, I'd say the burden of finding a corruption needs to start with proving that the array is has not done something wrong. Once you know that what is on disk is exactly what the filesystem asked to be written, then you can start to isolate filesystem issues. But you need the storage to be solid and trust-worthy before going looking for filesystem problems.... > This because some of our writes for a given low rate stream are as low as > 32KB and may be 2-3 seconds apart. With a 64-128KB chunk, 768 to 1536KB > stripe width, we'd get massive RMW without this feature. Testing thus far > shows it is fairly effective, though we still get pretty serious RMW due to > the fact we're writing 350 of these small streams per array at ~72 KB/s > max, along with 2 streams at ~48 MB/s, and and 50 streams at ~1.2 MB/s. > Multiply this by 7 LUNs per controller and it becomes clear we're putting a > pretty serious load on the firmware and cache. Yup, so having the array cache do the equivalent of sequential readahead multi-stream detection for writeback would make a big difference. But not simple to do.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Fri Aug 29 19: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 (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 93AFA7FAF for ; Fri, 29 Aug 2014 19:05:55 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 21A17AC001 for ; Fri, 29 Aug 2014 17:05:51 -0700 (PDT) X-ASG-Debug-ID: 1409357149-04cb6c54fd6877c0001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id 4wgSd8smx6vkSpAJ for ; Fri, 29 Aug 2014 17:05: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: AkwRAF4UAVR5LDJ8PGdsb2JhbABbgw2BKoIshQenVgEBAQEGmj6FbwGBEhcFAQEBATg2hAMBAQQBOhwjBQsIAw4KCSUPBSUDBxoTiDoHvH8BFxiFZIlQB4RMBY8djT6MHoxzKy+CTwEBAQ Received: from ppp121-44-50-124.lns20.syd6.internode.on.net (HELO dastard) ([121.44.50.124]) by ipmail05.adl6.internode.on.net with ESMTP; 30 Aug 2014 09:35:48 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1XNWAt-0005MK-NS; Sat, 30 Aug 2014 10:05:47 +1000 Date: Sat, 30 Aug 2014 10:05:47 +1000 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com Subject: Re: [PATCH 6/9] xfs: kill xfs_bioerror_relse Message-ID: <20140830000547.GG20518@dastard> X-ASG-Orig-Subj: Re: [PATCH 6/9] xfs: kill xfs_bioerror_relse References: <1408084747-4540-1-git-send-email-david@fromorbit.com> <1408084747-4540-7-git-send-email-david@fromorbit.com> <20140829003257.GF17502@infradead.org> <20140829011236.GB20518@dastard> <20140829182610.GA28670@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20140829182610.GA28670@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: 1409357149 X-Barracuda-URL: http://192.48.176.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.8969 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Fri, Aug 29, 2014 at 11:26:10AM -0700, Christoph Hellwig wrote: > On Fri, Aug 29, 2014 at 11:12:36AM +1000, Dave Chinner wrote: > > > This is a large change of behavior as it doesn't hit the error > > > path after the xfs_buf_iowait anymore. While I don't think that > > > that path was entirely correct this version seems to be even less so > > > by not releasing the buffer reference or forcing the shutdown. > > > > The IO is synchronous, so the previous behaviour did not release > > the buffer here. But, yes, it needs to because we're not running the > > io wait on it anymore. And this happens only during a shutdown, so i > > don't see any need to trigger a shutdown ;) > > > > As it is, I think this gets properly fixed by the next patch.... > > Do you have any scenario that might actually exercise this path? I > enabled xfs_trans_read_buf_io trace events and run xfstests as well > as a few other workloads and couldn't hit it at all. And when you > think of it: when would be do a trans_get_buf, then not actually > updating it with data and then recurse into a trans_read_buf in > the same transaction? *nod*. This path has been there is the Irix days, and I suspect that it was there to handle some wierd corner case to do with async buffer reads which IIRC, could once be done through this code... > Maybe it's just time do a bit more of an audit and put this whole > code path to rest. Perhaps so. Cheers, Dave. -- Dave Chinner david@fromorbit.com From stan@hardwarefreak.com Fri Aug 29 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 C12367FB2 for ; Fri, 29 Aug 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 B080F8F8037 for ; Fri, 29 Aug 2014 19:55:58 -0700 (PDT) X-ASG-Debug-ID: 1409367354-04cb6c550068de10001-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 qTtvpr08kHkNU6S3 for ; Fri, 29 Aug 2014 19:55:54 -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: by greer.hardwarefreak.com (Postfix, from userid 33) id EE7726C192; Fri, 29 Aug 2014 21:55:53 -0500 (CDT) To: Dave Chinner Subject: Re: storage, libaio, or XFS =?UTF-8?Q?problem=3F=20=20=33=2E=34=2E=32=36?= X-PHP-Originating-Script: 0:func.inc X-ASG-Orig-Subj: Re: storage, libaio, or XFS =?UTF-8?Q?problem=3F=20=20=33=2E=34=2E=32=36?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Date: Fri, 29 Aug 2014 21:55:53 -0500 From: Stan Hoeppner Cc: In-Reply-To: <20140829235538.GF20518@dastard> References: <3fe8c34c0ccbbd720015d273fa2b8b30@localhost> <20140826075345.GJ20518@dastard> <8c29baf987467a84f0b7c1d09c863662@localhost> <20140828003226.GO20518@dastard> <7f9e5aef187b44e899077467aeb0809d@localhost> <20140828230817.GU20518@dastard> <2d2ce7bb38c00a7d35f4a324f6a36cbb@localhost> <20140829235538.GF20518@dastard> Message-ID: X-Sender: stan@hardwarefreak.com User-Agent: RoundCube Webmail/0.3.1 X-Barracuda-Connect: mo-65-41-216-221.sta.embarqhsd.net[65.41.216.221] X-Barracuda-Start-Time: 1409367354 X-Barracuda-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, 30 Aug 2014 09:55:38 +1000, Dave Chinner wrote: > On Fri, Aug 29, 2014 at 11:38:16AM -0500, Stan Hoeppner wrote: >> On Fri, 29 Aug 2014 09:08:17 +1000, Dave Chinner >> wrote: >> > On Thu, Aug 28, 2014 at 05:31:33PM -0500, Stan Hoeppner wrote: >> >> On Thu, 28 Aug 2014 10:32:27 +1000, Dave Chinner >> >> wrote: >> >> > On Tue, Aug 26, 2014 at 12:19:43PM -0500, Stan Hoeppner wrote: >> >> >> Aug 25 23:05:39 Anguish-ssu-1 kernel: [22409.328839] XFS (sdd): >> >> >> xfs_do_force_shutdown(0x8) called from line 3732 of file >> >> >> fs/xfs/xfs_bmap.c. >> >> >> Return address = 0xffffffffa01cc9a6 >> >> > >> >> > Yup, that's kinda important. That's from xfs_bmap_finish(), and >> >> > freeing an extent has failed and triggered SHUTDOWN_CORRUPT_INCORE >> >> > which it's found some kind of inconsistency in the free space >> >> > btrees. So, likely the same problem that caused EFI recovery to fail >> >> > on the other volume. >> >> > >> >> > Are the tests being run on newly made filesystems? If not, have >> >> > these filesystems had xfs_repair run on them after a failure? If >> >> > so, what is the error that is fixed? If not, does repairing the >> >> > filesystem make the problem go away? >> >> >> >> Newly made after every error of any kind, whether app, XFS shutdown, >> call >> >> trace, etc. I've not attempted xfs_repair. >> > >> > Please do. >> >> Another storage crash yesterday. xfs_repair output inline below for the >> 7 >> filesystems. I'm also pasting the dmesg output. This time there is no >> oops, no call traces. The filesystems mounted fine after mounting, >> replaying, and repairing. > > Ok, what version of xfs_repair did you use? 3.1.4 which is a little long in the tooth. I believe they built the OS image from Squeeze 6.0. I was originally told it was Wheezy 7.0, but that turns out to have been false. >> > The bug? The bleeding edge storage arrays being used had had a >> > firmware bug in it. When the number of outstanding IOs hit the >> > *array controller* command tag queue depth limit (some several >> > thousand simultaneous IOs in flight) it would occasionally misdirect >> > a single write IO to the *wrong lun*. i.e. it would misdirect a >> > write. >> > >> > It was only under *extreme* loads that this would happen, and it's >> > this sort of load that AIO+DIO can easily generate - you can have >> > several thousand IOs in flight without too much hassle, and that >> > will hit limits in the storage arrays that aren't often hit. Array >> > controller CTQ depth limits are a good example of a limit that >> > normal IO won't go near to stressing. >> >> I hadn't considered that up to this point. That is *very* insightful, >> and >> applicable, since we are dealing with a beta storage array and firmware. >> Worth mentioning is that the storage vendor has added a custom routine >> which expends Herculean effort to identify full stripes before >> writeback. > > Hmmmm. Food for thought, especially as it is evident that the > storage array appears to be crashing completely. At this point, > I'd say the burden of finding a corruption needs to start with > proving that the array is has not done something wrong. Once you > know that what is on disk is exactly what the filesystem asked to be > written, then you can start to isolate filesystem issues. But you > need the storage to be solid and trust-worthy before going looking > for filesystem problems.... Agreed. Which is why I put storage first in the subject, AIO second, and XFS third. My initial instinct was a problem with libaio, as the crashes only surfaced writing with AIO. I'm now seeing problems with storage on both systems when not using AIO. We're supposed to receive a new firmware upload next week, so hopefully that will fix some of these issues. >> This because some of our writes for a given low rate stream are as low as >> 32KB and may be 2-3 seconds apart. With a 64-128KB chunk, 768 to 1536KB >> stripe width, we'd get massive RMW without this feature. Testing thus >> far >> shows it is fairly effective, though we still get pretty serious RMW due >> to >> the fact we're writing 350 of these small streams per array at ~72 KB/s >> max, along with 2 streams at ~48 MB/s, and and 50 streams at ~1.2 MB/s. >> Multiply this by 7 LUNs per controller and it becomes clear we're >> putting a >> pretty serious load on the firmware and cache. > > Yup, so having the array cache do the equivalent of sequential > readahead multi-stream detection for writeback would make a big > difference. But not simple to do.... Not at all, especially with only 3 GB of RAM to work with, as I'm told. Seems low for a high end controller with 4x 12G SAS ports. We're only able to achieve ~250 MB/s per array at the application due to the access pattern being essentially random, and still with a serious quantity of RMWs. Which is why we're going to test with an even smaller chunk of 32KB. I believe that's the lower bound on these controllers. For this workload 16KB or maybe even 8KB would likely be more optimal. We're also going to test with bcache and a 400 GB Intel 3700 (datacenter grade) SSD backing two LUNs. But with bcache chunk size should be far less relevant. I'm anxious to kick those tires, but it'll be a couple of weeks. Have you played with bcache yet? -- Stan From greg.freemyer@gmail.com Fri Aug 29 22:44: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=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 9964B7FB5 for ; Fri, 29 Aug 2014 22:44:11 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay3.corp.sgi.com (Postfix) with ESMTP id 3672BAC001 for ; Fri, 29 Aug 2014 20:44:08 -0700 (PDT) X-ASG-Debug-ID: 1409370245-04bdf010a1626540001-NocioJ Received: from mail-we0-f169.google.com (mail-we0-f169.google.com [74.125.82.169]) by cuda.sgi.com with ESMTP id zezOANUgOV8iNfyx (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Fri, 29 Aug 2014 20:44:06 -0700 (PDT) X-Barracuda-Envelope-From: greg.freemyer@gmail.com X-Barracuda-Apparent-Source-IP: 74.125.82.169 Received: by mail-we0-f169.google.com with SMTP id k48so2968901wev.14 for ; Fri, 29 Aug 2014 20:44:05 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:in-reply-to:references:from:date:message-id:subject:to :cc:content-type:content-transfer-encoding; bh=qaDuh7uTK2RtjS+0S6AoUhoR/G+SdTaxMIcRmiOnRug=; b=zTfszGOmmdhGinrqnErqs5aWmj6R5m9Lss/ld2fsXYf4rn/qFYCgiI3oQAGaJMzte5 MoqsG5lbHuDcNLm3B0jp7VqfgcO9GecnF6637vVaBHl7kstLhO+M3qvb7ZiRy6X5VYPR XvJdicTeAXhSCiH7QVW9qrOQVv4Th92at6zqgc7znEjsguShPfT5HN6jjiKJS30b6n/T YgiI0Cvnr0GfTxtxafOmm2o3F0winGUX1DD0fokADcYseOWrKjyno2HstkJb1KRCcWO9 LC3RO1nQa37LJBuPMfny7C0qmCbKdGI2K4WWULKIORQWRNS5hEcafHIIiXEk2qdIqiNg 4hiQ== X-Received: by 10.194.58.83 with SMTP id o19mr18245236wjq.20.1409370245461; Fri, 29 Aug 2014 20:44:05 -0700 (PDT) MIME-Version: 1.0 Received: by 10.180.10.73 with HTTP; Fri, 29 Aug 2014 20:43:25 -0700 (PDT) In-Reply-To: <20140829234505.GE20518@dastard> References: <3dc9caf6f9b415f6e4c0ebac1f1626d3@zbfmail.de> <20140827230732.GN20518@dastard> <20140829083738.GD20518@dastard> <6306cfa5-457d-4794-8fc0-1768f7f1deec@email.android.com> <20140829234505.GE20518@dastard> From: Greg Freemyer Date: Fri, 29 Aug 2014 23:43:25 -0400 Message-ID: Subject: Re: mount options question To: Dave Chinner X-ASG-Orig-Subj: Re: mount options question Cc: Stefan Ring , Xfs , "Johannes B. Kernel" Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable X-Barracuda-Connect: mail-we0-f169.google.com[74.125.82.169] X-Barracuda-Start-Time: 1409370246 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.8976 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, Aug 29, 2014 at 7:45 PM, Dave Chinner wrote: > On Fri, Aug 29, 2014 at 07:26:59AM -0400, Greg Freemyer wrote: >> >> >> On August 29, 2014 4:37:38 AM EDT, Dave Chinner wr= ote: >> >On Fri, Aug 29, 2014 at 08:31:43AM +0200, Stefan Ring wrote: >> >> On Thu, Aug 28, 2014 at 1:07 AM, Dave Chinner >> >wrote: >> >> > On Wed, Aug 27, 2014 at 12:14:21PM +0200, Marko Weber|8000 wrote: >> >> >> >> >> >> sorry dave and all other, >> >> >> >> >> >> can you guys recommend me the most stable / best mount options for >> >> >> my new server with ssd=E6=84=80 and XFS filesystem? >> >> >> >> >> >> at moment i would set: >> >defaults,nobarrier,discard,logbsize=3D256k,noikeep >> >> >> or is just "default" the best solution and xfs detect itself whats >> >best. >> >> >> >> >> >> can you guide me a bit? >> >> >> >> >> >> as eleavtor i set elevator=3Dnoop >> >> >> >> >> >> i setup disks with linux softraid raid1. On top of the raid is LVM >> >> >> (for some data partations). >> >> >> >> >> >> >> >> >> would be nice to hear some tipps from you >> >> > >> >> > Unless you have specific requirements or have the knowledge to >> >> > understand how the different options affect behaviour, then just >> >use >> >> > the defaults. >> >> >> >> Mostly agreed, but using "discard" would be a no-brainer for me. I >> >> suppose XFS does not automatically switch it on for non-rotational >> >> storage. >> > >> >Yup, you're not using your brain. :P >> > >> >mount -o discard *sucks* on so many levels it is not funny. I don't >> >recommend that anybody *ever* use it, on XFS, ext4 or btrfs. Just >> >use fstrim if you ever need to clean up a SSD. >> > >> In particular trim is a synchronous command in many SSDs, I don't >> know about the impact on the kernel block stack. > > blkdev_issue_discard() is synchronous as well, which is a big > problem for something that needs to iterate (potentially) thousands > of regions for discard when a journal checkpoint completes.... > >> For the SSD >> itself that means the SSDs basically flush their write cache on >> every trim call. > > Oh, it's worse than that, usually. TRIM is one of the slowest > operations you can run on many drives, so it can take hundreds of > milliseconds to execute.... > >> I often tell people to do performance testing with and without it >> and report back to me if they see no degradation caused by -o >> discard. To date no one has ever reported back. I think -o >> discard should have never been introduced and certainly not 5 >> years ago. > > It was introduced into XFS as a checkbox feature. We resisted as > long as we could, but too many people were shouting at us that we > needed realtime discard because ext4 and btrfs had it. Of course, > all those people shouting for it realised that we were right in that > it sucked the moment they tried to use it and found that performance > was woeful. Not to mention that SSD trim implementations were so bad > that they caused random data corruption by trimming the wrong > regions, drives would simply hang randomly and in a couple of cases > too many trims too fast would brick them... > > So, yeah, it was implement because lots of people demanded it, not > because it was a good idea. > >> In theory, SSDs that handle trim as a asynchronous >> command are now available, but I don't know any specifics. > > Requires SATA 3.1 for the queued TRIM, and I'm not sure that there > is any hardware out there that uses this end-to-end yet. And the > block layer can't make use of it yet, either... > >> In any case, fstrim works for almost all workloads and doesn't >> have the potential continuous negative impact of -o discard. > > Precisely my point - you just gave some more detail. :) > Yes, I was only attempting to elaborate on your answer, but thanks for elaborating on mine. Greg From bounce@client11.emailgun.biz Sat Aug 30 02:24: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=2.0 required=5.0 tests=DATE_IN_PAST_24_48, HTML_MESSAGE,NORMAL_HTTP_TO_IP,PLING_QUERY 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 9053D7FB7 for ; Sat, 30 Aug 2014 02:24:20 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 00DD9AC001 for ; Sat, 30 Aug 2014 00:24:16 -0700 (PDT) X-ASG-Debug-ID: 1409383452-04cb6c5500695ff0001-NocioJ Received: from server11.emailgun.biz (server11.emailgun.biz [23.239.19.58]) by cuda.sgi.com with ESMTP id INiqGAGufXZbaPaW (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Sat, 30 Aug 2014 00:24:12 -0700 (PDT) X-Barracuda-Envelope-From: bounce@client11.emailgun.biz X-Barracuda-Apparent-Source-IP: 23.239.19.58 Received: from client11 by server11.emailgun.biz with local (Exim 4.82) (envelope-from ) id 1XNd1A-0006Cl-1o for xfs@oss.sgi.com; Sat, 30 Aug 2014 07:24:12 +0000 To: xfs@oss.sgi.com Subject: Not planned holidays yet? Plan now & get best travel deals !!! Message-ID: X-ASG-Orig-Subj: Not planned holidays yet? Plan now & get best travel deals !!! Date: Fri, 29 Aug 2014 06:52:09 +0000 From: "Peehu Sharma" Reply-To: noreply@client11.emailgun.biz MIME-Version: 1.0 X-Mailer-LID: 13 List-Unsubscribe: X-Mailer-SID: 22 X-Mailer-Sent-By: 1 Content-Type: multipart/alternative; charset="UTF-8"; boundary="b1_e37c54b754c1d2f17eb6ac4cfceb5b82" Content-Transfer-Encoding: 8bit X-AntiAbuse: This header was added to track abuse, please include it with any abuse report X-AntiAbuse: Primary Hostname - server11.emailgun.biz X-AntiAbuse: Original Domain - oss.sgi.com X-AntiAbuse: Originator/Caller UID/GID - [501 512] / [47 12] X-AntiAbuse: Sender Address Domain - client11.emailgun.biz X-Get-Message-Sender-Via: server11.emailgun.biz: authenticated_id: client11/from_h X-Barracuda-Connect: server11.emailgun.biz[23.239.19.58] X-Barracuda-Start-Time: 1409383452 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.29 X-Barracuda-Spam-Status: No, SCORE=2.29 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DATE_IN_PAST_24_48, DATE_IN_PAST_24_48_2, HTML_MESSAGE, NORMAL_HTTP_TO_IP, PLING_PLING, PLING_QUERY X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.8982 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.01 DATE_IN_PAST_24_48 Date: is 24 to 48 hours before Received: date 0.00 NORMAL_HTTP_TO_IP URI: Uses a dotted-decimal IP address in URL 0.00 HTML_MESSAGE BODY: HTML included in message 1.33 PLING_QUERY Subject has exclamation mark and question mark 0.46 PLING_PLING Subject has lots of exclamation marks 0.48 DATE_IN_PAST_24_48_2 DATE_IN_PAST_24_48_2 --b1_e37c54b754c1d2f17eb6ac4cfceb5b82 Content-Type: text/plain; format=flowed; charset="UTF-8" Content-Transfer-Encoding: 8bit Your email client cannot read this email. To view it online, please go here: http://23.239.19.58/~client11/display.php?M=3256522&C=6d8ce6b3c2277ee07d66212c98d7ccdb&S=22&L=13&N=1 To stop receiving these emails:http://23.239.19.58/~client11/unsubscribe.php?M=3256522&C=6d8ce6b3c2277ee07d66212c98d7ccdb&L=13&N=22 --b1_e37c54b754c1d2f17eb6ac4cfceb5b82 Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: 8bit
Holiday Trip Planning
Andaman Tour
 
VISIT TOP DESTINATIONS in INDIA
 

Ladakh

Ladakh
Nubra Valley | Leh | Thiksey | Mankorma
5 Night 6 Days
PLAN NOW

North East

North East
Darjeeling | Gangtok | Sikkim | Bagdogra
4 Night 5 Days
PLAN NOW
 

Kashmir

Kashmir
Gulmarg | Pahalgam | Sonmarg | Dal Lake
3 Night 4 Days
PLAN NOW

Kerala

Kerala
Kovalam | Kumarakom | Kochi | Munnar
4 Night 5 Days
PLAN NOW
 

Unsubscribe me from this list
--b1_e37c54b754c1d2f17eb6ac4cfceb5b82-- From samuel.granjeaud@inserm.fr Sat Aug 30 14:33: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 B9B6D7FBA for ; Sat, 30 Aug 2014 14:33:54 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay1.corp.sgi.com (Postfix) with ESMTP id 9CE8E8F8037 for ; Sat, 30 Aug 2014 12:33:54 -0700 (PDT) X-ASG-Debug-ID: 1409427228-04cb6c54ff6b5110001-NocioJ Received: from smtpi.inserm.fr (smtpi.inserm.fr [195.98.252.11]) by cuda.sgi.com with ESMTP id MWdYGKXfOMAF9cfR (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Sat, 30 Aug 2014 12:33:49 -0700 (PDT) X-Barracuda-Envelope-From: samuel.granjeaud@inserm.fr X-Barracuda-Apparent-Source-IP: 195.98.252.11 Received: from localhost (localhost.localdomain [127.0.0.1]) by smtpi.inserm.fr (SrvInserm) with ESMTP id 13C6016835C for ; Sat, 30 Aug 2014 21:33:48 +0200 (CEST) X-Virus-Scanned: amavisd-new at inserm.fr Received: from smtpi.inserm.fr ([195.98.252.11]) by localhost (potentille.inserm.fr [127.0.0.1]) (amavisd-new, port 10033) with ESMTP id 7Ot9V8p9BLwa for ; Sat, 30 Aug 2014 21:33:48 +0200 (CEST) Received: from lavande.inserm.fr (lavande.inserm.fr [192.168.20.4]) (using TLSv1 with cipher ADH-AES256-SHA (256/256 bits)) (No client certificate requested) by smtpi.inserm.fr (SrvInserm) with ESMTP id 00462168267 for ; Sat, 30 Aug 2014 21:33:47 +0200 (CEST) Received: from zamia1.inserm.fr (zamia1.inserm.fr [192.168.19.93]) by lavande.inserm.fr (Postfix) with ESMTP id EC0518F74D for ; Sat, 30 Aug 2014 21:33:47 +0200 (CEST) Received: from webmail.inserm.fr (localhost.localdomain [127.0.0.1]) by zamia1.inserm.fr (Postfix) with ESMTP id DFAAB27D850 for ; Sat, 30 Aug 2014 21:33:46 +0200 (CEST) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit Date: Sat, 30 Aug 2014 21:33:46 +0200 From: Samuel GRANJEAUD IR/INSERM To: xfs@oss.sgi.com Subject: Re: Run out of =?UTF-8?Q?inodes=3F?= In-Reply-To: <54009603.9050404@sandeen.net> X-ASG-Orig-Subj: Re: Run out of =?UTF-8?Q?inodes=3F?= References: <54005108.1020203@inserm.fr> <20140829114806.GA17610@bfoster.bfoster> <5400802C.5050005@inserm.fr> <54009603.9050404@sandeen.net> Message-ID: <8d5fff2548d35737c6cebcb1f6382e80@inserm.fr> X-Sender: samuel.granjeaud@inserm.fr User-Agent: Roundcube Webmail/0.9.5 X-Barracuda-Connect: smtpi.inserm.fr[195.98.252.11] X-Barracuda-Start-Time: 1409427229 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=BSF_SC0_SA085 X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.8998 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 BSF_SC0_SA085 Custom Rule SA085 Enabling the inode64 option has solved the problem. Final question: could some issues appear with SAMBA? # smbstatus -V Version 3.4.5 # xfs_info -V /dev/vg1_backup/backup xfs_info version 2.6.25 # uname -a Linux 2.6.26.8-1.0.11.smp.gcc3.4.x86_64 #1 SMP Sun Jan 11 02:42:55 GMT 2009 x86_64 x86_64 x86_64 GNU/Linux Thanks for your expert help. Best regards, Samuel On 29-08-2014 17:02, Eric Sandeen wrote: > > You'll want to be using the inode64 mount option for this filesystem; > I'm surprised the openfiler folks didn't do this by default. > > http://xfs.org/index.php/XFS_FAQ#Q:_What_is_the_inode64_mount_option_for.3F > > add it to fstab for this filesystem, reboot the box (or unmount/mount > the filesystem) and all should be well. > > -Eric From sandeen@sandeen.net Sat Aug 30 21:46: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.0 required=5.0 tests=none autolearn=ham version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 81CBD7F69 for ; Sat, 30 Aug 2014 21:46:27 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id 0EB03AC003 for ; Sat, 30 Aug 2014 19:46:26 -0700 (PDT) X-ASG-Debug-ID: 1409453184-04cb6c54ff6c3c40001-NocioJ Received: from sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id JsJKNKPCtM5dHzD7 for ; Sat, 30 Aug 2014 19:46: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 191B7600024F; Sat, 30 Aug 2014 21:46:24 -0500 (CDT) Message-ID: <54028C7F.4040706@sandeen.net> Date: Sat, 30 Aug 2014 21:46:23 -0500 From: Eric Sandeen MIME-Version: 1.0 To: Samuel GRANJEAUD IR/INSERM , xfs@oss.sgi.com Subject: Re: Run out of inodes? References: <54005108.1020203@inserm.fr> <20140829114806.GA17610@bfoster.bfoster> <5400802C.5050005@inserm.fr> <54009603.9050404@sandeen.net> <8d5fff2548d35737c6cebcb1f6382e80@inserm.fr> X-ASG-Orig-Subj: Re: Run out of inodes? In-Reply-To: <8d5fff2548d35737c6cebcb1f6382e80@inserm.fr> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1409453184 X-Barracuda-URL: http://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: fmeh.org X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.9008 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 8/30/14, 2:33 PM, Samuel GRANJEAUD IR/INSERM wrote: > Enabling the inode64 option has solved the problem. > > Final question: could some issues appear with SAMBA? ah, what sort of issues? Any application which uses i.e. a 32-bit stat() interface will return -EOVERFLOW on a 64-bit inode. http://sandeen.net/wordpress/computers/the-world-wants-32-bit-inodes/ http://blog.fmeh.org/2013/05/11/does-the-world-need-32-bit-inodes/ -Eric From root@krios.tbi.univie.ac.at Sat Aug 30 23:25: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 0B2067F6D for ; Sat, 30 Aug 2014 23:25:11 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id DF5B58F8033 for ; Sat, 30 Aug 2014 21:25:10 -0700 (PDT) X-ASG-Debug-ID: 1409459105-04bdf01097662490001-NocioJ Received: from krios.tbi.univie.ac.at (krios.tbi.univie.ac.at [131.130.44.60]) by cuda.sgi.com with ESMTP id WjZCHgLITYn8C4dQ for ; Sat, 30 Aug 2014 21:25:06 -0700 (PDT) X-Barracuda-Envelope-From: root@krios.tbi.univie.ac.at X-Barracuda-Apparent-Source-IP: 131.130.44.60 Received: by krios.tbi.univie.ac.at (Postfix) id 206225EF10; Sun, 31 Aug 2014 06:25:03 +0200 (CEST) Delivered-To: root@krios.tbi.univie.ac.at Received: by krios.tbi.univie.ac.at (Postfix, from userid 0) id 128DE5F4C2; Sun, 31 Aug 2014 06:25:03 +0200 (CEST) From: root@krios.tbi.univie.ac.at (Cron Daemon) To: root@krios.tbi.univie.ac.at Subject: Cron test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily ) Content-Type: text/plain; charset=UTF-8 X-ASG-Orig-Subj: Cron test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily ) X-Cron-Env: X-Cron-Env: X-Cron-Env: X-Cron-Env: Message-Id: <20140831042503.128DE5F4C2@krios.tbi.univie.ac.at> Date: Sun, 31 Aug 2014 06:25:03 +0200 (CEST) X-Barracuda-Connect: krios.tbi.univie.ac.at[131.130.44.60] X-Barracuda-Start-Time: 1409459105 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.70 X-Barracuda-Spam-Status: No, SCORE=0.70 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, BSF_SC0_SA_TO_FROM_ADDR_MATCH, PR0N_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.9011 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) 0.50 BSF_SC0_SA_TO_FROM_ADDR_MATCH Sender Address Matches Recipient Address /etc/cron.daily/logrotate: error: error opening /home/git/gitlab/log/application.log: Permission denied error: error opening /home/git/gitlab/log/githost.log: Permission denied error: error opening /home/git/gitlab/log/production.log: Permission denied error: error opening /home/git/gitlab/log/satellites.log: Permission denied error: error opening /home/git/gitlab/log/sidekiq.log: Permission denied error: error opening /home/git/gitlab/log/unicorn.stderr.log: Permission denied error: error opening /home/git/gitlab/log/unicorn.stdout.log: Permission denied error: error opening /home/git/gitlab-shell/gitlab-shell.log: Permission denied run-parts: /etc/cron.daily/logrotate exited with return code 1 From alex@zadarastorage.com Sun Aug 31 03:50: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=1.9 required=5.0 tests=STOX_REPLY_TYPE 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 CCD697F6F for ; Sun, 31 Aug 2014 03:50:42 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay1.corp.sgi.com (Postfix) with ESMTP id BB8778F8039 for ; Sun, 31 Aug 2014 01:50:42 -0700 (PDT) X-ASG-Debug-ID: 1409475036-04cbb054889617a0001-NocioJ Received: from mail-wg0-f46.google.com (mail-wg0-f46.google.com [74.125.82.46]) by cuda.sgi.com with ESMTP id Q4aWcemqKfoWtrTW (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Sun, 31 Aug 2014 01:50:37 -0700 (PDT) X-Barracuda-Envelope-From: alex@zadarastorage.com X-Barracuda-Apparent-Source-IP: 74.125.82.46 Received: by mail-wg0-f46.google.com with SMTP id x13so3983263wgg.5 for ; Sun, 31 Aug 2014 01:50:36 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:message-id:from:to:cc:references:in-reply-to :subject:date:mime-version:content-type:content-transfer-encoding :importance; bh=acnGJ9HvaXiBfQAYdjvBXcCL/zGr7Wnp3Lb34z09hFI=; b=BZnjG+qrswaMMaKeVVqS/LQDn9GpkK32lcua/91i91z5ygnVYgJmuDGO7e3ZP9u3ER OCc2hf4ZAFqfTfUiYeA/UZ0tWsySenz5vMX7pLlIHIy1bRD42ANGGZpcqx0JmwMgyYsA nfGXfvkuxElBoYdqii4wy+DWSEckfkusN/QvFp/cG7K4A5/FbD54klcwVlf3iewklAWn z1mCqImNGShWFcJpdJRW1r/2Ldxqp4L590WIlH+AloYBQEpUfegRYxDxu3U09lMUFFaW JXTnm5OAhRmT6fAoZbKXYPOTBKB7Wj1wDHZgQGPtucR/4n3b9IMLS2suHgNfQr40yu+l k7uw== X-Gm-Message-State: ALoCoQkHmrijLTjuMitRZrKViXUtxAg6gEaYew9lcP8zJpDrm12a7Bi4X19tan2rka330rX8nJ50 X-Received: by 10.180.103.234 with SMTP id fz10mr14627277wib.76.1409475036466; Sun, 31 Aug 2014 01:50:36 -0700 (PDT) Received: from alyakaslap (bzq-169-168-31-234.red.bezeqint.net. [31.168.169.234]) by mx.google.com with ESMTPSA id ba3sm7666639wib.10.2014.08.31.01.50.35 for (version=TLSv1 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Sun, 31 Aug 2014 01:50:36 -0700 (PDT) Message-ID: From: "Alex Lyakas" To: "Brian Foster" Cc: , "Dave Chinner" References: <1408648692-15957-1-git-send-email-bfoster@redhat.com> <20140825142025.GA10135@bfoster.bfoster> In-Reply-To: <20140825142025.GA10135@bfoster.bfoster> Subject: Re: [PATCH] xfs: fix double free of trans in log recovery on I/O error Date: Sun, 31 Aug 2014 11:50:52 +0300 X-ASG-Orig-Subj: Re: [PATCH] xfs: fix double free of trans in log recovery on I/O error MIME-Version: 1.0 Content-Type: text/plain; format=flowed; charset="iso-8859-1"; reply-type=original Content-Transfer-Encoding: 7bit X-Priority: 3 X-MSMail-Priority: Normal Importance: Normal X-Mailer: Microsoft Windows Live Mail 15.4.3555.308 X-MimeOLE: Produced By Microsoft MimeOLE V15.4.3555.308 X-Barracuda-Connect: mail-wg0-f46.google.com[74.125.82.46] X-Barracuda-Start-Time: 1409475037 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, MARKETING_SUBJECT, STOX_REPLY_TYPE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.9017 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 STOX_REPLY_TYPE STOX_REPLY_TYPE 0.60 MARKETING_SUBJECT Subject contains popular marketing words 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header Hi Brian, Dave, I tested this patch on kernel 3.16, top commit: commit 19583ca584d6f574384e17fe7613dfaeadcdc4a6 Author: Linus Torvalds Date: Sun Aug 3 15:25:02 2014 -0700 Linux 3.16 and, yes, it appears to fix the issue. Trouble is that our production kernel is 3.8.13, and we cannot upgrade to mainline kernel easily. Question is whether we can expect some patch suitable for our kernel, or, since our kernel is EOL and not a long-term one, we cannot? Thanks for your help, Alex. -----Original Message----- From: Brian Foster Sent: 25 August, 2014 5:20 PM To: Alex Lyakas Cc: xfs@oss.sgi.com ; Dave Chinner Subject: Re: [PATCH] xfs: fix double free of trans in log recovery on I/O error On Sun, Aug 24, 2014 at 12:20:20PM +0300, Alex Lyakas wrote: > Hi Brian, > > On Thu, Aug 21, 2014 at 10:18 PM, Brian Foster wrote: > > XFS log recovery builds up an xlog_recover object as it passes through > > the log operations on the physical log. These structures are managed via > > a hash table and are allocated when a new transaction is encountered and > > freed once a commit operation for the transaction is encountered. > > > > This state machine for active transactions is implemented by a > > combination of xlog_do_recovery_pass(), which walks through the log > > buffers and xlog_recover_process_data() which processes log operations > > within each buffer. The latter function decides whether to allocate a > > new xlog_recover, add to it or commit and ultimately free it. If an > > error occurs at any point during the lifecycle of a particular > > xlog_recover, xlog_recover_process_data() frees the object and returns > > an error. > > > > xlog_recover_commit_trans() handles the final processing of the > > transaction. It submits whatever I/O is required for the transaction and > > frees xlog_recover object along with the transaction items it tracks. If > > an error occurs at the final stages of the commit operation, such as I/O > > failure, both xlog_recover_commit_trans() and > > xlog_recover_process_data() attempt to free the trans object. > > > > Modify xlog_recover_commit_trans() to only free the trans object on > > successful completion of the trans, including any I/O errors that might > > occur when recovering the log. > > > > Signed-off-by: Brian Foster > > --- > > > > Hi all, > > > > I found that the recent buffer I/O rework fixes didn't address the crash > > reproduced by the dm-flakey/log recovery test case I posted recently. I > > tracked the crash down to this, which allows the test to pass. This > > addresses the crash I saw when running the reproducer manually with the > > metadump that Alex posted as well. > > > > FWIW, I also went back and tested the xfs_buf_iowait() experiment in > > both scenarios (Alex's metadump and xfstests test) and they all > > reproduce the same crash for me. I think that either I'm still not > > reproducing the original problem, something else might have contaminated > > the original xfs_buf_iowait() test to give a false positive, or > > something else entirely is going on. > > > > Alex, > > > > If you have a chance, I think it might be interesting to see whether you > > reproduce any problems with this patch. It looks like this is a > > regression introduced by: > > > > 2a84108f xfs: free the list of recovery items on error > > > > ... but I have no idea if that's in whatever kernel you're running. > I am running kernel 3.8.13 with some changes (published at > https://github.com/zadarastorage/zadara-xfs-pushback), but this > problem also happens on pristine 3.8.13 from > git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git, > branch linux-stable-3.8.y. > > I do not have commit 2a84108f in this kernel. It was introduced in 3.14. > I applied your patch to 3.8.13, but it doesn't fix the issue. Same > problem happens when testing scenario that I described in > http://oss.sgi.com/pipermail/xfs/2014-August/037637.html. > Ok, thanks. Yeah, I don't see the double free regression in the 3.8.13 stable branch. I went back to that kernel to try and confirm some things. I do reproduce the problem with your metadump as well as the test case I put together. I tested Dave's buf hold across sync I/O patch and that does indeed prevent the problem. For whatever reason, neither the test case nor your metadump reproduce the same problem on latest kernels. Instead, they reproduce this double free regression. I suspect this is what you ran into when you reproduced on a more recent kernel. If you'd like, feel free to try and verify that by running your reproducer again on a recent kernel with this patch and see if you can still reproduce a crash as with the 3.8.13 kernel. Brian > Thanks, > Alex. > > > > > Brian > > > > fs/xfs/xfs_log_recover.c | 11 ++++++++--- > > 1 file changed, 8 insertions(+), 3 deletions(-) > > > > diff --git a/fs/xfs/xfs_log_recover.c b/fs/xfs/xfs_log_recover.c > > index 176c4b3..daca9a6 100644 > > --- a/fs/xfs/xfs_log_recover.c > > +++ b/fs/xfs/xfs_log_recover.c > > @@ -3528,10 +3528,15 @@ out: > > if (!list_empty(&done_list)) > > list_splice_init(&done_list, &trans->r_itemq); > > > > - xlog_recover_free_trans(trans); > > - > > error2 = xfs_buf_delwri_submit(&buffer_list); > > - return error ? error : error2; > > + > > + if (!error) > > + error = error2; > > + /* caller frees trans on error */ > > + if (!error) > > + xlog_recover_free_trans(trans); > > + > > + return error; > > } > > > > STATIC int > > -- > > 1.8.3.1 > > From bfoster@redhat.com Sun Aug 31 16:05: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 (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 6A34C7F5F for ; Sun, 31 Aug 2014 16:05:26 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 49284304032 for ; Sun, 31 Aug 2014 14:05:23 -0700 (PDT) X-ASG-Debug-ID: 1409519118-04cbb05485974e80001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 2ckeHoFxgyqRFhg2 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Sun, 31 Aug 2014 14:05: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-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 s7VL5AH6003899 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL); Sun, 31 Aug 2014 17:05:10 -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 s7VL59wJ012812; Sun, 31 Aug 2014 17:05:09 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 2964A12577F; Sun, 31 Aug 2014 17:05:08 -0400 (EDT) Date: Sun, 31 Aug 2014 17:05:08 -0400 From: Brian Foster To: Alex Lyakas Cc: xfs@oss.sgi.com, Dave Chinner Subject: Re: [PATCH] xfs: fix double free of trans in log recovery on I/O error Message-ID: <20140831210507.GA11913@bfoster.bfoster> X-ASG-Orig-Subj: Re: [PATCH] xfs: fix double free of trans in log recovery on I/O error References: <1408648692-15957-1-git-send-email-bfoster@redhat.com> <20140825142025.GA10135@bfoster.bfoster> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.23 (2014-03-12) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1409519118 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On Sun, Aug 31, 2014 at 11:50:52AM +0300, Alex Lyakas wrote: > Hi Brian, Dave, > I tested this patch on kernel 3.16, top commit: > > commit 19583ca584d6f574384e17fe7613dfaeadcdc4a6 > Author: Linus Torvalds > Date: Sun Aug 3 15:25:02 2014 -0700 > > Linux 3.16 > > and, yes, it appears to fix the issue. > Thanks. That settles that then, I think. We're reproducing different problems on the 3.8 stable kernel vs. a recent kernel using the same test case. > Trouble is that our production kernel is 3.8.13, and we cannot upgrade to > mainline kernel easily. Question is whether we can expect some patch > suitable for our kernel, or, since our kernel is EOL and not a long-term > one, we cannot? > Dave wrote a patch specifically to resolve this problem on older kernels: http://oss.sgi.com/archives/xfs/2014-08/msg00204.html Brian > Thanks for your help, > Alex. > > > -----Original Message----- From: Brian Foster > Sent: 25 August, 2014 5:20 PM > To: Alex Lyakas > Cc: xfs@oss.sgi.com ; Dave Chinner > Subject: Re: [PATCH] xfs: fix double free of trans in log recovery on I/O > error > > On Sun, Aug 24, 2014 at 12:20:20PM +0300, Alex Lyakas wrote: > >Hi Brian, > > > >On Thu, Aug 21, 2014 at 10:18 PM, Brian Foster wrote: > >> XFS log recovery builds up an xlog_recover object as it passes through > >> the log operations on the physical log. These structures are managed via > >> a hash table and are allocated when a new transaction is encountered and > >> freed once a commit operation for the transaction is encountered. > >> > >> This state machine for active transactions is implemented by a > >> combination of xlog_do_recovery_pass(), which walks through the log > >> buffers and xlog_recover_process_data() which processes log operations > >> within each buffer. The latter function decides whether to allocate a > >> new xlog_recover, add to it or commit and ultimately free it. If an > >> error occurs at any point during the lifecycle of a particular > >> xlog_recover, xlog_recover_process_data() frees the object and returns > >> an error. > >> > >> xlog_recover_commit_trans() handles the final processing of the > >> transaction. It submits whatever I/O is required for the transaction and > >> frees xlog_recover object along with the transaction items it tracks. If > >> an error occurs at the final stages of the commit operation, such as I/O > >> failure, both xlog_recover_commit_trans() and > >> xlog_recover_process_data() attempt to free the trans object. > >> > >> Modify xlog_recover_commit_trans() to only free the trans object on > >> successful completion of the trans, including any I/O errors that might > >> occur when recovering the log. > >> > >> Signed-off-by: Brian Foster > >> --- > >> > >> Hi all, > >> > >> I found that the recent buffer I/O rework fixes didn't address the crash > >> reproduced by the dm-flakey/log recovery test case I posted recently. I > >> tracked the crash down to this, which allows the test to pass. This > >> addresses the crash I saw when running the reproducer manually with the > >> metadump that Alex posted as well. > >> > >> FWIW, I also went back and tested the xfs_buf_iowait() experiment in > >> both scenarios (Alex's metadump and xfstests test) and they all > >> reproduce the same crash for me. I think that either I'm still not > >> reproducing the original problem, something else might have contaminated > >> the original xfs_buf_iowait() test to give a false positive, or > >> something else entirely is going on. > >> > >> Alex, > >> > >> If you have a chance, I think it might be interesting to see whether you > >> reproduce any problems with this patch. It looks like this is a > >> regression introduced by: > >> > >> 2a84108f xfs: free the list of recovery items on error > >> > >> ... but I have no idea if that's in whatever kernel you're running. > >I am running kernel 3.8.13 with some changes (published at > >https://github.com/zadarastorage/zadara-xfs-pushback), but this > >problem also happens on pristine 3.8.13 from > >git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git, > >branch linux-stable-3.8.y. > > > >I do not have commit 2a84108f in this kernel. It was introduced in 3.14. > >I applied your patch to 3.8.13, but it doesn't fix the issue. Same > >problem happens when testing scenario that I described in > >http://oss.sgi.com/pipermail/xfs/2014-August/037637.html. > > > > Ok, thanks. Yeah, I don't see the double free regression in the 3.8.13 > stable branch. I went back to that kernel to try and confirm some > things. I do reproduce the problem with your metadump as well as the > test case I put together. I tested Dave's buf hold across sync I/O patch > and that does indeed prevent the problem. > > For whatever reason, neither the test case nor your metadump reproduce > the same problem on latest kernels. Instead, they reproduce this double > free regression. I suspect this is what you ran into when you reproduced > on a more recent kernel. If you'd like, feel free to try and verify that > by running your reproducer again on a recent kernel with this patch and > see if you can still reproduce a crash as with the 3.8.13 kernel. > > Brian > > >Thanks, > >Alex. > > > >> > >> Brian > >> > >> fs/xfs/xfs_log_recover.c | 11 ++++++++--- > >> 1 file changed, 8 insertions(+), 3 deletions(-) > >> > >> diff --git a/fs/xfs/xfs_log_recover.c b/fs/xfs/xfs_log_recover.c > >> index 176c4b3..daca9a6 100644 > >> --- a/fs/xfs/xfs_log_recover.c > >> +++ b/fs/xfs/xfs_log_recover.c > >> @@ -3528,10 +3528,15 @@ out: > >> if (!list_empty(&done_list)) > >> list_splice_init(&done_list, &trans->r_itemq); > >> > >> - xlog_recover_free_trans(trans); > >> - > >> error2 = xfs_buf_delwri_submit(&buffer_list); > >> - return error ? error : error2; > >> + > >> + if (!error) > >> + error = error2; > >> + /* caller frees trans on error */ > >> + if (!error) > >> + xlog_recover_free_trans(trans); > >> + > >> + return error; > >> } > >> > >> STATIC int > >> -- > >> 1.8.3.1 > >> > From webmaster@dedikxboss4.com Sun Aug 31 16:08: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=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 25AA27F62 for ; Sun, 31 Aug 2014 16:08:17 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay1.corp.sgi.com (Postfix) with ESMTP id DC8D08F8040 for ; Sun, 31 Aug 2014 14:08:13 -0700 (PDT) X-ASG-Debug-ID: 1409519286-04bdf010a167f150001-NocioJ Received: from dedikxboss4.com ([78.153.148.16]) by cuda.sgi.com with ESMTP id pqKOr0CsdvWldXUD (version=TLSv1 cipher=AES128-SHA bits=128 verify=NO) for ; Sun, 31 Aug 2014 14:08:08 -0700 (PDT) X-Barracuda-Envelope-From: webmaster@dedikxboss4.com X-Barracuda-Apparent-Source-IP: 78.153.148.16 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=dedikxboss4.com; s=dkim; h=Content-Type:MIME-Version:Date:From:Message-ID:Subject:To; bh=p6WyCGyuAAW8A97VJAungNoDaISpmirjMgK+K43q/RQ=; b=n1yXXP8Xkqi+8DBYyOQXZMA3/qirzCvMd0Q0rpYw0gHVR7QoZ3zH50QPqclczPFprJfAeZKgQUkG8hAV8/MPf7pgiUFChW+g5hLsWC6fBO/njiHKQXmlmI6uPqpR9k+KQNDKR/2YCIKvSDqQraTIJb90fSrwkBwvTgs4CqPsUH4=; Received: from puxas by dedikxboss4.com with local (Exim 4.80) (envelope-from ) id 1XOCIb-0000oE-V1; Mon, 01 Sep 2014 01:04:34 +0400 To: , , , , , , , , , , , , , , Subject: =?windows-1251?B?z/Do4fvr/O3g/yDB6Oft5fEt0ejx8uXs4A==?= X-PHP-Originating-Script: 500:xmail.php X-ASG-Orig-Subj: =?windows-1251?B?z/Do4fvr/O3g/yDB6Oft5fEt0ejx8uXs4A==?= Message-ID: <4144F2A1AA7E50E33F3A73CEEAFB8D01@qxvkk> From: =?windows-1251?B?wejn7eXxIPHo8fLl7OA=?= Date: Sun, 31 Aug 2014 22:04:24 +0100 Organization: =?windows-1251?B?wejn7eXxIPHo8fLl7OA=?= MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="----=_NextPart_000_09AD_01CFC567.8684B0A0" X-Priority: 3 X-MSMail-Priority: Normal X-Mailer: Microsoft Windows Live Mail 16.4.3528.331 X-MimeOLE: Produced By Microsoft MimeOLE V16.4.3528.331 X-Barracuda-Connect: UNKNOWN[78.153.148.16] X-Barracuda-Start-Time: 1409519287 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.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, DKIM_SIGNED, DKIM_VERIFIED, HTML_FONT_SIZE_LARGE, HTML_MESSAGE, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.9035 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 0.00 BSF_SC0_TG035a Message contains invalid style definition 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_09AD_01CFC567.8684B0A0 Content-Type: text/plain; charset="windows-1251" Content-Transfer-Encoding: quoted-printable 100% =DD=EA=F1=EA=EB=FE=E7=E8=E2=ED=FB=E9 =EC=E0=F2=E5=F0=E8=E0=EB! =CD=E0 =E4=E0=ED=ED=FB=E9 =EC=EE=EC=E5=ED=F2 =FD=F2=E0 =C1=E8=E7=ED=E5=F1= -=D1=F5=E5=EC=E0 =E4=EE=F1=F2=F3=EF=ED=E0 =C8=D1=CA=CB=DE=D7=C8=D2=C5=CB=DC=CD=CE =EC=EE=E8= =EC =EF=EE=E4=EF=E8=F1=F7=E8=EA=E0=EC =CF=F0=E8=E1=FB=EB=FC=ED=E0=FF =C1=E8=E7=ED=E5=F1-=D1=E8=F1=F2=E5=EC=E0 =CF=F0=E8=E1=FB=EB=FC=ED=E0=FF =D1=F5=E5=EC=E0 =C1=E8=E7=ED=E5=F1=E0 =F1 = =E8=F1=EF=EE=EB=FC=E7=EE=E2=E0=ED=E8=E5=EC =C8=ED=F4=EE=F0=EC=E0=F6=E8=EE= =ED=ED=FB=F5 =D2=E5=F5=ED=EE=EB=EE=E3=E8=E9=85 =C8 =EF=F0=E8=ED=EE=F1=FF=F9=E0=FF =EF=EE 100=92000 =96 150=92000 =F0=F3=E1= =EB=E5=E9 =E2 =EC=E5=F1=FF=F6=85 =CD=E0 =EA=EE=F2=EE=F0=F3=FE =E4=EE=F1=F2=E0=F2=EE=F7=ED=EE 1-2 =F7=E0=F1= =EE=E2 =E2 =E4=E5=ED=FC=85 =DD=F2=EE 100% =DD=EA=F1=EA=EB=FE=E7=E8=E2=ED=FB=E9 =EC=E0=F2=E5=F0=E8=E0= =EB, =F2=E0=EA =EA=E0=EA =E4=EE =F1=E5=E3=EE=E4=ED=FF=F8=ED=E5=E3=EE =E4=ED= =FF =FD=F2=E0 =CF=F0=EE=F1=F2=E0=FF =C1=E8=E7=ED=E5=F1 =D1=F5=E5=EC=E0 =C4= =E5=F0=E6=E0=EB=E0=F1=FC =E2 =D1=E5=EA=F0=E5=F2=E5... =C8 =ED=E0 =E4=E0=ED=ED=FB=E9 =EC=EE=EC=E5=ED=F2 =FD=F2=E0 =C1=E8=E7=ED=E5= =F1-=D1=E8=F1=F2=E5=EC=E0 =E4=EE=F1=F2=F3=EF=ED=E0 =C8=D1=CA=CB=DE=D7=C8=D2= =C5=CB=DC=CD=CE =EC=EE=E8=EC =EF=EE=E4=EF=E8=F1=F7=E8=EA=E0=EC. IOS-BLOG= .RU >>>=CF=CE=CB=D3=D7=C8=D2=DC =C1=C8=C7=CD=C5=D1-=D1=C8=D1=D2=C5=CC=D3 =CF=D0= =DF=CC=CE =D1=C5=C9=D7=C0=D1<<< ------=_NextPart_000_09AD_01CFC567.8684B0A0 Content-Type: text/html; charset="windows-1251" Content-Transfer-Encoding: quoted-printable
100% =DD=EA=F1=EA=EB=FE=E7=E8=E2=ED=FB= =E9 =EC=E0=F2=E5=F0=E8=E0=EB!
=CD=E0 =E4=E0=ED=ED=FB=E9 =EC=EE=EC=E5=ED= =F2=20 =FD=F2=E0 =C1=E8=E7=ED=E5=F1-=D1=F5=E5=EC=E0
=E4=EE=F1=F2=F3=EF=ED=E0 = =C8=D1=CA=CB=DE=D7=C8=D2=C5=CB=DC=CD=CE =EC=EE=E8=EC =EF=EE=E4=EF=E8=F1=F7= =E8=EA=E0=EC

=CF=F0=E8=E1=FB= =EB=FC=ED=E0=FF=20 =C1=E8=E7=ED=E5=F1-=D1=E8=F1=F2=E5=EC=E0

=CF=F0=E8=E1=FB= =EB=FC=ED=E0=FF =D1=F5=E5=EC=E0 =C1=E8=E7=ED=E5=F1=E0 =F1=20 =E8=F1=EF=EE=EB=FC=E7=EE=E2=E0=ED=E8=E5=EC =C8=ED=F4=EE=F0=EC=E0=F6=E8=EE= =ED=ED=FB=F5 =D2=E5=F5=ED=EE=EB=EE=E3=E8=E9=85

=C8 =EF=F0=E8=ED=EE= =F1=FF=F9=E0=FF =EF=EE 100=92000
=96 150=92000=20 =F0=F3=E1=EB=E5=E9 =E2 =EC=E5=F1=FF=F6=85

=CD=E0 =EA=EE=F2=EE=F0=F3= =FE =E4=EE=F1=F2=E0=F2=EE=F7=ED=EE 1-2 =F7=E0=F1=EE=E2 =E2=20 =E4=E5=ED=FC=85


=DD=F2=EE= 100% =DD=EA=F1=EA=EB=FE=E7=E8=E2=ED=FB=E9=20 =EC=E0=F2=E5=F0=E8=E0=EB, =F2=E0=EA =EA=E0=EA =E4=EE =F1=E5=E3=EE=E4=ED=FF= =F8=ED=E5=E3=EE =E4=ED=FF =FD=F2=E0 =CF=F0=EE=F1=F2=E0=FF =C1=E8=E7=ED=E5= =F1 =D1=F5=E5=EC=E0 =C4=E5=F0=E6=E0=EB=E0=F1=FC =E2=20 =D1=E5=EA=F0=E5=F2=E5...


=C8 =ED=E0 =E4=E0=ED=ED=FB=E9 =EC=EE=EC=E5=ED= =F2 =FD=F2=E0 =C1=E8=E7=ED=E5=F1-=D1=E8=F1=F2=E5=EC=E0 =E4=EE=F1=F2=F3=EF= =ED=E0=20 =C8=D1=CA=CB=DE=D7=C8=D2=C5=CB=DC=CD=CE =EC=EE=E8=EC =EF=EE=E4=EF=E8=F1=F7= =E8=EA=E0=EC.  IOS-BLOG.RU

 
 
>>>= =CF=CE=CB=D3=D7=C8=D2=DC =C1=C8=C7=CD=C5=D1-= =D1=C8=D1=D2=C5=CC=D3 =CF=D0=DF=CC=CE=20 =D1=C5=C9=D7=C0=D1<<<
------=_NextPart_000_09AD_01CFC567.8684B0A0-- From sheikh@bahrawi.com Sun Aug 31 18:18: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=2.0 required=5.0 tests=DEAR_SOMETHING,HTML_MESSAGE autolearn=no version=3.3.1 X-Original-To: xfs@oss.sgi.com Delivered-To: xfs@oss.sgi.com Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (Postfix) with ESMTP id 39A227F5A for ; Sun, 31 Aug 2014 18:18:44 -0500 (CDT) Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by relay3.corp.sgi.com (Postfix) with ESMTP id AE5F3AC002 for ; Sun, 31 Aug 2014 16:18:40 -0700 (PDT) X-ASG-Debug-ID: 1409527117-04cb6c54fd6e6de0001-NocioJ Received: from web48.esoterica.pt (web48.esoterica.pt [80.172.241.34]) by cuda.sgi.com with ESMTP id BcuFhDusA600GKF7 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO); Sun, 31 Aug 2014 16:18:37 -0700 (PDT) X-Barracuda-Envelope-From: sheikh@bahrawi.com X-Barracuda-Apparent-Source-IP: 80.172.241.34 Received: by web48.esoterica.pt (Postfix, from userid 502) id A5A3C2A6F91; Mon, 1 Sep 2014 00:15:30 +0100 (WEST) Received: from 41.203.69.17 ([41.203.69.17]) by webmail.flamingo-gs.com (Horde Framework) with HTTP; Mon, 01 Sep 2014 00:15:27 +0100 Message-ID: <20140901001527.51311jntx4lcixzj@webmail.flamingo-gs.com> Date: Mon, 01 Sep 2014 00:15:27 +0100 From: Sheikh Mohammed Ali To: info@bahrawi.com Subject: Re: New Order MIME-Version: 1.0 X-ASG-Orig-Subj: Re: New Order Content-Type: multipart/alternative; boundary="=_2z9ttalyhuql" Content-Transfer-Encoding: 7bit User-Agent: Internet Messaging Program (IMP) H3 (4.3.9) X-Barracuda-Connect: web48.esoterica.pt[80.172.241.34] X-Barracuda-Start-Time: 1409527117 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.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_MISMATCH_TO, BSF_SC0_SA_TO_FROM_DOMAIN_MATCH, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.9041 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 0.01 BSF_SC0_SA_TO_FROM_DOMAIN_MATCH Sender Domain Matches Recipient Domain This message is in MIME format. --=_2z9ttalyhuql Content-Type: text/plain; charset=ISO-8859-1 Content-Description: Plaintext Version of Message Content-Disposition: inline Content-Transfer-Encoding: 7bit Dear Sir, Greetings to you! As per the below mail, reply us with proforma ASAP for the attached order. Thanks Sheikh Mohammed Ali (Import Manager) Bahrawi Building, Al Qandeel Street Off Thahlia Street Al Azzizia District, P.O. Box 48, Jeddah 21411 Kingdom Of Saudi Arabia Tel: +966 2 665 2441 Fax: +966 2 665 2464 The beginning of the message: > From: Abdulmajeed Abdulwahab > Subject: New Order > Date: August 31, 2014 06:39:23 GMT +2 > To: "Sheikh Mohammed Ali" Dear Shiekh, Find attached below our Purchase order, forward it to the supplier for them to send us invoice with their best price. Note that item #534 and #535 is needed in a very large quantity, So they will have to give us a reasonable discount with their best price. I await the invoice asap. B/R Abdulmajeed Abdulwahab (Sales Manager) Bahrawi Building, Al Qandeel Street Off Thahlia Street Al Azzizia District, P.O. Box 48, Jeddah 21411 Kingdom Of Saudi Arabia Tel: +966 2 665 5533 Fax: +966 2 665 2464 559KB DOWNLOAD PO-3109014.PDF --=_2z9ttalyhuql Content-Type: text/html; charset=ISO-8859-1 Content-Description: HTML Version of Message Content-Disposition: inline Content-Transfer-Encoding: 7bit
Dear Sir,

Greetings to you!

As per the below mail, reply us with proforma ASAP for the attached order.

Thanks

Sheikh Mohammed Ali
(Import Manager)
Bahrawi Building, Al Qandeel Street Off Thahlia Street
Al Azzizia District, P.O. Box 48,
Jeddah 21411 Kingdom Of Saudi Arabia
Tel: +966 2 665 2441
Fax: +966 2 665 2464

The beginning of the message:

> From: Abdulmajeed Abdulwahab  <info@bahrawi.com>
> Subject: New Order
> Date: August 31, 2014 06:39:23 GMT +2
> To: "Sheikh Mohammed Ali"<sheikh@bahrawi.com>

Dear Shiekh,

Find attached below our Purchase order, forward it to the supplier for them to send us invoice with their best price.
Note that item #534 and #535 is needed in a very large quantity, So they will have to give us a reasonable discount with their best price.
I await the invoice asap.
B/R


Abdulmajeed Abdulwahab
(Sales Manager)
Bahrawi Building, Al Qandeel Street Off Thahlia Street
Al Azzizia District, P.O. Box 48,
Jeddah 21411 Kingdom Of Saudi Arabia
Tel: +966 2 665 5533
Fax: +966 2 665 2464

559KB DOWNLOAD
PO-3109014.PDF
--=_2z9ttalyhuql-- From david@fromorbit.com Sun Aug 31 18:57: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 114A97F5A for ; Sun, 31 Aug 2014 18:57:58 -0500 (CDT) Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by relay2.corp.sgi.com (Postfix) with ESMTP id D7835304043 for ; Sun, 31 Aug 2014 16:57:54 -0700 (PDT) X-ASG-Debug-ID: 1409529472-04bdf010a16827a0001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id itVnS03yFw7MJ93U for ; Sun, 31 Aug 2014 16:57: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: AoERAKa1A1R5LDJ8PGdsb2JhbABZgw2BKoIshQenTwEBAQEBBqAvAYEPFwUBAQEBODaEAwEBAQMBOhwjEAgDGAklDwUlAwcaE4g6B7lIARcYhWSJCEkHhEwFjx2NPpkSKy+BB4FIAQEB Received: from ppp121-44-50-124.lns20.syd6.internode.on.net (HELO dastard) ([121.44.50.124]) by ipmail06.adl6.internode.on.net with ESMTP; 01 Sep 2014 09:27:51 +0930 Received: from dave by dastard with local (Exim 4.80) (envelope-from ) id 1XOF0H-00022B-HX; Mon, 01 Sep 2014 09:57:49 +1000 Date: Mon, 1 Sep 2014 09:57:49 +1000 From: Dave Chinner To: Stan Hoeppner Cc: xfs@oss.sgi.com Subject: Re: storage, libaio, or XFS problem? 3.4.26 Message-ID: <20140831235749.GH20518@dastard> X-ASG-Orig-Subj: Re: storage, libaio, or XFS problem? 3.4.26 References: <3fe8c34c0ccbbd720015d273fa2b8b30@localhost> <20140826075345.GJ20518@dastard> <8c29baf987467a84f0b7c1d09c863662@localhost> <20140828003226.GO20518@dastard> <7f9e5aef187b44e899077467aeb0809d@localhost> <20140828230817.GU20518@dastard> <2d2ce7bb38c00a7d35f4a324f6a36cbb@localhost> <20140829235538.GF20518@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1409529472 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-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.9043 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC5_SA210e Custom Rule SA210e On Fri, Aug 29, 2014 at 09:55:53PM -0500, Stan Hoeppner wrote: > On Sat, 30 Aug 2014 09:55:38 +1000, Dave Chinner wrote: > > On Fri, Aug 29, 2014 at 11:38:16AM -0500, Stan Hoeppner wrote: > >> > >> Another storage crash yesterday. xfs_repair output inline below for the 7 > >> filesystems. I'm also pasting the dmesg output. This time there is no > >> oops, no call traces. The filesystems mounted fine after mounting, > >> replaying, and repairing. > > > > Ok, what version of xfs_repair did you use? > > 3.1.4 which is a little long in the tooth. And so not useful for th epurposes of finding free space tree corruptions. Old xfs_repair versions only rebuild the freespace trees - they don't check them first. IOWs, silence from an old xfs_repair does not mean the filesystem was free of errors. > >> This because some of our writes for a given low rate stream are as low as > >> 32KB and may be 2-3 seconds apart. With a 64-128KB chunk, 768 to 1536KB > >> stripe width, we'd get massive RMW without this feature. Testing thus > >> far > >> shows it is fairly effective, though we still get pretty serious RMW due > >> to > >> the fact we're writing 350 of these small streams per array at ~72 KB/s > >> max, along with 2 streams at ~48 MB/s, and and 50 streams at ~1.2 MB/s. > > >> Multiply this by 7 LUNs per controller and it becomes clear we're > >> putting a > >> pretty serious load on the firmware and cache. > > > > Yup, so having the array cache do the equivalent of sequential > > readahead multi-stream detection for writeback would make a big > > difference. But not simple to do.... > > Not at all, especially with only 3 GB of RAM to work with, as I'm told. > Seems low for a high end controller with 4x 12G SAS ports. We're only able > to achieve ~250 MB/s per array at the application due to the access pattern > being essentially random, and still with a serious quantity of RMWs. Which > is why we're going to test with an even smaller chunk of 32KB. I believe > that's the lower bound on these controllers. For this workload 16KB or > maybe even 8KB would likely be more optimal. We're also going to test with > bcache and a 400 GB Intel 3700 (datacenter grade) SSD backing two LUNs. > But with bcache chunk size should be far less relevant. I'm anxious to > kick those tires, but it'll be a couple of weeks. > > Have you played with bcache yet? Enough to scare me. So many ways for things to go wrong, no easy way to recover when things go wrong. And that's before I even get to performance warts, like having systems stall completely because there's tens or hundreds of GB of 4k random writes that have to be flushed to slow SATA RAID6 in the cache.... Cheers, Dave. PS: can you wrap your text at 68 or 72 columns so quoted text doesn't overflow 80 columns and get randomly wrapped and messed up? -- Dave Chinner david@fromorbit.com From stan@hardwarefreak.com Sun Aug 31 22:36: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 (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (Postfix) with ESMTP id 452AC7F4E for ; Sun, 31 Aug 2014 22:36:33 -0500 (CDT) Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by relay2.corp.sgi.com (Postfix) with ESMTP id 33BAC304043 for ; Sun, 31 Aug 2014 20:36:30 -0700 (PDT) X-ASG-Debug-ID: 1409542585-04cbb0548797d620001-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 Jg32J6HSNJ3lD7cw for ; Sun, 31 Aug 2014 20:36:25 -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 5DD656C058; Sun, 31 Aug 2014 22:36:25 -0500 (CDT) Message-ID: <5403E9B9.7040608@hardwarefreak.com> Date: Sun, 31 Aug 2014 22:36:25 -0500 From: stan hoeppner User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Icedove/24.7.0 MIME-Version: 1.0 To: Dave Chinner CC: xfs@oss.sgi.com Subject: Re: storage, libaio, or XFS problem? 3.4.26 References: <3fe8c34c0ccbbd720015d273fa2b8b30@localhost> <20140826075345.GJ20518@dastard> <8c29baf987467a84f0b7c1d09c863662@localhost> <20140828003226.GO20518@dastard> <7f9e5aef187b44e899077467aeb0809d@localhost> <20140828230817.GU20518@dastard> <2d2ce7bb38c00a7d35f4a324f6a36cbb@localhost> <20140829235538.GF20518@dastard> <20140831235749.GH20518@dastard> X-ASG-Orig-Subj: Re: storage, libaio, or XFS problem? 3.4.26 In-Reply-To: <20140831235749.GH20518@dastard> 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: 1409542585 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-BRTS-Status: 1 On 08/31/2014 06:57 PM, Dave Chinner wrote: > On Fri, Aug 29, 2014 at 09:55:53PM -0500, Stan Hoeppner wrote: >> On Sat, 30 Aug 2014 09:55:38 +1000, Dave Chinner wrote: >>> On Fri, Aug 29, 2014 at 11:38:16AM -0500, Stan Hoeppner wrote: >>>> >>>> Another storage crash yesterday. xfs_repair output inline below for the 7 >>>> filesystems. I'm also pasting the dmesg output. This time there is no >>>> oops, no call traces. The filesystems mounted fine after mounting, >>>> replaying, and repairing. >>> >>> Ok, what version of xfs_repair did you use? >> >> 3.1.4 which is a little long in the tooth. > > And so not useful for th epurposes of finding free space tree > corruptions. Old xfs_repair versions only rebuild the freespace > trees - they don't check them first. IOWs, silence from an old > xfs_repair does not mean the filesystem was free of errors. > >>>> This because some of our writes for a given low rate stream are as low as >>>> 32KB and may be 2-3 seconds apart. With a 64-128KB chunk, 768 to 1536KB >>>> stripe width, we'd get massive RMW without this feature. Testing thus >>>> far >>>> shows it is fairly effective, though we still get pretty serious RMW due >>>> to >>>> the fact we're writing 350 of these small streams per array at ~72 KB/s >>>> max, along with 2 streams at ~48 MB/s, and and 50 streams at ~1.2 MB/s. >> >>>> Multiply this by 7 LUNs per controller and it becomes clear we're >>>> putting a >>>> pretty serious load on the firmware and cache. >>> >>> Yup, so having the array cache do the equivalent of sequential >>> readahead multi-stream detection for writeback would make a big >>> difference. But not simple to do.... >> >> Not at all, especially with only 3 GB of RAM to work with, as I'm told. >> Seems low for a high end controller with 4x 12G SAS ports. We're only able >> to achieve ~250 MB/s per array at the application due to the access pattern >> being essentially random, and still with a serious quantity of RMWs. Which >> is why we're going to test with an even smaller chunk of 32KB. I believe >> that's the lower bound on these controllers. For this workload 16KB or >> maybe even 8KB would likely be more optimal. We're also going to test with >> bcache and a 400 GB Intel 3700 (datacenter grade) SSD backing two LUNs. >> But with bcache chunk size should be far less relevant. I'm anxious to >> kick those tires, but it'll be a couple of weeks. >> >> Have you played with bcache yet? > > Enough to scare me. So many ways for things to go wrong, no easy way > to recover when things go wrong. And that's before I even get to > performance warts, like having systems stall completely because > there's tens or hundreds of GB of 4k random writes that have to be > flushed to slow SATA RAID6 in the cache.... Yikes. I hadn't yet heard such opinions expressed. By go wrong I assume you mean the btrees or cached sector data getting broken, corrupted? > Cheers, > > Dave. > > PS: can you wrap your text at 68 or 72 columns so quoted text > doesn't overflow 80 columns and get randomly wrapped and messed up? This email should be. Lemme see what I can do with the others. The lovely Cisco VPN client I must use kills routing to my local subnet, so Icedovce can't connect to my IMAP server when the VPN is active. The test hardness app requires a shell unfortunately so I have to keep the tunnel open all the time, as the test runs are 40+ hours each. My last test just crashed a bit ago so I can use Icedove for this reply. I've been using Roundcube, an older version, which doesn't let me set the line wrap, at least not in the web GUI, might be in the config. I normally only use it when I'm remote, which is rare, so I've not kept it updated. Lemme see if I can open the firewall and get IMAP working through their VPN link so I can use Icedove. Sorry for the inconvenience. Believe me, it negatively affects me more than you. :( Stan